Panel surya kecil mengisi baterai 18650 lewat modul TP4056, dan INA219 di antaranya mencatat tegangan panel, arus pengisian, serta total energi yang dipanen hari ini. Grafiknya memperlihatkan bagaimana matahari pagi, siang, dan mendung memengaruhi hasil panel.
Arus dari panel lewat INA219 (VIN+ → VIN−) sebelum masuk ke pengisi baterai TP4056. Yang diukur adalah arus yang benar-benar dipanen panel. TP4056 mengatur pengisian 18650 dengan aman sampai 4,2V.
Energi adalah daya dikali waktu. Setiap 5 detik daya sesaat (mW) dikali lamanya sejak bacaan sebelumnya (dalam jam), lalu dijumlahkan ke energiHariIni dalam mWh. Saat tanggal berganti (dari jam NTP), total kemarin dikirim ke Text Log dan hitungan dimulai dari nol.
Panel 5,5V 1,3W menghasilkan paling banyak ±240 mA di bawah terik matahari. Saat mendung arusnya bisa turun ke belasan mA.
Komponen
| Komponen | Qty | Harga |
|---|---|---|
| ESP32 DOIT DevKit V1 30 pin | 1 | Rp75.000 |
| INA219 I2C Sensor Arus Tegangan DC Power Monitor | 1 | Rp20.000 |
| 1.3W 5.5V 240mA Solar Panel with Wire [147×90 mm | 1 | Rp39.000 |
| TP4056 Charger 18650 3.7V 1A 4.2V Micro USB Lith | 1 | Rp4.500 |
| 18650 Flat Head Lithium Battery Real 2600mAh 3.7 | 1 | Rp32.175 |
| 18650 lithium battery 1 bracket socket holder pa | 1 | Rp1.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) | Rp175.175 |
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 |
| Panel surya 5,5V 1,3W + | → | INA219 VIN+ | merah |
| INA219 VIN− | → | TP4056 + baterai 18650 IN+ | merah |
| TP4056 + baterai 18650 IN− | → | Panel surya 5,5V 1,3W − | hitam |
| Panel surya 5,5V 1,3W − | → | INA219 GND | hitam |
Langkah 2: Siapkan dashboard Klenik
Cara cepat: unduh p122.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 Tegangan Panel | ichibot/KODE/p122/volt | 0–7 V |
| Gauge Arus Pengisian | ichibot/KODE/p122/arus | 0–300 mA |
| Gauge Energi Hari Ini | ichibot/KODE/p122/energi | 0–5000 mWh |
| Chart Grafik Arus Panel | ichibot/KODE/p122/arus | 0–300 mA |
| Text Log Laporan Harian | ichibot/KODE/p122/log | menampilkan teks masuk |
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 122 - Monitor Baterai Panel Surya
// Board: ESP32 DOIT DevKit V1 | Dashboard: klenik.ichibot.id
#include <WiFi.h>
#include <PubSubClient.h>
#include <Wire.h>
#include <Adafruit_INA219.h>
#include <time.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_LOG = "ichibot/budi1234/p122/log";
const char* TOPIK_VOLT = "ichibot/budi1234/p122/volt";
const char* TOPIK_ARUS = "ichibot/budi1234/p122/arus";
const char* TOPIK_ENERGI = "ichibot/budi1234/p122/energi";
const char* BROKER = "mqtt.ichibot.id";
WiFiClient wifi;
PubSubClient mqtt(wifi);
Adafruit_INA219 ina;
float energiHariIni = 0; // mWh yang masuk dari panel hari ini
int hariTadi = -1;
unsigned long terakhir = 0;
void langganan() {}
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();
configTime(7 * 3600, 0, "pool.ntp.org");
mqtt.setServer(BROKER, 1883);
}
void loop() {
if (!mqtt.connected()) sambungMQTT();
mqtt.loop();
if (millis() - terakhir < 5000) return;
float jam = (millis() - terakhir) / 3600000.0; // lama sejak bacaan terakhir, dalam jam
terakhir = millis();
float volt = ina.getBusVoltage_V() + ina.getShuntVoltage_mV() / 1000;
float mA = max(0.0f, ina.getCurrent_mA());
float mW = volt * mA;
energiHariIni += mW * jam; // energi = daya x waktu
time_t t = time(nullptr);
struct tm* w = localtime(&t);
if (t > 1700000000 && w->tm_mday != hariTadi) { // hari baru: laporkan kemarin lalu nolkan
if (hariTadi != -1) mqtt.publish(TOPIK_LOG, ("Kemarin panel menghasilkan " + String(energiHariIni, 0) + " mWh").c_str());
hariTadi = w->tm_mday;
energiHariIni = 0;
}
mqtt.publish(TOPIK_VOLT, String(volt, 2).c_str());
mqtt.publish(TOPIK_ARUS, String(mA, 0).c_str());
mqtt.publish(TOPIK_ENERGI, String(energiHariIni, 0).c_str());
}Langkah 4: Pahami kodenya
- Integrasi sederhana: setiap potongan waktu, daya × lamanya ditambahkan. Makin sering diukur, makin akurat.
- Arus negatif kecil saat malam (derau) dibuang supaya tidak mengurangi total energi.
- Pergantian hari dideteksi dari tanggal. Laporan pertama setelah ESP32 menyala dilewati karena datanya belum sehari penuh.