commit cf581c362ad0f9d79db69d25108790b769fd1a8f Author: Mohammad_Rodivol_Hak Date: Tue Jul 23 12:25:04 2024 +0700 Upload files to "/" diff --git a/Alat Pendeteksi Hujan dan Jemuran Otomatis .pdf b/Alat Pendeteksi Hujan dan Jemuran Otomatis .pdf new file mode 100644 index 0000000..2dc1f9b --- /dev/null +++ b/Alat Pendeteksi Hujan dan Jemuran Otomatis .pdf @@ -0,0 +1,427 @@ + LAMPIRAN + +Lampiran 1 Source Code + +#include +#include +#include +#include +#include +#include // Library untuk HTTP request + +// Ganti dengan kredensial WiFi dan token bot Anda +const char* ssid = "Oioi"; // Nama WiFi +const char* password = "00000001"; // Password WiFi +const char* botToken = "7379595880:AAEcQvnXyZzbevsMvtjam- +uNWFrJ7ZCu8tM"; // Token Telegram Bot +const char* chatID = "5060163371"; // ID chat untuk pengiriman +pesan +const char* serverName = +"http://192.168.137.237/cuacaDB/post.php"; // Alamat server +PHP + +LiquidCrystal_I2C lcd(0x27, 16, 2); +WiFiClientSecure client; +WiFiClient httpClient; // Deklarasi WiFiClient untuk HTTP +request +UniversalTelegramBot bot(botToken, client); + +const int raindropPin = 2; +const int LDRPin = A0; +const int buttonPin = D7; +const int buzzerPin = D3; +#define ENA D8 +#define IN1 14 +#define IN2 12 +#define lamp D0 + +bool motorRunning = false; +volatile bool buttonPressed = false; +bool buzzerOn = false; +bool manualLampOff = false; +bool manualControl = false; +int lastRaindropValue = 1; +int lastLDRValue = 0; + +void ICACHE_RAM_ATTR handleButtonPress() { + + 1 + buttonPressed = true; +} + +void sendToServer(const String &status) { + if (WiFi.status() == WL_CONNECTED) { + HTTPClient http; + + // Encode status untuk memastikan tidak ada karakter yang +tidak valid dalam URL + + String encodedStatus = urlencode(status); + String url = String(serverName) + "?status=" + +encodedStatus; + + Serial.print("Connecting to URL: "); + Serial.println(url); // Debugging URL + + http.begin(httpClient, url); // Menggunakan WiFiClient +dengan URL + + int httpCode = http.GET(); + + if (httpCode > 0) { + String payload = http.getString(); + Serial.println("HTTP Response code: " + + +String(httpCode)); + Serial.println(payload); + + } else { + Serial.println("Error on HTTP request"); + + } + http.end(); + } else { + Serial.println("WiFi not connected"); + } +} + +String urlencode(String str) { + String encodedString = ""; + char c; + char code0; + char code1; + char code2; + for (int i = 0; i < str.length(); i++) { + c = str.charAt(i); + if (c == ' ') { + encodedString += '+'; + } else if (isalnum(c)) { + encodedString += c; + + } else { + code1 = (c & 0xf) + '0'; + if ((c & 0xf) > 9) { + code1 = (c & 0xf) - 10 + 'A'; + } + c = (c >> 4) & 0xf; + code0 = c + '0'; + if (c > 9) { + code0 = c - 10 + 'A'; + } + code2 = '\0'; + encodedString += '%'; + encodedString += code0; + encodedString += code1; + + } + yield(); + } + return encodedString; +} + +void setup() { + pinMode(LDRPin, INPUT); + pinMode(raindropPin, INPUT); + pinMode(buttonPin, INPUT_PULLUP); + pinMode(buzzerPin, OUTPUT); + pinMode(ENA, OUTPUT); + pinMode(IN1, OUTPUT); + pinMode(IN2, OUTPUT); + pinMode(lamp, OUTPUT); + digitalWrite(lamp, HIGH); + + lcd.init(); + lcd.backlight(); + lcd.setCursor(0, 0); + lcd.print("Alat Pendeteksi"); + lcd.setCursor(0, 1); + lcd.print("Hujan"); + delay(1000); + + lcd.clear(); + lcd.setCursor(0, 0); + lcd.print("Jemuran"); + lcd.setCursor(0, 1); + lcd.print("Otomatis"); + delay(1000); + + Serial.begin(115200); + Serial.println("alat pendeteksi hujan dan jemuran +otomatis"); + delay(1000); + + attachInterrupt(digitalPinToInterrupt(buttonPin), +handleButtonPress, FALLING); + + WiFi.begin(ssid, password); + while (WiFi.status() != WL_CONNECTED) { + + delay(1000); + Serial.println("Menghubungkan ke WiFi..."); + } + Serial.println("Terhubung ke WiFi"); + + client.setInsecure(); +} + +void loop() { + int LDRValue = analogRead(LDRPin); + int raindropValue = digitalRead(raindropPin); + + Serial.print("Raindrop Sensor Value: "); + Serial.println(raindropValue); + Serial.print("LDR Sensor Value: "); + Serial.println(LDRValue); + + if (buttonPressed) { + buttonPressed = false; + digitalWrite(buzzerPin, LOW); + buzzerOn = false; + Serial.println("Button pressed! Buzzer OFF."); + delay(200); + + } + + if (!manualControl) { + // Menarik jemuran ke dalam jika terdeteksi hujan + if (raindropValue == 0 && lastRaindropValue == 1) { + digitalWrite(buzzerPin, HIGH); + buzzerOn = true; + digitalWrite(lamp, LOW); + manualLampOff = false; + Serial.println("Mengirim notifikasi ke Telegram: +Terdeteksi hujan!"); + + if (bot.sendMessage(chatID, "Terdeteksi hujan!", "")) { + Serial.println("Notifikasi terkirim."); + + } else { + Serial.println("Gagal mengirim notifikasi."); + + } + + if (!motorRunning) { + motorRunning = true; + digitalWrite(IN1, HIGH); + digitalWrite(IN2, LOW); + analogWrite(ENA, 255); + delay(900); + digitalWrite(IN1, LOW); + digitalWrite(IN2, LOW); + analogWrite(ENA, 0); + + lcd.clear(); + lcd.setCursor(0, 0); + lcd.print("Menarik ke dalam"); + lcd.setCursor(0, 1); + lcd.print("Hujan"); + sendToServer("Menarik ke dalam (Hujan)"); // Kirim +data ke server + } + } + // Menarik jemuran ke dalam jika terdeteksi gelap + else if (LDRValue > 800 && raindropValue == 1) { + if (!manualLampOff) { + digitalWrite(lamp, LOW); + } + if (!motorRunning) { + motorRunning = true; + digitalWrite(IN1, HIGH); + digitalWrite(IN2, LOW); + analogWrite(ENA, 255); + delay(900); + digitalWrite(IN1, LOW); + digitalWrite(IN2, LOW); + analogWrite(ENA, 0); + + lcd.clear(); + lcd.setCursor(0, 0); + lcd.print("Menarik ke dalam"); + lcd.setCursor(0, 1); + lcd.print("Gelap"); + + Serial.println("Mengirim notifikasi ke Telegram: +Terdeteksi Gelap."); + + if (bot.sendMessage(chatID, "Terdeteksi Gelap.", "")) +{ + + Serial.println("Notifikasi terkirim."); + } else { + + Serial.println("Gagal mengirim notifikasi."); + } + sendToServer("Menarik ke dalam (Hujan)"); // Kirim +data ke server + } + } + // Menarik jemuran keluar jika cerah dan tidak hujan + else if (raindropValue == 1 && LDRValue <= 800 && +motorRunning) { + if (!manualLampOff) { + digitalWrite(lamp, HIGH); + } + motorRunning = false; + digitalWrite(IN1, LOW); + digitalWrite(IN2, HIGH); + analogWrite(ENA, 255); + delay(900); + digitalWrite(IN1, LOW); + digitalWrite(IN2, LOW); + analogWrite(ENA, 0); + + lcd.clear(); + lcd.setCursor(0, 0); + lcd.print("Menarik keluar"); + lcd.setCursor(0, 1); + lcd.print("Cerah"); + + Serial.println("Mengirim notifikasi ke Telegram: Jemuran +ditarik keluar."); + + if (bot.sendMessage(chatID, "Jemuran ditarik keluar +karena cerah.", "")) { + + Serial.println("Notifikasi terkirim."); + } else { + + Serial.println("Gagal mengirim notifikasi."); + } + sendToServer("Menarik keluar (Cerah)"); // Kirim data ke +server + + } + } + + if (LDRValue <= 800 && lastLDRValue > 800) { + manualLampOff = false; + + } + + lastRaindropValue = raindropValue; + lastLDRValue = LDRValue; + + int numNewMessages = +bot.getUpdates(bot.last_message_received + 1); + + while (numNewMessages) { + Serial.println("Pesan baru diterima"); + + for (int i = 0; i < numNewMessages; i++) { + String chat_id = String(bot.messages[i].chat_id); + String text = bot.messages[i].text; + + Serial.println("Pesan: " + text); + + if (text == "/buzzer_off") { + digitalWrite(buzzerPin, LOW); + buzzerOn = false; + bot.sendMessage(chat_id, "Buzzer dimatikan.", ""); + Serial.println("Buzzer dimatikan melalui Telegram."); + + } + + if (text == "/lamp_off") { + digitalWrite(lamp, HIGH); + manualLampOff = true; + bot.sendMessage(chat_id, "Lampu dimatikan.", ""); + Serial.println("Lampu dimatikan melalui Telegram."); + + } + + if (text == "/lamp_on") { + digitalWrite(lamp, LOW); + manualLampOff = false; + bot.sendMessage(chat_id, "Lampu dinyalakan.", ""); + Serial.println("Lampu dinyalakan melalui Telegram."); + + } + if (text == "/pull_in") { + manualControl = true; + if (!motorRunning) { + motorRunning = true; + digitalWrite(IN1, HIGH); + digitalWrite(IN2, LOW); + analogWrite(ENA, 255); + delay(900); + digitalWrite(IN1, LOW); + digitalWrite(IN2, LOW); + analogWrite(ENA, 0); + + lcd.clear(); + lcd.setCursor(0, 0); + lcd.print("Menarik ke dalam"); + lcd.setCursor(0, 1); + lcd.print("Manual"); + } + bot.sendMessage(chat_id, "Jemuran ditarik ke dalam.", +""); + Serial.println("Jemuran ditarik ke dalam melalui +Telegram."); + } + + if (text == "/push_out") { + manualControl = true; + if (motorRunning) { + motorRunning = false; + digitalWrite(IN1, LOW); + digitalWrite(IN2, HIGH); + analogWrite(ENA, 255); + delay(900); + digitalWrite(IN1, LOW); + digitalWrite(IN2, LOW); + analogWrite(ENA, 0); + + lcd.clear(); + lcd.setCursor(0, 0); + lcd.print("Menarik keluar"); + lcd.setCursor(0, 1); + lcd.print("Manual"); + } + bot.sendMessage(chat_id, "Jemuran ditarik keluar.", + +""); + Serial.println("Jemuran ditarik keluar melalui +Telegram."); + + } + // Tambahkan perintah baru untuk mengaktifkan kembali +mode otomatis + if (text == "/auto_mode") { + + manualControl = false; // Menonaktifkan kontrol manual + bot.sendMessage(chat_id, "Mode otomatis diaktifkan +kembali.", ""); + Serial.println("Mode otomatis diaktifkan kembali +melalui Telegram."); + } + if ( text = "/options"){ + String keyboardJson = "[[\"/buzzer_off\", +\"/lamp_off\"\"/lamp_on\"],[\"/pull_in\",\"/push_out\"],[\"/au +to_mode\"]]"; + bot.sendMessageWithReplyKeyboard(chat_id, "Choose from +one of the following Start", "", keyboardJson, true); + } + if (text == "/start") + { + String welcome = "Selamat Datang\n"; + welcome += "Silahkan Pilih dibawah.\n\n"; + welcome += "/buzzer_off : Matikan Buzzer\n"; + welcome += "/lamp_off : Matikan Lampu\n"; + welcome += "/lamp_on : Hidupkan Lampu\n"; + welcome += "/pull_in : Tarik Masuk\n"; + welcome += "/push_out : Tarik Keluar\n"; + welcome += "/auto_mode : Mode otomatis\n"; + welcome += "/options : returns the reply keyboard\n"; + bot.sendMessage(chat_id, welcome, "Markdown"); + } + } + + numNewMessages = bot.getUpdates(bot.last_message_received ++ 1); + + } + + delay(100); +} +