#include <ESP32Servo.h>
#include <DHT.h>
#include <WiFi.h>
#include <PubSubClient.h>
const char *ssid = "Wokwi-GUEST";
const char *password = "";
const char *mqttServer = "test.mosquitto.org";
const int mqttPort = 1883;
const char *mqttUser = "";
const char *mqttPassword = "";
const char *topicServoControl = "servo/control";
const char *topicGas = "capteur/gaz";
const char *topicTemp = "capteur/temperature";
const int servoPin = 12;
const int gasSensorPin = 14;
const int alertPin = 27;
const int buzzer = 26;
const int dhtPin = 25;
const int maxTemperature = 70;
const int gasThreshold = 500;
Servo servo;
DHT dht(dhtPin, DHT22);
WiFiClient espClient;
PubSubClient client(espClient);
unsigned long lastTime = 0;
const int interval = 5000; // Mettez à jour l'intervalle à 5000 ms (5 secondes)
void callback(char *topic, byte *payload, unsigned int length);
void checkGasAndTemperature();
void handleServoControl(String command);
void setup()
{
Serial.begin(115200);
servo.attach(servoPin, 500, 2400);
pinMode(gasSensorPin, INPUT);
pinMode(alertPin, OUTPUT);
pinMode(buzzer, OUTPUT);
dht.begin();
// Connect to Wi-Fi
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED)
{
delay(1000);
Serial.println("Connecting to WiFi...");
}
Serial.println("Connected to WiFi");
// Connect to MQTT Broker
client.setServer(mqttServer, mqttPort);
client.setCallback(callback);
while (!client.connected())
{
if (client.connect("ESP32Client", mqttUser, mqttPassword))
{
Serial.println("Connected to MQTT Broker");
client.subscribe(topicServoControl);
}
else
{
Serial.print("Failed, rc=");
Serial.print(client.state());
Serial.println(" Retrying...");
delay(1000);
}
}
}
void loop()
{
unsigned long currentTime = millis();
if (currentTime - lastTime >= interval)
{
lastTime = currentTime;
checkGasAndTemperature();
}
if (!client.connected())
{
reconnect();
}
client.loop();
}
void callback(char *topic, byte *payload, unsigned int length)
{
String message;
for (int i = 0; i < length; i++)
{
message += (char)payload[i];
}
Serial.print("Message arrived on topic [");
Serial.print(topic);
Serial.print("]: ");
Serial.println(message);
if (strcmp(topic, topicServoControl) == 0)
{
handleServoControl(message);
}
}
void checkGasAndTemperature()
{
int gasValue = analogRead(gasSensorPin);
Serial.print("Gas Sensor Value: ");
Serial.println(gasValue);
char gasMsg[10];
sprintf(gasMsg, "%d", gasValue);
if (client.publish(topicGas, gasMsg))
{
Serial.println("Published Gas to MQTT");
}
else
{
Serial.println("Failed to publish Gas to MQTT");
}
if (gasValue > gasThreshold)
{
digitalWrite(alertPin, HIGH);
digitalWrite(buzzer, HIGH);
Serial.println("Alert: Gas Leak Detected!");
servo.write(90);
delay(1000);
unsigned long gasTimeout = millis() + 10000; // 10 seconds timeout
while (millis() < gasTimeout)
{
gasValue = analogRead(gasSensorPin);
Serial.print("Gas Sensor Value: ");
Serial.println(gasValue);
if (gasValue <= gasThreshold)
{
break;
}
delay(500);
}
digitalWrite(alertPin, LOW);
digitalWrite(buzzer, LOW);
servo.write(0);
}
else
{
servo.write(0);
digitalWrite(alertPin, LOW);
digitalWrite(buzzer, LOW);
}
float temperature = dht.readTemperature();
Serial.print("Temperature: ");
Serial.println(temperature);
char tempMsg[10];
sprintf(tempMsg, "%.2f", temperature);
if (client.publish(topicTemp, tempMsg))
{
Serial.println("Published Temperature to MQTT");
}
else
{
Serial.println("Failed to publish Temperature to MQTT");
}
if (isnan(temperature))
{
Serial.println("Error reading temperature from DHT sensor!");
}
if (temperature >= maxTemperature)
{
digitalWrite(alertPin, HIGH);
digitalWrite(buzzer, HIGH);
Serial.println("Alert: High Temperature Detected!");
servo.write(90);
delay(1000);
while (temperature >= maxTemperature)
{
temperature = dht.readTemperature();
delay(500);
}
digitalWrite(alertPin, LOW);
digitalWrite(buzzer, LOW);
servo.write(0);
}
}
void handleServoControl(String command)
{
if (command == "ON")
{
Serial.println("Servo turned ON");
servo.write(90);
}
else if (command == "OFF")
{
Serial.println("Servo turned OFF");
// Ne rien faire ici, la position du servo restera là où elle était lors du dernier "ON"
}
}
void reconnect()
{
while (!client.connected())
{
if (client.connect("ESP32Client", mqttUser, mqttPassword))
{
Serial.println("Reconnected to MQTT Broker");
client.subscribe(topicServoControl);
}
else
{
Serial.print("Failed to reconnect, rc=");
Serial.print(client.state());
Serial.println(" Retrying...");
delay(1000);
}
}
}