#include <WiFi.h>
#include <HTTPClient.h>
// WiFi credentials
const char* ssid = "your_SSID";
const char* password = "your_PASSWORD";
// Telegram bot token and chat ID
const char* telegramBotToken = "your_TELEGRAM_BOT_TOKEN";
const char* chat_id = "your_CHAT_ID";
// ThingsBoard credentials
const char* thingsboardServer = "http://YOUR_THINGSBOARD_SERVER_URL";
const char* accessToken = "YOUR_ACCESS_TOKEN";
// Hardware pin definitions
const int trigPin = 18; // GPIO pin for ultrasonic sensor trigger
const int echoPin = 19; // GPIO pin for ultrasonic sensor echo
const int relayPin = 21; // GPIO pin for relay
const int buzzerPin = 22; // GPIO pin for buzzer
const int ledBluePin = 23; // GPIO pin for blue LED
const int ledRedPin = 25; // GPIO pin for red LED
const int ledGreenPin = 26; // GPIO pin for green LED
// Variables for averaging the gas sensor readings
const int numReadings = 10;
int readings[numReadings]; // the readings from the analog input
int readIndex = 0; // the index of the current reading
int total = 0; // the running total
int average = 0; // the average
int analogValue = 0; // raw analog value from sensor
void setup() {
Serial.begin(115200);
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() {
MQ135 gasSensor = MQ135(0);
float air_quality = gasSensor.getPPM();
Serial.print("Air Quality: ");
Serial.print(air_quality);
Serial.println(" PPM");
Serial.println();
Serial.print("Gas Level (Analog): ");
Serial.print(analogValue);
Serial.print("\t Gas Level (ppm CO2): ");
Serial.println(ppmCO2);
if (ppmCO2 > 0 && ppmCO2 <= 1000) {
// Normal operating range, system is normal
digitalWrite(relayPin, LOW);
digitalWrite(buzzerPin, LOW);
digitalWrite(ledRedPin, LOW);
digitalWrite(ledGreenPin, HIGH);
} else if (ppmCO2 > 1000) {
// Hazardous gas detected
digitalWrite(relayPin, HIGH);
digitalWrite(buzzerPin, HIGH);
digitalWrite(ledRedPin, HIGH);
digitalWrite(ledGreenPin, LOW);
sendTelegramAlert(ppmCO2);
} else {
// Handle cases where ppmCO2 is 0 or negative (sensor not connected or error)
digitalWrite(relayPin, LOW);
digitalWrite(buzzerPin, LOW);
digitalWrite(ledRedPin, LOW);
digitalWrite(ledGreenPin, LOW); // Indicate error state
}
long duration = getUltrasonicReading();
float distance = duration * 0.034 / 2; // Calculate distance in cm
Serial.print("Water Level: ");
Serial.print(distance);
Serial.println(" cm");
sendToThingsBoard(ppmCO2, 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(float gasLevel) {
if (WiFi.status() == WL_CONNECTED) {
HTTPClient http;
String message = "Warning! Hazardous gas detected. Gas level: " + String(gasLevel) + " ppm CO2";
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(float 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();
}
}