Alternatif SCT-013 yang lebih ringkas: modul ZMCT103C sudah berisi trafo arus dan penguat. Kabel beban dilewatkan menembus lubang trafo, lalu ESP32 menghitung arus dan daya. Proyek ini juga mengajarkan cara mengkalibrasi sensor dari dashboard.
ZMCT103C bekerja seperti SCT-013, tetapi bentuknya trafo kecil berlubang di atas modul. Rangkaian bias dan penguat op-amp sudah ada di modul, jadi keluarannya langsung berupa gelombang yang menumpang di tengah tegangan suplai, siap dibaca ESP32. Perhitungan RMS-nya sama dengan proyek 123.
Penguatan modul bisa diatur dengan trimpot dan setiap modul sedikit berbeda, jadi angka ampere per volt harus dikalibrasi. Nyalakan alat yang arusnya diketahui (dari tang ampere, atau daya di label dibagi 220), lalu ketik arusnya di widget Kalibrasi. ESP32 menghitung angka KALIBRASI yang baru dan mengirimkannya ke Text Log. Tulis angka itu di kode supaya tidak hilang saat restart.
Keamanan: kabel beban 220V melewati modul ini. Rakit di dalam kotak tertutup dan jangan menyentuh modul saat beban menyala.
Komponen
| Komponen | Qty | Harga |
|---|---|---|
| ESP32 DOIT DevKit V1 30 pin | 1 | Rp75.000 |
| Sensor Arus 5A AC Single Phase Current Transform | 1 | Rp15.000 |
| Kabel jumper female-female 10 cm (isi 10)isi 10, terpakai 3 | 1 | Rp3.500 |
| Kabel micro USB data 30 cmopsional, kalau belum punya kabel micro USB data | 1 | Rp11.700 |
| Total (tanpa opsional) | Rp93.500 |
Langkah 1: Rangkai komponen
Sambungkan kabel sesuai gambar di atas. Kalau gambar dan tabel terlihat berbeda, ikuti tabel.
| Dari | Ke | Kabel | |
|---|---|---|---|
| Modul arus AC ZMCT103C VCC | → | 3V3 | merah |
| Modul arus AC ZMCT103C GND | → | GND | hitam |
| Modul arus AC ZMCT103C OUT | → | D34 GPIO34 | hijau |
Langkah 2: Siapkan dashboard Klenik
Cara cepat: unduh p125.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 Arus AC | ichibot/KODE/p125/arus | 0–5 A |
| Gauge Perkiraan Daya | ichibot/KODE/p125/daya | 0–1100 W |
| TEXT_INPUT Kalibrasi (arus sebenarnya, A) | ichibot/KODE/p125/kalibrasi | teks bebas |
| Text Log Catatan | ichibot/KODE/p125/log | menampilkan teks masuk |
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 125 - Arus AC Modul ZMCT103C
// 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_LOG = "ichibot/budi1234/p125/log";
const char* TOPIK_KALIBRASI = "ichibot/budi1234/p125/kalibrasi";
const char* TOPIK_ARUS = "ichibot/budi1234/p125/arus";
const char* TOPIK_DAYA = "ichibot/budi1234/p125/daya";
float KALIBRASI = 10.0; // ampere per volt, isi setelah kalibrasi (lihat penjelasan)
const char* BROKER = "mqtt.ichibot.id";
WiFiClient wifi;
PubSubClient mqtt(wifi);
const int PIN_ARUS = 34;
unsigned long terakhir = 0;
float ukurVrms() {
const int N = 2000;
static int data[N];
long jumlah = 0;
for (int i = 0; i < N; i++) { data[i] = analogReadMilliVolts(PIN_ARUS); jumlah += data[i]; delayMicroseconds(100); }
float tengah = (float)jumlah / N;
double kuadrat = 0;
for (int i = 0; i < N; i++) kuadrat += sq(data[i] - tengah);
return sqrt(kuadrat / N) / 1000.0;
}
void pesanMasuk(char* t, byte* isi, unsigned int panjang) {
// kirim arus sebenarnya (dari tang ampere/label alat) untuk kalibrasi, misalnya "1.8"
String p;
for (unsigned int i = 0; i < panjang; i++) p += (char)isi[i];
float sebenarnya = p.toFloat();
float v = ukurVrms();
if (sebenarnya > 0 && v > 0.005) {
KALIBRASI = sebenarnya / v;
mqtt.publish(TOPIK_LOG, ("Kalibrasi baru: " + String(KALIBRASI, 2) + " A/V. Tulis angka ini di kode.").c_str());
}
}
void langganan() {
mqtt.subscribe(TOPIK_KALIBRASI);
}
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);
mqtt.setCallback(pesanMasuk);
}
void loop() {
if (!mqtt.connected()) sambungMQTT();
mqtt.loop();
if (millis() - terakhir >= 2000) {
terakhir = millis();
float v = ukurVrms();
float ampere = v * KALIBRASI;
if (ampere < 0.05) ampere = 0;
Serial.printf("Vrms %.4f V -> %.2f A\n", v, ampere);
mqtt.publish(TOPIK_ARUS, String(ampere, 2).c_str());
mqtt.publish(TOPIK_DAYA, String(ampere * 220, 0).c_str());
}
}Langkah 4: Pahami kodenya
- Kalibrasi satu titik: kalau beban 1,8A menghasilkan 0,19V, berarti 1V setara 9,47A.
- Bukan
const, karena angkanya bisa diubah dari dashboard selama ESP32 menyala. - Sama dengan proyek 123: ambil 2000 sampel, cari titik tengah, lalu hitung RMS.