#include <LiquidCrystal.h>
#include <EEPROM.h>
LiquidCrystal LCD = LiquidCrystal(10, 9, 8, 7, 6, 5);
#define pAo_Led_01 12
#define pAo_Led_02 11
#define s_StartMessageL0 "Startup Message"
#define s_StartMessageL1 "by WOKWI"
#define pAi_Button_01 17
#define pAi_Button_02 18
#define pAi_Button_03 19
#define t_DisplayDelay 750
#define pAi_Analog_01 0
#define t_StatusChar 300
#define t_Min_Button 200
#define t_Min_SetButton 200
#define t_LoopDelay 50
#define t_Short_Button 400
#define t_Long_Button 4000
#define t_Longer_Button 8000
#define t_Message_Delay 27000
#define t_Message_Time 3000
#define Message_Number 16
char vC_Messages[Message_Number][16]={
"Tunnel was hot ",
"Lasha was here ",
"Ozan was here ",
"Zero deviation ",
"Samuel was here",
"It was dusty ",
"Feliks was here",
"Site start 2019",
"Baris was here",
"First Spin 2023",
"Valantin was ",
"First Pump 2024",
"Xinmin was here",
"It was very hot",
"Kadir was here ",
"Thanks to all "};
byte vB_Message_Count=0;
byte vB_MessageS=0;
unsigned int vA_ReadP;
unsigned int vA_WriteP;
float vA_WriteC;
char vC_Buffer0[10];
bool vD_SaveSet=0;
bool vD_Led01=0;
bool vD_Led02=0;
// Button status
// 0 : No Button min time
// 1 : Button pressed
// 2 : Button pressed short
// 3 : Button pressed long
// 4 : Button pressed longer
// 5 : Button released
// 6 : Button relased short
// 7 : Button relased long
// 8 : Button relased longer
byte vD_ButtonS[3]= {8, 8, 8};
byte vD_preButtonS[3]={8, 8, 8};
bool vD_Read_Button[3]={0, 0, 0};
bool vD_Pre_Button[3]={0, 0, 0};
// bool vD_Pro_Button[3]={0, 0, 0};
byte vd_Port_Button[3]={pAi_Button_01, pAi_Button_02, pAi_Button_03};
unsigned int vT_Button[3]={0, 0, 0};
unsigned int vT_Loop01=0;
unsigned int vT_Loop02=0;
unsigned int vT_DisplayTimer=0;
bool vD_Display=0;
unsigned int vT_printSc=0;
unsigned int vT_Message=0;
unsigned int vT_ReadButton[3]={0, 0, 0};
int vD_MenuLoop=0;
int vD_SetOffset;
int vD_SetMult;
int vD_SetK1;
int vD_SetK2;
int vD_pSetOffset=0;
int vD_pSetMult=100;
int vD_pSetK1=100;
int vD_pSetK2=200;
int vLa;
void f_SaveSet()
{
/*******************************************************************/
EEPROM.put(0, vD_SetOffset);
Serial.println(vD_SetOffset);
EEPROM.put(4, vD_SetMult);
Serial.println(vD_SetMult);
EEPROM.put(8, vD_SetK1);
Serial.println(vD_SetK1);
EEPROM.put(12, vD_SetK2);
Serial.println(vD_SetK2);
LCD.setCursor(0, 0);
LCD.print("Saved...");
delay(1500);
LCD.clear();
}
void f_NoSet()
{
vD_SetOffset=vD_pSetOffset;
vD_SetMult=vD_pSetMult;
vD_SetK1=vD_pSetK1;
vD_SetK2=vD_pSetK2;
LCD.setCursor(0, 0);
LCD.print("Restore...");
delay(1500);
LCD.clear();
}
void f_printSc(byte vA_A)
{
static int vL_A;
if(vT_Loop01-vT_printSc>t_StatusChar)
{
vL_A++;
vT_printSc=vT_Loop01;
}
if(vA_A==1)
{
LCD.setCursor(15, 0);
if(vL_A>2)
vL_A=0;
if(vL_A==0)
LCD.write(0xDF);
if(vL_A==1)
LCD.write(0xDB);
}
if(vA_A==2)
{
LCD.setCursor(15, 0);
if(vL_A>2)
vL_A=0;
if(vL_A==0)
LCD.write(0xFF);
if(vL_A==1)
LCD.write(0xFF);
}
}
void f_LCD_P()
{
LCD.setCursor(0, 0);
LCD.print("P:");
// LCD.print(vA_WriteP);
LCD.print(vC_Buffer0);
LCD.print(" ");
}
void f_ParmeterReadEEPROM(void)
{
EEPROM.get(0, vD_pSetOffset);
Serial.println(vD_pSetOffset);
EEPROM.get(4, vD_pSetMult);
Serial.println(vD_pSetMult);
EEPROM.get(8, vD_pSetK1);
Serial.println(vD_pSetK1);
EEPROM.get(12, vD_pSetK2);
Serial.println(vD_pSetK2);
}
void f_ParmeterDefault(void)
{
vD_pSetOffset=0;
vD_pSetMult=100;
vD_pSetK1=500;
vD_pSetK2=1000;
}
void setup()
{
Serial.begin(115200);
Serial.println("Nano Serial Started 231120a...");
/*******************************************************************/
//f_ParmeterReadEEPROM();
f_ParmeterDefault();
/*******************************************************************/
vD_SetOffset=vD_pSetOffset;
vD_SetMult=vD_pSetMult;
vD_SetK1=vD_pSetK1;
vD_SetK2=vD_pSetK2;
pinMode(pAi_Button_01, INPUT);
pinMode(pAi_Button_02, INPUT);
pinMode(pAi_Button_03, INPUT);
pinMode(pAo_Led_01, OUTPUT);
pinMode(pAo_Led_02, OUTPUT);
LCD.begin(16,2);
LCD.noCursor();
LCD.clear();
LCD.print(s_StartMessageL0);
LCD.setCursor(0, 1);
LCD.print(s_StartMessageL1);
delay(3000);
LCD.clear();
}
/******************************************************************/
/*
For simulation use random function;
*/
unsigned int f_ReadAnalogPin()
{
return random(1024);
// return analogRead(pAi_Analog_01);
}
void loop()
{
int vL_SetInc;
if(t_LoopDelay)
delay(t_LoopDelay);
vT_Loop01=millis();
vA_ReadP=f_ReadAnalogPin();
if(vD_Display)
vD_Display=0;
if(vT_Loop01-vT_DisplayTimer>t_DisplayDelay)
{
vT_DisplayTimer=vT_Loop01;
vD_Display=1;
}
/******************************************************************/
/*************** BUTTON LOOP **************************************/
for(vLa=0;vLa<3;vLa++)
{
vD_Pre_Button[vLa]=vD_Read_Button[vLa];
vD_Read_Button[vLa]=digitalRead(vd_Port_Button[vLa]);
// Serial.print(vLa);
if(vD_Read_Button[vLa] != vD_Pre_Button[vLa])
{
vD_preButtonS[vLa]=vD_ButtonS[vLa];
vT_Button[vLa]=vT_Loop01;
if(vD_Read_Button[vLa]==1)
{
vD_ButtonS[vLa]=1;
Serial.println(": 1 -Button Pressed");
}
if(vD_Read_Button[vLa]==0)
{
vD_ButtonS[vLa]=5;
Serial.println(": 5 -Button Released");
}
}
if(vD_Read_Button[vLa]==vD_Pre_Button[vLa])
{
if(vT_Loop01-vT_Button[vLa]<t_Short_Button)
{
if(vD_Read_Button[vLa])
if(vD_ButtonS[vLa]!=2)
{
Serial.println(": 2 -Button Short Pressed");
vD_preButtonS[vLa]=vD_ButtonS[vLa];
vD_ButtonS[vLa]=2;
}
if(!vD_Read_Button[vLa])
if(vD_ButtonS[vLa]!=6)
{
Serial.println(": 6 -Button Short Released");
vD_preButtonS[vLa]=vD_ButtonS[vLa];
vD_ButtonS[vLa]=6;
}
}
else
{
if(vT_Loop01-vT_Button[vLa]<t_Long_Button)
{
if(vD_Read_Button[vLa])
if(vD_ButtonS[vLa]!=3)
{
Serial.println(": 3 -Button Long Pressed");
vD_preButtonS[vLa]=vD_ButtonS[vLa];
vD_ButtonS[vLa]=3;
}
if(!vD_Read_Button[vLa])
if(vD_ButtonS[vLa]!=7)
{
Serial.println(": 7 -Button Long Released");
vD_preButtonS[vLa]=vD_ButtonS[vLa];
vD_ButtonS[vLa]=7;
}
}
else
{
if(vT_Loop01-vT_Button[vLa]<t_Longer_Button)
{
if(vD_Read_Button[vLa])
if(vD_ButtonS[vLa]!=4)
{
Serial.println(": 4 -Button Longer Pressed");
vD_preButtonS[vLa]=vD_ButtonS[vLa];
vD_ButtonS[vLa]=4;
}
if(!vD_Read_Button[vLa])
if(vD_ButtonS[vLa]!=8)
{
Serial.println(": 8 -Button Longer Released");
vD_preButtonS[vLa]=vD_ButtonS[vLa];
vD_ButtonS[vLa]=8;
}
}
}
}
}
}
if(vD_preButtonS[0]<5)
if(vD_preButtonS[0]>2)
if(vD_ButtonS[0]==5)
{
if(vD_MenuLoop==5)
{
if(vD_SaveSet)
{
f_SaveSet();
vD_SaveSet=0;
}
else
{
f_NoSet();
vD_SaveSet=0;
}
}
vD_MenuLoop=vD_MenuLoop+1;
if(vD_MenuLoop>5)
vD_MenuLoop=0;
Serial.println("Menu Loop");
}
if(vD_MenuLoop==0)
{
}
vL_SetInc=0;
if(vT_Loop01-vT_Loop02>t_Min_SetButton)
{
vT_Loop02=vT_Loop01;
if(vD_ButtonS[1]==1 || vD_ButtonS[1]==2)
vL_SetInc=1;
if(vD_ButtonS[1]==3 || vD_ButtonS[1]==4)
vL_SetInc=10;
if(vD_ButtonS[2]==1 || vD_ButtonS[2]==2)
vL_SetInc=-1;
if(vD_ButtonS[2]==3 || vD_ButtonS[2]==4)
vL_SetInc=-10;
}
if(vD_MenuLoop==1)
{
vD_SetOffset=vD_SetOffset+vL_SetInc;
}
if(vD_MenuLoop==2)
{
vD_SetMult=vD_SetMult+vL_SetInc;
}
if(vD_MenuLoop==3)
{
vD_SetK1=vD_SetK1+vL_SetInc;
}
if(vD_MenuLoop==4)
{
vD_SetK2=vD_SetK2+vL_SetInc;
}
if(vD_MenuLoop==5)
{
if(vD_preButtonS[1]>4)
if(vD_ButtonS[1]==1 || vD_ButtonS[1]==2)
vD_SaveSet=!vD_SaveSet;
if(vD_preButtonS[2]>4)
if(vD_ButtonS[2]==1 || vD_ButtonS[2]==2)
vD_SaveSet=!vD_SaveSet;
}
vA_WriteC=vA_ReadP;
vA_WriteC=vA_WriteC*vD_SetMult/100;
vA_WriteC=vA_WriteC+vD_SetOffset;
vA_WriteP=vA_WriteC;
vA_WriteC=vA_WriteC/100;
dtostrf(vA_WriteC,5,2,vC_Buffer0);
if(vA_WriteP<vD_SetK1+1)
{
vD_Led01=1;
vD_Led02=0;
}
if(vA_WriteP>vD_SetK1 && vA_WriteP<vD_SetK2)
{
vD_Led01=0;
vD_Led02=0;
}
if(vA_WriteP>vD_SetK2-1)
{
vD_Led01=0;
vD_Led02=1;
}
digitalWrite(pAo_Led_01, vD_Led01);
digitalWrite(pAo_Led_02, vD_Led02);
if(vD_ButtonS[0]==3)
f_printSc(2);
else
f_printSc(1);
if(vD_Display)
{
if(vD_MenuLoop==0)
{
f_LCD_P();
if(vB_MessageS==2)
{
vT_Message=vT_Loop01;
vB_MessageS=0;
}
if(vB_MessageS==1)
if(vT_Loop01-vT_Message>t_Message_Delay+t_Message_Time)
{
vB_MessageS=2;
vB_Message_Count++;
if(vB_Message_Count>15)
vB_Message_Count=0;
}
if(vB_MessageS==0)
if(vT_Loop01-vT_Message>t_Message_Delay)
vB_MessageS=1;
if(vB_MessageS==1)
{
LCD.setCursor(0, 1);
LCD.print(vC_Messages[vB_Message_Count]);
}
else
{
LCD.setCursor(0, 1);
LCD.print("K1:");
if(vD_Led01==true)
{
LCD.print("ON ");
}
else
{
LCD.print("OFF");
}
LCD.print(" K2:");
if(vD_Led02==true)
{
LCD.print("ON ");
}
else
{
LCD.print("OFF ");
}
}
}
if(vD_MenuLoop==1)
{
f_LCD_P();
if(vD_ButtonS[0]==3)
f_printSc(2);
else
f_printSc(1);
LCD.setCursor(0, 1);
LCD.print("Set Off.:");
LCD.print(vD_SetOffset);
LCD.print(" ");
}
if(vD_MenuLoop==2)
{
f_LCD_P();
if(vD_ButtonS[0]==3)
f_printSc(2);
else
f_printSc(1);
LCD.setCursor(0, 1);
LCD.print("Set Mul.:");
LCD.print(vD_SetMult);
LCD.print(" ");
}
if(vD_MenuLoop==3)
{
f_LCD_P();
if(vD_ButtonS[0]==3)
f_printSc(2);
else
f_printSc(1);
LCD.setCursor(0, 1);
LCD.print("Set K1:");
LCD.print(vD_SetK1);
LCD.print(" ");
}
if(vD_MenuLoop==4)
{
f_LCD_P();
if(vD_ButtonS[0]==3)
f_printSc(2);
else
f_printSc(1);
LCD.setCursor(0, 1);
LCD.print("Set K2:");
LCD.print(vD_SetK2);
LCD.print(" ");
}
if(vD_MenuLoop==5)
{
f_LCD_P();
if(vD_ButtonS[0]==3)
f_printSc(2);
else
f_printSc(1);
if(vD_SaveSet==true)
{
LCD.setCursor(0, 1);
LCD.print("Save changes");
}
else
{
LCD.setCursor(0, 1);
LCD.print("No change ");
}
}
}
}