MINI NP9I
Published

AI-enabled Smart Energy Meter

An IoT-based smart meter that uses AI to predict consumption and detect anomalies in industrial energy usage.

AdvancedFull instructions provided132
AI-enabled Smart Energy Meter

Things used in this project

Hardware components

Seeed Studio XIAO ESP32S3 Sense
Seeed Studio XIAO ESP32S3 Sense
×1
Photoelectric Sensor, Universal Voltage
Photoelectric Sensor, Universal Voltage
×1

Story

Read more

Code

energy_project.ino

Arduino
#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();
}

Credits

MINI NP9I
1 project • 0 followers
Thanks to NIHAL P.

Comments