Back to All Blog Posts
Tutorial EltroNerd Engineering

IoT-Based Smart Electricity Metering System

IoT-Based Smart Electricity Metering System

⚡ 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);
}

Try this project in your browser

Compile code and simulate hardware output with EltroNerd Cloud IDE.

Launch Cloud IDE