Bonsoir,
Pour pouvoir mettre en place l'envoi de commande par Mqtt , j'ai mis en place un petit programme sur un esp32 pour pouvoir tester.
Je remonte bien les infos esp32 vers Mqtt mais je n'arrive pas a envoyer depuis le Mqtt une commande sur l'esp32 pour allumer le relais.
Sur Mqtt j'envoi une commande de type: (commande)= Action → (topic)= Tracker-ldr/info_bouton → (valeur)= 1
Et dans le moniteur série je ne vois pas le = Serial.println("Message MQTT reçu !");
Le code de test:
/********* TEST-MQTT *************/
#include <ArduinoJson.h>
//#include <ArduinoJson.hpp>
#include <AsyncElegantOTA.h>
#include <ESPAsyncWebServer.h>
#include <AsyncTCP.h>
#include <WiFi.h>
#include <PubSubClient.h>
#include <Wire.h>
#include "LiquidCrystal_I2C.h"
#include <Adafruit_Sensor.h>
#include <Adafruit_TSL2561_U.h>
#define TSL2561_SDA 21
#define TSL2561_SCL 22
//relais pour test mqtt
#define relais1 16 // gpio
int relais1State; //test etat relais test mqtt
const int Boutonrelais1 = 32;
bool info_bouton = false; //test
bool led = false; //variable pour bouton ou seuil lumière
Adafruit_TSL2561_Unified tsl = Adafruit_TSL2561_Unified(TSL2561_ADDR_FLOAT, 12345);
const char* ssid = "xxxxxxxxx";
const char* password = "xxxxxxxxxx";
const char* mqttServer = "192.168.50.12";
const int mqttPort = 1883;
const char* clientId = "ESP32Client";
//variable RSSI pour tempo envoi
unsigned long lastMqttUpdate = 0;
const unsigned long mqttUpdateInterval = 5000; // Intervalle en millisecondes (30 secondes)
WiFiClient espClient;
PubSubClient client(espClient);
//Créer objet AsyncWebServer sur le port 80 :
AsyncWebServer server(80); //***
char message[10]; // Définissez un tableau de caractères pour stocker le message
//TEST MQTT**************
void MQTTsend() {
char buffer[512];
DynamicJsonDocument docMqtt(512);
docMqtt["Lux"] = message;
//docMqtt["notification"]= "Test envois sur le broker"; // exemple message texte
// Convertir le RSSI WiFi en chaîne de caractères
char rssiBuffer[5];
itoa(WiFi.RSSI(), rssiBuffer, 10);
docMqtt["RSSI du WiFi"]= rssiBuffer;
docMqtt["Relais1"]= relais1State;
docMqtt["Bouton"]= info_bouton;
//size_t n = serializeJson(docMqtt, buffer);
String jsonString;
serializeJson(docMqtt, jsonString);
//client.publish("Tracker-ldr/sensor/state", buffer, n);
client.publish("Tracker-ldr/sensor/state", jsonString.c_str());
}
// Connection au wifi
void setup_wifi() {
delay(10);
//Wifi
Serial.printf("Connecting to %s ", ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println();
Serial.print("Connecté au réseau WiFi avec l'adresse IP: ");
Serial.println(WiFi.localIP());
//Serial.print("Signal Wifi");
//Serial.println(WiFi.RSSI());
server.on("/", HTTP_GET, [](AsyncWebServerRequest *request) {
request->send(200, "text/plain", "Je suis le test mqtt .");
});
AsyncElegantOTA.begin(&server); // Start ElegantOTA
server.begin();
Serial.println("HTTP server started");
}
// reconnection Mqtt
void reconnect() {
// Boucle jusqu'à ce que nous soyons reconnectés
while (!client.connected()) {
Serial.print("Tentative de connexion au broker MQTT...");
// Tentative de connexion
if (client.connect("ESP32Client")) {
Serial.println("Connecté");
// Une fois connecté, vous pouvez vous abonner à des topics ici
} else {
Serial.print("échoué, rc=");
Serial.print(client.state());
Serial.println(" nouvelle tentative dans 5 secondes");
// Attendez 5 secondes avant de réessayer
delay(5000);
}
}
}
void callback(char* topic, byte* payload, unsigned int length) {
Serial.println("Message MQTT reçu !");
// Traitez le message ici
// Par exemple, allumez ou éteignez le relais en fonction du message reçu
if (payload[0] == '1') {
digitalWrite(relais1, HIGH);
relais1State = 1;
} else if (payload[0] == '0') {
digitalWrite(relais1, LOW);
relais1State = 0;
}
}
void setup() {
Serial.begin(115200);
delay(10);
// TSL2561
Wire.begin(TSL2561_SDA, TSL2561_SCL);
if (!tsl.begin()) {
Serial.println("Capteur TSL2561 non trouvé. Vérifiez votre câblage !");
while (1);
}
tsl.enableAutoRange(true);
// connection wifi
setup_wifi();
AsyncElegantOTA.begin(&server);//***
server.begin(); //***
// Connexion au serveur MQTT
client.setServer(mqttServer, mqttPort);
client.setCallback(callback); // Définissez la fonction de rappel pour les messages MQTT reçus
// Abonnez-vous au sujet MQTT
client.subscribe("Tracker-ldr");
//type relais
pinMode(relais1, OUTPUT); //*pour test mqtt
pinMode(Boutonrelais1, INPUT_PULLUP); //*pour test mqtt
}
void loop() {
delay(1000);
//fonction de reconnection wifi
if (!client.connected()) {
reconnect();
}
//Tempo envoi info MQTT
// Vérifiez si le temps écoulé dépasse l'intervalle de mise à jour du RSSI (30 secondes)
if (millis() - lastMqttUpdate >= mqttUpdateInterval) {
// Mettez à jour le dernier temps d'envoi du RSSI
lastMqttUpdate = millis();
MQTTsend(); //lancement envoi info Mqtt
}
// info lux
sensors_event_t event; // info tsl2561
tsl.getEvent(&event);
//variable pour lumière
int lumiere = event.light;
// Convertissez l'int en chaîne de caractères
dtostrf(event.light, 6, 2, message);
//snprintf(message, sizeof(message), "%d", event.light);
Serial.print("Message à publier sur MQTT : ");
Serial.println(message);
if (event.light) {
Serial.print("Luminosité: ");
Serial.println(event.light);
} else {
Serial.println("Erreur lors de la lecture de la luminosité !");
}
//int relaisporteState; //etat relais test mqtt
int Boutonrelais1State = digitalRead(Boutonrelais1); //test mqtt
//test mise en marche relais auto et remonter mqtt
if (lumiere > 150) {
digitalWrite(relais1, HIGH);
relais1State = 1;
led = true;
}
if (lumiere < 50) {
digitalWrite(relais1, LOW);
relais1State = 0;
led = false;
}
Serial.println(relais1State); //état relais moniteur série //debug
//test en local esp
if (led) {
} else{
if (Boutonrelais1State == LOW) {
digitalWrite(relais1, HIGH);
relais1State = 1;
info_bouton = true;
} else {
digitalWrite(relais1, LOW);
relais1State = 0;
info_bouton = false;
Serial.println("relais off sur bouton");//debug
}
}
client.loop();
}
Merci