Problème avec millis() et valeur supérieure à 20000

Bonjour,

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();
  }
}


Merci d'avance pour votre aide, car la, je sèche.

Ce n'est pas votre code complet. Veuillez montrer votre code complet.

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();
  }
}

Vous avez peut-être un timeout sur le client MQTT après vos 15/20 secondes
vérifiez avec l'appel if (client.connected()) { ...

Ah purée ! C'est ça ! J'ai rajouter, avant d'envoyer le message mqtt, ça : if (!MQTTclient.connected()) { MQTTconnect(); }
et ça marche.
Merci

super - bonnes bidouilles !

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.