// #include <Blynk.h>
// #define BLYNK_PRINT Serial
#include <EEPROM.h>
#include <Wire.h>
#include <WiFi.h>
#include <LiquidCrystal_I2C.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 "Wokwi-GUEST" //Enter your wifi Name
#define WIFI_PASSWORD ""// Enter your password
FirebaseData firebaseData;
FirebaseJson json;
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},A3S[3]={0,0,0},A2S[3]={0,0,0},P2S[3]={0,0,0},DRS[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 = 33;
const int Upbtn = 25;
const int Downbtn = 26;
const int Stopbtn = 27;
const int Startbtn = 14;
const int Autobtn = 12;
const int Dryrunbtn = 13;
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;
// char auth[] = "hsYG_5da4gdP9jZkL18O5RNcJSrBT-Ou";
// char ssid[] = "Alexahome";
// char pass[] = "loranthus";
int lcdColumns = 16;
int lcdRows = 2;
LiquidCrystal_I2C lcd(0x27, lcdColumns, lcdRows);
void setup()
{
// Serial.begin(9600);
// Blynk.begin(auth, ssid, pass);
EEPROM.begin(512);
lcd.init();
lcd.backlight();
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
// Serial.print("Connecting to Wi-Fi");
while (WiFi.status() != WL_CONNECTED)
{
lcd.setCursor(3, 0);
lcd.print("Connecting....");
// delay(300);
}
Firebase.begin(FIREBASE_HOST, FIREBASE_AUTH);
Firebase.reconnectWiFi(true);
json.set("/pstart", 0);
json.set("/pstop", 0);
json.set("/pmenu", 0);
json.set("/pup", 0);
json.set("/pdown", 0);
Firebase.updateNode(firebaseData,"/Sensor",json);
pinMode(Menubtn, INPUT_PULLUP);
pinMode(Upbtn, INPUT_PULLUP);
pinMode(Downbtn, INPUT_PULLUP);
pinMode(Stopbtn, INPUT_PULLUP);
pinMode(Startbtn, INPUT_PULLUP);
pinMode(Autobtn, INPUT_PULLUP);
pinMode(Dryrunbtn, INPUT_PULLUP);
pinMode(Phasebtn, INPUT_PULLUP);
pinMode(ORelComm, OUTPUT);
pinMode(ORelstar, OUTPUT);
pinMode(ORelDelt, OUTPUT);
pinMode(ORelPhas, OUTPUT);
pinMode(OpLED3Ph, OUTPUT);
pinMode(OpLED2Ph, OUTPUT);
pinMode(OpLEDRun, OUTPUT);
digitalWrite(ORelComm,HIGH);
digitalWrite(ORelstar,HIGH);
digitalWrite(ORelDelt,HIGH);
digitalWrite(ORelPhas,HIGH);
digitalWrite(OpLED3Ph,LOW);
digitalWrite(OpLED2Ph,LOW);
digitalWrite(OpLEDRun,LOW);
// timer.setInterval(100, myTimerEvent);
lcd.setCursor(3, 0);
lcd.print("IOT STARTER");
lcd.setCursor(5, 1);
lcd.print("DEMO TEST");
delay(2000);
lcd.clear();
sc=0;
cnt=0;
threephase=0;
threestp=0;
twophase=0;
oldstate=0;
run=0;
arun=0;
ct=0;
tm=0;
pp=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,HIGH);
digitalWrite(ORelstar,HIGH);
digitalWrite(ORelComm,HIGH);
digitalWrite(ORelPhas,HIGH);
digitalWrite(OpLEDRun,LOW);
}
void timerr(int a,int b)
{
int count1=0;
long count2=0;
count2=a*(b);
while(count1!=count2)
{
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]);
}
int calcone(unsigned int Tvol[3])
{
return ((Tvol[0]*0)+(Tvol[1]*0)+Tvol[2]);
}
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);
EEPROM.commit();
}
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,3,8,0);
WriEEP(4,5,6,1,8,0);
WriEEP(7,8,9,0,8,5);
WriEEP(10,11,12,0,8,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);
WriEEP(25,26,27,0,0,1);
WriEEP(28,29,30,0,0,1);
WriEEP(31,32,33,0,0,1);
WriEEP(34,35,36,0,0,1);
lcd.clear();
}
}
ubuttonState = digitalRead(Upbtn);
if (ubuttonState != ulastButtonState)
{
if (ubuttonState == LOW)
{
lcd.clear();
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);
EEPROM.commit();
}
////delay(50);
}
ulastButtonState = ubuttonState;
dbuttonState = digitalRead(Downbtn);
if (dbuttonState != dlastButtonState)
{
if (dbuttonState == LOW)
{
lcd.clear();
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);
EEPROM.commit();
}
////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;
rVolt=calcVolt(34,rVolt);
yVolt=calcVolt(35,yVolt);
bVolt=calcVolt(32,bVolt);
vb=bVolt;
vy=yVolt;
vr=rVolt;
switchpoint();
digitalWrite(OpLEDRun,HIGH);
timerr(1,1);
// if(tm==0)
{
digitalWrite(ORelComm,LOW);
timerr(1,1);
// if(tm==0)
{
digitalWrite(ORelstar,LOW);
if(twophase==1)
{
timerr(1,1);
// if(tm==0)
{
digitalWrite(ORelPhas,LOW);
}
tm=0;
}
timerr(200,(ht[2]));
digitalWrite(ORelstar,HIGH);
timerr(200,1);
if((digitalRead(ORelstar) ==HIGH))
{
// if(tm==0)
{
digitalWrite(ORelDelt,LOW);
}
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);
// // 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,3,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,9,0,"3PHS ","HCUR ",s1);
break;
case 4:
Wri(10,11,12,0,9,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);
break;
case 9:
Wri(25,25,27,0,0,2,"3AUT ","SWTH ",A3S);
if(calcone(A3S)==1)
{
lcd.setCursor(1, 1);
lcd.print("OFF");
}
else
{
lcd.setCursor(1, 1);
lcd.print("ON ");
}
break;
case 10:
Wri(28,29,30,0,0,2,"2AUT ","SWTH ",A2S);
if(calcone(A2S)==1)
{
lcd.setCursor(1, 1);
lcd.print("OFF");
}
else
{
lcd.setCursor(1, 1);
lcd.print("ON ");
}
break;
case 11:
Wri(31,32,33,0,0,2,"2PHS ","SWTH ",P2S);
if(calcone(P2S)==1)
{
lcd.setCursor(1, 1);
lcd.print("OFF");
}
else
{
lcd.setCursor(1, 1);
lcd.print("ON ");
}
break;
case 12:
Wri(34,35,36,0,0,2,"DRYN ","SWTH ",DRS);
if(calcone(DRS)==1)
{
lcd.setCursor(1, 1);
lcd.print("OFF");
}
else
{
lcd.setCursor(1, 1);
lcd.print("ON ");
}
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 Voltagecheck()
{
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 == LOW)&&(calcone(P2S)==2))
{
threephase=0;
twophase=1;
}
else
{
twophase=0;
}
}
else
{
twophase=0;
digitalWrite(OpLED2Ph,LOW);
}
}
void loop()
{
// Blynk.run();
// int
// timer.run();
voltoff();
// Incrementvalue();
// if( bPress)
// {
// bPress = false;
// Serial.print(sc);
// }
buttonState = digitalRead(Menubtn);
if (buttonState != lastButtonState)
{
if (buttonState == LOW)
{
sc++;
lcd.clear();
// Serial.println("on");
// Serial.print("number of button pushes: ");
// Serial.println(sc);
}
// //delay(50);
}
lastButtonState = buttonState;
switchpoint();
Rdi(34,35,36,DRS);
Rdi(31,32,33,P2S);
Rdi(28,29,30,A2S);
Rdi(25,26,27,A3S);
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(34,rVolt);
yVolt=calcVolt(35,yVolt);
bVolt=calcVolt(32,bVolt);
vb=bVolt;
vy=yVolt;
vr=rVolt;
lv=calcthree(y);
hv=calcthree(v);
cpd=calctwo(ct1);
lcd.clear();
if (Firebase.RTDB.getInt(&firebaseData, "/Sensor/pstart"))
{
if (firebaseData.dataType() == "int") {
int Value = firebaseData.intData();
lcd.print(Value);
}
}
if(Firebase.getString(firebaseData,"/Sensor","/pstart")==1)
{
digitalWrite(Startbtn,LOW);
}
Voltagecheck();
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)&&(calcone(A3S)==2))||((twophase==1)&&(calcone(A2S)==2)))))
{
digitalWrite(OpLEDRun,LOW);
// timerr(1000,((at1[2])*60));
int countr1=0;
long countr2=0;
lcd.clear();
countr2=((at1[2])*1000);
while(countr1!=countr2)
{
lcd.setCursor(0, 0);
lcd.print("MOTOR ");
lcd.print("AUTO START");
lcd.setCursor(0, 1);
lcd.print(countr2/1000);
delayMicroseconds(1000);
countr2--;
}
Voltagecheck();
atbuttonState = digitalRead(Autobtn);
if(atbuttonState == LOW)
{
if((arun==0)&&(run==0)&&(oldstate==0)&&((((threephase==1)&&(calcone(A3S)==2))||((twophase==1)&&(calcone(A2S)==2)))))
{
start();
arun=1;
ct=1;
sc=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(36,crcurt);
cycurt=calcCurt(39,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)&&(calcone(DRS)==2))
{
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;
}