#include <Blynk.h>
#define BLYNK_PRINT Serial
// #include <WiFi.h>
// #include <WiFiClient.h>
// #include <BlynkSimpleEsp32.h>
#include <EEPROM.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
short threephase,oldstate,twophase,run,arun,ct,threest,tm,pp,threestp;
unsigned short voltr[3]={0,0,0},volty[3]={0,0,0},voltb[3]={0,0,0},curtr[3]={0,0,0},curty[3]={0,0,0};
// unsigned short 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};
unsigned short v,y,w1,s1,t1[3],p1,ht,at1,ct1;
uint32_t rVolt,yVolt,bVolt,crcurt,cycurt;
unsigned short l,m,n;
unsigned int vr,vy,vb,lv,hv,dr,hc,cr,cy,sp,cnt,cpd;
int sc;
int Menubtnstate=1;
int Menubtn = 36;
int Upbtn = 39;
int Downbtn = 34;
int Stopbtn = 35;
int Startbtn = 32;
int Autobtn = 33;
int Dryrunbtn = 25;
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);
// calcIrms(uint8_t channel)
// {
// #if defined emonTxV3
// int SupplyVoltage=3300;
// #else
// int SupplyVoltage = readVcc();
// #endif
// for (unsigned int n = 0; n < 20; n++)
// {
// sampleI = analogRead(channel);
// // Digital low pass filter extracts the 2.5 V or 1.65 V dc offset,
// // then subtract this - signal is now centered on 0 counts.
// offsetI = (offsetI + (sampleI-offsetI)/1024);
// filteredI = sampleI - offsetI;
// // Root-mean-square method current
// // 1) square current values
// sqI = filteredI * filteredI;
// // 2) sum
// sumI += sqI;
// }
// double I_RATIO = ICAL *((SupplyVoltage/1000.0) / (ADC_COUNTS));
// Irms = I_RATIO * sqrt(sumI / Number_of_Samples);
// //Reset accumulators
// sumI = 0;
// //--------------------------------------------------------------------------------------
// return Irms;
// }
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;
return vol/310;
}
void Rdi(unsigned short address1,unsigned short address2,unsigned short address3,unsigned short Tvot)
{
short val1,val2,val3;
val1=EEPROM.read(address1);
val2=EEPROM.read(address2);
val3=EEPROM.read(address3);
l=val1;
m=val2;
n=val3;
}
void WriEEP(unsigned char addk1,unsigned char addk2,unsigned char addk3,unsigned char lt1,unsigned char lt2,unsigned char lt3)
{
EEPROM.write(addk1,lt1);
delay(1);
EEPROM.write(addk2,lt2);
delay(1);
EEPROM.write(addk3,lt3);
delay(1);
}
void Wri(unsigned short add1,unsigned short add2,unsigned short add3,unsigned char lt1,unsigned char lt2,unsigned char lt3,unsigned char a,unsigned char b,unsigned short Tvol)
{
Rdi(add1,add2,add3,Tvol);
if(Stopbtn==1)
{
if(sc==5)
{
WriEEP(0x0007,0x0008,0x0009,2,8,0);
WriEEP(0x000A,0x000B,0x000C,1,8,0);
WriEEP(0x0011,0x000D,0x000E,0,1,5);
WriEEP(0x0012,0x0005,0x0006,0,2,0);
WriEEP(0x0013,0x0003,0x0004,0,0,5);
WriEEP(0x0014,0x0001,0x0002,0,0,3);
WriEEP(0x0016,0x0017,0x000F,0,0,1);
WriEEP(0x0018,0x0019,0x0010,0,0,5);
}
}
if(Upbtn==1)
{
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(1);
}
while(Upbtn)
{
lcd.setCursor(0, 1);
lcd.print(a);
lcd.print(b);
lcd.print(Tvol);
};
if(Downbtn==1)
{
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(1);
}
while(Downbtn)
{
lcd.setCursor(0, 1);
lcd.print(a);
lcd.print(b);
lcd.print(Tvol);
};
lcd.setCursor(0, 1);
lcd.print(a);
lcd.print(b);
lcd.print(Tvol);
}
void switchpoint()
{
switch(sc)
{
case 0:
char buf1[10],buf2[10],buf3[10],buf4[10],buf5[10];
sprintf(buf1, "%03u", rVolt);
sprintf(buf2, "%03u", bVolt);
sprintf(buf3, "%03u", yVolt);
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(0x0007,0x0008,0x0009,2,8,0,'H','V',v);
break;
case 2:
Wri(0x000A,0x000B,0x000C,2,8,0,'L','V',y);
break;
case 3:
Wri(0x0011,0x000D,0x000E,0,3,0,3,'C',s1);
break;
case 4:
Wri(0x0012,0x0005,0x0006,0,3,0,2,'C',w1);
break;
case 5:
Wri(0x0013,0x0003,0x0004,0,1,5,'D','r',p1);
break;
case 6:
Wri(0x0014,0x0001,0x0002,0,0,5,'D','t',ht);
break;
case 7:
Wri(0x0016,0x0017,0x000F,0,0,9,'A','t',at1);
break;
case 8:
Wri(0x0018,0x0019,0x0010,0,1,5,'C','t',ct1);
break;
case 9:
sc=0;
break;
case 14:
lcd.setCursor(0, 1);
lcd.print("HIGH ");
lcd.print("Current");
lcd.print("OFF");
break;
case 15:
lcd.setCursor(0, 1);
lcd.print("DRY ");
lcd.print("RUN");
lcd.print("OFF");
break;
}
}
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);
bVolt=calcVolt(27,bVolt);
yVolt=calcVolt(14,yVolt);
crcurt=calcCurt(12,crcurt);
cycurt=calcCurt(13,cycurt);
}
void setup()
{
Serial.begin(9600);
// Blynk.begin(auth, ssid, pass);
lcd.init();
lcd.backlight();
sc=0;
timer.setInterval(100, myTimerEvent);
lcd.setCursor(3, 0);
lcd.print("IoT Energy");
lcd.setCursor(5, 1);
lcd.print("Meter");
pinMode(Menubtn, INPUT_PULLUP);
pinMode(Upbtn, INPUT);
pinMode(Downbtn, INPUT);
pinMode(Stopbtn, INPUT);
pinMode(Startbtn, INPUT);
pinMode(Autobtn, INPUT);
pinMode(Dryrunbtn, INPUT);
delay(100);
lcd.clear();
}
void loop()
{
// Blynk.run();
// int
Menubtnstate = digitalRead(Menubtn);
if(Menubtnstate == LOW)
{
//delay2();
sc =(sc+1);
delay(1000);
Serial.print(sc);
}
timer.run();
}