#define BLYNK_TEMPLATE_ID "TMPL3-sSWMQIl"
#define BLYNK_TEMPLATE_NAME "Bit Minds"
#define BLYNK_AUTH_TOKEN "RrnaICRqbLP-xWMI-zX15c-ctJiCQ6kz"
#include <TimeLib.h>
#include <Wire.h>
//#include <LiquidCrystal_I2C.h>
#include "EmonLib.h"
#include <WiFi.h>
#include <WiFiClient.h>
#include <BlynkSimpleEsp32.h>
#include <SD.h>
#include "tft_setup.h"
#include "TFT_eSPI.h"
TFT_eSPI tft = TFT_eSPI();
const int cw = tft.width()/2;
const int ch = tft.height()/2;
const int s = min(cw/4,ch/4);
EnergyMonitor emon;
File myFile;
unsigned long lastmillis = millis();
unsigned long previousMillis = 0;
const long interval = 360; // 1 hour in milliseconds
#define vCalibration 83.3
#define currCalibration 0.50
int led = 2;
BlynkTimer timer;
char auth[] = "RrnaICRqbLP-xWMI-zX15c-ctJiCQ6kz";
char ssid[] = "JasilM";
char pass[] = "spothot1";
// Set the LCD address to 0x27 for a 16 chars and 2 line display
//LiquidCrystal_I2C lcd(0x27, 16, 2); // Change the address to your LCD address
float kWh = 0;
float value;
int led1 = 29;
void myTimerEvent() {
emon.calcVI(10, 1000);
kWh = kWh + emon.apparentPower * (millis() - lastmillis) / 3600000000.0;
yield();
value = analogRead(33);
// Display data on Serial Monitor
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.println("Connecting to WiFi...");
}
Serial.print("Vrms: ");
Serial.print(emon.Vrms, 2);
Serial.print("V");
Serial.print("\tIrms: ");
Serial.print(emon.Irms, 4);
Serial.print("A");
Serial.print("\tPower: ");
Serial.print(emon.apparentPower, 4);
Serial.print("W");
Serial.print("\tkWh: ");
Serial.print(kWh, 5);
Serial.println("kWh");
Serial.println(value);
tft.fillRect(0, 70, 240, 170, TFT_BLACK);
tft.setTextFont(1);
tft.setTextSize(4.5);
tft.setTextColor(TFT_RED, TFT_BLACK);
tft.drawString(String(emon.Vrms, 1)+" V", cw-s, ch-50);
tft.setTextColor(TFT_BLUE, TFT_BLACK);
tft.drawString(String(emon.Irms, 2)+" A", cw-s, ch-10);
tft.setTextColor(TFT_ORANGE, TFT_BLACK);
tft.drawString(String(emon.apparentPower, 2)+" W", cw-s/2, ch+30);
tft.setTextColor(TFT_GREEN, TFT_BLACK);
tft.drawString(String(kWh, 3)+" KWH", cw-s/2.5, ch+70);
/*
// Display data on LCD
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Vrms:");
lcd.print(emon.Vrms, 2);
lcd.print("V");
lcd.setCursor(0, 1);
lcd.print("Irms:");
lcd.print(emon.Irms, 4);
lcd.print("A");
delay(2500);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Power:");
lcd.print(emon.apparentPower, 4);
lcd.print("W");
lcd.setCursor(0, 1);
lcd.print("kWh:");
lcd.print(kWh, 4);
lcd.print("W");
delay(2500);
*/
if (WiFi.status() == WL_CONNECTED) {
digitalWrite(led, HIGH); // Turn on LED if WiFi is connected
} else {
digitalWrite(led, LOW); // Turn off LED if WiFi is disconnected
}
delay(500);
lastmillis = millis();
// Update Blynk app with sensor data
Serial.print("Sending to Blynk => V0: ");
Blynk.virtualWrite(V0, emon.Vrms);
Serial.print("Sending to Blynk => V1: ");
Blynk.virtualWrite(V1, emon.Irms);
Blynk.virtualWrite(V2, emon.apparentPower);
Blynk.virtualWrite(V3, kWh);
Blynk.virtualWrite(V4, value);
Blynk.virtualWrite(V5, led1);
// Update data to SD card every hour
if (millis() - previousMillis >= interval) {
previousMillis = millis();
// Create folder for the year
String yearFolder = String(year());
if (!SD.exists(yearFolder)) {
SD.mkdir(yearFolder);
}
// Create folder for the month inside the year folder
String monthFolder = yearFolder + "/" + String(month());
if (!SD.exists(monthFolder)) {
SD.mkdir(monthFolder);
}
// Create file for today's date inside the month folder
String dayFileName = monthFolder + "/" + String(day()) + ".txt";
myFile = SD.open(dayFileName, FILE_WRITE);
if (myFile) {
myFile.print("Voltage: ");
myFile.println(emon.Vrms);
myFile.print("Current: ");
myFile.println(emon.Irms);
myFile.print("Power: ");
myFile.println(emon.apparentPower);
myFile.print("kWh: ");
myFile.println(kWh);
myFile.close();
Serial.println("Data updated in file.");
} else {
Serial.println("Error opening file for updating");
}
}
}
void setup() {
Serial.begin(9600);
Blynk.begin(auth, ssid, pass);
Serial.println("Serial Monitor begin test");
//lcd.init(); // initialize the LCD
//lcd.backlight(); // Turn on the backlight
//lcd.begin(16, 2); // Initialize LCD with your configuration
tft.init();
tft.fillScreen(TFT_BLACK);
tft.setRotation(2);
emon.voltage(35, vCalibration, 1.7); // Voltage: input pin, calibration, phase_shift
emon.current(34, currCalibration); // Current: input pin, calibration.
timer.setInterval(5000L, myTimerEvent);
tft.setTextFont(1);
tft.setTextSize(4);
tft.setTextColor(TFT_GREENYELLOW, TFT_BLACK);
tft.setTextDatum(TC_DATUM);
tft.drawString("BITMINDS", cw, ch-115);
//Imitialize the variable to 0
/*
lcd.setCursor(3, 0);
lcd.print("IoT Energy");
lcd.setCursor(5, 1);
lcd.print("Meter");
delay(3000);
lcd.clear();
// Initialize the SD card
if (!SD.begin(10)) {
Serial.println("SD card initialization failed");
return;
}
// Open the file for writing initially (optional)
myFile = SD.open("data.txt", FILE_WRITE);
if (myFile) {
myFile.println("Initial data.");
myFile.close();
Serial.println("Data written to file.");
} else {
Serial.println("Error opening file for writing");
}
*/
}
void loop() {
Blynk.run();
timer.run();
}
Comments