Ukur tegangan baterai 18650 dengan dua resistor saja, lalu tampilkan voltase dan perkiraan persen isinya di Klenik. Dasar penting untuk semua alat bertenaga baterai: kamu tahu kapan baterai harus diisi sebelum alat mati.
Baterai 18650 penuh bertegangan 4,2V, padahal pin ESP32 maksimal 3,3V. Dua resistor 100K yang disusun seri membagi tegangan itu menjadi dua: titik tengahnya hanya setengah tegangan baterai (2,1V saat penuh), aman untuk GPIO34. ESP32 membaca milivolt di titik tengah, lalu mengalikannya dengan 2.
Resistor dipilih besar (100K) supaya arus yang terbuang lewat pembagi sangat kecil (±20 µA), jadi baterai tidak terkuras oleh pengukurnya sendiri. Persen isi dihitung dari tegangan dengan dua garis lurus: 3,0-3,7V untuk 0-40% dan 3,7-4,2V untuk 40-100%, kira-kira mengikuti kurva baterai Li-ion.
Komponen
| Komponen | Qty | Harga |
|---|---|---|
| ESP32 DOIT DevKit V1 30 pin | 1 | Rp75.000 |
| 18650 Flat Head Lithium Battery Real 2600mAh 3.7 | 1 | Rp32.175 |
| 18650 lithium battery 1 bracket socket holder pa | 1 | Rp1.000 |
| 10x Resistor 1/4 Watt 1% 100K ohm 100000 Metal fisi 10, terpakai 2 | 1 | Rp1.800 |
| Breadboard mini 170 titik | 1 | Rp4.875 |
| Kabel jumper male-female 10 cm (isi 10)isi 10, terpakai 2 | 1 | Rp3.500 |
| Kabel micro USB data 30 cmopsional, kalau belum punya kabel micro USB data | 1 | Rp11.700 |
| Total (tanpa opsional) | Rp118.350 |
Langkah 1: Rangkai komponen
Sambungkan kabel sesuai gambar di atas. Kalau gambar dan tabel terlihat berbeda, ikuti tabel.
| Dari | Ke | Kabel | |
|---|---|---|---|
| Baterai 18650 + pembagi 2×100K OUT | → | D34 GPIO34 | hijau |
| Baterai 18650 + pembagi 2×100K GND | → | GND | hitam |
Langkah 2: Siapkan dashboard Klenik
Cara cepat: unduh p127.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 Baterai | ichibot/KODE/p127/volt | 2.8–4.3 V |
| Gauge Isi Baterai | ichibot/KODE/p127/persen | 0–100 % |
| Indikator Boolean Baterai | ichibot/KODE/p127/lemah | ON = 1 “ISI ULANG!”, OFF = 0 |
Langkah 3: Upload kode
Library: PubSubClient (Nick O'Leary). 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 127 - Tegangan Baterai 18650 (Pembagi Tegangan)
// Board: ESP32 DOIT DevKit V1 | Dashboard: klenik.ichibot.id
#include <WiFi.h>
#include <PubSubClient.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_VOLT = "ichibot/budi1234/p127/volt";
const char* TOPIK_PERSEN = "ichibot/budi1234/p127/persen";
const char* TOPIK_LEMAH = "ichibot/budi1234/p127/lemah";
const char* BROKER = "mqtt.ichibot.id";
WiFiClient wifi;
PubSubClient mqtt(wifi);
const int PIN_BAT = 34;
const float KALI = 2.0; // pembagi 100K/100K: tegangan di pin = setengah tegangan baterai
unsigned long terakhir = 0;
int persenBaterai(float v) { // perkiraan kasar kurva Li-ion
if (v >= 4.20) return 100;
if (v <= 3.00) return 0;
if (v >= 3.70) return 40 + (v - 3.70) / 0.50 * 60; // 3,7-4,2 V = 40-100%
return (v - 3.00) / 0.70 * 40; // 3,0-3,7 V = 0-40%
}
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);
sambungWiFi();
mqtt.setServer(BROKER, 1883);
}
void loop() {
if (!mqtt.connected()) sambungMQTT();
mqtt.loop();
if (millis() - terakhir >= 5000) {
terakhir = millis();
long jumlah = 0;
for (int i = 0; i < 20; i++) jumlah += analogReadMilliVolts(PIN_BAT);
float vBat = jumlah / 20 / 1000.0 * KALI;
int persen = persenBaterai(vBat);
Serial.printf("Baterai %.2f V (%d%%)\n", vBat, persen);
mqtt.publish(TOPIK_VOLT, String(vBat, 2).c_str());
mqtt.publish(TOPIK_PERSEN, String(persen).c_str());
mqtt.publish(TOPIK_LEMAH, vBat < 3.3 ? "1" : "0");
}
}Langkah 4: Pahami kodenya
- Faktor pembagi. Untuk 100K + 100K hasilnya 2. Kalau memakai 100K + 47K, faktornya (100 + 47) / 47 = 3,13.
- Tegangan Li-ion tidak turun lurus. Dua garis ini perkiraan yang cukup baik untuk pemakaian sehari-hari.
- Rata-rata 20 bacaan dalam milivolt, diubah ke volt, lalu dikali faktor pembagi.