#include "DHTesp.h"
#include <LiquidCrystal_I2C.h>
#include <WiFi.h>
#include <WiFiClientSecure.h>
#include <HTTPClient.h>
// Konfigurasi pin dan sensor
const int DHT_PIN = 15; // Pin untuk sensor DHT22
const int BUZZER = 18; // Pin untuk buzzer
const int LED_MERAH = 5; // Pin untuk LED Merah
const int GAS_SENSOR = 34; // Pin untuk sensor gas (analog)
DHTesp dhtSensor;
LiquidCrystal_I2C lcd(0x27, 16, 2); // LCD 16x2 dengan I2C address 0x27
const int gasThreshold = 600; // Ambang batas untuk deteksi gas bocor
int gasLeakCount = 0; // Hitungan kebocoran gas berturut-turut
const int consistencyThreshold = 3; // Ambang batas konsistensi deteksi kebocoran gas
// Konfigurasi WiFi dan Antares
#define WIFI_SSID "Wokwi-GUEST"
#define WIFI_PASSWORD ""
#define ACCESSKEY "21eacdbb77c456a0:4d7976172fe0391c"
#define applicationName "Monitoringsensor"
#define deviceName "FireandGasDetection"
WiFiClientSecure client;
void InitWiFi() {
Serial.println("Connecting to AP...");
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nConnected to AP");
}
void reconnect() {
if (WiFi.status() != WL_CONNECTED) {
Serial.println("Reconnecting to WiFi...");
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nReconnected to WiFi");
}
}
void sendDataToAntares(float temp, float hum, int gasValue) {
if (WiFi.status() == WL_CONNECTED) {
client.setInsecure(); // Untuk testing, gunakan sertifikat untuk produksi.
HTTPClient http;
String serverPath = "https://platform.antares.id:8443/~/antares-cse/antares-id/" +
String(applicationName) + "/" + String(deviceName);
http.begin(client, serverPath);
http.addHeader("X-M2M-Origin", ACCESSKEY);
http.addHeader("Content-Type", "application/json;ty=4");
// Payload JSON
String jsonPayload = "{";
jsonPayload += "\"m2m:cin\":{";
jsonPayload += "\"con\":\"{";
jsonPayload += "\\\"temperature\\\":" + String(temp) + ",";
jsonPayload += "\\\"humidity\\\":" + String(hum) + ",";
jsonPayload += "\\\"gasValue\\\":" + String(gasValue);
jsonPayload += "}\"";
jsonPayload += "}";
jsonPayload += "}";
Serial.println("Payload:");
Serial.println(jsonPayload);
int httpResponseCode = http.POST(jsonPayload);
if (httpResponseCode > 0) {
Serial.println("Data sent successfully!");
Serial.println("Response: " + http.getString());
} else {
Serial.println("Error sending data. HTTP response code: " + String(httpResponseCode));
}
http.end();
} else {
Serial.println("WiFi not connected");
}
}
void displayMessage(String line1, String line2, int duration) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(line1);
lcd.setCursor(0, 1);
lcd.print(line2);
delay(duration);
}
void setup() {
Serial.begin(115200);
pinMode(BUZZER, OUTPUT);
pinMode(LED_MERAH, OUTPUT);
pinMode(GAS_SENSOR, INPUT);
dhtSensor.setup(DHT_PIN, DHTesp::DHT22);
lcd.init();
lcd.backlight();
InitWiFi();
// Menampilkan pesan selamat datang
displayMessage("Welcome to Fire", "and Gas Detection", 3000);
}
void loop() {
// Ambil data dari sensor
TempAndHumidity data = dhtSensor.getTempAndHumidity();
int gasValue = analogRead(GAS_SENSOR);
// Cetak ke Serial Monitor
Serial.println("Temp: " + String(data.temperature, 2) + "°C");
Serial.println("Humidity: " + String(data.humidity, 1) + "%");
Serial.println("Gas Value: " + String(gasValue));
Serial.println("---");
// Tampilkan data di LCD
lcd.setCursor(0, 0);
lcd.print("Temp: " + String(data.temperature, 2) + "C ");
lcd.setCursor(10, 0);
lcd.print("H: " + String(data.humidity, 1) + "%");
// Logika deteksi bahaya
bool isFire = data.temperature > 50 && data.humidity < 30;
bool isGasLeak = gasValue > gasThreshold;
if (isGasLeak) {
gasLeakCount++;
} else {
gasLeakCount = 0;
}
if (gasLeakCount >= consistencyThreshold && isFire) {
displayMessage("BAHAYA API &", "GAS BOCOR!!!", 2000);
digitalWrite(LED_MERAH, HIGH);
tone(BUZZER, 500);
} else if (isFire) {
displayMessage("BAHAYA API!!!", "Segera Evakuasi", 2000);
digitalWrite(LED_MERAH, HIGH);
tone(BUZZER, 300);
} else if (gasLeakCount >= consistencyThreshold) {
displayMessage("BAHAYA GAS!!!", "Periksa Area", 2000);
digitalWrite(LED_MERAH, HIGH);
tone(BUZZER, 200);
} else {
displayMessage("AMAN", "Semua Normal", 2000);
digitalWrite(LED_MERAH, LOW);
noTone(BUZZER);
}
// Kirim data ke Antares
sendDataToAntares(data.temperature, data.humidity, gasValue);
delay(2000); // Delay sebelum pembaruan berikutnya
}