Step‑by‑Step Guide: Build a DIY IoT Power Monitor with a Hall Effect Current Sensor
Ever wondered how much electricity your coffee maker really drinks? I was shocked to see the numbers on my utility bill after a month of home‑office brewing. That curiosity pushed me to build a tiny IoT power monitor that tells me exactly what’s pulling current from the wall. The good news? You can do it with a Hall effect sensor, a cheap microcontroller, and a pinch of solder.
Why a Hall Effect Sensor?
A Hall effect current sensor measures the magnetic field generated by the flow of current. Unlike a shunt resistor, it doesn’t need to be in series with the load, so you can clip it around a wire and keep everything isolated. That safety factor alone makes it perfect for DIY projects that sit near mains voltage.
What You’ll Need
Parts List
- Hall effect current sensor (e.g., ACS712 5A or 20A)
- ESP32 development board – the Wi‑Fi and Bluetooth make it easy to push data to the cloud.
- Micro‑USB cable for power and programming.
- Breadboard and jumper wires – keep it tidy while you prototype.
- 10 kΩ resistor – for a simple voltage divider if you want to read the sensor’s output with an analog pin.
- Optional: 0.1 µF ceramic capacitor – smooths out noise on the sensor’s VCC line.
- Enclosure – a small project box works fine, just make a hole for the sensor’s opening.
Tools
- Soldering iron and solder
- Wire stripper / cutter
- Small screwdriver
- Laptop with Arduino IDE installed
Wiring the Hall Sensor to the ESP32
- Power the sensor – Connect the sensor’s VCC pin to the ESP32’s 3.3 V rail. The ACS712 works fine at 3.3 V, though you’ll get a slightly lower range than at 5 V.
- Ground – Tie the sensor’s GND to the ESP32 GND.
- Signal output – The sensor gives an analog voltage proportional to current. Hook the OUT pin to ESP32’s GPIO34 (an ADC‑only pin).
- Add a resistor – Place a 10 kΩ resistor between the sensor’s OUT and GND to form a weak pull‑down. This helps keep the reading stable when no current flows.
- Noise filter (optional) – Solder a 0.1 µF capacitor across VCC and GND close to the sensor. It cuts high‑frequency spikes from the power line.
Double‑check every connection before you plug the ESP32 into USB. A short on the mains side can damage the board, and I learned that the hard way when my first prototype smoked a resistor.
Programming the ESP32
Setting Up the Arduino IDE
- Open File → Preferences and add
https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.jsonto the Additional Boards Manager URLs. - Go to Tools → Board → Boards Manager, search “esp32”, and install the latest package.
Sketch Overview
We’ll read the analog voltage, convert it to current, and push the data to a free MQTT broker. The code is short enough to fit on a single page, but I’ll break it into logical blocks.
#include <WiFi.h>
#include <PubSubClient.h>
// ---- Wi‑Fi credentials ----
const char* ssid = "YOUR_SSID";
const char* password = "YOUR_PASSWORD";
// ---- MQTT broker ----
const char* mqtt_server = "test.mosquitto.org";
WiFiClient espClient;
PubSubClient client(espClient);
// ---- Hall sensor constants ----
const int sensorPin = 34; // ADC pin
const float VCC = 3.3; // ESP32 voltage
const float offset = VCC / 2.0; // Zero‑current voltage (mid‑point)
const float sensitivity = 0.185; // V/A for ACS712 5A version
void setup() {
Serial.begin(115200);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nWi‑Fi connected");
client.setServer(mqtt_server, 1883);
}
float readCurrent() {
int raw = analogRead(sensorPin);
float voltage = (raw / 4095.0) * VCC;
float current = (voltage - offset) / sensitivity;
return current;
}
void loop() {
if (!client.connected()) {
while (!client.connect("PowerMonitor")) {
delay(1000);
}
}
client.loop();
float amps = readCurrent();
char payload[20];
dtostrf(amps, 1, 3, payload);
client.publish("home/power/amps", payload);
Serial.print("Current: ");
Serial.println(payload);
delay(2000);
}
Explanation of key lines
offsetis the voltage you see when no current flows – the sensor’s output sits at half the supply voltage.sensitivitytells you how many volts correspond to one ampere; check the datasheet for your sensor version.analogReadon the ESP32 returns a value from 0‑4095 because it’s a 12‑bit ADC.
If you prefer a cloud dashboard, replace the MQTT part with an HTTP POST to a service like ThingSpeak. The core reading logic stays the same.
Testing and Calibration
- Zero the sensor – With the wire unplugged, run the sketch and note the reading. It should be close to 0 A. If it’s off by a few milliamps, adjust the
offsetvariable in the code. - Known load test – Plug a lamp rated at 60 W into a 120 V outlet (≈0.5 A). Compare the reading to the expected value. Fine‑tune the
sensitivityconstant if needed. - Safety check – Keep the sensor’s opening clear of stray wires. The Hall sensor is non‑intrusive, but a loose conductor can cause erratic readings.
Once the numbers line up, you can mount the sensor around the mains feed of any appliance. I started with my router, then moved on to the fridge. The fridge’s compressor spikes are now visible on my phone, and I’ve learned to schedule defrost cycles when electricity rates are low.
Enclosing the Project
A tidy enclosure not only looks professional, it protects the ESP32 from dust and accidental short circuits. Drill a 12 mm hole for the sensor’s opening, feed the wire through, and secure the board with double‑sided tape. I like to label the MQTT topic on the outside so I know which device is reporting what.
Wrap‑Up Thoughts
Building a DIY IoT power monitor is a great way to get hands‑on with Hall effect sensors, ADC reading, and basic networking. The parts cost under $15, and the whole build takes a Saturday afternoon. More importantly, you end up with real‑time insight into where your electricity goes – a small step toward smarter energy use.
Next time you hear the hum of a device, you’ll actually know how much current it’s pulling. And if you ever feel the urge to tinker, remember that the same sensor can be used for motor control feedback, battery management, or even a simple over‑current alarm. The possibilities are as wide as the wires you can wrap around it.
- → Step-by-step Guide: Installing Spacers and Standoffs for Reliable DIY Electronics Projects @hardwarehacks
- → How to Design a Stable Voltage Regulator Using a Zener Diode @zenerzone
- → How to Choose the Right IC Plug for Your Next DIY Electronics Project @plugtechinsights
- → How to Build a 4‑Bit Binary Counter from Scratch @logiclab
- → Build a Portable Arduino Oscilloscope for Under $30 – Step‑by‑Step Guide @circuitplayground