Je n'arrive pas à comprendre pour mon code ne marche pas. Lorsque udiWatchdog est <= 20000 ça marche, lorsqu'il est supérieur ça ne marche plus ??
Le message Mqtt est bien envoyé toutes les 20s lorsque udiWatchdog vaut 20 000 mais lorsque udiWatchdog est plus grand (i.e. 25 000) le message n'est pas envoyé.
Voici le code (j'ai enlevé des morceaux pour simplifié la lecture) :
//Variables globales
unsigned long previousMillis = millis();
unsigned long udiWatchdog = 20000; //Time between two mqtt message in ms
void loop() {
unsigned long currentMillis = millis();
//Send the temperature each minute or when the temerature change about 0,2°C
if (currentMillis - previousMillis > udiWatchdog || abs(rPreviousTemp - rTemp) > 0.2) {
//Send the message
MQTTsend("RootSol/TempBallOuf",strToSend);
rPreviousTemp = rTemp;
previousMillis = millis();
}
}
Ci dessous, le code entier. J'ai oublié de préciser que j'utilise un esp32.
//////////////////////////////
// Routeur solaire pour chauffe eau électrique
//
//////// Bibliothèques ////////
//Bibliothèques pour le capteur de température
#include <OneWire.h>
#include <DallasTemperature.h>
//Bibliothèques pour la connexion wifi
//#include <ESP8266WebServer.h>
//#include <ESP8266WiFi.h>
//#include <ESP8266HTTPClient.h>
#include <WiFiClientSecure.h>
//Bibliothèque pour communication MQTT
#include <PubSubClient.h> //MQTT
//Bibliothèque pour les mises à jour OTA
#include <ArduinoOTA.h> //Mise à jour OTA
//Bibliothèques pour l'heure
#include <NtpClientLib.h> //Mise à l'heure
#include <TimeLib.h> //Mise à l'heure
//Bibliothèque pour générer des json
#include <ArduinoJson.h>
//////// Déclaration variables globales /////////
// Le fil data du capteur est connecté sur la broche GPIO 2 (Repéré D4 sur l'esp32)
#define ONE_WIRE_BUS 0
// Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)
OneWire oneWire(ONE_WIRE_BUS);
// Pass our oneWire reference to Dallas Temperature.
DallasTemperature sensors(&oneWire);
//Declare le Json, 200 represente la taille du Json
StaticJsonDocument<200> monJson; // Use arduinojson.org/v6/assistant to compute the capacity
//Wifi
WiFiClient espClient;
PubSubClient client(espClient);
//Hours Parameter
String date;
String ntpError;
unsigned long previousMillis = millis();
unsigned long udiWatchdog = 20000; //Time between two mqtt message in ms
//Broker MQTT
const char* mqtt_server = "192.168.1.56"; //IP du serveur Mqtt
const int mqttPort = 1883; //Port du broker
String strDataRec = ""; //Données reçues par le broker
//Tags for the temperature
float rTemp = 0.0; //Ballon temperature
float rPreviousTemp = 0.0; //Previous temperature sended
char strToSend[200]; //Chaine de caractère contenant le jSon à envoyé
//Fonctions
void setup_mqtt(){
client.setServer(mqtt_server, mqttPort);
delay(10);
Serial.println("Serveur Mqtt Ok");
client.setCallback(callback);//Déclaration de la fonction de souscription
reconnect();
}
//Callback doit être présent pour souscrire a un topic et de prévoir une action
void callback(char* topic, byte *payload, unsigned int length) {
Serial.println("-------Nouveau message du broker mqtt-----");
Serial.print("Topic:");
Serial.println(topic);
Serial.print("donnée:");
Serial.write(payload, length);
Serial.println();
strDataRec = "";
for (int i = 0; i <= length -1; i++) {
strDataRec += (char)payload[i];
}
Serial.print("Mqtt : ");
Serial.println(strDataRec);
//strDataRec = String((char*)payload);
}
void reconnect(){
while (!client.connected()) {
Serial.println("Connection au serveur MQTT ...");
if (client.connect("ESP32Client")) {
Serial.println("MQTT connecté");
}
else {
Serial.print("echec, code erreur= ");
Serial.println(client.state());
Serial.println("nouvel essai dans 2s");
delay(2000);
}
}
client.subscribe("ChEau/Set");
}
void MQTTsend(String strTopic,char* strText) {
// String strReponse = strText;
client.publish(strTopic.c_str(), strText);
delay(20);
Serial.println("Message envoye !");
}
void setup_wifi(){
WiFi.begin(ssid, password); //Initialise la connection Wifi
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
//char* strIp = "";
//strIp = (char*)WiFi.localIP().toString().c_str();
//Serial.print(strIp);
delay(10);
}
void setup() {
// start serial port
Serial.begin(9600);
Serial.setDebugOutput(true);
Serial.println("Connecting Wifi...");
//Message d'introdution
Serial.println("Bonjour");
Serial.println("Routeur solaire V0RC1");
delay(15);
//Initialise la connexion wifi
setup_wifi();
delay(10);
//Initialise la connexion avec le serveur mqtt
setup_mqtt();
delay(10);
client.publish("RootSol/TempBallOuf", "Hello !"); //Envoi un petit message de bienvenue
//Initialise les mises à jours OTA
Init_Ota();
//Initialyse le serveur NTP
delay(20);
NTP.begin("pool.ntp.org", 1, true);
NTP.setInterval(36000); //Intervalle pour l'heure en s
// Start up the library
sensors.begin(); // IC Default 9 bit. If you have troubles consider upping it 12. Ups the delay giving the IC more time to process the temperature measurement
}
void loop() {
// A chaque iteration, on verifie si une mise a jour nous est envoyee
// si tel est cas, la lib ArduinoOTA se charge de gerer la suite :)
ArduinoOTA.handle();
// Affiche l'heure
NTP.onNTPSyncEvent([](NTPSyncEvent_t error) {
if (error) {
Serial.print("Time Sync error: ");
if (error == noResponse){
ntpError = "noResponse";
Serial.println("NTP server not reachable");}
else if (error == invalidAddress){
ntpError = "invalidAddress";
Serial.println("Invalid NTP server address");}
}
else {
Serial.print("Got NTP time: ");
Serial.println(NTP.getTimeDateString(NTP.getLastNTPSync()));
}
});
//Température
Serial.print("Requesting temperatures...");
sensors.requestTemperatures(); // Send the command to get temperatures
Serial.println("DONE");
rTemp = sensors.getTempCByIndex(0);
//strTemp = String(rTemp);
//strTemp = String(sensors.getTempCByIndex(0));
Serial.print("Temperature : ");
Serial.println(rTemp);
//Structure du jSon
monJson["Temperature"] = rTemp;
monJson["Date"] = now();
//monJson["Millis"] = millis(); //Uncomment for diag
//monJson["PrMillis"] = previousMillis; //Uncomment for diag
monJson["Fin"] = "Fin";
serializeJson(monJson,strToSend);
delay(10);
unsigned long currentMillis = millis();
//Send the temperature each minute or when the temerature change about 0,2°C
if (currentMillis - previousMillis > udiWatchdog || abs(rPreviousTemp - rTemp) > 0.2) {
//Send the message
MQTTsend("RootSol/TempBallOuf",strToSend);
rPreviousTemp = rTemp;
previousMillis = millis();
}
}