⚡ IoT-Based Smart Electricity Metering System
This system monitors electricity consumption in real-time and allows remote monitoring via IoT.
It can track energy usage, send alerts, and provide data for smart billing and load management.
⚡ Hardware Required
- ESP32 (Wi-Fi & Bluetooth)
- AC Current Sensor → e.g., ACS712 / ACS758
- Voltage Sensor → e.g., ZMPT101B or voltage divider with isolation
- OLED SSD1306 → optional for local display
- Relay / Smart Switch → optional for load control
- Jumper wires, breadboard
🔌 Connections
| Sensor / Device | ESP32 Pin | Notes |
|---|---|---|
| Current Sensor | Analog input GPIO34 | Measures AC current |
| Voltage Sensor | Analog input GPIO35 | Measures AC voltage |
| Relay / Switch | Digital GPIO26 | Optional: control load |
| OLED Display | SDA=21, SCL=22 | I²C |
🖥️ Full Code Example
c
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <WiFi.h>
#include <PubSubClient.h>
// OLED setup
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
// Pins
#define CURRENT_SENSOR 34
#define VOLTAGE_SENSOR 35
#define RELAY 26
// Wi-Fi + MQTT
const char* ssid = "YOUR_WIFI";
const char* password = "YOUR_PASS";
const char* mqtt_server = "broker.hivemq.com";
WiFiClient espClient;
PubSubClient client(espClient);
// Energy variables
float currentRMS = 0;
float voltageRMS = 0;
float power = 0;
float energyConsumed = 0; // in Wh
void reconnectMQTT() {
while(!client.connected()){
if(client.connect("SmartMeterESP32")){
client.subscribe("meter/control");
} else delay(2000);
}
}
// Read AC Current RMS
float readCurrent() {
int samples = 1000;
float sum = 0;
for(int i=0;i<samples;i++){
int val = analogRead(CURRENT_SENSOR);
float current = (val - 2048.0) * 5.0 / 4095.0 / 0.185; // ACS712 5A module
sum += current * current;
delayMicroseconds(100);
}
return sqrt(sum/samples);
}
// Read AC Voltage RMS
float readVoltage() {
int samples = 1000;
float sum = 0;
for(int i=0;i<samples;i++){
int val = analogRead(VOLTAGE_SENSOR);
float voltage = (val * 230.0 / 4095.0); // Adjust based on voltage divider calibration
sum += voltage * voltage;
delayMicroseconds(100);
}
return sqrt(sum/samples);
}
void setup() {
Serial.begin(115200);
pinMode(RELAY, OUTPUT);
digitalWrite(RELAY, LOW);
// OLED
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
display.clearDisplay();
display.setCursor(0,0);
display.println("Smart Meter Init...");
display.display();
delay(2000);
WiFi.begin(ssid,password);
while(WiFi.status()!=WL_CONNECTED){ delay(500); Serial.print("."); }
Serial.println("WiFi connected");
client.setServer(mqtt_server,1883);
}
void loop() {
if(!client.connected()) reconnectMQTT();
client.loop();
// Read sensors
currentRMS = readCurrent();
voltageRMS = readVoltage();
power = voltageRMS * currentRMS; // Instantaneous power (W)
energyConsumed += power / 3600.0; // Wh per second
// Display
display.clearDisplay();
display.setCursor(0,0);
display.println("Smart Electricity Meter");
display.print("Current A: "); display.println(currentRMS);
display.print("Voltage V: "); display.println(voltageRMS);
display.print("Power W: "); display.println(power);
display.print("Energy Wh: "); display.println(energyConsumed);
display.display();
// MQTT
String msg = "Current:"+String(currentRMS)+
" Voltage:"+String(voltageRMS)+
" Power:"+String(power)+
" Energy:"+String(energyConsumed);
client.publish("meter/status", msg.c_str());
delay(1000);
}