#include <Blynk.h>
#define BLYNK_PRINT Serial
// #include <WiFi.h>
// #include <FirebaseESP32.h>
// #define FIREBASE_HOST "https://demostarter-122a1-default-rtdb.firebaseio.com/" // Firebase host
// #define FIREBASE_AUTH "KVZBKvkLbe8FKJy0Z0dwnCLTiDlmzVbK8d4pNiPZ" //Firebase Auth code
// #define WIFI_SSID "SANA" //Enter your wifi Name
// #define WIFI_PASSWORD "9787480324" // Enter your password
// FirebaseData firebaseData;
// FirebaseJson json;
#include <EEPROM.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
int8_t threephase,oldstate,twophase,run,arun,ct,threest,tm,pp,threestp;
unsigned int v[3]={0,0,0},y[3]={0,0,0},w1[3]={0,0,0},s1[3]={0,0,0},t1[3]={0,0,0},p1[3]={0,0,0},ht[3]={0,0,0},at1[3]={0,0,0},ct1[3]={0,0,0};
uint32_t rVolt,yVolt,bVolt,crcurt,cycurt;
int8_t l,m,n;
int vr,vy,vb,lv,hv,dr,hc,cr,cy,sp,cnt,cpd;
int sc=0;
int Menubtnstate=1;
const int Menubtn = 34;
const int Upbtn = 35;
const int Downbtn = 32;
const int Stopbtn = 33;
const int Startbtn = 25;
const int Autobtn = 36;
const int Dryrunbtn = 39;
const int Phasebtn = 23;
const int ORelComm = 15;
const int ORelstar = 2;
const int ORelDelt = 4;
const int ORelPhas = 16;
const int OpLED3Ph = 19;
const int OpLED2Ph = 18;
const int OpLEDRun = 5;
int buttonState = 0;
int lastButtonState = 0;
int ubuttonState = 0;
int ulastButtonState = 0;
int dbuttonState = 0;
int dlastButtonState = 0;
int spbuttonState = 0;
int splastButtonState = 0;
int stbuttonState = 0;
int stlastButtonState = 0;
int atbuttonState = 0;
int atlastButtonState = 0;
int drbuttonState = 0;
int drlastButtonState = 0;
int phbuttonState = 0;
int phlastButtonState = 0;
bool bPress = false;
BlynkTimer timer;
int lcdColumns = 16;
int lcdRows = 2;
LiquidCrystal_I2C lcd(0x27, lcdColumns, lcdRows);
void setup()
{
Serial.begin(9600);
// Blynk.begin(auth, ssid, pass);
// WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
// Serial.print("Connecting to Wi-Fi");
// while (WiFi.status() != WL_CONNECTED)
// {
// Serial.print(".");
// // delay(300);
// }
// Serial.println();
// Serial.print("Connected with IP: ");
// Serial.println(WiFi.localIP());
// Serial.println("WiFi connected");
// Firebase.begin(FIREBASE_HOST, FIREBASE_AUTH);
// Firebase.reconnectWiFi(true);
// Firebase.setReadTimeout(firebaseData, 1000 * 60);
// Firebase.setwriteSizeLimit(firebaseData, "tiny");
// Serial.println("------------------------------------");
// Serial.println("Connected...");
EEPROM.begin(512);
lcd.init();
lcd.backlight();
pinMode(Menubtn, INPUT_PULLUP);
pinMode(Upbtn, INPUT_PULLUP);
pinMode(Downbtn, INPUT_PULLUP);
pinMode(Stopbtn, INPUT_PULLUP);
pinMode(Startbtn, INPUT_PULLUP);
pinMode(Autobtn, INPUT);
pinMode(Dryrunbtn, INPUT);
pinMode(Phasebtn, INPUT);
pinMode(ORelComm, OUTPUT);
pinMode(ORelstar, OUTPUT);
pinMode(ORelDelt, OUTPUT);
pinMode(ORelPhas, OUTPUT);
pinMode(OpLED3Ph, OUTPUT);
pinMode(OpLED2Ph, OUTPUT);
pinMode(OpLEDRun, OUTPUT);
digitalWrite(ORelComm,LOW);
digitalWrite(ORelstar,LOW);
digitalWrite(ORelDelt,LOW);
digitalWrite(ORelPhas,LOW);
digitalWrite(OpLED3Ph,LOW);
digitalWrite(OpLED2Ph,LOW);
digitalWrite(OpLEDRun,LOW);
timer.setInterval(100, myTimerEvent);
lcd.setCursor(3, 0);
lcd.print("IoT Energy");
lcd.setCursor(5, 1);
lcd.print("Meter");
delay(200);
lcd.clear();
sc=0;
cnt=0;
threephase=0;
threestp=0;
twophase=0;
oldstate=0;
run=0;
arun=0;
ct=0;
tm=0;
pp=0;
l=0,m=0,n=0;
threest=0;
}
uint16_t get_max(uint8_t channel) {
uint16_t max_v = 0;
for(uint8_t i = 0; i < 20; i++) {
uint16_t r = analogRead(channel); // read from analog channel 3 (A3)
if(max_v < r) max_v = r;
delayMicroseconds(200);
}
return max_v;
}
uint32_t calcVolt(uint8_t channel,uint32_t vol)
{
vol = get_max(channel);
vol = vol * 1100/1023;
vol /= sqrt(2);
return vol/10;
}
uint32_t calcCurt(uint8_t channel,uint32_t vol)
{
vol = get_max(channel);
vol = vol * 1100/1023;
vol =(vol-5.0);
vol=vol*7.07;
vol=vol/310;
if((vol>=0) && (vol<=101))
{
return vol;
}
else{
return 0;
}
}
void off()
{
digitalWrite(ORelDelt,LOW);
digitalWrite(ORelstar,LOW);
digitalWrite(ORelComm,LOW);
digitalWrite(ORelPhas,LOW);
digitalWrite(OpLEDRun,LOW);
}
void timerr(int a,int b)
{
int count1=0;
long count2=0;
count2=a*(b);
while(count1!=count2)
{
spbuttonState = digitalRead(Stopbtn);
if (spbuttonState != splastButtonState)
{
if(spbuttonState==LOW)
{
if(((oldstate==1)||(oldstate==0)))
{
tm=1;
off1();
off();
}
delayMicroseconds(100);
}
}
splastButtonState = spbuttonState;
if((twophase==0)&&(pp==1)&&(threestp==1))
{
pp=0;
off();
off1();
threestp=0;
}
if(((twophase==0)&&(threephase==0))||((twophase==1)&&(threephase==1)))
{
off();
off1();
}
delayMicroseconds(1000);
count1++;
}
}
void off1()
{
oldstate=0;
run=0;
arun=0;
threephase=0;
twophase=0;
digitalWrite(OpLEDRun,LOW);
}
void voltoff()
{
if(((twophase==0)&&(threephase==0))||((twophase==1)&&(threephase==1)))
{
off();
off1();
}
}
int calcthree(unsigned int Tvol[3])
{
return ((Tvol[0]*100)+(Tvol[1]*10)+Tvol[2]);
}
int calctwo(unsigned int Tvol[3])
{
return ((Tvol[0]*0)+(Tvol[1]*10)+Tvol[2]);
}
void Incrementvalue()
{
buttonState = digitalRead(Menubtn);
if (buttonState != lastButtonState)
{
if (buttonState == LOW)
{
bPress = true;
sc++;
lcd.clear();
Serial.println("on");
Serial.print("number of button pushes: ");
Serial.println(sc);
}
delay(50);
}
lastButtonState = buttonState;
}
void Rdi(int8_t address1,int8_t address2,int8_t address3,unsigned int Tvol[])
{
char val1,val2,val3;
val1=EEPROM.read(address1);
val2=EEPROM.read(address2);
val3=EEPROM.read(address3);
Tvol[0] = val1;
Tvol[1] = val2;
Tvol[2] = val3;
l=val1;
m=val2;
n=val3;
}
void WriEEP(int8_t addk1,int8_t addk2,int8_t addk3,int8_t lt1,int8_t lt2,int8_t lt3)
{
EEPROM.write(addk1,lt1);
EEPROM.write(addk2,lt2);
EEPROM.write(addk3,lt3);
}
void Wri(int8_t add1,int8_t add2,int8_t add3,int8_t lt1,int8_t lt2,int8_t lt3,String a,String b,unsigned int Tvol[])
{
Rdi(add1,add2,add3,Tvol);
if(digitalRead(Stopbtn)==LOW)
{
if(sc==1)
{
WriEEP(1,2,3,2,8,0);
WriEEP(4,5,6,1,8,0);
WriEEP(7,8,9,0,1,5);
WriEEP(10,11,12,0,2,0);
WriEEP(13,14,15,0,0,5);
WriEEP(16,17,18,0,0,3);
WriEEP(19,20,21,0,0,1);
WriEEP(22,23,24,0,0,5);
lcd.clear();
}
}
ubuttonState = digitalRead(Upbtn);
if (ubuttonState != ulastButtonState)
{
if (ubuttonState == LOW)
{
if((l==lt1)&&(m==lt2)&&(n==lt3))
{
l=lt1;
m=lt2;
n=lt3;
}
else if((n<9))
{
n++;
}
else if((m<9)&&(n>8))
{
m++;
n=0;
}
else if((l<2)&&(m>=8)&&(n>=8))
{
l++;
n=0;
m=0;
}
EEPROM.write(add1,l);
EEPROM.write(add2,m);
EEPROM.write(add3,n);
}
delay(50);
}
ulastButtonState = ubuttonState;
dbuttonState = digitalRead(Downbtn);
if (dbuttonState != dlastButtonState)
{
if (dbuttonState == LOW)
{
if((n>1)||(n==1))
{
n=n-1;
if((n==0)&&(m==0)&&(l==0))
{
n=1;
}
}
else if((m>0)&&(n<8))
{
m=m-1;
n=9;
}
else if((l>=1)&&((m<8)||(m==8))&&((n<8)||(n==8)))
{
l=l-1;
n=9;
m=9;
}
//else if(l>1)
//{
//l=2;
//}
EEPROM.write(add1,l);
EEPROM.write(add2,m);
EEPROM.write(add3,n);
}
delay(50);
}
dlastButtonState = dbuttonState;
lcd.setCursor(0, 0);
lcd.print(a);
lcd.print(b);
lcd.print(Tvol[0]);
lcd.print(Tvol[1]);
lcd.print(Tvol[2]);
}
void start()
{
lcd.clear();
sc=0;
switchpoint();
digitalWrite(OpLEDRun,LOW);
timerr(1,1);
// if(tm==0)
{
digitalWrite(ORelComm,HIGH);
timerr(1,1);
// if(tm==0)
{
digitalWrite(ORelstar,HIGH);
if(twophase==1)
{
timerr(1,1);
// if(tm==0)
{
digitalWrite(ORelPhas,HIGH);
}
tm=0;
}
timerr(200,(ht[2]));
digitalWrite(ORelstar,LOW);
timerr(200,1);
if((digitalRead(ORelstar) ==LOW))
{
// if(tm==0)
{
digitalWrite(ORelDelt,HIGH);
}
tm=0;
}
oldstate=1;
timerr(1,3);
}
tm=0;
}
tm=0;
}
void myTimerEvent()
{
// Serial.print("Vrms: ");
// Serial.print(rVolt);
// Serial.print("V");
// Serial.print("\tIrms: ");
// Serial.print(rVolt);
// Serial.print("A");
// delay(100);
rVolt=calcVolt(26,rVolt);
yVolt=calcVolt(27,yVolt);
bVolt=calcVolt(14,bVolt);
crcurt=calcCurt(12,crcurt);
cycurt=calcCurt(13,cycurt);
// json.set("/RVOLT", rVolt);
// json.set("/YVOLT", yVolt);
// json.set("/BVOLT", bVolt);
// json.set("/CRCURT", crcurt);
// json.set("/CYCURT", cycurt);
// Firebase.updateNode(firebaseData,"/Sensor",json);
spbuttonState = digitalRead(Stopbtn);
if (spbuttonState != splastButtonState)
{
if(spbuttonState==LOW)
{
if((oldstate==1)||(oldstate==0))
{
tm=1;
off1();
off();
}
}
delay(50);
}
splastButtonState = spbuttonState;
if((twophase==0)&&(pp==1)&&(threestp==1))
{
pp=0;
off();
off1();
threestp=0;
}
if(((twophase==0)&&(threephase==0))||((twophase==1)&&(threephase==1)))
{
off();
off1();
}
}
void switchpoint()
{
switch(sc)
{
case 0:
char buf1[10],buf2[10],buf3[10],buf4[10],buf5[10];
sprintf(buf1, "%03u", rVolt);
sprintf(buf2, "%03u", yVolt);
sprintf(buf3, "%03u", bVolt);
lcd.setCursor(0, 0);
lcd.print("R");
lcd.print(buf1);
lcd.setCursor(6, 0);
lcd.print("Y");
lcd.print(buf2);
lcd.setCursor(12, 0);
lcd.print("B");
lcd.print(buf3);
sprintf(buf4, "%03u", crcurt);
sprintf(buf5, "%03u", cycurt);
lcd.setCursor(0, 1);
lcd.print("CR");
lcd.print(buf4);
lcd.setCursor(8, 1);
lcd.print("CY");
lcd.print(buf5);
// delay(100);
// Blynk.virtualWrite(V0, emon.Vrms);
// Blynk.virtualWrite(V1, emon.Irms)
break;
case 1:
Wri(1,2,3,2,8,0,"HIGH ","VOLT ",v);
break;
case 2:
Wri(4,5,6,1,8,0,"LOWW ","VOLT ",y);
break;
case 3:
Wri(7,8,9,0,3,0,"3PHS ","HCUR ",s1);
break;
case 4:
Wri(10,11,12,0,3,0,"2PHS ","HCUR ",w1);
break;
case 5:
Wri(13,14,15,0,1,5,"DRYY ","RUNN ",p1);
break;
case 6:
Wri(16,17,18,0,0,5,"DELT ","TIME ",ht);
break;
case 7:
Wri(19,20,21,0,0,9,"AUTO ","TIME ",at1);
break;
case 8:
Wri(22,23,24,0,1,5,"CAPS ","TIME ",ct1);
sc=-1;
break;
case 14:
lcd.setCursor(0, 0);
lcd.print("HIGH ");
lcd.print("CURR ");
lcd.print("OFF");
break;
case 15:
lcd.setCursor(0, 0);
lcd.print("DRY ");
lcd.print("RUN ");
lcd.print("OFF");
break;
}
}
void loop()
{
timer.run();
voltoff();
buttonState = digitalRead(Menubtn);
if (buttonState != lastButtonState)
{
if (buttonState == LOW)
{
sc=sc+1;
lcd.clear();
switchpoint();
}
delay(50);
}
lastButtonState = buttonState;
switchpoint();
Rdi(22,23,24,ct1);
Rdi(19,20,21,at1);
Rdi(16,17,18,ht);
Rdi(13,14,15,p1);
Rdi(10,11,12,w1);
Rdi(1,2,3,v);
Rdi(4,5,6,y);
Rdi(7,8,9,s1);
rVolt=calcVolt(26,rVolt);
yVolt=calcVolt(27,yVolt);
bVolt=calcVolt(14,bVolt);
vb=bVolt;
vy=yVolt;
vr=rVolt;
lv=calcthree(y);
hv=calcthree(v);
cpd=calctwo(ct1);
if((((vr>=lv)&&(vr<=hv))&&((vy>=lv)&&(vy<=hv)))&&((vb>=lv)&&(vb<=hv)))
{
threephase=1;
twophase=0;
threest=1;
threestp=1;
digitalWrite(OpLED3Ph,HIGH);
digitalWrite(OpLED2Ph,LOW);
}
else
{
threephase=0;
twophase=0;
digitalWrite(OpLED3Ph,LOW);
}
if(((vr>=lv)&&(vr<=hv))&&((vy>=lv)&&(vy<=hv))&&(vb<15))
{
digitalWrite(OpLED2Ph,HIGH);
digitalWrite(OpLED3Ph,LOW);
twophase=0;
threephase=0;
phbuttonState = digitalRead(Phasebtn);
if(phbuttonState==0)
{
threephase=0;
twophase=1;
}
else
{
twophase=0;
}
}
else
{
twophase=0;
digitalWrite(OpLED2Ph,LOW);
}
stbuttonState = digitalRead(Startbtn);
if (stbuttonState != stlastButtonState)
{
if(stbuttonState==LOW)
{
if((run==0)&&(arun==0)&&(oldstate==0)&&((twophase==1)||(threephase==1)))
{
start();
run=1;
ct=1;
sc=0;
}
}
delay(50);
}
stlastButtonState = stbuttonState;
atbuttonState = digitalRead(Autobtn);
if(atbuttonState==LOW)
{
if((arun==0)&&(run==0)&&(oldstate==0)&&(((threephase==1)||(twophase==1))))
{
digitalWrite(OpLEDRun,LOW);
timerr(1000,((at1[2])*60));
// if(tm==0)
{
atbuttonState = digitalRead(Autobtn);
if(atbuttonState==LOW)
{
if((arun==0)&&(run==0)&&(oldstate==0)&&((threephase==1)||(twophase==1)))
{
start();
arun=1;
ct=1;
sc=0;
}
}
}
tm=0;
}
}
if((run==1)||(arun==1))
{
digitalWrite(OpLEDRun,HIGH);
}
if(((run==1)||(arun==1))&&(ct==1)&&(twophase==1))
{
timerr(300,cpd);
digitalWrite(ORelPhas,LOW);
ct=0;
pp=1;
timerr(1,1);
}
voltoff();
if(((twophase==0)&&(threephase==0))||((twophase==1)&&(threephase==1)))
{
off();
off1();
}
if((twophase==0)&&(pp==1)&&(threestp==1))
{
pp=0;
off();
off1();
threestp=0;
}
if((twophase==1)&&(threestp==1))
{
off();
off1();
threestp=0;
}
crcurt=calcCurt(12,crcurt);
cycurt=calcCurt(13,cycurt);
cr=crcurt;
cy=cycurt;
sp=calctwo(w1);
dr=calctwo(p1);
hc=calctwo(s1);
if(((((cr>=hc)||(cy>=hc))&&(oldstate==1))&&(threephase==1))||((((cr>=sp)||(cy>=sp))&&(oldstate==1))&&(twophase==1)))
{
off();
off1();
oldstate=1;
lcd.clear();
sc=14;
}
if((cr<=dr)||(cy<=dr))
{
if(oldstate==1)
{
if((threephase==1)||(twophase==1))
{
drbuttonState = digitalRead(Dryrunbtn);
if(drbuttonState==LOW)
{
off();
off1();
oldstate=1;
lcd.clear();
sc=15;
}
}
}
}
spbuttonState = digitalRead(Stopbtn);
if (spbuttonState != splastButtonState)
{
if(spbuttonState==LOW)
{
if(((oldstate==1)||(oldstate==0)))
{
off1();
off();
if((sc==14)||(sc==15))
{
lcd.clear();
sc=0;
}
}
}
delay(50);
}
splastButtonState = spbuttonState;
}