Bonsoir,
Je me suis lancé sur un projet de tracker photovoltaïque (ça fais déjà un mois que je suis dessus) et c’est aussi un grand défi car je ne suis pas spécialiste du code.
Je suis entrain de mettre en place le Mqtt pour remonter certaines infos et aussi pouvoir depuis jeedom envoyer des commandes sur le tracker.
Pour l’instant j’arrive à remonté les infos dans le plugin jmqtt.
J’ai fais a l’arrache un autre petit code pour pouvoir faire les tests pour les commandes reçu sur l’esp avant de mettre le mqtt complet sur le code du tracker, mais pas moyen de trouver comment faire.
Je post le code pour ceux qui pourrait m’aider
/********* 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 = "xxxxxxxx";
const char* password = "xxxxxxxxx";
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 = 30000; // 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; //ok
docMqtt["Relais1"]= relais1State; //ok
docMqtt["Bouton"]= info_bouton; //ok
//size_t n = serializeJson(docMqtt, buffer); //test
String jsonString;
serializeJson(docMqtt, jsonString);
//client.publish("Tracker-ldr/sensor/state", buffer, n); //test
client.publish("Tracker-ldr/sensor/state", jsonString.c_str()); //ok
}
// Connection au wifi
void setup_wifi() {
delay(10);
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());
// connection sur navigateur = IP esp et IP/update pour mise a jour OTA
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é");
} 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 !");
// Traite 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éfinir la fonction de rappel pour les messages MQTT reçus
// S'abonner au sujet MQTT ? Pas de message!!!
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;
// Convertir 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