#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 20, 4);
#include <EEPROM.h>
int m,v,vo,vu,dl,dly,dly1,tmp;
unsigned long vtm;
bool st,dt;
#define ENCODER_CLK 2
#define ENCODER_DT 3
#define ENCODER_SW 4
void setup(){
Serial.begin(9600);
lcd.init();
lcd.backlight();
pinMode(5,OUTPUT);
pinMode(ENCODER_CLK, INPUT);
pinMode(ENCODER_DT, INPUT);
pinMode(ENCODER_SW, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(ENCODER_CLK), readEncoder, FALLING);
lcd.setCursor(0,0);
lcd.print("MAIN:250V OP:OFF");
lcd.setCursor(0,1);
lcd.print("OU:250-210V D:10");
vo=EEPROM.read(0);
vo=vo+EEPROM.read(1)*100;
if(vo>300) vo=0;
vu=EEPROM.read(2);
if(vu>200) vu=0;
dl=EEPROM.read(3);
if(dl>50) dl=0;
}
void loop(){
for(int i=0;i<500;i++){
v=analogRead(A0);
v=map(v,0,1023,0,655);
vtm=vtm+v;
}
dly1++;
if(dly1>9){dly1=0;dt=!dt;}
v=vtm/5000;
v=(v*10);
//if(v<0)v=0;
vtm=0;
if(v<vu|v>vo){
digitalWrite(5,0);
dly=dly1=0;dt=1;
}
if(v>vu&v<vo-1){
if(dly<dl&dly1==9)dly++;
if(dly==dl){ digitalWrite(5,1);dt=1; }
}
if(m==0){
lcd.setCursor(5,0);
if(v<100)lcd.print(" ");
lcd.print(v);
lcd.setCursor(13,0);
if(digitalRead(5))lcd.print("ON ");
else lcd.print("OFF");
//lcd.print("MAIN:250V OP:OFF");
lcd.setCursor(3,1);
if(vo<100)lcd.print(" ");
lcd.print(vo);
lcd.setCursor(7,1);
lcd.print(vu);
if(vu<100)lcd.print("V ");
else lcd.print("V");
lcd.setCursor(14,1);
if(dt|digitalRead(5)) lcd.print(dl);
else lcd.print(" ");
lcd.print(" ");
}
if (digitalRead(ENCODER_SW) == LOW){st=0;}
if(st==0){
lcd.clear();
m++;
if(m>3){
lcd.setCursor(0,0);
lcd.print("MAIN:250V OP:OFF");
lcd.setCursor(0,1);
lcd.print("OU:250-210V D:10");
EEPROM.update(0,vo%100);
EEPROM.update(1,vo/100);
EEPROM.update(2,vu);
EEPROM.update(3,dl);
m=0;}
st=1;
}
if(m==1){
lcd.setCursor(0,0);
lcd.print(" SET OVER-VOLT ");
lcd.setCursor(6,1);
lcd.print(vo);
}
if(m==2){
lcd.setCursor(0,0);
lcd.print(" SET UNDER-VOLT ");
lcd.setCursor(6,1);
lcd.print(vu);
}
if(m==3){
lcd.setCursor(0,0);
lcd.print(" SET ON-DELAY ");
lcd.setCursor(7,1);
lcd.print(dl);
lcd.print(" ");
}
}
void readEncoder() {
int dtValue = digitalRead(ENCODER_DT);
if (dtValue == HIGH) {
//counter++; // Clockwise
if(m==1)vo+=10;
if(m==2)vu+=10;
if(m==3)dl+=1;
if(vo>300)vo=300;
if(vu>200)vu=200;
if(dl>50)dl=50;
st=1;
}
if (dtValue == LOW) {
//counter--; // Counterclockwise
if(m==1)vo-=10;
if(m==2)vu-=10;
if(m==3)dl-=1;
if(vo<200)vo=200;
if(vu<100)vu=100;
if(dl<0)dl=0;
st=1;
}
}