#include <Wire.h> // Pustaka untuk komunikasi I2C
#include <LiquidCrystal_I2C.h> // Pustaka untuk mengontrol LCD I2C
#include <WiFi.h>
#include <HTTPClient.h>
// Pin MQ-2
const int gasSensorPin = 34; // A0 dari MQ-2 ke GPIO34 (ADC)
// Pin Flame Sensor
const int flameSensorPin = 25; // OUT dari Flame Sensor ke GPIO25
// Pin LED
const int greenLedPin = 26; // LED Hijau ke GPIO26
const int yellowLedPin = 27; // LED Kuning ke GPIO27
const int redLedPin = 14; // LED Merah ke GPIO14
// Pin Buzzer
const int buzzerPin = 33; // Buzzer ke GPIO33
// Inisialisasi LCD I2C
LiquidCrystal_I2C lcd(0x27, 16, 2);
// Wi-Fi Credentials
const char* ssid = "Wokwi-GUEST";
const char* password = "";
// Telegram bot token dan chat ID
String botToken = "8005538312:AAF--qXtYMRS4P7p8yPR-L8AMYzUClewzSM";
String chatId = "-1002320441566";
// Kirim pesan Telegram
void sendTelegramMessage(String message) {
HTTPClient http;
String telegramApiUrl = "https://api.telegram.org/bot" + botToken + "/sendMessage";
http.begin(telegramApiUrl);
http.addHeader("Content-Type", "application/json");
// Escape JSON format
String postData = "{\"chat_id\":\"" + chatId + "\",\"text\":\"" + message + "\"}";
// Debug log
Serial.println("Telegram URL: " + telegramApiUrl);
Serial.println("Data: " + postData);
int responseCode = http.POST(postData);
if (responseCode == 200) {
Serial.println("Pesan berhasil dikirim");
} else {
Serial.print("Gagal mengirim pesan. Kode HTTP: ");
Serial.println(responseCode);
Serial.println("Response: " + http.getString()); // Tampilkan respon server
}
http.end();
}
void setup() {
// Inisialisasi pin
pinMode(greenLedPin, OUTPUT);
pinMode(yellowLedPin, OUTPUT);
pinMode(redLedPin, OUTPUT);
pinMode(buzzerPin, OUTPUT);
pinMode(flameSensorPin, INPUT);
pinMode(gasSensorPin, INPUT);
// Inisialisasi komunikasi serial
Serial.begin(115200);
WiFi.begin(ssid, password);
Serial.print("Connecting to Wi-Fi");
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nConnected to Wi-Fi.");
Serial.print("IP: ");
Serial.println(WiFi.localIP());
// Inisialisasi I2C LCD
Wire.begin();
lcd.begin(16, 2);
lcd.backlight();
lcd.print("Deteksi Gas&Api");
delay(2000); // Pesan awal selama 2 detik
}
void loop() {
// Membaca nilai dari sensor gas
int rawGasValue = analogRead(gasSensorPin);
int gasValue = rawGasValue / 40; // Skalakan agar 1 unit bertambah 10 di LCD
int gasPpm = gasValue * 10; // Skala akhir dalam ppm
// Membaca nilai dari sensor api
int flameValue = digitalRead(flameSensorPin);
// Menampilkan nilai sensor di Serial Monitor
Serial.print("Gas Value: ");
Serial.print(gasPpm);
Serial.print(" ppm");
Serial.print("\tFlame Detected: ");
Serial.println(flameValue);
// Menampilkan nilai sensor di LCD
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Gas: ");
lcd.print(gasPpm);
lcd.print(" ppm");
lcd.setCursor(0, 1);
lcd.print("Api: ");
if (flameValue == HIGH) {
lcd.print("YA"); // Jika api terdeteksi
} else {
lcd.print("TIDAK"); // Jika api tidak terdeteksi
}
// Logika deteksi gas
if (gasPpm > 350) {
digitalWrite(greenLedPin, LOW);
digitalWrite(yellowLedPin, LOW);
digitalWrite(redLedPin, HIGH);
tone(buzzerPin, 2000);
} else if (gasPpm > 150) {
digitalWrite(greenLedPin, LOW);
digitalWrite(yellowLedPin, HIGH);
digitalWrite(redLedPin, LOW);
tone(buzzerPin, 2000, 1000);
} else if (gasPpm > 50) {
digitalWrite(greenLedPin, HIGH);
digitalWrite(yellowLedPin, LOW);
digitalWrite(redLedPin, LOW);
tone(buzzerPin, 2000, 500);
} else {
digitalWrite(greenLedPin, LOW);
digitalWrite(yellowLedPin, LOW);
digitalWrite(redLedPin, LOW);
noTone(buzzerPin);
}
// Logika deteksi api
if (flameValue == HIGH) {
digitalWrite(redLedPin, HIGH);
tone(buzzerPin, 2000);
} else {
if (gasPpm <= 50) {
digitalWrite(redLedPin, LOW);
noTone(buzzerPin);
}
}
if (gasPpm >= 50) {
String flameStatus = (flameValue == HIGH) ? "YA" : "TIDAK";
String fireAlert = (flameValue == HIGH) ? "\nKEBAKARAN!!!🔥🔥🔥" : "";
String message =
"TERDETEKSI KADAR GAS: " + String(gasPpm) + " PPM\n" +
"TERDETEKSI API: " + flameStatus + fireAlert + "\n" +
"Lokasi: Politeknik Negeri Semarang";
sendTelegramMessage(message);
}
delay(5000); // Delay pembaruan
}