#include <WiFi.h>
#include <Adafruit_MAX31855.h>
#include <TM1637Display.h>
#include <picomqtt.h>
// Configuration des broches pour les composants
#define MAXDO 19 // Broche de données pour le MAX31855
#define MAXCS 23 // Broche de sélection de puce pour le MAX31855
#define MAXCLK 18 // Broche d'horloge pour le MAX31855
#define RELAY_PIN 22 // Broche pour le relais
#define TM1637_CLK 2 // Broche d'horloge pour l'afficheur TM1637
#define TM1637_DIO 4 // Broche de données pour l'afficheur TM1637
#define PIR_PIN 27 // Broche pour le capteur de présence PIR
// Initialisation des composants
Adafruit_MAX31855 thermocouple(MAXCLK, MAXCS, MAXDO); // Création d'un objet thermocouple
TM1637Display display(TM1637_CLK, TM1637_DIO); // Création d'un objet pour l'afficheur TM1637
// Informations Wi-Fi
const char* ssid = "Votre_SSID"; // Remplacez par votre SSID Wi-Fi
const char* password = "Votre_MDP"; // Remplacez par votre mot de passe Wi-Fi
// Informations MQTT
const char* mqttServer = "778970ad16bc4384b58e90acf0ffc3c4.s1.eu.hivemq.cloud"; // Adresse du broker MQTT
const int mqttPort = 1883; // Port du broker MQTT
const char* mqttUser = "votre_utilisateur"; // Votre nom d'utilisateur MQTT
const char* mqttPassword = "votre_mot_de_passe"; // Votre mot de passe MQTT
const char* temperatureTopic = "sechoir/temperature"; // Topic pour publier la température
const char* commandTopic = "sechoir/command"; // Topic pour les commandes (ON/OFF)
const char* presenceTopic = "sechoir/presence"; // Topic pour les notifications de présence
const char* alertTopic = "sechoir/alert"; // Topic pour les alertes
const char* notificationTopic = "sechoir/notification"; // Topic pour les notifications
WiFiClient espClient; // Client Wi-Fi
Picomqtt mqttClient(espClient); // Client MQTT
unsigned long startTime = 0; // Temps de début du séchage
bool isDrying = false; // État du séchage (true si en cours, false sinon)
void setup() {
Serial.begin(115200); // Démarrer la communication série à 115200 bauds
WiFi.begin(ssid, password); // Connexion au réseau Wi-Fi
// Attendre la connexion au Wi-Fi
while (WiFi.status() != WL_CONNECTED) {
delay(1000); // Attendre 1 seconde
Serial.println("Connexion au Wi-Fi..."); // Afficher le message de connexion
}
Serial.println("Connecté au Wi-Fi"); // Afficher que la connexion est réussie
// Configuration MQTT
mqttClient.begin(mqttServer, mqttPort, mqttUser, mqttPassword); // Initialiser le client MQTT
mqttClient.onMessage(messageReceived); // Définir la fonction à appeler lors de la réception d'un message
// Initialiser le relais
pinMode(RELAY_PIN, OUTPUT); // Définir la broche du relais comme sortie
digitalWrite(RELAY_PIN, LOW); // Éteindre le relais au départ
// Initialiser le capteur PIR
pinMode(PIR_PIN, INPUT); // Définir la broche du capteur PIR comme entrée
// Initialiser l'afficheur
display.setBrightness(0x0f); // Régler la luminosité à son maximum
}
void loop() {
mqttClient.loop(); // Gérer les messages MQTT entrants
// Lire la température du thermocouple
double temperature = thermocouple.readCelsius();
// Publier la température sur le topic MQTT
mqttClient.publish(temperatureTopic, String(temperature).c_str());
// Contrôle du relais en fonction de la température
if (temperature < 45) { // Si la température est inférieure à 45°C
digitalWrite(RELAY_PIN, HIGH); // Allumer le relais
} else {
digitalWrite(RELAY_PIN, LOW); // Éteindre le relais
}
// Vérifier si la température atteint 47 °C
if (temperature >= 47) {
mqttClient.publish(notificationTopic, "Ajoutez le produit 'spiruline' dans la salle de séchage."); // Notification à l'administrateur
}
// Lire l'état du capteur PIR
if (digitalRead(PIR_PIN) == HIGH) { // Si une présence est détectée
Serial.println("Présence détectée."); // Afficher un message de détection
mqttClient.publish(presenceTopic, "Produit présent"); // Publier un message de présence
if (!isDrying) { // Si le séchage n'est pas déjà en cours
isDrying = true; // Mettre à jour l'état de séchage
startTime = millis(); // Démarrer le chronomètre
}
}
// Gérer le temps de séchage
if (isDrying) { // Si le séchage est en cours
unsigned long elapsedTime = (millis() - startTime) / 1000; // Calculer le temps écoulé en secondes
display.showNumberDec(elapsedTime); // Afficher la durée sur l'afficheur TM1637
// Vérifier si le temps de séchage a atteint 12 heures (43200 secondes)
if (elapsedTime >= 43200) {
mqttClient.publish(alertTopic, "Temps de séchage terminé, fermer le séchoir"); // Publier une alerte
isDrying = false; // Réinitialiser l'état de séchage
}
}
// Afficher la température sur l'afficheur
int displayTemp = (int)temperature; // Convertir la température en entier
display.showNumberDec(displayTemp); // Afficher la température sur l'afficheur
delay(5000); // Attendre 5 secondes avant la prochaine itération
}
void messageReceived(const char* topic, const char* payload) {
// Traiter les messages reçus sur le topic de commande
if (strcmp(topic, commandTopic) == 0) { // Si le message provient du topic de commande
String command = payload; // Convertir le payload en String
if (command == "ON") { // Si la commande est "ON"
digitalWrite(RELAY_PIN, HIGH); // Allumer le relais
} else if (command == "OFF") { // Si la commande est "OFF"
digitalWrite(RELAY_PIN, LOW); // Éteindre le relais
}
}
}