● online
- MP3 TF 16P Alternatif DFPlayer mini MP3 Player Ard....
- Modul Sensor Tegangan AC Bolak balik 220V Listrik ....
- TANG CRIMPING PRESS SKUN RATCHET YTH SN-48B....
- ADS1115 16 Bit I2C Module ADC 4 channel with Pro G....
- Kapton Tape Polymide Film 50mm Polimida 50 mm Isol....
- Kabel Jumper Arduino Dupont 20 cm Female to Male P....
- Raspberry Pi Pico Microcontroller Board....
- B0505S-1W 5V to 5V converter DC DC power module co....
- Selamat Datang di Indomaker ❯ Silahkan pesan produk sesuai kebutuhan anda, kami siap melayani.
- Selamat Datang di Indomaker ❯ Silahkan pesan produk sesuai kebutuhan anda, kami siap melayani.
Cara Menggunakan HLW8032 dengan ESP32 untuk Monitoring Konsumsi Energi
Mengukur konsumsi listrik secara real-time bisa menjadi salah satu proyek menarik menggunakan ESP32. Dengan bantuan IC HLW8032, ESP32 dapat membaca berbagai parameter listrik dan mengolahnya menjadi data yang lebih mudah dipantau. Pada artikel ini, kita akan membahas cara menggunakan HLW8032 dengan ESP32 serta dasar pembacaan data hasil pengukurannya.
Alat dan Bahan
Sebelum memulai praktik, pastikan semua alat dan bahan yang dibutuhkan telah disiapkan agar proses perakitan dan pengujian dapat berjalan dengan baik. Berikut alat dan bahan yang digunakan beserta estimasi harganya:
| No. | Alat/Bahan | Jumlah | Estimasi Harga |
|---|---|---|---|
| 1 | ESP32 | 1 buah | Rp75.000 |
| 2 | Modul HLW8032 | 1 buah | Rp35.000 |
| 3 | Breadboard | 1 buah | Rp20.000 |
| 4 | Kabel jumper | 1 set | Rp15.000 |
| 5 | Kabel USB | 1 buah | Rp15.000 |
| 6 | Laptop/PC | 1 unit | Rp0 |
| Total | Rp160.000 |
Topologi Sistem
Sistem yang digunakan terdiri dari ESP32 sebagai mikrokontroler utama dan HLW8032 sebagai sensor pengukur parameter listrik. HLW8032 membaca tegangan, arus, dan daya dari beban listrik, kemudian data hasil pengukuran dikirimkan ke ESP32 untuk diproses dan ditampilkan sebagai informasi monitoring energi.

Gambar 1. Topologi sistem ESP32 dan HLW8032
Cara Kerja
Sistem bekerja dengan HLW8032 sebagai pengukur parameter listrik dan ESP32 sebagai mikrokontroler untuk mengolah data. Saat beban listrik terhubung, HLW8032 melakukan pengukuran terhadap tegangan dan arus yang digunakan oleh beban, kemudian menghasilkan data pengukuran yang dapat dibaca oleh ESP32. ESP32 menerima dan mengolah data tersebut sehingga dapat diperoleh informasi seperti tegangan, arus, daya, dan energi yang digunakan. Data hasil pengukuran selanjutnya dapat ditampilkan pada serial monitor atau media tampilan lainnya untuk memudahkan proses pemantauan.
Pada percobaan, sistem dirakit dengan menghubungkan modul HLW8032 ke ESP32 sesuai dengan konfigurasi yang telah ditentukan. Setelah rangkaian dinyalakan, dilakukan pengujian menggunakan beban listrik untuk melihat apakah data pengukuran dapat terbaca oleh ESP32. Hasil pembacaan kemudian diamati dan dibandingkan untuk memastikan sistem dapat melakukan monitoring sesuai dengan yang diharapkan.
Dokumentasi hasil percobaan:

Dokumentasi hasil percobaan sistem HLW8032 dengan ESP32-C3 dapat dilihat melalui video berikut. Video tersebut menampilkan proses pengujian rangkaian serta hasil pembacaan data dari HLW8032 yang diproses oleh ESP32-C3.
Lihat dokumentasi hasil percobaan di YouTube
Perangkat lunak
Setelah rangkaian HLW8032 dan ESP32-C3 terhubung, diperlukan program untuk membaca dan mengolah data hasil pengukuran dari HLW8032. Program berikut menggunakan komunikasi UART dengan konfigurasi 4800 baud, 8 data bit, even parity, dan 1 stop bit (8E1). Data yang diterima kemudian diproses oleh ESP32-C3 untuk mendapatkan nilai tegangan dan arus, kemudian ditampilkan melalui Serial Monitor.
#include <Arduino.h>
// =====================================================
// PIN ESP32-C3
// =====================================================
#define HLW_RX_PIN 5 // HLW8032 TX -> Optocoupler -> GPIO5
#define HLW_PF_PIN 4 // HLW8032 PF -> Optocoupler -> GPIO4
// =====================================================
// UART HLW8032
// =====================================================
HardwareSerial HLWSerial(1);
// =====================================================
// FRAME HLW8032
// =====================================================
uint8_t frame[24];
// =====================================================
// DATA HLW8032
// =====================================================
uint32_t VolPar = 0;
uint32_t VolData = 0;
uint32_t CurrentPar = 0;
uint32_t CurrentData = 0;
uint32_t PowerPar = 0;
uint32_t PowerData = 0;
uint16_t PF = 0;
// =====================================================
// KONSTANTA SESUAI LIBRARY HLW8032
// =====================================================
// Tegangan:
// VolR1 = 470K x 4
// VolR1 = 1.880.000 ohm
// VolR2 = 1K
//
// VF = VolR1 / VolR2
// VF = 1880
const float VF = 1880.0f;
// Arus:
//
// CurrentRF = 0.1
//
// CF = 1 / (CurrentRF x 1000)
// CF = 0.01
const float CF = 0.01f;
// =====================================================
// KALIBRASI TEGANGAN
// =====================================================
//
// Sebelumnya:
//
// Pembacaan HLW = 171 V
// Tegangan sebenarnya = 215 V
//
// Faktor:
//
// 215 / 171
// = 1.25731
//
// Jika nanti hasil berubah, cukup ubah nilai ini.
// =====================================================
const float VOLTAGE_CAL = 1.25731f;
// =====================================================
// KALIBRASI ARUS
// =====================================================
//
// Untuk sementara belum dikoreksi.
//
// Jika nanti misalnya:
//
// HLW = 0.80 A
// Multimeter = 1.00 A
//
// maka:
//
// CURRENT_CAL = 1.00 / 0.80
// = 1.25
//
// =====================================================
const float CURRENT_CAL = 1.00000f;
// =====================================================
// STATUS
// =====================================================
bool dataValid = false;
unsigned long lastValidData = 0;
unsigned long lastPrint = 0;
// =====================================================
// CHECKSUM HLW8032
// =====================================================
bool checkChecksum()
{
uint8_t checksum = 0;
// Sesuai library:
// checksum byte 2 sampai byte 22
for (int i = 2; i <= 22; i++)
{
checksum += frame[i];
}
return (checksum == frame[23]);
}
// =====================================================
// BACA FRAME HLW8032
// =====================================================
bool readHLW8032()
{
// ---------------------------------------------------
// Belum ada data
// ---------------------------------------------------
if (HLWSerial.available() == 0)
return false;
// ---------------------------------------------------
// Tunggu frame seperti library asli
// ---------------------------------------------------
delay(56);
// ---------------------------------------------------
// Cek jumlah byte
// ---------------------------------------------------
int availableBytes = HLWSerial.available();
if (availableBytes < 24)
return false;
// ---------------------------------------------------
// Jika data lebih dari 24 byte,
// buang byte lama agar mengambil frame terakhir.
// ---------------------------------------------------
if (availableBytes > 24)
{
int discard = availableBytes - 24;
while (discard--)
{
HLWSerial.read();
}
}
// ---------------------------------------------------
// Baca 24 byte
// ---------------------------------------------------
for (int i = 0; i < 24; i++)
{
int b = HLWSerial.read();
if (b < 0)
return false;
frame[i] = (uint8_t)b;
}
// ---------------------------------------------------
// Sesuai library asli:
// byte ke-2 harus 0x5A
// ---------------------------------------------------
if (frame[1] != 0x5A)
{
return false;
}
// ---------------------------------------------------
// CHECKSUM
// ---------------------------------------------------
if (!checkChecksum())
{
return false;
}
// ===================================================
// VOLTAGE PARAMETER
// ===================================================
VolPar =
((uint32_t)frame[2] << 16) |
((uint32_t)frame[3] << 8) |
frame[4];
// ===================================================
// VOLTAGE DATA
// ===================================================
if (bitRead(frame[20], 6))
{
VolData =
((uint32_t)frame[5] << 16) |
((uint32_t)frame[6] << 8) |
frame[7];
}
// ===================================================
// CURRENT PARAMETER
// ===================================================
CurrentPar =
((uint32_t)frame[8] << 16) |
((uint32_t)frame[9] << 8) |
frame[10];
// ===================================================
// CURRENT DATA
// ===================================================
if (bitRead(frame[20], 5))
{
CurrentData =
((uint32_t)frame[11] << 16) |
((uint32_t)frame[12] << 8) |
frame[13];
}
// ===================================================
// POWER PARAMETER
// ===================================================
PowerPar =
((uint32_t)frame[14] << 16) |
((uint32_t)frame[15] << 8) |
frame[16];
// ===================================================
// POWER DATA
// ===================================================
if (bitRead(frame[20], 4))
{
PowerData =
((uint32_t)frame[17] << 16) |
((uint32_t)frame[18] << 8) |
frame[19];
}
// ===================================================
// PF
// ===================================================
PF =
((uint16_t)frame[21] << 8) |
frame[22];
// ===================================================
// DATA VALID
// ===================================================
dataValid = true;
lastValidData = millis();
return true;
}
// =====================================================
// HITUNG TEGANGAN
// =====================================================
float getVoltage()
{
if (VolData == 0)
return 0.0f;
// Hitung tegangan dasar
float voltage =
((float)VolPar / (float)VolData)
* VF
* 0.001f;
// Terapkan kalibrasi
voltage *= VOLTAGE_CAL;
return voltage;
}
// =====================================================
// HITUNG ARUS
// =====================================================
float getCurrent()
{
if (CurrentData == 0)
return 0.0f;
// Hitung arus dasar
float current =
((float)CurrentPar / (float)CurrentData)
* CF;
// Terapkan kalibrasi arus
current *= CURRENT_CAL;
return current;
}
// =====================================================
// SETUP
// =====================================================
void setup()
{
// ===================================================
// SERIAL MONITOR
// ===================================================
Serial.begin(115200);
delay(1500);
Serial.println();
Serial.println("========================================");
Serial.println(" ESP32-C3 + HLW8032");
Serial.println("========================================");
Serial.println("HLW TX -> Optocoupler -> GPIO5");
Serial.println("HLW PF -> Optocoupler -> GPIO4");
Serial.println();
Serial.println("UART : 4800 8E1");
Serial.println("RX : GPIO5");
Serial.println("Invert : OFF");
Serial.println();
// ===================================================
// GPIO PF
// ===================================================
pinMode(
HLW_PF_PIN,
INPUT
);
// ===================================================
// UART HLW8032
// ===================================================
//
// TX HLW8032
// |
// v
// Optocoupler
// |
// v
// GPIO5
//
// Inversion OFF karena dari pengujian sebelumnya
// GPIO5 sudah menerima aktivitas UART.
// ===================================================
HLWSerial.begin(
4800,
SERIAL_8E1,
HLW_RX_PIN,
-1,
false
);
Serial.println("UART HLW8032 siap.");
Serial.println("Menunggu data...");
Serial.println();
}
// =====================================================
// LOOP
// =====================================================
void loop()
{
// ===================================================
// BACA DATA HLW8032
// ===================================================
readHLW8032();
// ===================================================
// TAMPILKAN SETIAP 1 DETIK
// ===================================================
if (millis() - lastPrint >= 1000)
{
lastPrint = millis();
Serial.println("----------------------------------------");
if (dataValid &&
(millis() - lastValidData < 3000))
{
float voltage = getVoltage();
float current = getCurrent();
// ===============================================
// TEGANGAN
// ===============================================
Serial.print("Voltage : ");
Serial.print(voltage, 2);
Serial.println(" V");
// ===============================================
// ARUS
// ===============================================
Serial.print("Current : ");
Serial.print(current, 3);
Serial.println(" A");
Serial.println("Status : DATA OK");
}
else
{
Serial.println("Voltage : --- V");
Serial.println("Current : --- A");
Serial.println("Status : NO DATA");
}
Serial.println("----------------------------------------");
}
}
Pada bagian awal program, library Arduino.h digunakan untuk menyediakan fungsi dasar pemrograman ESP32. Selanjutnya ditentukan pin yang digunakan untuk menerima data dari HLW8032, yaitu GPIO5 untuk jalur TX HLW8032 melalui optocoupler dan GPIO4 untuk sinyal PF.
HardwareSerial HLWSerial(1) digunakan untuk membuat komunikasi UART pada hardware serial nomor 1. Komunikasi tersebut diatur menggunakan konfigurasi 4800, SERIAL_8E1, sehingga ESP32-C3 dapat menerima data dari HLW8032 sesuai format komunikasinya.
Program menyediakan array frame[24] untuk menampung 24 byte data yang dikirimkan oleh HLW8032. Data tersebut kemudian dipisahkan menjadi beberapa parameter, yaitu parameter tegangan, arus, daya, serta data hasil pengukuran masing-masing parameter.
Pada bagian perhitungan, program menggunakan konstanta VF dan CF sebagai faktor untuk mengubah data mentah HLW8032 menjadi nilai tegangan dan arus. Nilai tegangan juga dikalibrasi menggunakan VOLTAGE_CAL, sedangkan CURRENT_CAL disiapkan sebagai faktor kalibrasi arus yang dapat disesuaikan berdasarkan hasil pengukuran menggunakan alat ukur.
Fungsi readHLW8032() bertugas membaca data dari UART. Program memastikan jumlah data yang diterima mencukupi, kemudian membaca 24 byte frame. Data juga diperiksa menggunakan byte penanda 0x5A dan checksum untuk memastikan frame yang diterima valid sebelum diproses lebih lanjut.
Setelah data valid diperoleh, fungsi getVoltage() menghitung nilai tegangan berdasarkan perbandingan parameter dan data tegangan dari HLW8032, kemudian menerapkan faktor kalibrasi. Fungsi getCurrent() melakukan proses yang sama untuk mendapatkan nilai arus.
Pada fungsi setup(), Serial Monitor diatur pada baud rate 115200 dan UART HLW8032 diinisialisasi. Sedangkan pada loop(), ESP32 terus membaca data HLW8032 dan menampilkan hasil pengukuran setiap satu detik. Jika data masih valid, Serial Monitor akan menampilkan nilai tegangan dan arus beserta status DATA OK. Jika tidak ada data yang valid selama beberapa waktu, sistem akan menampilkan NO DATA.
Kesimpulan
Berdasarkan percobaan yang telah dilakukan, ESP32-C3 dapat digunakan untuk membaca dan mengolah data pengukuran dari HLW8032 melalui komunikasi UART. Data yang diterima dapat diproses menjadi informasi tegangan dan arus, kemudian ditampilkan melalui Serial Monitor. Dengan adanya proses validasi data dan kalibrasi, sistem dapat digunakan sebagai dasar untuk membuat perangkat monitoring konsumsi energi listrik secara real-time.
Tags: Arduino, Energy Meter, esp32, HLW8032, IoT, Monitoring Listrik, Sensor Listrik
Cara Menggunakan HLW8032 dengan ESP32 untuk Monitoring Konsumsi Energi
Telegram? ya dengan fitur robot chat di telegram kita bisa mengontrol device dengan mudah dan praktis. Misal kita kelupaan... selengkapnya
Thingspeak merupakan sebuah platform Internet of things yang memungkinkan anda untuk memonitoring/kontrol device menggunakan internet. Platform Iot ini gratis... selengkapnya
Sensor getar Piezoelectric Ceramic (Piezo) merupakan sensor getaran sederhana namun sangat sensitif yang mampu menghasilkan tegangan saat terjadi tekanan atau... selengkapnya
Oke Hallo semua pada kesempatan kali ini kita akan belajar mendeteksi kemiringan suatu benda. Sensor yang digunakan adalah tilt... selengkapnya
Bluetooth merupakan komunikasi wireles (nirkabel) menggunakan SPP (Serial Port Protocol) dengan frekusensi kerja 2.4 GHz. Dengan Bluetooth, kita dapat... selengkapnya
Sensor cahaya atau LDR (Light Dependent Resistor) adalah salah satu sensor analog yang paling sering digunakan saat belajar Arduino. Sensor... selengkapnya
Tombol adalah salah satu komponen input paling sederhana namun sangat penting dalam berbagai proyek elektronika. Dalam tutorial ini, kamu akan... selengkapnya
Secara bawaan, GPIO Raspberry Pi hanya bisa membaca input digital yang berarti hanya bisa mendeteksi dua kondisi, yaitu hidup atau... selengkapnya
NodeMCU dikhususkan sebagai board yang dapat terhubung dengan jaringan internet (Wifi), jadi buat yang ingin belajar Internet of... selengkapnya
Hari ini kita akan mencoba untuk menampilkan data sensor ldr ke web server dengan koneksi WIFI menggunakan board NodeMCU.... selengkapnya
Features and Specs: Dual-Core, 32-bit ARM Cortex M0+ Processor Clocked at 48MHz (default), configurable max to 133MHz. Ready with USB… selengkapnya
Rp 82.900Fitur: -Dapat mendeteksi api atau panjang gelombang sumber cahaya dalam 760nm ~ 1100nm – Api lebih ringan mendeteksi jarak 80cm… selengkapnya
Rp 9.000TILT SENSOR adalah sensor untuk mendeteksi sudut kemiringan / derajat, dimana cara kerja sensor ini adalah dengan menggunakan 2 buah… selengkapnya
Rp 9.800Case patern: Solid Warna : Merah dan Hijau Current: 10-20 mA Diameter: 3mm
Rp 300Harga untuk 10pcs Resistance: 220 Ohm Wattage Rating: 0.25 Watt Tolerance: 1% Metal Film Lead Free ROHS compliant
Rp 1.500Menerima jasa cetak PCB FR2 (pertinax) / FR4 (double) single / double layer. Silahkan ke web kalkulator biaya cetak pcb… selengkapnya
Rp 1.000Putaran = 180º Specifications • Weight: 55 g • Dimension: 40.7 x 19.7 x 42.9 mm approx. • Stall torque:… selengkapnya
Rp 36.400Product Name: Tactile Switch; Material: Metal, Plastic Package Content: 30 Pcs x Tactile Switch; Main Color: Black, Silver Tone Total… selengkapnya
Rp 40012A 300W DC Buck Step Down Converter CC CV Driver LED charge Battery Spesifikasi: Input Voltage: 5-40V Output Voltage: 1.2-35V… selengkapnya
Rp 39.400ESP-WROOM-32 is Powered by Espressif’s most advanced SoC, the ESP-WROOM-32 features high performance, a wide range of peripherals, Wi-Fi and… selengkapnya
Rp 38.400Cara Menggunakan HLW8032 dengan ESP32 untuk Monitoring Konsumsi Energi
Kategori
Artikel Terkait
-
Sistem Kendali Suhu pada Inkubator Penetasan Telur Berbasis PID Diskrit Menggunakan Sensor DHT11 dan Aktuator Lampu Pijar
- Cara Mengatur Kecepatan Motor DC dengan PWM Raspberry Pi dan TB6612FNG
-
Cara Menghubungkan TB6612FNG dengan Raspberry Pi untuk Mengontrol Arah Motor DC
-
Cara Membuat Alarm Keamanan Sederhana dengan Sensor PIR dan Raspberry Pi 5
-
Cara Menghubungkan Sensor PIR ke Raspberry Pi untuk Mendeteksi Gerakan

Saat ini belum tersedia komentar.