#include #include #include #include #include #include #include #include #include #include // Definitions and initializations RTC_DS3231 rtc; unsigned long BotLastMessageReceivedTime; #define DHTPIN 4 #define DHTTYPE DHT22 DHT dht(DHTPIN, DHTTYPE); #define RELAY1_PIN 27 #define RELAY2_PIN 32 #define RELAY3_PIN 18 #define RELAY4_PIN 33 LiquidCrystal_I2C lcd(0x27, 16, 2); #define CHAT_ID "6261768108" #define BOT_TOKEN "7346491961:AAEE0IcO8oXWjEWRCRyFR5HyHSlrtjzjAgk" WiFiClientSecure secured_client; UniversalTelegramBot bot(BOT_TOKEN, secured_client); const char* ssid = "Bismillah"; const char* password = "Alhamdulillah"; WiFiUDP ntpUDP; NTPClient timeClient(ntpUDP, "pool.ntp.org", 25200, 60000); // 25200 for GMT+7 (WIB) // Variables to store relay states bool relay1ManualMode = false; bool relay2ManualMode = false; bool relay3ManualMode = false; bool relay4ManualMode = false; // Variables to store manual schedules int relay4Hour = 20; int relay4MinuteStart = 50; int relay4MinuteEnd = 0; // Function to handle new messages from the Telegram bot void handleNewMessages(int numNewMessages) { Serial.println("handleNewMessages"); for (int i = 0; i < numNewMessages; i++) { String text = bot.messages[i].text; Serial.println(text); String from_name = bot.messages[i].from_name; if (text == "/start") { String welcome = "Selamat datang di Bot Pengontrol Relay!\n"; welcome += "Gunakan perintah-perintah berikut untuk mengontrol relay:\n\n"; welcome += "/relay1_on untuk mengaktifkan Sprayer\n"; welcome += "/relay1_off untuk menonaktifkan Sprayer\n"; welcome += "/relay1_manual untuk mengatur Sprayer ke mode manual\n"; welcome += "/relay1_auto untuk mengatur Sprayer ke mode otomatis\n"; welcome += "/relay2_on untuk mengaktifkan Kipas\n"; welcome += "/relay2_off untuk menonaktifkan Kipas\n"; welcome += "/relay2_manual untuk mengatur Kipas ke mode manual\n"; welcome += "/relay2_auto untuk mengatur Kipas ke mode otomatis\n"; welcome += "/relay3_on untuk mengaktifkan Lampu UV\n"; welcome += "/relay3_off untuk menonaktifkan Lampu UV\n"; welcome += "/relay3_manual untuk mengatur Lampu UV ke mode manual\n"; welcome += "/relay3_auto untuk mengatur Lampu UV ke mode otomatis\n"; welcome += "/relay4_on untuk mengaktifkan Irigasi\n"; welcome += "/relay4_off untuk menonaktifkan Irigasi\n"; welcome += "/relay4_manual untuk mengatur Irigasi ke mode manual\n"; welcome += "/relay4_auto untuk mengatur Irigasi ke mode otomatis\n"; welcome += "/set_relay4_schedule HH:MM HH:MM untuk mengatur jadwal Irigasi\n"; welcome += "/suhu untuk melihat suhu saat ini\n"; bot.sendMessage(CHAT_ID, welcome, ""); } else if (text == "/relay1_on") { digitalWrite(RELAY1_PIN, HIGH); relay1ManualMode = true; bot.sendMessage(CHAT_ID, "Sprayer telah diaktifkan.", ""); } else if (text == "/relay1_off") { digitalWrite(RELAY1_PIN, LOW); relay1ManualMode = true; bot.sendMessage(CHAT_ID, "Sprayer telah dinonaktifkan.", ""); } else if (text == "/relay1_manual") { relay1ManualMode = true; bot.sendMessage(CHAT_ID, "Sprayer diatur ke mode manual.", ""); } else if (text == "/relay1_auto") { relay1ManualMode = false; bot.sendMessage(CHAT_ID, "Sprayer diatur ke mode otomatis.", ""); } else if (text == "/relay2_on") { digitalWrite(RELAY2_PIN, HIGH); relay2ManualMode = true; bot.sendMessage(CHAT_ID, "Kipas telah diaktifkan.", ""); } else if (text == "/relay2_off") { digitalWrite(RELAY2_PIN, LOW); relay2ManualMode = true; bot.sendMessage(CHAT_ID, "Kipas telah dinonaktifkan.", ""); } else if (text == "/relay2_manual") { relay2ManualMode = true; bot.sendMessage(CHAT_ID, "Kipas diatur ke mode manual.", ""); } else if (text == "/relay2_auto") { relay2ManualMode = false; bot.sendMessage(CHAT_ID, "Kipas diatur ke mode otomatis.", ""); } else if (text == "/relay3_on") { digitalWrite(RELAY3_PIN, HIGH); relay3ManualMode = true; bot.sendMessage(CHAT_ID, "Lampu UV telah diaktifkan.", ""); } else if (text == "/relay3_off") { digitalWrite(RELAY3_PIN, LOW); relay3ManualMode = true; bot.sendMessage(CHAT_ID, "Lampu UV telah dinonaktifkan.", ""); } else if (text == "/relay3_manual") { relay3ManualMode = true; bot.sendMessage(CHAT_ID, "Lampu UV diatur ke mode manual.", ""); } else if (text == "/relay3_auto") { relay3ManualMode = false; bot.sendMessage(CHAT_ID, "Lampu UV diatur ke mode otomatis.", ""); } else if (text == "/relay4_on") { digitalWrite(RELAY4_PIN, HIGH); relay4ManualMode = true; bot.sendMessage(CHAT_ID, "Irigasi telah diaktifkan.", ""); } else if (text == "/relay4_off") { digitalWrite(RELAY4_PIN, LOW); relay4ManualMode = true; bot.sendMessage(CHAT_ID, "Irigasi telah dinonaktifkan.", ""); } else if (text == "/relay4_manual") { relay4ManualMode = true; bot.sendMessage(CHAT_ID, "Irigasi diatur ke mode manual.", ""); } else if (text == "/relay4_auto") { relay4ManualMode = false; bot.sendMessage(CHAT_ID, "Irigasi diatur ke mode otomatis.", ""); } else if (text.startsWith("/set_relay4_schedule")) { int hour, startMinute, endMinute; if (sscanf(text.c_str(), "/set_relay4_schedule %d:%d %d:%d", &hour, &startMinute, &hour, &endMinute) == 4) { relay4Hour = hour; relay4MinuteStart = startMinute; relay4MinuteEnd = endMinute; bot.sendMessage(CHAT_ID, "Jadwal Irigasi telah diubah.", ""); } else { bot.sendMessage(CHAT_ID, "Format jadwal tidak valid. Gunakan /set_Irigasi_schedule HH:MM HH:MM", ""); } } else if (text == "/suhu") { float currentTemperature = dht.readTemperature(); if (!isnan(currentTemperature)) { String message = "Suhu saat ini: " + String(currentTemperature) + " °C"; bot.sendMessage(CHAT_ID, message, ""); } else { bot.sendMessage(CHAT_ID, "Gagal membaca suhu dari sensor DHT!", ""); } } } } // Function to connect to WiFi void connectToWiFi() { Serial.println("Connecting to WiFi..."); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(1000); Serial.println("Attempting to connect to WiFi..."); } Serial.println("Connected to WiFi"); } // Setup function void setup() { Serial.begin(115200); pinMode(RELAY1_PIN, OUTPUT); pinMode(RELAY2_PIN, OUTPUT); pinMode(RELAY3_PIN, OUTPUT); pinMode(RELAY4_PIN, OUTPUT); dht.begin(); Serial.println("Sensor DHT diinisialisasi"); lcd.init(); lcd.backlight(); connectToWiFi(); secured_client.setInsecure(); // Disable certificate validation if (!rtc.begin()) { Serial.println("Couldn't find RTC"); while (1); } // Initialize NTPClient timeClient.begin(); while (!timeClient.update()) { timeClient.forceUpdate(); } if (rtc.lostPower()) { Serial.println("RTC lost power, let's set the time!"); // Get time from NTPClient timeClient.update(); unsigned long epochTime = timeClient.getEpochTime(); rtc.adjust(DateTime(epochTime)); } bot.sendMessage(CHAT_ID, "Bot started up", ""); } // Loop function void loop() { float temperature = dht.readTemperature(); if (!isnan(temperature)) { Serial.print("Temperature: "); Serial.print(temperature); Serial.println(" °C"); if (!relay1ManualMode) { digitalWrite(RELAY1_PIN, temperature > 32 ? HIGH : LOW); } if (!relay2ManualMode) { digitalWrite(RELAY2_PIN, (temperature > 31 && temperature <= 32) ? HIGH : LOW); } if (!relay3ManualMode) { digitalWrite(RELAY3_PIN, temperature < 28 ? HIGH : LOW); } } else { Serial.println("Gagal membaca suhu dari sensor DHT!"); } DateTime now = rtc.now(); Serial.print("Current time: "); Serial.print(now.hour()); Serial.print(":"); Serial.println(now.minute()); if (!relay4ManualMode) { digitalWrite(RELAY4_PIN, (now.hour() == relay4Hour && now.minute() >= relay4MinuteStart && now.minute() <= relay4MinuteEnd) ? HIGH : LOW); } int numNewMessages = bot.getUpdates(bot.last_message_received + 1); Serial.println("Num : " + String(numNewMessages)); if (numNewMessages) { handleNewMessages(numNewMessages); } lcd.setCursor(0, 0); lcd.print("Suhu: "); lcd.print(temperature); lcd.print(" C"); lcd.setCursor(0, 1); lcd.print("R1"); lcd.print(digitalRead(RELAY1_PIN) ? "ON" : "OF"); lcd.print("R2"); lcd.print(digitalRead(RELAY2_PIN) ? "ON" : "OF"); lcd.print("R3"); lcd.print(digitalRead(RELAY3_PIN) ? "ON" : "OF"); lcd.print("R4"); lcd.print(digitalRead(RELAY4_PIN) ? "ON" : "OF"); delay(1000); }