#include <WiFi.h>
#include <PubSubClient.h>
#include <Arduino.h>
#include <DHTesp.h>
const char* ssid = "Wokwi-GUEST";
const char* password = "";
const char* mqtt_server = "test.mosquitto.org";
//arrosage
const int ledpin = 17;
const char* topic = "arrosagee";
const char* timerTopic = "timer"; // New MQTT topic for timer
int delayTime = 0;
int remainingDelay = 0; // Variable to keep track of remaining delay time
//intrusion
const int PIR_PIN1 = 16; // PIR sensor pin
const char* mqtt_intrus_topic = "presence_intrus"; // MQTT topic for PIR sensor
//presenceldr
const int LED_PIN = 0; // LED pin
const int PIR_PIN2 = 19; // PIR sensor pin
const int LDR_PIN = 34; // LDR sensor pin
const char* mqtt_brightness_topic = "brightness"; // MQTT topic for controlling LED brightness
const char* mqtt_presence_topic = "presence"; // MQTT topic for PIR sensor
const char* mqtt_ldr_topic = "ldr"; // MQTT topic for LDR sensor
//tempo
const int DHT_PIN = 15;
DHTesp dht; // DHT sensor object
const int LED_PIN_1 = 2; // Pin for LED 1
const int LED_PIN_2 = 4; // Pin for LED 2
unsigned long lastMsg = 0;
const char* publish_topic = "tempo"; // MQTT topic for publishing temperature data
const char* climat_topic = "climat"; // MQTT topic for sending climate control information
WiFiClient espClient;
PubSubClient client(espClient);
void setup_wifi() {
Serial.println("Connecting to WiFi");
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() {
// Loop until we're reconnected
while (!client.connected()) {
Serial.println("Attempting MQTT connection...");
String clientId = "ESP32Client-";
clientId += String(random(0xffff), HEX);
if (client.connect(clientId.c_str())) {
Serial.println("Connected to MQTT broker");
} else {
Serial.print("Failed to connect to MQTT broker, rc=");
Serial.print(client.state());
Serial.println(" Retrying in 5 seconds");
delay(5000);
}
}
}
void setup() {
Serial.begin(115200); // Serial baud rate
// Arrosage setup
pinMode(ledpin, OUTPUT); // Set LED pin for arrosage
setup_wifi(); // Initialize WiFi connection for arrosage
client.setServer(mqtt_server, 1883); // Set MQTT server and port for arrosage
client.setCallback(callback); // Set MQTT callback function for arrosage
// Intrusion setup
pinMode(PIR_PIN1, INPUT); // Set PIR sensor pin for intrusion
// Presenceldr setup
pinMode(LED_PIN, OUTPUT); // Set LED pin for presenceldr
pinMode(PIR_PIN2, INPUT); // Set PIR sensor pin for presenceldr
pinMode(LDR_PIN, INPUT); // Set LDR sensor pin for presenceldr
// Tempo setup
pinMode(LED_PIN_1, OUTPUT); // Set LED pin 1 for tempo
pinMode(LED_PIN_2, OUTPUT); // Set LED pin 2 for tempo
client.setServer(mqtt_server, 1883); // Set MQTT server and port for tempo
dht.setup(DHT_PIN, DHTesp::DHT22); // Initialize DHT sensor as DHT22
}
void loop() {
if (!client.connected()) {
reconnect();
}
client.loop();
// Read PIR sensor (Arrosage)
int presence1 = digitalRead(PIR_PIN1);
client.publish(mqtt_intrus_topic, String(presence1).c_str());
// Read PIR sensor (Presenceldr)
int presence2 = digitalRead(PIR_PIN2);
client.publish(mqtt_presence_topic, String(presence2).c_str());
// Read LDR sensor (Presenceldr)
int ldrValue = analogRead(LDR_PIN);
client.publish(mqtt_ldr_topic, String(ldrValue).c_str());
// Adjust LED brightness based on presence and LDR value (Presenceldr)
if (presence2 == 1) {
int invertedValue = 1023 - ldrValue; // Invert LDR value
int brightness = map(invertedValue, 0, 1023, 0, 255);
client.publish(mqtt_brightness_topic, String(brightness).c_str());
analogWrite(LED_PIN, brightness);
} else {
client.publish(mqtt_brightness_topic, "0");
analogWrite(LED_PIN, 0); // Turn off the LED
}
// Read temperature and control LEDs based on temperature (Tempo)
float temperature = dht.getTemperature();
String message;
if (temperature < 25) {
digitalWrite(LED_PIN_2, LOW);
digitalWrite(LED_PIN_1, HIGH);
message = "chauffage";
} else if (temperature >= 25 && temperature <= 28) {
digitalWrite(LED_PIN_1, LOW);
digitalWrite(LED_PIN_2, LOW);
message = "none";
} else {
digitalWrite(LED_PIN_1, LOW);
digitalWrite(LED_PIN_2, HIGH);
message = "ventilateur";
}
client.publish(publish_topic, String(temperature).c_str());
client.publish(climat_topic, message.c_str());
Serial.print("Temperature: ");
Serial.println(temperature);
delay(1000); // Adjust delay as needed
}
void callback(char* topic, byte* payload, unsigned int length) {
Serial.print("Message arrived on topic: ");
Serial.println(topic);
String message = "";
for (int i = 0; i < length; i++) {
message += (char)payload[i];
}
Serial.println("Message received: " + message);
// Convert the received message to an integer representing delay time
delayTime = message.toInt();
// Update remaining delay
remainingDelay = delayTime;
// Publish remaining delay to the timer topic
client.publish(timerTopic, String(remainingDelay).c_str());
// Check if delayTime is 0, turn off the LED
if (delayTime == 0) {
digitalWrite(ledpin, LOW); // Turn off the LED
Serial.println("LED turned off");
} else if (delayTime > 0) {
digitalWrite(ledpin, HIGH); // Turn on the LED
Serial.println("LED turned on");
while (remainingDelay > 0) {
delay(1000); // Wait for 1 second
remainingDelay = remainingDelay-1000; // Decrease remaining delay by 1 second
client.publish(timerTopic, String(remainingDelay/1000).c_str()); // Publish updated remaining delay
}
digitalWrite(ledpin, LOW); // Turn off the LED after delay
Serial.println("LED turned off after delay");
}
}