#include <WiFi.h>
#include <WiFiClientSecure.h>
#include <PubSubClient.h>
// Wi-Fi credentials
const char* ssid = "Waleed_Hassan";
const char* password = "Hassan2004**";
// MQTT Broker settings
const char* mqtt_server = "836d265158fe407b82c0c60afc009fad.s1.eu.hivemq.cloud";
const char* mqtt_username = "faresmohamed260";
const char* mqtt_password = "#Rmc136a1drd47r";
const int mqtt_port = 8883;
// Certificates for secure connection
static const char* root_ca PROGMEM = R"EOF(
-----BEGIN CERTIFICATE-----
MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAw
TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh
cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4
WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJu
ZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBY
MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54rVygc
h77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+
0TM8ukj13Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6U
A5/TR5d8mUgjU+g4rk8Kb4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sW
T8KOEUt+zwvo/7V3LvSye0rgTBIlDHCNAymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyH
B5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ4Q7e2RCOFvu396j3x+UC
B5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf1b0SHzUv
KBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWn
OlFuhjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTn
jh8BCNAw1FtxNrQHusEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbw
qHyGO0aoSCqI3Haadr8faqU9GY/rOPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CI
rU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV
HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY9umbbjANBgkq
hkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL
ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ
3BebYhtF8GaV0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KK
NFtY2PwByVS5uCbMiogziUwthDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5
ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJwTdwJx4nLCgdNbOhdjsnvzqvHu7Ur
TkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nxe5AW0wdeRlN8NwdC
jNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZAJzVc
oyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq
4RgqsahDYVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPA
mRGunUHBcnWEvgJBQl9nJEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57d
emyPxgcYxn/eR44/KJ4EBs+lVDR3veyJm+kXQ99b21/+jh5Xos1AnX5iItreGCc=
-----END CERTIFICATE-----
)EOF";
// Define topics
const char* ir_sensor_topic = "ir_sensor";
const char* flame_sensor_topic = "flame_sensor";
const char* online_reset_button_topic = "online_reset_button";
// Variables to hold alarm states
bool irAlarmTriggered = false;
bool flameAlarmTriggered = false;
bool ultrasonicAlarmTriggered = false;
bool smokeAlarmTriggered = false;
// Pin Definitions
#define IR_SENSOR_PIN 15
#define FLAME_SENSOR_PIN 18
#define LED_PIN_IR 13
#define LED_PIN_FLAME 12
#define BUZZER_PIN 25
#define RESET_BUTTON_PIN 26
// MQTT client and Wi-Fi client
WiFiClientSecure espClient;
PubSubClient client(espClient);
// Task handles
TaskHandle_t irSensorTaskHandle = NULL;
TaskHandle_t flameSensorTaskHandle = NULL;
TaskHandle_t resetButtonTaskHandle = NULL;
TaskHandle_t onlineResetButtonTaskHandle = NULL;
// Function prototypes
void setup_wifi();
void reconnect();
void callback(char* topic, byte* payload, unsigned int length);
void setup() {
Serial.begin(115200);
// Initialize pins
pinMode(IR_SENSOR_PIN, INPUT);
pinMode(FLAME_SENSOR_PIN, INPUT);
pinMode(LED_PIN_IR, OUTPUT);
pinMode(LED_PIN_FLAME, OUTPUT);
pinMode(BUZZER_PIN, OUTPUT);
pinMode(RESET_BUTTON_PIN, INPUT_PULLUP);
// Initialize all LEDs and Buzzer as OFF
digitalWrite(LED_PIN_IR, LOW);
digitalWrite(LED_PIN_FLAME, LOW);
digitalWrite(BUZZER_PIN, LOW);
// Connect to Wi-Fi
setup_wifi();
// Set MQTT server and callback function
espClient.setCACert(root_ca);
client.setServer(mqtt_server, mqtt_port);
client.setCallback(callback);
// Create FreeRTOS tasks to handle LEDs based on MQTT messages
xTaskCreatePinnedToCore(irSensorTask, "IR Sensor Task", 10000, NULL, 1, &irSensorTaskHandle, 1); // Task for IR sensor
xTaskCreatePinnedToCore(flameSensorTask, "Flame Sensor Task", 10000, NULL, 1, &flameSensorTaskHandle, 1); // Task for Flame sensor
xTaskCreatePinnedToCore(resetButtonTask, "Reset Button Task", 10000, NULL, 1, &resetButtonTaskHandle, 1); // Task for Reset button
xTaskCreatePinnedToCore(onlineResetButtonTask, "Online Reset Button Task", 10000, NULL, 1, &onlineResetButtonTaskHandle, 1); // Task for Online Reset button
}
void loop() {
if (!client.connected()) {
reconnect();
}
client.loop();
delay(1000); // Adjust delay as needed
}
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("WiFi connected");
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
}
void reconnect() {
while (!client.connected()) {
Serial.print("Attempting MQTT connection...");
if (client.connect("ESP32Client", mqtt_username, mqtt_password)) {
Serial.println("connected");
// Subscribe to topics
client.subscribe(online_reset_button_topic);
} else {
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 5 seconds");
delay(5000);
}
}
}
void callback(char* topic, byte* payload, unsigned int length) {
Serial.print("Message arrived [");
Serial.print(topic);
Serial.print("] ");
String message = "";
for (int i = 0; i < length; i++) {
message += (char)payload[i];
}
Serial.println(message);
// Send the received message to the corresponding task
if (String(topic) == online_reset_button_topic && message == "LOW") {
xTaskNotifyGive(onlineResetButtonTaskHandle); // Use task notification for Online Reset button
}
}
// Task for IR sensor
void irSensorTask(void* parameter) {
while (1) {
if (!irAlarmTriggered && digitalRead(IR_SENSOR_PIN) == LOW) { // Assuming digitalRead is correct for IR sensor
// Publish sensor state to MQTT topics
if (client.publish(ir_sensor_topic, (digitalRead(IR_SENSOR_PIN) == HIGH) ? "HIGH" : "LOW", true)) {
Serial.println("IR sensor state published successfully.");
} else {
Serial.println("Failed to publish IR sensor state.");
}
irAlarmTriggered = true;
int* ledPinPtr = new int(LED_PIN_IR);
xTaskCreate(pulseAlarmTask, "IR Pulse Alarm Task", 10000, ledPinPtr, 1, &irSensorTaskHandle);
Serial.println("IR Sensor triggered the alarm!");
}
vTaskDelay(100 / portTICK_PERIOD_MS); // Delay to avoid spamming
}
}
// Task for Flame sensor
void flameSensorTask(void *parameter) {
while (1) {
if (!flameAlarmTriggered && digitalRead(FLAME_SENSOR_PIN) == LOW) { // Assuming digitalRead is correct for Flame sensor
// Publish sensor state to MQTT topics
if (client.publish(flame_sensor_topic, (digitalRead(FLAME_SENSOR_PIN) == HIGH) ? "HIGH" : "LOW", true)) {
Serial.println("Flame sensor state published successfully.");
} else {
Serial.println("Failed to publish Flame sensor state.");
}
flameAlarmTriggered = true;
int *ledPinPtr = new int(LED_PIN_FLAME);
xTaskCreate(pulseAlarmTask, "Flame Pulse Alarm Task", 10000, ledPinPtr, 1, &flameSensorTaskHandle);
Serial.println("Flame Sensor triggered the alarm!");
}
vTaskDelay(100 / portTICK_PERIOD_MS); // Delay to avoid spamming
}
}
// Task for pulsing LED and Buzzer
void pulseAlarmTask(void *parameter) {
int ledPin = *(int *)parameter;
while (1) {
if (irAlarmTriggered || flameAlarmTriggered || ultrasonicAlarmTriggered || smokeAlarmTriggered) {
digitalWrite(ledPin, HIGH);
digitalWrite(BUZZER_PIN, HIGH);
vTaskDelay(500 / portTICK_PERIOD_MS); // LED and Buzzer ON for 500ms
digitalWrite(ledPin, LOW);
digitalWrite(BUZZER_PIN, LOW);
vTaskDelay(500 / portTICK_PERIOD_MS); // LED and Buzzer OFF for 500ms
} else {
vTaskDelete(NULL); // Delete this task when the alarm is not triggered
}
}
}
void resetButtonTask(void *parameter) {
while (1) {
if (digitalRead(RESET_BUTTON_PIN) == LOW) {
Serial.println("Reset button pressed");
turnOffAlarms();
}
vTaskDelay(100 / portTICK_PERIOD_MS); // Delay to avoid rapid checking
}
}
void onlineResetButtonTask(void *parameter) {
while (1) {
ulTaskNotifyTake(pdTRUE, portMAX_DELAY); // Wait for the notification
turnOffAlarms();
}
}
void turnOffAlarms() {
irAlarmTriggered = false;
flameAlarmTriggered = false;
ultrasonicAlarmTriggered = false;
smokeAlarmTriggered = false;
// Delete active alarm tasks
if (irSensorTaskHandle != NULL) {
vTaskDelete(irSensorTaskHandle);
irSensorTaskHandle = NULL;
}
if (flameSensorTaskHandle != NULL) {
vTaskDelete(flameSensorTaskHandle);
flameSensorTaskHandle = NULL;
}
// Turn off all LEDs and Buzzer
digitalWrite(LED_PIN_IR, LOW);
digitalWrite(LED_PIN_FLAME, LOW);
digitalWrite(BUZZER_PIN, LOW);
}