#include <SimpleDHT.h>
#include <WiFi.h>
#include "DHT.h"
#include <LiquidCrystal_I2C.h>
#define I2C_ADDR 0x27
#define LCD_COLUMNS 20
#define LCD_LINES 4
LiquidCrystal_I2C lcd(I2C_ADDR, LCD_COLUMNS, LCD_LINES);
#include "Adafruit_MQTT.h"
#include "Adafruit_MQTT_Client.h"
// WiFi parameters
#define WLAN_SSID "Wokwi-GUEST"
#define WLAN_PASS ""
// Adafruit IO setup
#define AIO_SERVER "io.adafruit.com" // Adafruit IO Cloud Platform server for IoT
#define AIO_SERVERPORT 1883
#define AIO_USERNAME "YOUNESS2024"
#define AIO_KEY "aio_bwes99eObTrflU8NxNI1xgFFxvix"
WiFiClient client;
// Setup the MQTT client class by passing in the WiFi client and MQTT server and login details.
Adafruit_MQTT_Client mqtt(&client, AIO_SERVER, AIO_SERVERPORT, AIO_USERNAME, AIO_KEY);
Adafruit_MQTT_Publish Temperature = Adafruit_MQTT_Publish(&mqtt, AIO_USERNAME "/feeds/Temperature");
Adafruit_MQTT_Publish Humidity = Adafruit_MQTT_Publish(&mqtt, AIO_USERNAME "/feeds/Humedity");
Adafruit_MQTT_Publish relaisStateFeed = Adafruit_MQTT_Publish(&mqtt, AIO_USERNAME "/feeds/state");
// on crer l objet qui nous permet d envoyer les donné vers le chemin determiner
//apres on verfier la publication par nom objet.Publish(nom de variable ex:temp) si oui sent si non error
Adafruit_MQTT_Publish relaisStateFeed1 = Adafruit_MQTT_Publish(&mqtt, AIO_USERNAME "/feeds/state1");
Adafruit_MQTT_Subscribe tmaxFeed = Adafruit_MQTT_Subscribe(&mqtt, AIO_USERNAME "/feeds/TMAX");
Adafruit_MQTT_Subscribe hmaxFeed = Adafruit_MQTT_Subscribe(&mqtt, AIO_USERNAME "/feeds/HMAX");
//dans ce cas on cree des abonné tmaxFeed et hmaxFeed au feed TMAX HMAX
//pou lir les message on utilise l instruction nom abbone.lstread
//avant de lire on verfier est ce qu il ya des abonné active cad il recoie un message on utilsant while
//si oui comparer la le pointeur avec adress des abonné " le pointeur est deja crer comme quoi il represent adress des abonné"
//
float tmaxValue = NAN;
float hmaxValue = NAN;
int pinDHT22 = 15; // Connect your DHT22 data pin here! teperature et humidity sont des variable qui nous permet de tranfere de data ves cloud
DHT dht(15, DHT22);
const int relaisT = 12;
const int relaisH = 25;
const int inidT=26;
const int inidH=5;
bool relaisState = NAN; // false = éteint, true = allumé
bool relaisState1 = NAN; // false = éteint, true = allumé
int sliderValue = 0;
void setup()
{
Serial.begin(115200);
lcd.init();
mqtt.subscribe(&tmaxFeed);
mqtt.subscribe(&hmaxFeed);
lcd.backlight();
pinMode(relaisT, OUTPUT);
pinMode(relaisH, OUTPUT);
pinMode(inidH, OUTPUT);
pinMode(inidT, OUTPUT);
pinMode(4, OUTPUT);
Serial.println(F("Adafruit IO Example"));
// Connect to WiFi access point.
Serial.println(); Serial.println();
delay(10);
Serial.print(F("Connecting to "));
Serial.println(WLAN_SSID);
WiFi.begin(WLAN_SSID, WLAN_PASS);
while (WiFi.status() != WL_CONNECTED)
{
delay(500);
Serial.print(F("."));
}
Serial.println();
Serial.println(F("WiFi connected"));
Serial.println(F("IP address: "));
Serial.println(WiFi.localIP());
// connect to adafruit io
connect();
}
// connect to adafruit io via MQTT
void connect()
{
Serial.print(F("Connecting to Adafruit IO... "));
int8_t ret;
while ((ret = mqtt.connect()) != 0)
{
switch (ret)
{
case 1: Serial.println(F("Wrong protocol")); break;
case 2: Serial.println(F("ID rejected")); break;
case 3: Serial.println(F("Server unavail")); break;
case 4: Serial.println(F("Bad user/pass")); break;
case 5: Serial.println(F("Not authed")); break;
case 6: Serial.println(F("Failed to subscribe")); break;
default: Serial.println(F("Connection failed")); break;
}
if(ret >= 0)
mqtt.disconnect();
Serial.println(F("Retrying connection..."));
delay(10000);
}
Serial.println(F("Adafruit IO Connected!"));
}
void loop()
{
bool newrelaisState = digitalRead(relaisT);
bool newrelaisState1 = digitalRead(relaisH);
if (newrelaisState != relaisState) {
// Mettre à jour l'état
relaisState = newrelaisState;
// Publier l'état de la LED via MQTT
relaisStateFeed.publish(relaisState ? "on" : "off");
}
if (newrelaisState1 != relaisState1) {
// Mettre à jour l'état
relaisState1 = newrelaisState1;
// Publier l'état de la LED via MQTT
relaisStateFeed1.publish(relaisState1 ? "on" : "off");
}
// ping adafruit io a few times to make sure we remain connected
if(! mqtt.ping(3))
{
// reconnect to adafruit io
if(! mqtt.connected())
connect();
}
delay(1000); // this speeetup code heds up the simulation
float hum = dht.readHumidity();
float temp = dht.readTemperature();
Serial.print("Temperature: ");
Serial.print(temp);
Serial.print("ºC ");
Serial.print("Humidity: ");
Serial.println(hum);
lcd.setCursor(0, 0);
lcd.print("T:" + String(temp, 1) + "\xDF" + "C");
lcd.setCursor(10, 0); // Ajustement de la position du curseur pour aligner avec la longueur de la ligne
lcd.print("H:" + String(hum, 1) + "%");
lcd.setCursor(0, 1);
lcd.print("TM:" + String(tmaxValue, 1) + "\xDF" + "C");
lcd.setCursor(10, 1); // Ajustement de la position du curseur pour aligner avec la longueur de la ligne
lcd.print("HM:" + String(hmaxValue, 1) + "%");
lcd.setCursor(0, 2);
lcd.print("Ventilateur N1: ");
lcd.setCursor(16, 2);
if (relaisState == 1) {
lcd.print("ON ");
} else {
lcd.print("OFF ");
}
lcd.setCursor(0, 3);
lcd.print("Ventilateur N2: ");
lcd.setCursor(16, 3);
if (relaisState1 == 1) {
lcd.print("ON ");
} else {
lcd.print("OFF ");
}
if (! Temperature.publish(temp)) { //Publish Temperature data to Adafruit on temperature connecter au cloud est il sert a publier la valeur stocké dans temp dans le canal specifier Feed
Serial.println(F("Failed"));
}
if (! Humidity.publish(hum)) { //Publish Humidity data to Adafruit
Serial.println(F("Failed"));
}
else {
Serial.println(F("Sent!"));
}
Adafruit_MQTT_Subscribe *subscription;
while ((subscription = mqtt.readSubscription(5000))) {
if (subscription == &tmaxFeed) {
tmaxValue = atof((char*)tmaxFeed.lastread);
// Afficher la valeur de Tmax
Serial.print("Tmax Value: ");
Serial.println(tmaxValue);
}else if (subscription == &hmaxFeed) {
hmaxValue = atoi((char*)hmaxFeed.lastread);
// Afficher la valeur de Hmax
Serial.print("Hmax Value: ");
Serial.println(hmaxValue);
}
}
if (temp > tmaxValue) {
digitalWrite(relaisT, HIGH);
digitalWrite(inidT, HIGH);
} else {
digitalWrite(relaisT, LOW);
digitalWrite(inidT, LOW);
}
if(hum>hmaxValue){
digitalWrite(relaisH, HIGH);
digitalWrite(inidH, HIGH);}
if(hum<hmaxValue){
digitalWrite(relaisH, LOW);
digitalWrite(inidH, LOW);}
}
//Creation des objet qui va me permet de recevoir les valeur de cloud vers esp32 --creaction de
//pointeur qui va prend adress des objet les abboné"Adafruit_MQTT_Subscribe *subscription;"--
//on va verfier est ce que l un des abone est active cad il ya d information si oui--
//on va vefier lequelle subscription == &hmaxFeed ou subscription == &tmaxFeed-- lir et affecter la valeur lit
//HMAX=hmaxFeed.lastread Tmax=hmaxFeed.lastread