#include <LiquidCrystal.h>
#include <EEPROM.h>
//#include <Wire.h>
// initialize the library by associating any needed LCD interface pin
// with the arduino pin number it is connected to
// const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2;
// LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
LiquidCrystal LCD = LiquidCrystal(10, 9, 8, 7, 6, 5);
#define pAo_Led_01 12
#define pAo_Led_02 11
#define pAi_Button_01 17
#define pAi_Button_02 18
#define pAi_Button_03 19
#define pAi_Analog_01 0
#define t_Short_Button_01 300
#define t_Long_Button_01 3000
#define t_Short_Button_02 300
#define t_Long_Button_02 3000
#define t_Short_Button_03 300
#define t_Long_Button_03 3000
unsigned int vA_ReadP;
unsigned int vA_WriteP;
float vA_WriteC;
bool vD_SaveSet=0;
bool vD_Led01=0;
bool vD_Led02=0;
// 76543210 : Button status
// .......0 : Button pressed
// ......1. : Button pressed short
// .....2.. : Button pressed long
// ....3... : Button pressed longer
// ...4.... : Button released short
// ..5..... : Button released long
// .6...... : None
// 7....... : None
byte vD_Status_Button01=0b00000000;
byte vD_Status_Button02=0b00000000;
byte vD_Status_Button03=0b00000000;
byte vD_Status_preButton01=0b00000000;
byte vD_Status_preButton02=0b00000000;
byte vD_Status_preButton03=0b00000000;
bool vD_Read_Button01=0;
bool vD_Read_Button02=0;
bool vD_Read_Button03=0;
bool vD_Pre_Button01=0;
bool vD_Pre_Button02=0;
bool vD_Pre_Button03=0;
bool vD_Pro_Button01=0;
bool vD_Pro_Button02=0;
bool vD_Pro_Button03=0;
unsigned vT_Loop01=0;
unsigned vT_Button01=0;
unsigned vT_Button02=0;
unsigned vT_Button03=0;
unsigned vT_ReadButton=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;
void f_SaveSet()
{
LCD.setCursor(0, 0);
LCD.print("Saved...");
delay(1000);
}
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(1000);
}
void f_LCD_P()
{
LCD.setCursor(0, 0);
LCD.print("P:");
LCD.print(vA_WriteP);
LCD.print(" ");
}
void setup() {
Serial.begin(115200);
Serial.println("Serial Started...");
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("KH");
LCD.setCursor(0, 1);
LCD.print("by b");
delay(1500);
LCD.clear();
}
void loop()
{
vT_Loop01=millis();
vA_ReadP=analogRead(pAi_Analog_01);
Serial.println(vA_ReadP);
vD_Read_Button02=digitalRead(pAi_Button_02);
vD_Read_Button03=digitalRead(pAi_Button_03);
/***************************************************************/
/*************** BUTTON 1 **************************************/
if(digitalRead(pAi_Button_01))
vD_Status_Button01=vD_Status_Button01 | 0b00000001;
if(digitalRead(!pAi_Button_01))
vD_Status_Button01=vD_Status_Button01 & 0b11111110;
if(vD_Status_Button01!=vD_Status_preButton01)
{
vD_Status_preButton01=vD_Status_Button01; // shift << 4 can be used ?
vD_Pre_Button01=vD_Read_Button01;
vT_Button01=vT_Loop01;
if(vD_Read_Button01)
Serial.println("Button1 Pressed");
if(!vD_Read_Button01)
Serial.println("Button1 Released");
}
else
{
if(vT_Loop01-vT_Button01>t_Short_Button_01)
{
if(vD_Status_Button01 & 0b00000001)
Serial.println("Button1 Short Pressed");
else
Serial.println("Button1 Short Released");
}
if(vT_Loop01-vT_Button01>t_Long_Button_01)
{
if(vD_Status_Button01 & 0b00000001)
Serial.println("Button1 Long Pressed");
else
Serial.println("Button1 Long Released");
}
if(vT_Loop01-vT_Button01>t_Long_Button_01)
if(vD_Status_preButton01 | 0b00000000)
vD_Status_Button01
{
vD_Pro_Button01=1;
Serial.println("Button1 Long Pressed");
}
else
{
vD_Pro_Button01=0;
}
}
/***************************************************************/
/*************** BUTTON 2 **************************************/
if(vD_Read_Button02!=vD_Pre_Button02)
{
vD_Pre_Button02=vD_Read_Button02;
vT_Button02=vT_Loop01;
Serial.println("Button2 Pressed");
}
else
{
if(vT_Loop01-vT_Button02>t_Long_Button_02 && vD_Read_Button02==1)
{
vD_Pro_Button02=1;
Serial.println("Button2 Long Pressed");
// vD_SetOffset=vD_SetOffset+10;
}
else
{
vD_Pro_Button02=0;
}
}
/***************************************************************/
/*************** BUTTON 3 **************************************/
if(vD_Read_Button03!=vD_Pre_Button03)
{
vD_Pre_Button03=vD_Read_Button03;
vT_Button03=vT_Loop01;
Serial.println("Button3 Pressed");
}
else
{
if(vT_Loop01-vT_Button03>t_Long_Button_03 && vD_Read_Button03==1)
{
vD_Pro_Button03=1;
Serial.println("Button3 Long Pressed");
}
else
{
vD_Pro_Button03=0;
}
}
if(vD_MenuLoop==0)
{
if(vD_Pro_Button01==1)
{
delay(1000);
vD_MenuLoop=1;
vD_Pro_Button01=0;
vD_Read_Button01=0;
vT_Button01=vT_Button01+2000;
vT_ReadButton=vT_Button01+3000;
LCD.clear();
}
}
if(vD_MenuLoop==1)
{
if(vD_Pro_Button01==1)
{
delay(1000);
vD_MenuLoop=2;
vD_Pro_Button01=0;
vD_Read_Button01=0;
vT_Button01=vT_Button01+2000;
// vT_ReadButton=vT_Button01+3000;
LCD.clear();
}
if(vD_Read_Button02==1)
vD_SetOffset=vD_SetOffset+1;
if(vD_Pro_Button02==1)
vD_SetOffset=vD_SetOffset+10;
if(vD_Read_Button03==1)
vD_SetOffset=vD_SetOffset-1;
if(vD_Pro_Button03==1)
vD_SetOffset=vD_SetOffset-10;
}
if(vD_MenuLoop==2)
{
if(vD_Pro_Button01==1)
{
delay(1000);
vD_MenuLoop=3;
vD_Pro_Button01=0;
vD_Read_Button01=0;
vT_Button01=vT_Button01+2000;
LCD.clear();
}
if(vD_Read_Button02==1)
vD_SetMult=vD_SetMult+1;
if(vD_Pro_Button02==1)
vD_SetMult=vD_SetMult+10;
if(vD_Read_Button03==1)
vD_SetMult=vD_SetMult-1;
if(vD_Pro_Button03==1)
vD_SetMult=vD_SetMult-10;
}
if(vD_MenuLoop==3)
{
if(vD_Pro_Button01==1)
{
delay(1000);
vD_MenuLoop=4;
vD_Pro_Button01=0;
vD_Read_Button01=0;
vT_Button01=vT_Button01+2000;
LCD.clear();
}
if(vD_Read_Button02==1)
vD_SetK1=vD_SetK1+1;
if(vD_Pro_Button02==1)
vD_SetK1=vD_SetK1+10;
if(vD_Read_Button03==1)
vD_SetK1=vD_SetK1-1;
if(vD_Pro_Button03==1)
vD_SetK1=vD_SetK1-10;;
}
if(vD_MenuLoop==4)
{
if(vD_Pro_Button01==1)
{
delay(1000);
vD_MenuLoop=5;
vD_Pro_Button01=0;
vD_Read_Button01=0;
vT_Button01=vT_Button01+2000;
LCD.clear();
}
if(vD_Read_Button02==1)
vD_SetK2=vD_SetK2+1;
if(vD_Pro_Button02==1)
vD_SetK2=vD_SetK2+10;
if(vD_Read_Button03==1)
vD_SetK2=vD_SetK2-1;
if(vD_Pro_Button03==1)
vD_SetK2=vD_SetK2-10;
}
if(vD_MenuLoop==5)
{
if(vD_Pro_Button01==1)
{
delay(1000);
if(vD_SaveSet)
f_SaveSet();
vD_MenuLoop=0;
vD_Pro_Button01=0;
vD_Read_Button01=0;
vT_Button01=vT_Button01+2000;
LCD.clear();
}
if(vD_Read_Button02==1)
vD_SaveSet=!vD_SaveSet;
if(vD_Pro_Button02==1)
vD_SaveSet=!vD_SaveSet;
if(vD_Read_Button03==1)
vD_SaveSet=!vD_SaveSet;
if(vD_Pro_Button03==1)
vD_SaveSet=!vD_SaveSet;
}
vA_WriteC=vA_ReadP/100;
vA_WriteC=vA_WriteC*vD_SetMult;
vA_WriteC=vA_WriteC+vD_SetOffset;
vA_WriteP=vA_WriteC;
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_MenuLoop==0)
{
f_LCD_P();
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();
LCD.setCursor(0, 1);
LCD.print("Set Off.:");
LCD.print(vD_SetOffset);
LCD.print(" ");
}
if(vD_MenuLoop==2)
{
f_LCD_P();
LCD.setCursor(0, 1);
LCD.print("Set Mul.:");
LCD.print(vD_SetMult);
LCD.print(" ");
}
if(vD_MenuLoop==3)
{
f_LCD_P();
LCD.setCursor(0, 1);
LCD.print("Set K1:");
LCD.print(vD_SetK1);
LCD.print(" ");
}
if(vD_MenuLoop==4)
{
f_LCD_P();
LCD.setCursor(0, 1);
LCD.print("Set K2:");
LCD.print(vD_SetK2);
LCD.print(" ");
}
if(vD_MenuLoop==5)
{
f_LCD_P();
if(vD_SaveSet==true)
{
LCD.setCursor(0, 1);
LCD.print("Save changes");
}
else
{
LCD.setCursor(0, 1);
LCD.print("No change ");
}
}
delay(500);
}