#include <DHT.h>
#include <LiquidCrystal_I2C.h>
#include <WiFi.h>
#include <PubSubClient.h>
#define DHTPIN_1 18
#define DHTPIN_2 4
#define DHTPIN_3 15
#define DHTPIN_4 16
#define DHTTYPE DHT22
DHT dht1(DHTPIN_1, DHTTYPE);
DHT dht2(DHTPIN_2, DHTTYPE);
DHT dht3(DHTPIN_3, DHTTYPE);
DHT dht4(DHTPIN_4, DHTTYPE);
#define LED_PIN 27
#define LED_PIN_2 25
#define BUZZER_PIN 26
#define PIR_PIN 19
#define HUMI_LOW 30
#define HUMI_HIGH 70
#define I2C_ADDR 0x27
#define LCD_COLUMNS 16
#define LCD_LINES 2
LiquidCrystal_I2C lcd(I2C_ADDR, LCD_COLUMNS, LCD_LINES);
const char* ssid = "Wokwi-GUEST";
const char* password = "";
const char *mqttBroker = "public.cloud.shiftr.io";
const int mqttPort = 1883;
const char *mqttUsername = "public";
const char *mqttPassword = "public";
const char *mqttClientID = "iryna_client";
const char *mqttTopic = "it126iryna/text";
const char *tempTopic1 = "it126iryna/temp1";
const char *tempTopic2 = "it126iryna/temp2";
const char *tempTopic3 = "it126iryna/temp3";
const char *tempTopic4 = "it126iryna/temp4";
const char *statusTopic1 = "it126iryna/status1";
const char *statusTopic2 = "it126iryna/status2";
const char *statusTopic3 = "it126iryna/status3";
const char *statusTopic4 = "it126iryna/status4";
const char *humiTopic1 = "it126iryna/humi1";
const char *humiTopic2 = "it126iryna/humi2";
const char *humiTopic3 = "it126iryna/humi3";
const char *humiTopic4 = "it126iryna/humi4";
WiFiClient espClient;
PubSubClient client(espClient);
int chanceOfFire[4] = {0, 0, 0, 0};
void setup_wifi() {
delay(10);
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
}
void reconnect() {
while (!client.connected()) {
Serial.print("Attempting MQTT connection...");
if (client.connect(mqttClientID, mqttUsername, mqttPassword)) {
Serial.println("connected");
} else {
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 5 seconds");
delay(5000);
}
}
}
void setup() {
Serial.begin(115200);
pinMode(LED_PIN, OUTPUT);
pinMode(LED_PIN_2, OUTPUT);
pinMode(BUZZER_PIN, OUTPUT);
pinMode(PIR_PIN, INPUT);
lcd.init();
lcd.backlight();
lcd.setCursor(6, 0);
lcd.print("Fire");
lcd.setCursor(2, 1);
lcd.print("Alarm System");
delay(2000);
lcd.clear();
setup_wifi();
client.setServer(mqttBroker, mqttPort);
dht1.begin();
dht2.begin();
dht3.begin();
dht4.begin();
}
void check_sensor(DHT &dht, int sensor_id) {
float temp = dht.readTemperature();
float humi = dht.readHumidity();
if (isnan(temp) || isnan(humi)) {
Serial.println("Failed to read from DHT sensor!");
return;
}
Serial.print("DHT ");
Serial.print(sensor_id + 1);
Serial.print(" - Temp: ");
Serial.print(temp);
Serial.print("'C, Humi: ");
Serial.print(humi);
Serial.println("%");
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("DHT");
lcd.print(sensor_id + 1);
lcd.print(" Temp:");
lcd.print(temp);
lcd.print("'C");
lcd.setCursor(0, 1);
lcd.print("Humi:");
lcd.print(humi);
lcd.print("%");
if (sensor_id == 0) {
client.publish(tempTopic1, String(temp).c_str());
} else if (sensor_id == 1) {
client.publish(tempTopic2, String(temp).c_str());
} else if (sensor_id == 2) {
client.publish(tempTopic3, String(temp).c_str());
} else if (sensor_id == 3) {
client.publish(tempTopic4, String(temp).c_str());
}
if (sensor_id == 0) {
client.publish(humiTopic1, String(humi).c_str());
} else if (sensor_id == 1) {
client.publish(humiTopic2, String(humi).c_str());
} else if (sensor_id == 2) {
client.publish(humiTopic3, String(humi).c_str());
} else if (sensor_id == 3) {
client.publish(humiTopic4, String(humi).c_str());
}
delay(2000);
if (temp >= 30 && temp < 40) {
chanceOfFire[sensor_id] += 4;
if (chanceOfFire[sensor_id] > 100) chanceOfFire[sensor_id] = 100;
}
if (temp >= 40 && temp < 50) {
chanceOfFire[sensor_id] += 10;
if (chanceOfFire[sensor_id] > 100) chanceOfFire[sensor_id] = 100;
}
if (temp >= 50 ) {
chanceOfFire[sensor_id] += 50;
if (chanceOfFire[sensor_id] > 100) chanceOfFire[sensor_id] = 100;
}
if (temp < 30) {
chanceOfFire[sensor_id] -= 5;
if (chanceOfFire[sensor_id] < 1) chanceOfFire[sensor_id] = 0;
}
if (humi < HUMI_LOW) {
chanceOfFire[sensor_id] += 4;
if (chanceOfFire[sensor_id] > 100) chanceOfFire[sensor_id] = 100;
}
if (humi > HUMI_HIGH) {
chanceOfFire[sensor_id] -= 4;
if (chanceOfFire[sensor_id] < 1) chanceOfFire[sensor_id] = 0;
}
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("ChanceOfFire: ");
lcd.setCursor(0, 1);
lcd.print(chanceOfFire[sensor_id]);
lcd.print("%");
delay(2000);
String statusTopic;
if (sensor_id == 0) {
statusTopic = statusTopic1;
} else if (sensor_id == 1) {
statusTopic = statusTopic2;
} else if (sensor_id == 2) {
statusTopic = statusTopic3;
} else if (sensor_id == 3) {
statusTopic = statusTopic4;
}
if (chanceOfFire[sensor_id] == 100) {
digitalWrite(LED_PIN, HIGH);
tone(BUZZER_PIN, 1000);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Fire Detected by");
lcd.setCursor(0, 1);
lcd.print("DHT ");
lcd.print(sensor_id + 1);
delay(3000);
digitalWrite(LED_PIN, LOW);
noTone(BUZZER_PIN);
lcd.clear();
String message = "Fire Detected by DHT ";
message += (sensor_id + 1);
client.publish(mqttTopic, message.c_str());
client.publish(statusTopic.c_str(), "fire");
} else {
client.publish(statusTopic.c_str(), "security");
}
}
void loop() {
if (!client.connected()) {
reconnect();
}
client.loop();
DHT* dht_sensors[] = {&dht1, &dht2, &dht3, &dht4};
for (int i = 0; i < 4; i++) {
check_sensor(*dht_sensors[i], i);
}
int pirState = digitalRead(PIR_PIN);
if (pirState == HIGH) {
digitalWrite(LED_PIN, HIGH);
tone(BUZZER_PIN, 1000);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Motion detected!");
Serial.println("Motion detected!");
client.publish(mqttTopic, "Motion detected!");
delay(3000);
digitalWrite(LED_PIN, LOW);
noTone(BUZZER_PIN);
}
bool fire_detected = false;
for (int i = 0; i < 4; i++) {
if (chanceOfFire[i] == 100) {
fire_detected = true;
break;
}
}
if (!fire_detected) {
digitalWrite(LED_PIN_2, HIGH);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("All systems OK");
lcd.setCursor(0, 1);
lcd.print("No fire detected");
delay(3000);
digitalWrite(LED_PIN_2, LOW);
lcd.clear();
}
}