JUDUL : PENERAPAN ALGORITMA DETEKSI SINYAL
PULSA DAN DEBOUNCING PADA ESP32 UNTUK
PEMANTAUAN TEGANGAN TRAVO VIA WHATSAPP API
Mata Kuliah Internet of Things
Disusun Oleh:
- Irma Aulia 24051204005
- Kaysa Karuma Amalia 24051204011
- Maskurotin Faizah 24051204015
- Qurrota Ayun 24051204082
- Syifa Nayla Artika Dewi 24051204238
BAB I
PENDAHULUAN
1.1 Latar Belakang
Transformator (trafo) adalah salah satu komponen penting dalam sistem distribusi listrik sehingga kondisi kelistrikannya perlu dipantau untuk mengetahui adanya gangguan atau pemadaman. Pemantauan secara manual cukup memakan waktu, sehingga diperlukan sistem pemantauan otomatis dan memberikan informasi secara cepat.
Teknologi Internet of Things (IoT) memungkinkan pemantauan dilakukan secara jarak jauh menggunakan ESP32 yang terhubung dengan jaringan Wi-Fi. Pada sistem ini, sensor Non-Contact Voltage (NCV) digunakan untuk mendeteksi sinyal pulsa sebagai indikator keberadaan tegangan. Jika tidak terdapat pulsa dalam waktu tertentu, sistem mengidentifikasi kondisi sebagai padam.
Untuk menghindari kesalahan deteksi akibat perubahan sinyal yang tidak stabil, sistem menggunakan algoritma debouncing sebagai validasi perubahan status sebelum mengirimkan notifikasi. Informasi kondisi trafo kemudian dikirim secara otomatis melalui WhatsApp API ketika terjadi pemadaman maupun saat listrik kembali normal.
Berdasarkan hal tersebut, dikembangkan sistem berbasis ESP32 dengan menerapkan algoritma deteksi sinyal pulsa dan debouncing untuk mendeteksi kondisi tegangan pada trafo. Hasil deteksi kemudian digunakan untuk mengirimkan notifikasi secara otomatis melalui WhatsApp API ketika terjadi perubahan kondisi listrik.
1.2 Rumusan Masalah
- Bagaimana menerapkan algoritma deteksi sinyal pulsa pada ESP32 untuk mengetahui kondisi tegangan pada trafo?
- Bagaimana menerapkan algoritma debouncing untuk memvalidasi perubahan kondisi tegangan dan mengurangi kesalahan deteksi?
- Bagaimana mengintegrasikan ESP32 dengan WhatsApp API untuk mengirimkan notifikasi ketika terjadi perubahan kondisi tegangan trafo?
1.3 Tujuan Laporan
- Menerapkan algoritma deteksi sinyal pulsa pada ESP32 untuk mengetahui kondisi tegangan pada trafo.
- Menerapkan algoritma debouncing untuk memvalidasi perubahan kondisi tegangan dan mengurangi kesalahan deteksi.
- Mengintegrasikan ESP32 dengan WhatsApp API untuk mengirimkan notifikasi ketika terjadi perubahan kondisi tegangan trafo.
1.4 Manfaat Penulisan
- Bagi pengguna, sistem dapat membantu memantau kondisi tegangan trafo secara otomatis dan memberikan notifikasi ketika terjadi perubahan kondisi listrik melalui WhatsApp API.
- Bagi pengembang, laporan ini dapat menjadi sarana untuk memahami penerapan algoritma deteksi sinyal pulsa dan debouncing pada ESP32 dalam sistem monitoring.
- Bagi akademik, laporan ini dapat menjadi referensi untuk pengembangan sistem monitoring kelistrikan berbasis ESP32 dan Internet of Things (IoT).
BAB II
TINJAUAN PUSTAKA
2.2 Dasar Teori
a. Mikrokontroler ESP32
ESP32 merupakan modul mikrokontroler yang dilengkapi dengan konektivitas Wi-Fi dan Bluetooth terintegrasi, sehingga banyak digunakan pada aplikasi Internet of Things (IoT). ESP32 memiliki sejumlah pin GPIO (General Purpose Input/Output) yang dapat dikonfigurasi sebagai input maupun output digital, serta mendukung komunikasi jaringan melalui pustaka WiFi.h dan HTTPClient.h untuk melakukan request HTTP/HTTPS.
b. Non-Contact Voltage (NCV) Sensor / Tespen Elektronik
Tespen non-kontak (NCV tester) mendeteksi keberadaan medan listrik AC tanpa perlu bersentuhan langsung dengan konduktor. Ketika mendeteksi tegangan, buzzer pada tespen akan aktif dan menghasilkan sinyal berupa pulsa berulang (bukan sinyal tegangan yang stabil/konstan). Karakteristik pulsa inilah yang menjadi dasar dari algoritma deteksi pada sistem ini.
c. Optocoupler
Optocoupler (PC817) digunakan sebagai elemen isolasi galvanis antara rangkaian buzzer tespen dan GPIO ESP32. Optocoupler bekerja dengan memancarkan cahaya inframerah dari LED internal yang kemudian diterima oleh fototransistor, sehingga sinyal dapat diteruskan tanpa adanya hubungan listrik langsung. Hal ini penting untuk melindungi mikrokontroler dari risiko tegangan yang tidak stabil.
d. Algoritma Deteksi Sinyal Berbasis Pulsa
Karena keluaran sensor berupa pulsa LOW yang berulang (bukan level statis), sistem perlu mencatat waktu setiap kali pulsa LOW terdeteksi. Jika dalam rentang waktu tertentu (disebut PULSE_TIMEOUT_MS) tidak ada pulsa baru yang masuk, maka sistem menyimpulkan bahwa tegangan sudah tidak ada (padam).
e. Debouncing
Debouncing adalah teknik untuk menyaring perubahan sinyal yang tidak stabil/sesaat agar tidak dianggap sebagai perubahan kondisi yang valid. Pada sistem ini, debouncing diterapkan pada level yang lebih tinggi dari deteksi pulsa, yaitu dengan mensyaratkan bahwa perubahan status (normal ↔ padam) harus bertahan konsisten selama periode waktu tertentu
(DEBOUNCE_TIME_MS) sebelum notifikasi benar-benar dikirimkan.
f. WhatsApp API (Whapi.Cloud)
Whapi.Cloud adalah layanan pihak ketiga yang menyediakan API untuk mengirim dan menerima pesan WhatsApp secara terprogram melalui endpoint HTTP. Pada sistem ini, endpoint https://gate.whapi.cloud/messages/text digunakan untuk mengirimkan pesan teks ke sebuah channel/saluran WhatsApp dalam format JSON.
2.2 Komponen
1. ESP32
Digunakan sebagai mikrokontroler utama untuk membaca sinyal sensor, mengolah status kondisi listrik, terhubung ke Wi-Fi, dan menjalankan proses pengiriman notifikasi.
2. Sensor Non-Contact Voltage (NCV)
Digunakan untuk mendeteksi keberadaan tegangan tanpa kontak langsung. Output sensor berupa pulsa yang dibaca oleh ESP32 melalui GPIO 23.
3. Optocoupler
Digunakan sebagai penghubung antara output buzzer tespen/NCV dengan input GPIO ESP32.
4. Buzzer Tespen
Menghasilkan sinyal pulsa LOW berulang ketika terdapat tegangan yang kemudian digunakan sebagai indikator oleh sistem.
5. Wi-Fi
Digunakan sebagai koneksi internet ESP32 untuk mengirimkan data dan notifikasi ke layanan WhatsApp.
6. WhatsApp API (Whapi.Cloud)
Digunakan untuk mengirimkan notifikasi otomatis ketika kondisi listrik berubah menjadi padam atau kembali normal.
7. NTP (Network Time Protocol)
Digunakan untuk mendapatkan waktu aktual sehingga notifikasi dapat dilengkapi dengan waktu terjadinya perubahan kondisi
Software/library
- Wokwi Simulator: sebagai platform simulasi berbasis web untuk menjalankan dan menguji program ESP32 serta rangkaian elekktronik
- ArduinoJson: untuk membuat dan mengolah data JSON yang dikirim melalui API.
- Whapi.Cloud AP: sebagai layanan pengiriman pesan WhatsApp.
- Google Maps: digunakan dalam tautan lokasi pada notifikasi gangguan.
BAB III
PEMBAHASAN
3.1 Penjelasan Simulasi

Berdasarkan rangkaian pada Gambar 3.1, terdapat tiga jalur input yang berasal dari tespen, yaitu Tespen 1, Tespen 2, dan Tespen 3. Masing-masing jalur dihubungkan ke optocoupler PC817CAD. Pada sisi input optocoupler digunakan resistor sebesar 1 kΩ untuk membatasi arus yang masuk ke LED internal optocoupler. Sementara itu, sisi output optocoupler dihubungkan dengan pin digital ESP32 melalui jalur D23, D22, dan D21. Pada rangkaian ESP32, jalur tersebut juga dilengkapi resistor 10 kΩ sebagai bagian dari rangkaian input.
Ketika sensor mendeteksi keberadaan tegangan listrik, sinyal dari tespen akan menyebabkan LED pada optocoupler aktif. Aktivasi tersebut menghasilkan perubahan kondisi pada sisi output optocoupler yang kemudian dibaca oleh pin digital ESP32. Dengan menggunakan optocoupler, sinyal dari bagian sensor dapat diteruskan ke ESP32 tanpa menghubungkan rangkaian sensor secara langsung dengan pin mikrokontroler.
Pada implementasi program yang digunakan, GPIO 23 (D23) menjadi jalur pembacaan sensor untuk menentukan kondisi listrik. Sinyal yang diterima pada GPIO 23 tidak dibaca sebagai kondisi HIGH atau LOW yang bersifat tetap, tetapi sebagai pulsa. Ketika terdapat tegangan listrik, sensor menghasilkan pulsa LOW secara berulang. Setiap pulsa yang diterima menunjukkan bahwa keberadaan tegangan masih terdeteksi.
ESP32 melakukan pembacaan pulsa tersebut secara terus-menerus selama sistem berjalan. Setiap kali pulsa LOW diterima, waktu penerimaan pulsa terakhir akan diperbarui. Selama pulsa masih diterima secara berkala, sistem mempertahankan kondisi listrik sebagai NORMAL. Sebaliknya, apabila tidak terdapat pulsa yang diterima selama 2 detik, sistem menganggap bahwa tidak terdapat lagi tegangan yang terdeteksi dan mengubah kondisi menjadi PADAM.
Namun, perubahan kondisi tersebut tidak langsung digunakan sebagai pemicu pengiriman notifikasi. Hal ini dilakukan karena sinyal dari sensor dapat mengalami perubahan sesaat yang belum tentu menunjukkan kondisi listrik yang sebenarnya. Oleh karena itu, sistem menerapkan proses validasi atau debounce selama 7 detik.
Sebagai contoh, ketika sistem sedang berada pada kondisi NORMAL kemudian tidak menerima pulsa selama 2 detik, sistem akan mendeteksi adanya kemungkinan perubahan menjadi PADAM. Kondisi tersebut kemudian masuk ke tahap validasi. Apabila kondisi PADAM tetap bertahan selama 7 detik, perubahan status dianggap valid dan sistem mengirimkan notifikasi Power Outage Alert. Namun, apabila pulsa kembali diterima sebelum proses validasi selesai, perubahan status dibatalkan dan sistem tetap mempertahankan kondisi NORMAL.
Mekanisme yang sama diterapkan ketika listrik kembali menyala. Setelah sistem berada pada kondisi PADAM dan kembali menerima pulsa dari sensor, kondisi tersebut akan divalidasi selama 7 detik. Apabila pulsa tetap diterima secara stabil selama proses validasi, kondisi listrik dinyatakan kembali NORMAL dan sistem mengirimkan notifikasi System Update — Power Restored.
Selain proses deteksi kondisi listrik, ESP32 juga terhubung dengan jaringan Wi-Fi untuk memungkinkan sistem mengirimkan informasi ke layanan Whapi.Cloud API. Sistem melakukan sinkronisasi waktu menggunakan NTP (Network Time Protocol) sehingga waktu kejadian dapat dicantumkan pada pesan notifikasi. Apabila sinkronisasi waktu berhasil, sistem menggunakan waktu aktual sebagai timestamp pada notifikasi.
Notifikasi yang dikirimkan melalui WhatsApp Channel terdiri dari tiga kondisi utama, yaitu:
- System Working Normally
Pesan dikirim ketika ESP32 pertama kali dijalankan dan kondisi listrik pada saat awal pengamatan terdeteksi normal.
- Power Outage Alert
Pesan dikirim ketika tidak terdapat pulsa sensor selama 2 detik dan kondisi PADAM tersebut telah bertahan selama proses validasi 7 detik.
- System Update — Power Restored
Pesan dikirim ketika pulsa kembali terdeteksi dan kondisi listrik NORMAL telah bertahan selama proses validasi.
Pesan notifikasi juga memuat informasi mengenai Asset ID, Asset Name, status listrik, waktu deteksi, koordinat lokasi, serta tindakan yang perlu dilakukan. Dengan demikian, pengguna dapat mengetahui kondisi aset yang dimonitor tanpa harus melakukan pemeriksaan secara langsung terlebih dahulu.
Secara keseluruhan, simulasi sistem bekerja dengan alur sensor NCV → optocoupler → ESP32 → pengolahan status → validasi perubahan → Whapi.Cloud API → WhatsApp Channel. ESP32 berfungsi sebagai pusat pengolahan data yang menerima sinyal dari sensor, menentukan kondisi listrik berdasarkan pulsa yang diterima, memvalidasi perubahan kondisi, kemudian mengirimkan informasi kepada pengguna secara otomatis.
3.2 Program
|
#include <WiFi.h> #include <WiFiClientSecure.h> #include <HTTPClient.h> #include <time.h> #include <ArduinoJson.h>
const char* WIFI_SSID = "Wokwi-GUEST"; const char* WIFI_PASSWORD = "";
// Whapi.Cloud const char* WHAPI_TOKEN = "4NweDS66DbPQUgKuBxpZBCnrGs2jRaBx"; const char* WHAPI_CHANNEL_ID = "6281226477210@s.whatsapp.net"; // MONITOR-KETINTANG⚡ const char* WHAPI_ENDPOINT = "https://gate.whapi.cloud/messages/text";
const char* LOKASI = "KETINTANG";
// Identitas aset & lokasi untuk format pesan notifikasi const char* ASSET_ID = "TR-KTT-001"; const char* ASSET_NAME = "Trafo Ketintang Wiyata"; const char* CHANNEL_NAME = "MONITOR-KETINTANG ⚡"; const double LATITUDE = -7.310655; const double LONGITUDE = 112.7255535;
// GPIO input dari optocoupler (buzzer tespen) const int PIN_NCV = 23;
// ================== PARAMETER DETEKSI PULSA ================== // Buzzer mengirim pulsa LOW berulang selama ada tegangan. // Jika tidak ada pulsa selama PULSE_TIMEOUT_MS -> dianggap tidak ada tegangan. const unsigned long PULSE_TIMEOUT_MS = 2000; // 2 detik
// Debounce / validasi kondisi SEBELUM kirim notifikasi (dalam milidetik) // Ini terpisah dari PULSE_TIMEOUT_MS di atas -- ini untuk mencegah // notifikasi spam saat kondisi baru saja berubah. const unsigned long DEBOUNCE_TIME_MS = 7000; // 5-10 detik, atur sesuai kebutuhan
// NTP untuk timestamp const char* NTP_SERVER = "pool.ntp.org"; const long GMT_OFFSET_SEC = 7 * 3600; // WIB (UTC+7) const int DAYLIGHT_OFFSET = 0; |
// ================== VARIABEL GLOBAL - DETEKSI PULSA
==================
unsigned long waktuPulsaTerakhir = 0; bool adaTeganganPulsa = false; // hasil deteksi pulsa mentah (belum didebounce) bool pulsaPertamaDiterima = false;
// ================== VARIABEL GLOBAL - VALIDASI/DEBOUNCE
NOTIFIKASI ==================
bool statusListrikTervalidasi = true; // status yang sudah lolos debounce
unsigned long waktuMulaiPerubahan = 0; bool sedangValidasiPerubahan = false; bool calonStatusBaru = true;
bool ntpTersedia = false;
// ================== SETUP WIFI ================== void connectWiFi() {
Serial.print("[WiFi] Menghubungkan ke ");
Serial.println(WIFI_SSID);
WiFi.mode(WIFI_STA);
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
unsigned long startAttempt = millis(); while (WiFi.status() != WL_CONNECTED && millis() - startAttempt < 20000) { delay(500);
Serial.print(".");
}
if (WiFi.status() == WL_CONNECTED) {
Serial.println();
Serial.print("[WiFi] Terhubung! IP: ");
Serial.println(WiFi.localIP());
} else {
Serial.println();
Serial.println("[WiFi] Gagal terhubung, akan dicoba ulang di loop().");
}
}
void ensureWiFiConnected() { if (WiFi.status() != WL_CONNECTED) {
Serial.println("[WiFi] Terputus, mencoba reconnect..."); connectWiFi();
}
}
// ================== SETUP NTP / TIMESTAMP ================== void setupNTP() { configTime(GMT_OFFSET_SEC, DAYLIGHT_OFFSET, NTP_SERVER);
struct tm timeinfo;
Serial.print("[NTP] Sinkronisasi waktu");
int percobaan = 0;
while (!getLocalTime(&timeinfo) && percobaan < 10) {
Serial.print("."); delay(500);
percobaan++;
}
if (percobaan < 10) { ntpTersedia = true;
Serial.println();
Serial.println("[NTP] Waktu berhasil disinkronkan.");
} else {
ntpTersedia = false;
Serial.println();
Serial.println("[NTP] Gagal sinkronisasi, akan pakai millis() sebagai fallback.");
}
}
// Mengembalikan string timestamp (NTP jika ada, fallback ke millis)
String getTimestamp() { struct tm timeinfo; if (ntpTersedia && getLocalTime(&timeinfo)) {
char buffer[32]; strftime(buffer, sizeof(buffer), "%d-%m-%Y %H:%M:%S", &timeinfo); return String(buffer);
} else {
unsigned long detik = millis() / 1000; unsigned long jam = detik / 3600; unsigned long menit = (detik % 3600) / 60; unsigned long sisaDetik = detik % 60;
char buffer[32]; snprintf(buffer, sizeof(buffer), "Uptime %02lu:%02lu:%02lu", jam, menit, sisaDetik); return String(buffer);
}
}
// ================== FUNGSI KIRIM WHATSAPP (CHANNEL)
==================
bool kirimWhatsApp(const String &pesan) { ensureWiFiConnected();
if (WiFi.status() != WL_CONNECTED) {
Serial.println("[WA] Gagal kirim, WiFi tidak terhubung."); return false;
}
WiFiClientSecure client;
client.setInsecure(); // lewati verifikasi sertifikat (umum dipakai di ESP32)
HTTPClient http;
Serial.println("[WA] Mengirim notifikasi ke channel...");
if (!http.begin(client, WHAPI_ENDPOINT)) {
Serial.println("[WA] Gagal memulai koneksi HTTPS."); return false;
}
http.addHeader("Content-Type", "application/json"); http.addHeader("Authorization", String("Bearer ") + WHAPI_TOKEN); http.addHeader("accept", "application/json");
StaticJsonDocument<1024> doc; doc["typing_time"] = 0; doc["to"] = WHAPI_CHANNEL_ID;
doc["body"] = pesan;
// Preview link Google Maps dibiarkan aktif (default WhatsApp/Whapi).
String payload;
serializeJson(doc, payload);
int httpCode = http.POST(payload);
bool sukses = false; if (httpCode > 0) {
String response = http.getString();
Serial.printf("[WA] HTTP Response Code: %d\n", httpCode);
Serial.println("[WA] Response: " + response); sukses = (httpCode == 200);
} else {
Serial.printf("[WA] Request gagal, error: %s\n", http.errorToString(httpCode).c_str());
}
http.end(); return sukses;
}
// ================== DETEKSI PULSA (dipanggil tiap iterasi loop)
==================
// Update status pulsa mentah berdasarkan sinyal dari buzzer. // G23 LOW = buzzer sedang ON / ada pulsa -> ada tegangan. void perbaruiDeteksiPulsa() {
int status = digitalRead(PIN_NCV);
if (status == LOW) {
waktuPulsaTerakhir = millis();
if (!pulsaPertamaDiterima) {
pulsaPertamaDiterima = true;
}
if (!adaTeganganPulsa) { adaTeganganPulsa = true;
Serial.println("[PULSA] ADA TEGANGAN (pulsa terdeteksi)");
}
}
// Jika tidak ada pulsa selama PULSE_TIMEOUT_MS -> anggap tidak ada tegangan.
if (adaTeganganPulsa && (millis() - waktuPulsaTerakhir >= PULSE_TIMEOUT_MS)) {
adaTeganganPulsa = false;
Serial.println("[PULSA] TIDAK ADA TEGANGAN (timeout pulsa)");
}
}
// Baca status listrik saat ini hasil deteksi pulsa (true = ada tegangan/normal) bool bacaStatusListrik() {
return adaTeganganPulsa;
}
// ================== FUNGSI VALIDASI KONDISI (DEBOUNCE
NOTIFIKASI) ==================
// Mengembalikan true jika ada perubahan status yang SUDAH tervalidasi bool validasiPerubahanStatus(bool statusSaatIni, bool &statusHasilValidasi) { statusHasilValidasi = statusListrikTervalidasi;
if (statusSaatIni != statusListrikTervalidasi) { if (!sedangValidasiPerubahan || calonStatusBaru != statusSaatIni) { sedangValidasiPerubahan = true; calonStatusBaru = statusSaatIni; waktuMulaiPerubahan = millis();
Serial.println("[VALIDASI] Perubahan terdeteksi, memulai debounce..."); return false;
}
if (millis() - waktuMulaiPerubahan >= DEBOUNCE_TIME_MS) {
statusHasilValidasi = calonStatusBaru; sedangValidasiPerubahan = false;
return true;
}
return false; } else {
if (sedangValidasiPerubahan) {
Serial.println("[VALIDASI] Kondisi kembali stabil, validasi dibatalkan.");
}
sedangValidasiPerubahan = false;
return false;
}
}
// ================== HELPER: BANGUN PESAN OUTAGE
==================
String buatPesanOutage() {
String waktu = getTimestamp();
String koordinat = String(LATITUDE, 6) + ", " + String(LONGITUDE, 6);
String mapsUrl = "https://maps.google.com/?q=" + String(LATITUDE, 6) + "," +
String(LONGITUDE, 6);
String pesan = "🚨 *POWER OUTAGE ALERT*\n\n"; pesan += "Asset ID: " + String(ASSET_ID) + "\n";
pesan += "Asset Name: " + String(ASSET_NAME) + "\n";
pesan += "Status: POWER OUTAGE\n";
pesan += "Detection Time: " + waktu + "\n";
pesan += "Coordinates: " + koordinat + "\n\n";
pesan += "Required Action:\n";
pesan += "Please inspect the transformer and restore the power supply immediately.\n\n"; pesan += "Generated automatically by the ESP32 Transformer Monitoring System.\n\n"; pesan += mapsUrl;
return pesan;
}
// ================== HELPER: BANGUN PESAN RESTORED
==================
String buatPesanRestored() {
String waktu = getTimestamp();
String koordinat = String(LATITUDE, 6) + ", " + String(LONGITUDE, 6);
String mapsUrl = "https://maps.google.com/?q=" + String(LATITUDE, 6) + "," +
String(LONGITUDE, 6);
String pesan = "*SYSTEM UPDATE — POWER RESTORED*\n\n";
pesan += "Asset ID: " + String(ASSET_ID) + "\n"; pesan += "Asset Name: " + String(ASSET_NAME) + "\n"; pesan += "Grid Status: STABLE\n"; pesan += "Restored At: " + waktu + "\n"; pesan += "Coordinates: " + koordinat + "\n\n"; pesan += "Great work, PLN ULP Karangpilang Team.\n"; pesan += "Power has been successfully restored and the grid is operating within normal parameters.\n\n";
pesan += "System Status: FULLY OPERATIONAL\n"; pesan += "— Automated Monitoring System (ESP32)\n\n"; pesan += mapsUrl;
return pesan;
}
// ================== FUNGSI PESAN STARTUP ================== void kirimPesanStartup(bool statusAwal) {
String pesan;
if (statusAwal) {
pesan = "Hi, " + String(CHANNEL_NAME) + "\n"; pesan += "Your system is working normally.";
Serial.println("[STARTUP] Sistem online, kondisi NORMAL.");
} else {
pesan = buatPesanOutage();
Serial.println("[STARTUP] Sistem online, kondisi PADAM terdeteksi!");
}
kirimWhatsApp(pesan);
}
// ================== FUNGSI PROSES NOTIFIKASI (runtime, saat ada
perubahan) ==================
void prosesNotifikasi(bool statusBaru) {
String pesan;
if (statusBaru == false) {
pesan = buatPesanOutage();
Serial.println("[STATUS] Listrik PADAM terkonfirmasi!");
} else {
pesan = buatPesanRestored();
Serial.println("[STATUS] Listrik NORMAL kembali terkonfirmasi!");
}
kirimWhatsApp(pesan);
}
// ================== SETUP ================== void setup() { Serial.begin(115200);
delay(1000);
Serial.println("\n=== ESP32 Monitoring Listrik (NCV Sensor - deteksi pulsa) ===");
pinMode(PIN_NCV, INPUT);
connectWiFi();
setupNTP();
// Ambil beberapa sampel pulsa singkat sebelum menentukan status awal, // supaya pesan startup mencerminkan kondisi aktual (bukan default false). Serial.println("[INIT] Mengamati sinyal buzzer sejenak untuk menentukan status awal...");
unsigned long tSample = millis(); while (millis() - tSample < PULSE_TIMEOUT_MS + 300) {
perbaruiDeteksiPulsa();
delay(10);
}
bool statusAwal = bacaStatusListrik();
Serial.println(statusAwal ? "[INIT] Status awal: LISTRIK NORMAL" : "[INIT] Status awal: LISTRIK PADAM");
statusListrikTervalidasi = statusAwal;
kirimPesanStartup(statusAwal);
Serial.println("=== Sistem siap memonitor ===\n");
}
// ================== LOOP ================== void loop() {
ensureWiFiConnected();
// 1) Perbarui deteksi pulsa mentah setiap iterasi perbaruiDeteksiPulsa();
// 2) Ambil status hasil deteksi pulsa, lalu debounce sebelum notifikasi bool statusSaatIni = bacaStatusListrik();
|
bool statusTervalidasi;
bool adaPerubahanValid = validasiPerubahanStatus(statusSaatIni, statusTervalidasi);
// Debug serial monitor (ringkas, tidak spam) static unsigned long lastPrint = 0; if (millis() - lastPrint >= 2000) { Serial.print("[DEBUG] Pulsa: "); Serial.print(statusSaatIni ? "ADA TEGANGAN" : "TIDAK ADA TEGANGAN"); Serial.print(" | Status tervalidasi: "); Serial.println(statusListrikTervalidasi ? "NORMAL" : "PADAM"); lastPrint = millis(); }
if (adaPerubahanValid) { statusListrikTervalidasi = statusTervalidasi; prosesNotifikasi(statusTervalidasi); }
delay(10); // polling interval sensor (mengikuti versi deteksi pulsa) }
|
BAB IV
PENUTUP
4.1 Kesimpulan
Berdasarkan hasil perancangan dan simulasi sistem monitoring tegangan trafo berbasis Internet of Things (IoT), dapat disimpulkan bahwa:
- Algoritma deteksi sinyal berbasis pulsa berhasil diterapkan pada ESP32 untuk memantau kondisi tegangan listrik. Pulsa LOW yang dihasilkan oleh sensor NCV digunakan sebagai indikator keberadaan tegangan. Sistem menganggap kondisi listrik normal selama pulsa masih diterima secara berkala, sedangkan tidak adanya pulsa selama 2 detik digunakan sebagai indikator kondisi padam.
- Algoritma debouncing berhasil digunakan sebagai mekanisme validasi perubahan kondisi listrik. Perubahan status tidak langsung dianggap valid, tetapi harus bertahan selama 7 detik. Mekanisme ini digunakan untuk mengurangi kemungkinan kesalahan deteksi akibat perubahan atau ketidakstabilan sinyal sensor yang terjadi sesaat.
- ESP32 berhasil diintegrasikan dengan Whapi.Cloud API untuk mengirimkan notifikasi melalui WhatsApp Channel. Sistem dapat memberikan informasi ketika kondisi listrik berubah menjadi padam maupun ketika listrik kembali normal. Notifikasi juga dilengkapi informasi aset, waktu kejadian, dan lokasi sehingga dapat membantu proses pemantauan kondisi trafo secara jarak jauh.
- Secara keseluruhan, sistem yang dirancang dapat mengintegrasikan sensor NCV, optocoupler, ESP32, koneksi Wi-Fi, algoritma deteksi pulsa, debouncing, serta WhatsApp API menjadi sebuah sistem monitoring yang mampu memberikan informasi perubahan kondisi listrik secara otomatis.
4.2 Saran
Untuk pengembangan sistem selanjutnya, beberapa hal yang dapat dilakukan adalah:
- Melakukan pengujian menggunakan kondisi kelistrikan yang lebih beragam agar kemampuan sistem dalam mendeteksi perubahan tegangan dapat diuji secara lebih menyeluruh.
- Menyesuaikan nilai PULSE_TIMEOUT_MS dan DEBOUNCE_TIME_MS berdasarkan hasil pengujian pada sensor secara langsung, sehingga sistem dapat memperoleh waktu respons yang optimal tanpa meningkatkan risiko kesalahan deteksi.
- Mengembangkan sistem agar dapat memantau lebih dari satu jalur atau titik pengukuran secara bersamaan. Dengan demikian, beberapa kondisi tegangan dapat dipantau menggunakan satu sistem monitoring.
- Meningkatkan keamanan sistem, khususnya pada penyimpanan kredensial Wi-Fi dan API token. Informasi tersebut sebaiknya tidak dituliskan secara langsung pada kode yang dibagikan dan dapat dipindahkan ke konfigurasi yang lebih aman.
- Melakukan pengujian dalam kondisi jaringan yang tidak stabil untuk memastikan sistem tetap dapat menangani kegagalan koneksi Wi-Fi maupun kegagalan pengiriman notifikasi dengan baik.
- Sistem dapat dikembangkan lebih lanjut dengan penyimpanan riwayat kondisi listrik, sehingga perubahan status dapat dicatat dan digunakan untuk melakukan pemantauan serta analisis gangguan secara berkala.
DAFTAR PUSTAKA
Espressif Systems. (2026). Arduino ESP32 Documentation. Espressif Systems.
Sharp Corporation. (1996). PC817 Series: High Density Mounting Type Photocoupler. Sharp Corporation.
LAMPIRAN
Link Video :
https://drive.google.com/file/d/1mOreiAxT1H9aAWrxYziDT90dpyk2W21G/view?usp=s haring
Tidak ada komentar:
Posting Komentar