Seberapa lama baterai bisa menyalakan lampu USB? INA219 menghitung muatan yang sudah terpakai (mAh) dan energinya (mWh), lalu memperkirakan sisa baterai dalam persen. Teknik yang sama dipakai power bank dan HP untuk menghitung persen baterai.
Arus sesaat saja tidak cukup untuk mengetahui sisa baterai. Yang dibutuhkan adalah jumlah total arus yang sudah keluar, disebut coulomb counting. Setiap 0,2 detik arus (mA) dikali lama waktunya (jam) lalu dijumlahkan: hasilnya mAh, satuan yang sama dengan yang tertulis di baterai dan power bank. Arus dikali tegangan dikali waktu memberi energi dalam mWh.
Sisa baterai diperkirakan dari mAh terpakai dibanding kapasitas baterai. Tiga AA alkaline berisi ±2000 mAh. Saat memasang baterai baru, tekan switch Baterai baru supaya hitungan dimulai dari nol.
Komponen
| Komponen | Qty | Harga |
|---|---|---|
| ESP32 DOIT DevKit V1 30 pin | 1 | Rp75.000 |
| INA219 I2C Sensor Arus Tegangan DC Power Monitor | 1 | Rp20.000 |
| Holder baterai 3×AA + kabelbaterai AA dibeli terpisah | 1 | Rp6.000 |
| Kabel jumper female-female 10 cm (isi 10)isi 10, terpakai 4 | 1 | Rp3.500 |
| Kabel micro USB data 30 cmopsional, kalau belum punya kabel micro USB data | 1 | Rp11.700 |
| Total (tanpa opsional) | Rp104.500 |
Langkah 1: Rangkai komponen
Sambungkan kabel sesuai gambar di atas. Kalau gambar dan tabel terlihat berbeda, ikuti tabel.
| Dari | Ke | Kabel | |
|---|---|---|---|
| INA219 VCC | → | 3V3 | merah |
| INA219 GND | → | GND | hitam |
| INA219 SCL | → | D22 GPIO22 | kuning |
| INA219 SDA | → | D21 GPIO21 | biru |
| Baterai 3×AA (4,5V) + | → | INA219 VIN+ | merah |
| INA219 VIN− | → | Soket USB + lampu USB VCC | merah |
| Soket USB + lampu USB GND | → | Baterai 3×AA (4,5V) − | hitam |
| Baterai 3×AA (4,5V) − | → | INA219 GND | hitam |
Langkah 2: Siapkan dashboard Klenik
Cara cepat: unduh p129.json, ganti budi1234 dengan KODE-mu, lalu import di Klenik (menu titik tiga → Export / Import → Import → Ganti total). Langkah lengkapnya ada di Panduan Klenik.
| Widget | Topic | Setting |
|---|---|---|
| Gauge Sisa Baterai (perkiraan) | ichibot/KODE/p129/sisa | 0–100 % |
| Gauge Arus Lampu | ichibot/KODE/p129/arus | 0–500 mA |
| Gauge Muatan Terpakai | ichibot/KODE/p129/mah | 0–2000 mAh |
| Gauge Energi Terpakai | ichibot/KODE/p129/mwh | 0–9000 mWh |
| Switch Baterai Baru | ichibot/KODE/p129/ulang | payload ON / OFF |
Langkah 3: Upload kode
Library: PubSubClient (Nick O'Leary), Adafruit INA219. Board di Arduino IDE: ESP32 Dev Module.
Isi dulu nama WiFi dan password di bagian ISI DULU, lalu ganti budi1234 di baris topic dengan KODE-mu, lalu upload dan buka Serial Monitor (115200).
// Proyek 129 - Pemakaian Energi Lampu USB (INA219)
// Board: ESP32 DOIT DevKit V1 | Dashboard: klenik.ichibot.id
#include <WiFi.h>
#include <PubSubClient.h>
#include <Wire.h>
#include <Adafruit_INA219.h>
// ===== ISI DULU =====
const char* WIFI_NAMA = "nama-wifi-kamu";
const char* WIFI_PASS = "password-wifi-kamu";
// topic MQTT: ganti budi1234 dengan KODE-mu (sama dengan di dashboard Klenik)
const char* TOPIK_ULANG = "ichibot/budi1234/p129/ulang";
const char* TOPIK_ARUS = "ichibot/budi1234/p129/arus";
const char* TOPIK_MAH = "ichibot/budi1234/p129/mah";
const char* TOPIK_MWH = "ichibot/budi1234/p129/mwh";
const char* TOPIK_SISA = "ichibot/budi1234/p129/sisa";
const float KAPASITAS_MAH = 2000; // perkiraan isi 3 baterai AA alkaline
const char* BROKER = "mqtt.ichibot.id";
WiFiClient wifi;
PubSubClient mqtt(wifi);
Adafruit_INA219 ina;
double mAh = 0, mWh = 0;
unsigned long terakhir = 0, kirimTerakhir = 0;
void pesanMasuk(char* t, byte* isi, unsigned int panjang) {
mAh = 0; mWh = 0; // baterai baru: hitung dari nol
mqtt.publish(TOPIK_ULANG, "OFF");
}
void langganan() {
mqtt.subscribe(TOPIK_ULANG);
}
sambungWiFi() dan sambungMQTT(): sama di semua proyek (klik untuk lihat)
void sambungWiFi() {
WiFi.begin(WIFI_NAMA, WIFI_PASS);
Serial.print("WiFi");
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println(" OK, IP " + WiFi.localIP().toString());
}
void sambungMQTT() {
while (!mqtt.connected()) {
if (mqtt.connect(WiFi.macAddress().c_str())) {
Serial.println("Terhubung ke Klenik");
langganan();
} else {
Serial.println("Broker gagal, coba lagi 3 detik");
delay(3000);
}
}
}
void setup() {
Serial.begin(115200);
ina.begin();
sambungWiFi();
mqtt.setServer(BROKER, 1883);
mqtt.setCallback(pesanMasuk);
terakhir = millis();
}
void loop() {
if (!mqtt.connected()) sambungMQTT();
mqtt.loop();
if (millis() - terakhir >= 200) { // ukur 5x per detik supaya penjumlahan teliti
double jam = (millis() - terakhir) / 3600000.0;
terakhir = millis();
float mA = max(0.0f, ina.getCurrent_mA());
float volt = ina.getBusVoltage_V();
mAh += mA * jam;
mWh += mA * volt * jam;
}
if (millis() - kirimTerakhir >= 5000) {
kirimTerakhir = millis();
float sisa = constrain(100 - mAh / KAPASITAS_MAH * 100, 0, 100);
mqtt.publish(TOPIK_ARUS, String(ina.getCurrent_mA(), 0).c_str());
mqtt.publish(TOPIK_MAH, String(mAh, 1).c_str());
mqtt.publish(TOPIK_MWH, String(mWh, 0).c_str());
mqtt.publish(TOPIK_SISA, String(sisa, 0).c_str());
}
}Langkah 4: Pahami kodenya
- Coulomb counting: menjumlahkan arus × waktu. Tipe
doubledipakai karena angka kecil terus ditambahkan ribuan kali. - Kapasitas baterai. AA isi ulang NiMH biasanya 1800-2500 mAh, sedangkan AA biasa (karbon) jauh lebih kecil.