Skematik ESP-12S ke USB
Catatan penting: saya anggap board yang dipakai adalah NodeMCU ESP8266, bukan Arduino Uno biasa. Karena Telegram butuh WiFi, lebih cocok pakai ESP8266 langsung.
Table
| Kondisi | Jarak Air dari Sensor | Status | LED | Buzzer | Telegram |
|---|---|---|---|---|---|
| Aman | > 30 cm | AMAN | Hijau ON | OFF | Tidak terus-menerus |
| Waspada | 15–30 cm | WASPADA | Kuning ON | Beep pelan | Kirim notifikasi |
| Bahaya | < 15 cm | BAHAYA | Merah ON | Beep cepat | Kirim notifikasi |
Table
| HC-SR04 | NodeMCU |
|---|---|
| VCC | VIN / 5V |
| GND | GND |
| TRIG | D5 / GPIO14 |
| ECHO | D6 / GPIO12 melalui pembagi tegangan |
Text
HC-SR04 ECHO ---- R1 1kΩ ----+---- D6 NodeMCU | R2 2kΩ | GND
Table
| LCD I2C | NodeMCU |
|---|---|
| VCC | VIN / 5V |
| GND | GND |
| SDA | D2 / GPIO4 |
| SCL | D1 / GPIO5 |
0x27 atau 0x3F.Table
| LED | Anoda LED | Katoda LED |
|---|---|---|
| Hijau | D0 / GPIO16 lewat resistor 220Ω | GND |
| Kuning | D7 / GPIO13 lewat resistor 220Ω | GND |
| Merah | D8 / GPIO15 lewat resistor 220Ω | GND |
Text
NodeMCU Pin ---- Resistor 220Ω ---- Anoda LED Katoda LED ------------------------ GND
Table
| Buzzer | NodeMCU |
|---|---|
| Positif + | D3 / GPIO0 |
| Negatif - | GND |
Table
| Fungsi | Pin NodeMCU |
|---|---|
| TRIG HC-SR04 | D5 / GPIO14 |
| ECHO HC-SR04 | D6 / GPIO12 |
| LCD SDA | D2 / GPIO4 |
| LCD SCL | D1 / GPIO5 |
| LED Hijau | D0 / GPIO16 |
| LED Kuning | D7 / GPIO13 |
| LED Merah | D8 / GPIO15 |
| Buzzer | D3 / GPIO0 |
ESP8266WiFiWiFiClientSecureUniversalTelegramBotArduinoJsonLiquidCrystal_I2CText
Board: NodeMCU 1.0 ESP-12E Module
Text
/newbot
Text
https://api.telegram.org/botTOKEN_BOT_ANDA/getUpdates
TOKEN_BOT_ANDA dengan token asli.Cpp
const char* ssid = "NAMA_WIFI"; const char* password = "PASSWORD_WIFI"; #define BOT_TOKEN "TOKEN_BOT_TELEGRAM" #define CHAT_ID "CHAT_ID_ANDA"
Cpp
#include <ESP8266WiFi.h> #include <WiFiClientSecure.h> #include <UniversalTelegramBot.h> #include <ArduinoJson.h> #include <Wire.h> #include <LiquidCrystal_I2C.h> // ========================== // WiFi dan Telegram // ========================== const char* ssid = "NAMA_WIFI"; const char* password = "PASSWORD_WIFI"; #define BOT_TOKEN "TOKEN_BOT_TELEGRAM" #define CHAT_ID "CHAT_ID_ANDA" WiFiClientSecure secured_client; UniversalTelegramBot bot(BOT_TOKEN, secured_client); // ========================== // LCD I2C // ========================== LiquidCrystal_I2C lcd(0x27, 16, 2); // Jika LCD tidak tampil, coba ubah 0x27 menjadi 0x3F // ========================== // Pin NodeMCU // ========================== #define TRIG_PIN D5 #define ECHO_PIN D6 #define LED_HIJAU D0 #define LED_KUNING D7 #define LED_MERAH D8 #define BUZZER_PIN D3 // ========================== // Batas Level Air // ========================== #define BATAS_WASPADA 30 #define BATAS_BAHAYA 15 // ========================== // Timer Notifikasi // ========================== unsigned long lastTelegramTime = 0; const unsigned long telegramInterval = 60000; // kirim notifikasi maksimal setiap 60 detik String statusSebelumnya = ""; void setup() { Serial.begin(115200); pinMode(TRIG_PIN, OUTPUT); pinMode(ECHO_PIN, INPUT); pinMode(LED_HIJAU, OUTPUT); pinMode(LED_KUNING, OUTPUT); pinMode(LED_MERAH, OUTPUT); pinMode(BUZZER_PIN, OUTPUT); digitalWrite(LED_HIJAU, LOW); digitalWrite(LED_KUNING, LOW); digitalWrite(LED_MERAH, LOW); digitalWrite(BUZZER_PIN, LOW); lcd.init(); lcd.backlight(); lcd.setCursor(0, 0); lcd.print("Pendeteksi"); lcd.setCursor(0, 1); lcd.print("Banjir ESP8266"); delay(2000); lcd.clear(); lcd.setCursor(0, 0); lcd.print("Connect WiFi..."); WiFi.begin(ssid, password); Serial.print("Menghubungkan WiFi"); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } secured_client.setInsecure(); Serial.println(); Serial.println("WiFi Terhubung"); Serial.print("IP Address: "); Serial.println(WiFi.localIP()); lcd.clear(); lcd.setCursor(0, 0); lcd.print("WiFi Terhubung"); lcd.setCursor(0, 1); lcd.print(WiFi.localIP()); delay(2000); bot.sendMessage(CHAT_ID, "Sistem pendeteksi banjir ESP8266 aktif.", ""); } void loop() { long jarak = bacaJarakCM(); String statusAir = tentukanStatus(jarak); tampilkanLCD(jarak, statusAir); kontrolOutput(statusAir); kirimTelegramJikaPerlu(jarak, statusAir); Serial.print("Jarak: "); Serial.print(jarak); Serial.print(" cm | Status: "); Serial.println(statusAir); delay(1000); } long bacaJarakCM() { digitalWrite(TRIG_PIN, LOW); delayMicroseconds(2); digitalWrite(TRIG_PIN, HIGH); delayMicroseconds(10); digitalWrite(TRIG_PIN, LOW); long durasi = pulseIn(ECHO_PIN, HIGH, 30000); if (durasi == 0) { return 999; } long jarak = durasi * 0.034 / 2; return jarak; } String tentukanStatus(long jarak) { if (jarak <= BATAS_BAHAYA) { return "BAHAYA"; } else if (jarak <= BATAS_WASPADA) { return "WASPADA"; } else { return "AMAN"; } } void tampilkanLCD(long jarak, String statusAir) { lcd.clear(); lcd.setCursor(0, 0); lcd.print("Jarak: "); lcd.print(jarak); lcd.print(" cm"); lcd.setCursor(0, 1); lcd.print("Status: "); lcd.print(statusAir); } void kontrolOutput(String statusAir) { if (statusAir == "AMAN") { digitalWrite(LED_HIJAU, HIGH); digitalWrite(LED_KUNING, LOW); digitalWrite(LED_MERAH, LOW); digitalWrite(BUZZER_PIN, LOW); } else if (statusAir == "WASPADA") { digitalWrite(LED_HIJAU, LOW); digitalWrite(LED_KUNING, HIGH); digitalWrite(LED_MERAH, LOW); digitalWrite(BUZZER_PIN, HIGH); delay(100); digitalWrite(BUZZER_PIN, LOW); } else if (statusAir == "BAHAYA") { digitalWrite(LED_HIJAU, LOW); digitalWrite(LED_KUNING, LOW); digitalWrite(LED_MERAH, HIGH); digitalWrite(BUZZER_PIN, HIGH); delay(300); digitalWrite(BUZZER_PIN, LOW); delay(100); } } void kirimTelegramJikaPerlu(long jarak, String statusAir) { unsigned long currentTime = millis(); bool statusBerubah = statusAir != statusSebelumnya; bool sudahLewatInterval = currentTime - lastTelegramTime > telegramInterval; if ((statusAir == "WASPADA" || statusAir == "BAHAYA") && (statusBerubah || sudahLewatInterval)) { String pesan = ""; if (statusAir == "WASPADA") { pesan += "PERINGATAN BANJIR\n"; pesan += "Status: WASPADA\n"; } else if (statusAir == "BAHAYA") { pesan += "BAHAYA BANJIR!\n"; pesan += "Status: BAHAYA\n"; } pesan += "Jarak air dari sensor: "; pesan += String(jarak); pesan += " cm\n"; if (statusAir == "WASPADA") { pesan += "Air mulai naik. Harap dipantau."; } else { pesan += "Air sangat tinggi. Segera lakukan tindakan."; } bot.sendMessage(CHAT_ID, pesan, ""); lastTelegramTime = currentTime; } if (statusAir == "AMAN" && statusSebelumnya != "AMAN") { String pesan = "Status kembali AMAN.\n"; pesan += "Jarak air dari sensor: "; pesan += String(jarak); pesan += " cm"; bot.sendMessage(CHAT_ID, pesan, ""); } statusSebelumnya = statusAir; }
Text
+----------------------+ | NodeMCU ESP8266 | | | 5V/VIN ----+ VIN GND +---- GND semua modul | | D5 --------+ TRIG | D6 <-------+ ECHO via divider | | | D1 --------+ SCL LCD I2C | D2 --------+ SDA LCD I2C | | | D0 --------+ LED Hijau + 220R | D7 --------+ LED Kuning + 220R | D8 --------+ LED Merah + 220R | | | D3 --------+ Buzzer + | +----------------------+ HC-SR04: VCC -> VIN/5V GND -> GND TRIG -> D5 ECHO -> Divider -> D6 LCD I2C: VCC -> VIN/5V GND -> GND SDA -> D2 SCL -> D1
BATAS_WASPADABATAS_BAHAYA