#include <WiFi.h>
#include <HTTPClient.h>
// WiFi credentials
const char* ssid = "ANNISA";
const char* password = "Annisa1234ab";
// Telegram bot token and chat ID
const char* telegramBotToken = "7310509126:AAGwZmLQ48320PFI6IKfNWYHFLeWLnkaJYE";
const char* chat_id = "2006192777";
// ThingsBoard credentials
const char* thingsboardServer = "http://demo.thingsboard.io";
const char* accessToken = "Cayzl2AffTB7gzMyrKP4";
// Hardware pin definitions
const int mq135Pin = 27; // GPIO pin for MQ135 analog output
const int trigPin = 14; // GPIO pin for ultrasonic sensor trigger
const int echoPin = 12; // GPIO pin for ultrasonic sensor echo
const int relayPin = 26; // GPIO pin for relay
const int buzzerPin = 25; // GPIO pin for buzzer
const int ledBluePin = 33; // GPIO pin for blue LED
const int ledRedPin = 32; // GPIO pin for red LED
const int ledGreenPin = 35; // GPIO pin for green LED
void setup() {
Serial.begin(9600);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
pinMode(relayPin, OUTPUT);
pinMode(buzzerPin, OUTPUT);
pinMode(ledBluePin, OUTPUT);
pinMode(ledRedPin, OUTPUT);
pinMode(ledGreenPin, OUTPUT);
digitalWrite(relayPin, LOW);
digitalWrite(buzzerPin, LOW);
digitalWrite(ledBluePin, HIGH); // System ON
digitalWrite(ledRedPin, LOW);
digitalWrite(ledGreenPin, LOW);
connectToWiFi();
}
void loop() {
int gasLevel = analogRead(mq135Pin);
Serial.print("Gas Level: ");
Serial.println(gasLevel);
if (gasLevel > 300) { // Threshold for hazardous gas, adjust as needed
digitalWrite(relayPin, HIGH);
digitalWrite(buzzerPin, HIGH);
digitalWrite(ledRedPin, HIGH); // Hazard detected
digitalWrite(ledGreenPin, LOW);
sendTelegramAlert(gasLevel);
} else {
digitalWrite(relayPin, LOW);
digitalWrite(buzzerPin, LOW);
digitalWrite(ledRedPin, LOW);
digitalWrite(ledGreenPin, HIGH); // System normal
}
long duration = getUltrasonicReading();
float distance = duration * 0.034 / 2; // Calculate distance in cm
Serial.print("Water Level: ");
Serial.print(distance);
Serial.println(" cm");
sendToThingsBoard(gasLevel, distance);
delay(5000); // Delay 5 seconds before the next reading
}
void connectToWiFi() {
Serial.print("Connecting to WiFi");
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println(" connected");
}
long getUltrasonicReading() {
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
return pulseIn(echoPin, HIGH);
}
void sendTelegramAlert(int gasLevel) {
if (WiFi.status() == WL_CONNECTED) {
HTTPClient http;
String message = "Warning! Hazardous gas detected. Gas level: " + String(gasLevel);
String url = "https://api.telegram.org/bot" + String(telegramBotToken) + "/sendMessage?chat_id=" + String(chat_id) + "&text=" + message;
http.begin(url);
int httpResponseCode = http.GET();
if (httpResponseCode > 0) {
String response = http.getString();
Serial.println(httpResponseCode);
Serial.println(response);
} else {
Serial.print("Error on sending POST: ");
Serial.println(httpResponseCode);
}
http.end();
}
}
void sendToThingsBoard(int gasLevel, float waterLevel) {
if (WiFi.status() == WL_CONNECTED) {
HTTPClient http;
String url = String(thingsboardServer) + "/api/v1/" + String(accessToken) + "/telemetry";
http.begin(url);
http.addHeader("Content-Type", "application/json");
String payload = "{\"gasLevel\":" + String(gasLevel) + ",\"waterLevel\":" + String(waterLevel) + "}";
int httpResponseCode = http.POST(payload);
if (httpResponseCode > 0) {
String response = http.getString();
Serial.println(httpResponseCode);
Serial.println(response);
} else {
Serial.print("Error on sending POST: ");
Serial.println(httpResponseCode);
}
http.end();
}
}