#include <WiFi.h>
#include <WiFiClientSecure.h>
#include <UniversalTelegramBot.h>
#include "DHT.h"
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// Konfigurasi
const char* ssid = "Wokwi-GUEST";
const char* password = "";
#define BOT_TOKEN "8096462221:AAHDRRfuEiRpFWta3eaSbZMLgMjx2zG2LZM"
#define CHAT_ID "7012465456"
#define DHTPIN 14
#define DHTTYPE DHT22
#define BUZZER_PIN 12
// Objek
DHT dht(DHTPIN, DHTTYPE);
LiquidCrystal_I2C lcd(0x27, 20, 4);
WiFiClientSecure client;
UniversalTelegramBot bot(BOT_TOKEN, client);
unsigned long previousMillis = 0;
const long interval = 500; // Interval pembaruan Telegram dalam milidetik (500 ms
// Variabel
float setpoint = 30.0;
bool aboveSetpointNotified = false, belowSetpointNotified = false;
void connectWiFi() {
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
lcd.setCursor(0, 1);
lcd.print("Menghubungkan WiFi");
delay(1000);
}
lcd.clear();
lcd.print("WiFi Terhubung!");
lcd.setCursor(0, 1);
lcd.print("IP: ");
lcd.print(WiFi.localIP());
}
void updateLCD(float t, float h) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Suhu: ");
lcd.print(t);
lcd.print(" C");
lcd.setCursor(0, 1);
lcd.print("Kelembaban: ");
lcd.print(h);
lcd.print(" %");
lcd.setCursor(0, 2);
lcd.print("Setpoint: ");
lcd.print(setpoint);
lcd.print(" C");
}
void handleTemperatureAlerts(float t, float h) {
if (t > setpoint) {
digitalWrite(BUZZER_PIN, HIGH);
lcd.setCursor(0, 3);
lcd.print("!!! Overheat !!!");
if (!aboveSetpointNotified) {
bot.sendMessage(CHAT_ID, "⚠️ Suhu melebihi setpoint.\n🔥 Suhu: " + String(t) + "°C\n💧 Kelembaban: " + String(h) + "%", "");
aboveSetpointNotified = true;
belowSetpointNotified = false;
}
} else {
digitalWrite(BUZZER_PIN, LOW);
lcd.setCursor(0, 3);
lcd.print("Suhu Normal");
if (!belowSetpointNotified) {
bot.sendMessage(CHAT_ID, "✅ Suhu di bawah setpoint.\n🔥 Suhu: " + String(t) + "°C\n💧 Kelembaban: " + String(h) + "%", "");
belowSetpointNotified = true;
aboveSetpointNotified = false;
}
}
}
void handleTelegramMessages() {
int messageCount = bot.getUpdates(bot.last_message_received + 1);
for (int i = 0; i < messageCount; i++) {
String chatId = bot.messages[i].chat_id;
String text = bot.messages[i].text;
if (chatId != CHAT_ID) {
bot.sendMessage(chatId, "Akses ditolak!", "");
continue;
}
if (text.startsWith("/setpoint")) {
float newSetpoint = text.substring(10).toFloat();
if (newSetpoint > 0) {
setpoint = newSetpoint;
bot.sendMessage(CHAT_ID, "✅ Setpoint diubah ke " + String(setpoint) + "°C.", "");
} else {
bot.sendMessage(CHAT_ID, "⚠️ Format salah! Gunakan: /setpoint <nilai>", "");
}
} else if (text == "/status") {
float t = dht.readTemperature();
float h = dht.readHumidity();
bot.sendMessage(CHAT_ID, "🔥 Suhu: " + String(t) + "°C\n💧 Kelembaban: " + String(h) + "%\n⚙️ Setpoint: " + String(setpoint) + "°C.", "");
} else {
bot.sendMessage(CHAT_ID, "Perintah tidak dikenali!", "");
}
}
}
void setup() {
Serial.begin(9600);
dht.begin();
lcd.init();
lcd.backlight();
lcd.print("Inisialisasi...");
pinMode(BUZZER_PIN, OUTPUT);
connectWiFi();
client.setInsecure();
delay(2000);
}
void loop() {
unsigned long currentMillis = millis();
// Perbarui hanya jika interval terpenuhi
if (currentMillis - previousMillis >= interval) {
previousMillis = currentMillis;
float h = dht.readHumidity();
float t = dht.readTemperature();
if (isnan(h) || isnan(t)) {
lcd.print("Error membaca DHT");
return;
}
updateLCD(t, h);
handleTemperatureAlerts(t, h);
handleTelegramMessages();
}
}