Arduino mqtt relais plus ds18b20 temperature

Bonjour
J'essaie de faire communiquer un Arduino et jeedom en mqtt (5 sonde ds18b20 en one wire et projet de 12 relais)
Mon Arduino redémarre en boucle je ne comprend pas d'ou cela vient il y a t'il quelqu'un qui peut jeter un coup œil a mon code, l'erreur est peut être toute bête;)

/*
 * Ce programme tourne sur arduino Mega avec afficheur OLED SSD1306
 * Il permet de lire les données de deux capteurs de températures DS18B20
 * ainsi que la tension aux bornes d'une LDR et de publier les valeurs sur le réseau Ethernet en MQTT.
 * Il permet également de recevoir l'état dun switch virtuel et d'allumer une LED
*/
#include <OneWire.h>  // bibliothèque pour le bus 1-Wire
#include <Ethernet.h>
#include <PubSubClient.h>
#include <avr/wdt.h>  // bibliothèque pour le watchdog

#define BROCHE_ONEWIRE 23
#define LDR A0
#define RelaisK3 22
#define RelaisK4 24
#define RelaisK5 26
#define RelaisK6 28
#define RelaisK7 2
#define RelaisK8 3
#define RelaisK9 4
#define RelaisK10 5
#define RelaisK11 6
#define RelaisK12 7
#define RelaisK13 8
#define RelaisK14 9

uint8_t mac[6] = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x06 };  // on fixe l'adresse MAC de la carte Ethernet
int LDRValue = 0;
float temperature[2];
char buf[4];                              // Buffer de stockage de la valeur de la LDR
const char* MQTTserver = "192.168.2.85";  // Adresse IP du broket MQTT (Raspberry Pi HA)

EthernetClient ethClient;  // Initialisation des objets Ethernet & MQTT
PubSubClient mqttClient(ethClient);

enum DS18B20_RCODES {
  READ_OK,
  NO_SENSOR_FOUND,
  INVALID_ADDRESS,
  INVALID_SENSOR
};

OneWire ds(BROCHE_ONEWIRE);

void setup() {
  Serial.begin(9600);      // Initialisation du port série
  Serial.println(F("Arduino Chauffage (Températures + Relais)"));
  pinMode(RelaisK3, OUTPUT);
  pinMode(RelaisK4, OUTPUT);
  pinMode(RelaisK5, OUTPUT);
  pinMode(RelaisK6, OUTPUT);
  pinMode(RelaisK7, OUTPUT);
  pinMode(RelaisK8, OUTPUT);
  pinMode(RelaisK9, OUTPUT);
  pinMode(RelaisK10, OUTPUT);
  pinMode(RelaisK11, OUTPUT);
  pinMode(RelaisK12, OUTPUT);
  pinMode(RelaisK13, OUTPUT);
  pinMode(RelaisK14, OUTPUT);
  digitalWrite(RelaisK3, HIGH);
  digitalWrite(RelaisK4, HIGH);
  digitalWrite(RelaisK5, HIGH);
  digitalWrite(RelaisK6, HIGH);
  digitalWrite(RelaisK7, HIGH);
  digitalWrite(RelaisK8, HIGH);
  digitalWrite(RelaisK9, HIGH);
  digitalWrite(RelaisK10, HIGH);
  digitalWrite(RelaisK11, HIGH);
  digitalWrite(RelaisK12, HIGH);
  digitalWrite(RelaisK13, HIGH);
  digitalWrite(RelaisK14, HIGH);
  
  wdt_enable(WDTO_8S);  //watchdog timer with 8 Seconds time out
  if (Ethernet.begin(mac) == 0) {
    Serial.println(F("Impossible de configurer Ethernet via serveur DHCP !"));
    for (;;)
      ;
  }
  Serial.println(F("Ethernet configuré via DHCP"));
  Serial.print(F("IP address: "));
  Serial.println(Ethernet.localIP());
//  Serial.println(F("------------"));
  mqttClient.setServer(MQTTserver, 1883);
  Serial.println(F("Client MQTT configuré !"));
  Serial.println(F("Connexion au serveur avec l'ID 'Arduino Chauffage'"));
  if (mqttClient.connect("core-mosquitto", "Idt", "Mdp")) {
    Serial.println(F("La connection a été établie"));
  } else {
    Serial.println(F("Le serveur ne répond pas"));
  }
  //mqttClient.publish("Arduino_Chauffage/Relais/RelaisK3", "1");
  mqttClient.setCallback(callback);
  delay(2000);
}

void loop() {
  // static unsigned long prevMillis100ms = 0;  // déclaration d'une variable pour la temporisation publiation mqtt
  static unsigned long prevMillis10s = 0;  // déclaration d'une variable pour la temporisation publiation mqtt
  unsigned long curMillis = millis();
  mqttClient.loop();
  if (!mqttClient.connected()) {  // permet de reconnecter l'arduino au broker en cas de crash de celui-ci.
    reconnect();
  }
  mqttClient.subscribe("Arduino_Chauffage/Relais/RelaisK3");
  mqttClient.subscribe("Arduino_Chauffage/Relais/RelaisK4");
  mqttClient.subscribe("Arduino_Chauffage/Relais/RelaisK5");
  mqttClient.subscribe("Arduino_Chauffage/Relais/RelaisK6");
  mqttClient.subscribe("Arduino_Chauffage/Relais/RelaisK7");
  mqttClient.subscribe("Arduino_Chauffage/Relais/RelaisK8");
  mqttClient.subscribe("Arduino_Chauffage/Relais/RelaisK9");
  mqttClient.subscribe("Arduino_Chauffage/Relais/RelaisK10");
  mqttClient.subscribe("Arduino_Chauffage/Relais/RelaisK11");
  mqttClient.subscribe("Arduino_Chauffage/Relais/RelaisK12");
  mqttClient.subscribe("Arduino_Chauffage/Relais/RelaisK13");
  mqttClient.subscribe("Arduino_Chauffage/Relais/RelaisK14");
  
  if (curMillis - prevMillis10s > 10000) {  // on lit les valeurs des capteurs et on les publie toutes les 10s
    prevMillis10s = curMillis;
    if (getTemperature(&temperature[0], true) != READ_OK) {
      Serial.println(F("Erreur de lecture du capteur 1"));
      return;
    }
    if (getTemperature(&temperature[1], false) != READ_OK) {
      Serial.println(F("Erreur de lecture du capteur 2"));
      return;
    }
    if (getTemperature(&temperature[2], false) != READ_OK) {
      Serial.println(F("Erreur de lecture du capteur 3"));
      return;
    }
    if (getTemperature(&temperature[3], false) != READ_OK) {
      Serial.println(F("Erreur de lecture du capteur 4"));
      return;
    }
    if (getTemperature(&temperature[4], false) != READ_OK) {
      Serial.println(F("Erreur de lecture du capteur 5"));
      return;
    }
    affValeurs();
    //mqttClient.publish("Arduino1/Temperature", itoa(LDRValue, buf, 10));
    mqttClient.publish("Arduino_Chauffage/Temperatures/Capteur1", itoa((temperature[0] * 10), buf, 10));
    mqttClient.publish("Arduino_Chauffage/Temperatures/Capteur2", itoa((temperature[1] * 10), buf, 10));
    mqttClient.publish("Arduino_Chauffage/Temperatures/Capteur3", itoa((temperature[2] * 10), buf, 10));
    mqttClient.publish("Arduino_Chauffage/Temperatures/Capteur4", itoa((temperature[3] * 10), buf, 10));
    mqttClient.publish("Arduino_Chauffage/Temperatures/Capteur5", itoa((temperature[4] * 10), buf, 10));
    Serial.println(F("Publication MQTT effectuée"));
  }
  wdt_reset();
}

//----------------------- début de la fonction lecture de la température d'un capteur DS18B20 : ---------------------

byte getTemperature(float* temperature, byte reset_search) {
  byte data[9], addr[8];  // data[] : Données lues depuis le scratchpad; addr[] : Adresse du module 1-Wire détecté
  /* Reset le bus 1-Wire ci nécessaire (requis pour la lecture du premier capteur) */
  if (reset_search) {
    ds.reset_search();
  }
  /* Recherche le prochain capteur 1-Wire disponible */
  if (!ds.search(addr)) {  // Pas de capteur
    return NO_SENSOR_FOUND;
  }
  /* Vérifie que l'adresse a été correctement reçue */
  if (OneWire::crc8(addr, 7) != addr[7]) {  // Adresse invalide
    return INVALID_ADDRESS;
  }
  /* Vérifie qu'il s'agit bien d'un DS18B20 */
  if (addr[0] != 0x28) {  // Mauvais type de capteur
    return INVALID_SENSOR;
  }
  /* Reset le bus 1-Wire et sélectionne le capteur */
  ds.reset();
  ds.select(addr);
  /* Lance une prise de mesure de température et attend la fin de la mesure */
  ds.write(0x44, 1);
  unsigned long prevDSMillis = millis();
  unsigned long curDSMillis = millis();
  while (curDSMillis - prevDSMillis < 800) {
    mqttClient.loop();
    curDSMillis = millis();
  }
  /* Reset le bus 1-Wire, sélectionne le capteur et envoie une demande de lecture du scratchpad */
  ds.reset();
  ds.select(addr);
  ds.write(0xBE);
  /* Lecture du scratchpad */
  for (byte i = 0; i < 9; i++) {
    data[i] = ds.read();
  }
  /* Calcul de la température en degré Celsius */
  *temperature = (int16_t)((data[1] << 8) | data[0]) * 0.0625;
  return READ_OK;  // Pas d'erreur
}

//----------------------- fin de la fonction lecture de la température d'un capteur DS18B20 : ---------------------

//-------- début de la fonction qui permet de se reconnecter au broker MQTT : ----------
void reconnect() {
  while (!mqttClient.connected()) {
    if (mqttClient.connect("core-mosquitto", "Idt", "Mdp*")) {
      Serial.println();
      Serial.println("Reconnecté au broker !");
      mqttClient.subscribe("Arduino_Chauffage/Relais/RelaisK3");
      mqttClient.subscribe("Arduino_Chauffage/Relais/RelaisK4");
      mqttClient.subscribe("Arduino_Chauffage/Relais/RelaisK5");
      mqttClient.subscribe("Arduino_Chauffage/Relais/RelaisK6");
      mqttClient.subscribe("Arduino_Chauffage/Relais/RelaisK7");
      mqttClient.subscribe("Arduino_Chauffage/Relais/RelaisK8");
      mqttClient.subscribe("Arduino_Chauffage/Relais/RelaisK9");
      mqttClient.subscribe("Arduino_Chauffage/Relais/RelaisK10");
      mqttClient.subscribe("Arduino_Chauffage/Relais/RelaisK11");
      mqttClient.subscribe("Arduino_Chauffage/Relais/RelaisK12");
      mqttClient.subscribe("Arduino_Chauffage/Relais/RelaisK13");
      mqttClient.subscribe("Arduino_Chauffage/Relais/RelaisK14");
    } else {
      Serial.print(F("Broker MQTT indisponible. Status : rc="));
      Serial.print(mqttClient.state());
      Serial.println(F(" , tentative de reconnexion dans 3 secondes..."));
      delay(3000);
    }
  }
}
//--------  fin de la fonction qui permet de se reconnecter au broker MQTT : ----------

//-------- début de la fonction qui permet de traiter les messages qui arrivent depuis le broker MQTT : ----------
/* Cette fonction est automatiquement appelée lorsque le broquer MQTT envoie un message à l'arduino 
*  (ou plutôt lorsque l'arduino lit un message)
*/
void callback(char* topic, byte* payload, unsigned int length) {
  String Str;
  Serial.print(F("**** Message arrivé depuis MQTT broker **** -> [ "));
  Serial.print(topic);
  Serial.print(F(" ] -> ' "));
  for (int i = 0; i < length; i++) {  //ici le lenght c'est la variable de la fonction callback
    Serial.print((char)payload[i]);
    Str = Str + (char)payload[i];
  }
  Serial.println(F(" '"));
  char* Canal_Switch_Virtuel = "Arduino_Chauffage/Relais/RelaisK3";
  int valeur_Canal = strcmp(topic, Canal_Switch_Virtuel);
  if (valeur_Canal == 0 && Str == "1") {
    Serial.println(F("Retour d'etat K3 à 1"));
    mqttClient.publish("Arduino_Chauffage/Relais/RelaisK3/Etat", "1");
    digitalWrite(RelaisK3, HIGH);
    Serial.println(F("RelaisK3 ON"));
  } else if (valeur_Canal == 0 && Str == "0") {
    Serial.println(F("Retour d'etat K3 à 0"));
    mqttClient.publish("Arduino_Chauffage/Relais/RelaisK3/Etat", "0");
    digitalWrite(RelaisK3, LOW);
    Serial.println(F("RelaisK3 OFF"));
  }
}

//-------- fin de la fonction qui permet de traiter les messages qui arrivent depuis le broker MQTT : ----------


// //----------------------- début de la fonction affichage temp  : ---------------------
void affValeurs() {
  Serial.print(F("Temperatures : "));
  Serial.print(temperature[0], 1);
  Serial.print(F("°C   /   "));
  Serial.print(temperature[1], 1);
  Serial.print(F("°C   /   "));
  Serial.print(temperature[2], 1);
  Serial.print(F("°C   /   "));
  Serial.print(temperature[3], 1);
  Serial.print(F("°C   /   "));
  Serial.print(temperature[4], 1);
  Serial.println(F("°C"));
  LDRValue = analogRead(LDR);
  Serial.print(F("LDR : "));
  Serial.print(LDRValue);
  Serial.println(F("mV"));
}
//----------------------- fin de la fonction affichage temp   ---------------------

comment sont branchés et alimentés les relais ?

Les relais sont des 5 v alimenter en externe et chaque commande et piloter par les pin de 2 a 9
J'espère avoir répondu à la question correctement :wink:
Pour l'instant mon code fonctionnais avec une sonde et un relais je les adapter pour 5 sonde 1 relais et sa commence déjà a plus marcher
Il faudra encore que je gère les autre relais dans la suite du code

si vous enlevez MQTT ça fonctionne ?

Ci je commente

//  mqttClient.loop();
//if (!mqttClient.connected()) {  // permet de reconnecter l'arduino au broker en cas de crash de celui-ci.
//    reconnect();
//}

cela a l'air de fonctionner pour les température remonte dans jeedom
le relais k3 ne fonctionne pas depuis jeedom

Petit détail normalement je lui demande de lire les sondes toutes les 10 secondes et là il me les publie toutes les 4 secondes

pouvez vous reposter votre code?

Je reposte le code

/*
 * Ce programme tourne sur arduino Mega avec afficheur OLED SSD1306
 * Il permet de lire les données de deux capteurs de températures DS18B20
 * ainsi que la tension aux bornes d'une LDR et de publier les valeurs sur le réseau Ethernet en MQTT.
 * Il permet également de recevoir l'état dun switch virtuel et d'allumer une LED
*/
#include <OneWire.h>  // bibliothèque pour le bus 1-Wire
#include <Ethernet.h>
#include <PubSubClient.h>
#include <avr/wdt.h>  // bibliothèque pour le watchdog

#define BROCHE_ONEWIRE 23
#define LDR A0
#define RelaisK3 22
#define RelaisK4 24
#define RelaisK5 26
#define RelaisK6 28
#define RelaisK7 2
#define RelaisK8 3
#define RelaisK9 4
#define RelaisK10 5
#define RelaisK11 6
#define RelaisK12 7
#define RelaisK13 8
#define RelaisK14 9

uint8_t mac[6] = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x06 };  // on fixe l'adresse MAC de la carte Ethernet
int LDRValue = 0;
float temperature[2];
char buf[4];                              // Buffer de stockage de la valeur de la LDR
const char* MQTTserver = "192.168.2.85";  // Adresse IP du broket MQTT (Raspberry Pi HA)

EthernetClient ethClient;  // Initialisation des objets Ethernet & MQTT
PubSubClient mqttClient(ethClient);

enum DS18B20_RCODES {
  READ_OK,
  NO_SENSOR_FOUND,
  INVALID_ADDRESS,
  INVALID_SENSOR
};

OneWire ds(BROCHE_ONEWIRE);

void setup() {
  Serial.begin(9600);      // Initialisation du port série
  Serial.println(F("Arduino Chauffage (Températures + Relais)"));
  pinMode(RelaisK3, OUTPUT);
  pinMode(RelaisK4, OUTPUT);
  pinMode(RelaisK5, OUTPUT);
  pinMode(RelaisK6, OUTPUT);
  pinMode(RelaisK7, OUTPUT);
  pinMode(RelaisK8, OUTPUT);
  pinMode(RelaisK9, OUTPUT);
  pinMode(RelaisK10, OUTPUT);
  pinMode(RelaisK11, OUTPUT);
  pinMode(RelaisK12, OUTPUT);
  pinMode(RelaisK13, OUTPUT);
  pinMode(RelaisK14, OUTPUT);
  digitalWrite(RelaisK3, HIGH);
  digitalWrite(RelaisK4, HIGH);
  digitalWrite(RelaisK5, HIGH);
  digitalWrite(RelaisK6, HIGH);
  digitalWrite(RelaisK7, HIGH);
  digitalWrite(RelaisK8, HIGH);
  digitalWrite(RelaisK9, HIGH);
  digitalWrite(RelaisK10, HIGH);
  digitalWrite(RelaisK11, HIGH);
  digitalWrite(RelaisK12, HIGH);
  digitalWrite(RelaisK13, HIGH);
  digitalWrite(RelaisK14, HIGH);
  
  wdt_enable(WDTO_8S);  //watchdog timer with 8 Seconds time out
  if (Ethernet.begin(mac) == 0) {
    Serial.println(F("Impossible de configurer Ethernet via serveur DHCP !"));
    for (;;)
      ;
  }
  Serial.println(F("Ethernet configuré via DHCP"));
  Serial.print(F("IP address: "));
  Serial.println(Ethernet.localIP());
//  Serial.println(F("------------"));
  mqttClient.setServer(MQTTserver, 1883);
  Serial.println(F("Client MQTT configuré !"));
  Serial.println(F("Connexion au serveur avec l'ID 'Arduino Chauffage'"));
  if (mqttClient.connect("core-mosquitto", "Idt", "Mdp")) {
    Serial.println(F("La connection a été établie"));
  } else {
    Serial.println(F("Le serveur ne répond pas"));
  }
  //mqttClient.publish("Arduino_Chauffage/Relais/RelaisK3", "1");
  mqttClient.setCallback(callback);
  delay(2000);
}

void loop() {
  // static unsigned long prevMillis100ms = 0;  // déclaration d'une variable pour la temporisation publiation mqtt
  static unsigned long prevMillis10s = 0;  // déclaration d'une variable pour la temporisation publiation mqtt
  unsigned long curMillis = millis();
  mqttClient.loop();
  if (!mqttClient.connected()) {  // permet de reconnecter l'arduino au broker en cas de crash de celui-ci.
    reconnect();
  }
  mqttClient.subscribe("Arduino_Chauffage/Relais/RelaisK3");
  mqttClient.subscribe("Arduino_Chauffage/Relais/RelaisK4");
  mqttClient.subscribe("Arduino_Chauffage/Relais/RelaisK5");
  mqttClient.subscribe("Arduino_Chauffage/Relais/RelaisK6");
  mqttClient.subscribe("Arduino_Chauffage/Relais/RelaisK7");
  mqttClient.subscribe("Arduino_Chauffage/Relais/RelaisK8");
  mqttClient.subscribe("Arduino_Chauffage/Relais/RelaisK9");
  mqttClient.subscribe("Arduino_Chauffage/Relais/RelaisK10");
  mqttClient.subscribe("Arduino_Chauffage/Relais/RelaisK11");
  mqttClient.subscribe("Arduino_Chauffage/Relais/RelaisK12");
  mqttClient.subscribe("Arduino_Chauffage/Relais/RelaisK13");
  mqttClient.subscribe("Arduino_Chauffage/Relais/RelaisK14");
  
  if (curMillis - prevMillis10s > 10000) {  // on lit les valeurs des capteurs et on les publie toutes les 10s
    prevMillis10s = curMillis;
    if (getTemperature(&temperature[0], true) != READ_OK) {
      Serial.println(F("Erreur de lecture du capteur 1"));
      return;
    }
    if (getTemperature(&temperature[1], false) != READ_OK) {
      Serial.println(F("Erreur de lecture du capteur 2"));
      return;
    }
    if (getTemperature(&temperature[2], false) != READ_OK) {
      Serial.println(F("Erreur de lecture du capteur 3"));
      return;
    }
    if (getTemperature(&temperature[3], false) != READ_OK) {
      Serial.println(F("Erreur de lecture du capteur 4"));
      return;
    }
    if (getTemperature(&temperature[4], false) != READ_OK) {
      Serial.println(F("Erreur de lecture du capteur 5"));
      return;
    }
    affValeurs();
    //mqttClient.publish("Arduino1/Temperature", itoa(LDRValue, buf, 10));
    mqttClient.publish("Arduino_Chauffage/Temperatures/Capteur1", itoa((temperature[0] * 10), buf, 10));
    mqttClient.publish("Arduino_Chauffage/Temperatures/Capteur2", itoa((temperature[1] * 10), buf, 10));
    mqttClient.publish("Arduino_Chauffage/Temperatures/Capteur3", itoa((temperature[2] * 10), buf, 10));
    mqttClient.publish("Arduino_Chauffage/Temperatures/Capteur4", itoa((temperature[3] * 10), buf, 10));
    mqttClient.publish("Arduino_Chauffage/Temperatures/Capteur5", itoa((temperature[4] * 10), buf, 10));
    Serial.println(F("Publication MQTT effectuée"));
  }
  wdt_reset();
}

//----------------------- début de la fonction lecture de la température d'un capteur DS18B20 : ---------------------

byte getTemperature(float* temperature, byte reset_search) {
  byte data[9], addr[8];  // data[] : Données lues depuis le scratchpad; addr[] : Adresse du module 1-Wire détecté
  /* Reset le bus 1-Wire ci nécessaire (requis pour la lecture du premier capteur) */
  if (reset_search) {
    ds.reset_search();
  }
  /* Recherche le prochain capteur 1-Wire disponible */
  if (!ds.search(addr)) {  // Pas de capteur
    return NO_SENSOR_FOUND;
  }
  /* Vérifie que l'adresse a été correctement reçue */
  if (OneWire::crc8(addr, 7) != addr[7]) {  // Adresse invalide
    return INVALID_ADDRESS;
  }
  /* Vérifie qu'il s'agit bien d'un DS18B20 */
  if (addr[0] != 0x28) {  // Mauvais type de capteur
    return INVALID_SENSOR;
  }
  /* Reset le bus 1-Wire et sélectionne le capteur */
  ds.reset();
  ds.select(addr);
  /* Lance une prise de mesure de température et attend la fin de la mesure */
  ds.write(0x44, 1);
  unsigned long prevDSMillis = millis();
  unsigned long curDSMillis = millis();
  while (curDSMillis - prevDSMillis < 800) {
    mqttClient.loop();
    curDSMillis = millis();
  }
  /* Reset le bus 1-Wire, sélectionne le capteur et envoie une demande de lecture du scratchpad */
  ds.reset();
  ds.select(addr);
  ds.write(0xBE);
  /* Lecture du scratchpad */
  for (byte i = 0; i < 9; i++) {
    data[i] = ds.read();
  }
  /* Calcul de la température en degré Celsius */
  *temperature = (int16_t)((data[1] << 8) | data[0]) * 0.0625;
  return READ_OK;  // Pas d'erreur
}

//----------------------- fin de la fonction lecture de la température d'un capteur DS18B20 : ---------------------

//-------- début de la fonction qui permet de se reconnecter au broker MQTT : ----------
void reconnect() {
  while (!mqttClient.connected()) {
    if (mqttClient.connect("core-mosquitto", "Idt", "Mdp")) {
      Serial.println();
      Serial.println("Reconnecté au broker !");
      mqttClient.subscribe("Arduino_Chauffage/Relais/RelaisK3");
      mqttClient.subscribe("Arduino_Chauffage/Relais/RelaisK4");
      mqttClient.subscribe("Arduino_Chauffage/Relais/RelaisK5");
      mqttClient.subscribe("Arduino_Chauffage/Relais/RelaisK6");
      mqttClient.subscribe("Arduino_Chauffage/Relais/RelaisK7");
      mqttClient.subscribe("Arduino_Chauffage/Relais/RelaisK8");
      mqttClient.subscribe("Arduino_Chauffage/Relais/RelaisK9");
      mqttClient.subscribe("Arduino_Chauffage/Relais/RelaisK10");
      mqttClient.subscribe("Arduino_Chauffage/Relais/RelaisK11");
      mqttClient.subscribe("Arduino_Chauffage/Relais/RelaisK12");
      mqttClient.subscribe("Arduino_Chauffage/Relais/RelaisK13");
      mqttClient.subscribe("Arduino_Chauffage/Relais/RelaisK14");
    } else {
      Serial.print(F("Broker MQTT indisponible. Status : rc="));
      Serial.print(mqttClient.state());
      Serial.println(F(" , tentative de reconnexion dans 3 secondes..."));
      delay(3000);
    }
  }
}
//--------  fin de la fonction qui permet de se reconnecter au broker MQTT : ----------

//-------- début de la fonction qui permet de traiter les messages qui arrivent depuis le broker MQTT : ----------
/* Cette fonction est automatiquement appelée lorsque le broquer MQTT envoie un message à l'arduino 
*  (ou plutôt lorsque l'arduino lit un message)
*/
void callback(char* topic, byte* payload, unsigned int length) {
  String Str;
  Serial.print(F("**** Message arrivé depuis MQTT broker **** -> [ "));
  Serial.print(topic);
  Serial.print(F(" ] -> ' "));
  for (int i = 0; i < length; i++) {  //ici le lenght c'est la variable de la fonction callback
    Serial.print((char)payload[i]);
    Str = Str + (char)payload[i];
  }
  Serial.println(F(" '"));
  char* Canal_Switch_Virtuel = "Arduino_Chauffage/Relais/RelaisK3";
  int valeur_Canal = strcmp(topic, Canal_Switch_Virtuel);
  if (valeur_Canal == 0 && Str == "1") {
    Serial.println(F("Retour d'etat K3 à 1"));
    mqttClient.publish("Arduino_Chauffage/Relais/RelaisK3/Etat", "1");
    digitalWrite(RelaisK3, HIGH);
    Serial.println(F("RelaisK3 ON"));
  } else if (valeur_Canal == 0 && Str == "0") {
    Serial.println(F("Retour d'etat K3 à 0"));
    mqttClient.publish("Arduino_Chauffage/Relais/RelaisK3/Etat", "0");
    digitalWrite(RelaisK3, LOW);
    Serial.println(F("RelaisK3 OFF"));
  }
}

//-------- fin de la fonction qui permet de traiter les messages qui arrivent depuis le broker MQTT : ----------


// //----------------------- début de la fonction affichage temp  : ---------------------
void affValeurs() {
  Serial.print(F("Temperatures : "));
  Serial.print(temperature[0], 1);
  Serial.print(F("°C   /   "));
  Serial.print(temperature[1], 1);
  Serial.print(F("°C   /   "));
  Serial.print(temperature[2], 1);
  Serial.print(F("°C   /   "));
  Serial.print(temperature[3], 1);
  Serial.print(F("°C   /   "));
  Serial.print(temperature[4], 1);
  Serial.println(F("°C"));
  LDRValue = analogRead(LDR);
  Serial.print(F("LDR : "));
  Serial.print(LDRValue);
  Serial.println(F("mV"));
}
//----------------------- fin de la fonction affichage temp   ---------------------

Comme dit plus haut si je commente

//  mqttClient.loop();
//if (!mqttClient.connected()) {  // permet de reconnecter l'arduino au broker en cas de crash de celui-ci.
//    reconnect();
//}

Alors la transmission des températures sur le moniteur et vers MQTT puis jeedom fonctionne

Ce qui ne fonctionne pas c'est l'envoie toute les 10 seconde et surtout la réception des ordre venant de jeedom.
Alors que sur mqtt explorer dans le topic Relais/RelaisK3 je reçois bien l'info 0 ou 1 venant de jeedom.
Normalement sur le moniteur serie je devrait voir
Serial.print(F("**** Message arrivé depuis MQTT broker **** -> [ "));

Vu que je suis bien abonée au topic

cette partie là

devrait effectivement faire un affichage au plus toutes les 10 secondes. Vous êtes sûr que l'arduino ne reboot pas entre temps ? (vous ne voyez pas les commentaires du setup s'afficher de nouveau)


vous avez un mqttClient.loop() au coeur de la lecture des t°

pendant que vous effectuez l'attente de 800ms pour obtenir les températures.

si j'avais à écrire cela, je prendrais plutôt une approche asynchrone où vous demandez à chaque capteur d'effectuer une mesure et vous revenez plus tard la lire quand elle est dispo et faites la mise à jour de cet élément et relancez une lecture asynchrone.

j'avais posté un exemple sur wokwi qui utilisait la bibliothèque DallasTemperature et faisait cela

ça vous permet de revenir à la loop le plus rapidement possible pour maintenir vos états et ne pas avoir de souci de watchdog ou de wifi etc...

Non je ne voit pas les lignes du setup réapparaitre si je commente les lignes citée plus haut sinon effectivement il reboot
Par contre même en commentant et il print les température toute les 4 seconde
En ce qui concerne le mqttClient.loop je ne voie pas trop ou le mettre pour que cela fonctionne
J'avoue que j'apprend bcp a essayer de comprendre la logique du code
Ces un sketch que j'ai trouver sur un forum et que j'ai adapter pour mon utilisation
il fonctionnai plutôt bien de base avec 2 sonde et 1 relais
des que j'ai commencer a rajouter les sonde et les relais sa a buguer et pourtant je n'est que le programme pour 1 relais

c'est louche cette partie là...

Quel est exactement votre montage matériel et quelle board / éventuellement fréquence de processeur avez vous choisies dans l'IDE ?

si vous compilez et chargez sans rien changer d'autre

void setup() {
  Serial.begin(115200);
}

void loop() {
  static unsigned long prevMillis10s = -20000;
  unsigned long curMillis = millis();
  if (curMillis - prevMillis10s >= 10000) {
    Serial.println(curMillis / 1000ul); 
  }
}

que voyez vous dans le terminal série (à 115200 bauds)

Pour le test et la fréquence je vous dirait ce soir car là je ne suis pas sur place
Pour le matériel la carte est une Arduino méga avec Shield ethernet w5100

Il compte en ajoutant 1 par seconde

j'ai tapé trop vite, c'était

void setup() {
  Serial.begin(115200);
}

void loop() {
  static unsigned long prevMillis10s = -20000;
  unsigned long curMillis = millis();
  if (curMillis - prevMillis10s >= 10000) {
    Serial.println(curMillis / 1000ul); 
    prevMillis10s = curMillis;
  }
}

Pour le processeur ATmega2560 (Mega 2560)

il ajoute 10 toute les 10 seconde

OK donc l'horloge tourne correctement

c'est bizarre que le même code dans votre programme imprime toutes les 4s

il n'y avait pas le = apres le >

if (curMillis - prevMillis10s >= 10000) {  // on lit les valeurs des capteurs et on les publie toutes les 10s
    prevMillis10s = curMillis;

Je l'est donc rajouter.
Premier essaie en déconnectant les sonde du pins 23 il me poste erreur de lecture du capteur 1 toute les 10 secondes
En reconnectant les sondes il me poste les valeurs toute les 4 seconde

ce n'est pas un drame, ça faisait l'impression au bout de 10001 ms au lieu de 10000

c'est symptomatique d'un problème d'une variable qui est écrasée en mémoire ➜ il doit y avoir un débordement quelque part...

➜ effectivement

votre tableau n'a que deux entrées (indices 0 et 1)

mais vous essayez d'accéder en écriture aux indices 2, 3 et 4....

il faut que je mette
float temperature[5];

pour avoir 5 entrée si je comprend bien