Commande reboot arduino via mqtt

Mon problème

Bonjour,

Ma question est: comment puis-je forcer le reboot d’un arduino mega via mqtt ou autre d’ailleurs?
Je spécifie juste que j’ai déjà cherché et demandé sur le forum arduino mais pas de réponse.

Maintenant, le décor:
Ca fait des semaines que je me bat avec mon arduino mega et shield ethernet (j’ai déjà posé des questions ici).
J’ai 8 sondes DHT22. En fait, au bout de quelques heures, mon arduino envoi « erreur capteur » et plus rien si je ne redémarre pas l’arduino.
J’ai pensé à l’alim mais après 3 changements, rien n’y fait. Pour le moment j’ai une de 5v 3A.
Donc, soit vous connaitriez le moyen (dans le code) de redémarrer l’arduino si « erreur capteur » durant X temps. Soit je le fait via une commande (mqtt???) via HA (node Red)?

En vous remerciant

Ma configuration


System Health

version core-2021.3.4
installation_type Home Assistant OS
dev false
hassio true
docker true
virtualenv false
python_version 3.8.7
os_name Linux
os_version 5.4.83-v7
arch armv7l
timezone Europe/Brussels
Home Assistant Community Store
GitHub API ok
Github API Calls Remaining 4616
Installed Version 1.11.3
Stage running
Available Repositories 777
Installed Repositories 34
Home Assistant Cloud
logged_in false
can_reach_cert_server ok
can_reach_cloud_auth ok
can_reach_cloud ok
Hass.io
host_os Home Assistant OS 5.13
update_channel stable
supervisor_version supervisor-2021.03.9
docker_version 19.03.15
disk_total 14.0 GB
disk_used 8.6 GB
healthy true
supported true
board rpi3
supervisor_api ok
version_api ok
installed_addons Samba share (9.3.1), Terminal & SSH (9.1.0), KNXD daemon (0.4.1), Node-RED (8.2.1), Samba Backup (4.4), InfluxDB (4.0.4), Alsa & PulseAudio Fix (3.4), Mosquitto broker (5.1.1), Grafana (6.1.3), File editor (5.2.0), APC UPS Daemon (1.9), Network UPS Tools (0.6.2), Nginx Proxy Manager (0.10.0), MariaDB (2.2.2), ESPHome (1.16.2)
Lovelace
dashboards 2
resources 15
views 7
mode storage
___

je ne connais pas assez arduino, peux tu envoyer une commande type ssh à un arduino?

Si oui, tu fais un sensor à partir d’une ligne mqtt pour notifier ton erreur de capteur, tu le retrouveras ensuite dans Node Red, ensuite via le noeud ssh tu balances la commande de reboot si erreur pendant x mn.
ou
comme dans esphome, il faut créer un switch de reboot, ensuite dans node red tu pourras aussi l’executer à ta convenance également.

Justement, je n’en sais rien non plus.
C’est pour cela que je fais appel à vous car je suis un peu largué.

Merci

// Redémarre le programme depuis le début mais ne
// réinitialiser pas les périphériques et les registres
void software_Reset()
{
asm volatile (" jmp 0");
}

Qwant est ton ami.

Reste à s’abonner à un topic mqtt et lancer cette fonction

Bonjour,

J’avais recherché sur le net et trouver des trucs mais quand on est une bille, on se sait pas où le mettre dans le code.
Si je te met mon code, tu sais me dire où l’intégrer???

//  Arduino Mqtt et des capteurs DHT22 (temp/humidite )
//
//  Exemple de reconnexion MQTT - non bloquant
//  une recopie-modif du wiki FHEM : https://wiki.fhem.de/wiki/MQTT_Einführung_Teil_3
//
// Ce croquis montre comment garder le client connecté en utilisant
// une fonction de reconnexion non bloquante, Si le client perd sa connexion,
// il tente de se reconnecter toutes les 5 secondes sans bloquer la boucle principale.
//
//
// -------------- debut ---------------

 #include <DHT.h>
 #include <SPI.h>
 #include <Ethernet.h>
 #include <PubSubClient.h>
 

 #define DHTPIN1 24 
 #define DHTPIN2 26  
 #define DHTPIN3 28
 #define DHTPIN4 30  

 #define DHTPIN6 34 
 #define DHTPIN7 36
 #define DHTPIN8 38  
 #define DHTPIN9 40 
  

 #define DHTTYPE1 DHT22
 #define DHTTYPE2 DHT22
 #define DHTTYPE3 DHT22
 #define DHTTYPE4 DHT22

 #define DHTTYPE6 DHT22
 #define DHTTYPE7 DHT22
 #define DHTTYPE8 DHT22
 #define DHTTYPE9 DHT22
 

 DHT dht1 (DHTPIN1, DHTTYPE1);
 DHT dht2 (DHTPIN2, DHTTYPE1);
 DHT dht3 (DHTPIN3, DHTTYPE1);
 DHT dht4 (DHTPIN4, DHTTYPE1);

 DHT dht6 (DHTPIN6, DHTTYPE1);
 DHT dht7 (DHTPIN7, DHTTYPE1);
 DHT dht8 (DHTPIN8, DHTTYPE1);
 DHT dht9 (DHTPIN9, DHTTYPE1);
 

 byte mac[]    = {  0xDE, 0xED, 0xBA, 0xFE, 0xFE, 0xED }; // adresses mac
 IPAddress ip{ 192, 168, 1, 34};     //ip du client
 IPAddress server{ 192, 168, 1, 2}; //ip du serveur MQTT (le Broker)


        // ------------- mqtt ---------------//

   void callback(char* topic, byte* payload, unsigned int length)
   {
   // gérer le message est arrivé
   }

  EthernetClient ethClient;
  PubSubClient client(ethClient);

  long lastReconnectAttempt = 0;

  boolean reconnect()
 {
    if (client.connect("Arduino_rez", "xxx", "xxx"))
    {
     // Once connected, publish an announcement...
     client.publish("home/Arduino_rez","online", true);
     // ... and resubscribe
     client.subscribe("inTopic");
    }
   return client.connected();
 }


 // Réservez la zone de stockage pour sauver la clôture //
 
  // capteur0
  static char humidity[15];
  static char temperature[15];
  float h = 0.0;
  float h_alt = 0.0;
  float t = 0.0;
  float t_alt = 0.0;

  // capteur1
  static char char_h1[15];
  static char char_t1[15];
  float h1 = 0.0;
  float h1_alt = 0.0;
  float t1 = 0.0;
  float t1_alt = 0.0;

    // capteur2
  static char char_h2[15];
  static char char_t2[15];
  float h2 = 0.0;
  float h2_alt = 0.0;
  float t2 = 0.0;
  float t2_alt = 0.0;

    // capteur3
  static char char_h3[15];
  static char char_t3[15];
  float h3 = 0.0;
  float h3_alt = 0.0;
  float t3 = 0.0;
  float t3_alt = 0.0;

    // capteur4
  static char char_h4[15];
  static char char_t4[15];
  float h4 = 0.0;
  float h4_alt = 0.0;
  float t4 = 0.0;
  float t4_alt = 0.0;

    // capteur5
  static char char_h5[15];
  static char char_t5[15];
  float h5 = 0.0;
  float h5_alt = 0.0;
  float t5 = 0.0;
  float t5_alt = 0.0;

    // capteur6
  static char char_h6[15];
  static char char_t6[15];
  float h6 = 0.0;
  float h6_alt = 0.0;
  float t6 = 0.0;
  float t6_alt = 0.0;

    // capteur7
  static char char_h7[15];
  static char char_t7[15];
  float h7 = 0.0;
  float h7_alt = 0.0;
  float t7 = 0.0;
  float t7_alt = 0.0;

    // capteur8
  static char char_h8[15];
  static char char_t8[15];
  float h8 = 0.0;
  float h8_alt = 0.0;
  float t8 = 0.0;
  float t8_alt = 0.0;

    // capteur9
  static char char_h9[15];
  static char char_t9[15];
  float h9 = 0.0;
  float h9_alt = 0.0;
  float t9 = 0.0;
  float t9_alt = 0.0;

// remise a zero du compteur "millisecondes"  depuis le dernier appel.
    unsigned long previousMillis = 0;  
        
// valeur intervalle de fréquence d'utilisation du capteur, en millisecondes (60000=1mn)
    const long interval = 6000;



         //***************** Setup **********************//

 void setup()
 {
   client.setServer(server, 1883);
   client.setCallback(callback);

   Ethernet.begin(mac, ip);
   delay(1500);
   lastReconnectAttempt = 0;
  
   Serial.begin(9600);
      
  if (Ethernet.begin(mac) == 0)
    {
      Serial.println("Failed to configure Ethernet using DHCP");
      return;
    }
    
  Serial.print("My IP address: ");
  for (byte thisByte = 0; thisByte < 4; thisByte++) {
    // print the value of each byte of the IP address:
    Serial.print(Ethernet.localIP()[thisByte], DEC);
    Serial.print("."); 
  }
  Serial.println();


   dht1.begin();
   dht2.begin();
   dht3.begin();
   dht4.begin();

   dht6.begin();
   dht7.begin();
   dht8.begin();
   dht9.begin();
  
 }

//***************** Loop **********************

 void loop()
 {
   if (!client.connected())
   {
     long now = millis();
     if (now - lastReconnectAttempt > 5000) // calcul temps pour reconnection client
       {
        lastReconnectAttempt = now;
    
     // Tentative de reconnexion
       if (reconnect())
          {
          lastReconnectAttempt = 0;
          }
       }
   }

   else
     {
      client.loop(); // Client connected
     }

   unsigned long currentMillis = millis();

    if (currentMillis - previousMillis >= interval) // calcul temps ecouler du capteur
    {
      previousMillis = currentMillis;

     // ----- lecture des capteurs ------    
    

      
      h1 = dht1.readHumidity();     //humidite 1
      t1 = dht1.readTemperature();  //Temperature 1
      
      h2 = dht2.readHumidity();     //humidite 2
      t2 = dht2.readTemperature();  //Temperature 2

      h3 = dht3.readHumidity();     //humidite 3
      t3 = dht3.readTemperature();  //Temperature 3
      
      h4 = dht4.readHumidity();     //humidite 4
      t4 = dht4.readTemperature();  //Temperature 4


      
      h6 = dht6.readHumidity();     //humidite 6
      t6 = dht6.readTemperature();  //Temperature 6
     
      h7 = dht7.readHumidity();     //humidite 7
      t7 = dht7.readTemperature();  //Temperature 7
      
      h8 = dht8.readHumidity();     //humidite 8
      t8 = dht8.readTemperature();  //Temperature 8
     
      h9 = dht9.readHumidity();     //humidite 9
      t9 = dht9.readTemperature();  //Temperature 9     
     }
    
   // Vérifiez si un numéro valide est retourné.
   //  Si "NaN" "Not a Number" (pas un nombre) est renvoyé, affiche erreurs capteur.

     if (isnan(t) || isnan(h) || isnan(t1) || isnan(h1) || isnan(t2) || isnan(h2) || isnan(t3) || isnan(h3) || isnan(t4) || isnan(h4) || isnan(t5) || isnan(h5) || isnan(t6) || isnan(h6) || isnan(t7) || isnan(h7) || isnan(t8) || isnan(h8) || isnan(t9) || isnan(h9) )
      {
       Serial.println(" un DHT22 n'a pas pu être lu");
       client.publish("home/Arduino_rez","Erreur capteur",true);
    
     // "true" envoie le message conservé, c'est-à-dire que le message reste sur le courtier
     //jusqu'à ce que quelque chose de nouveau arrive.
      }
       else if (h == h_alt && t == t_alt && h1 == h1_alt && t1 == t1_alt && h2 == h2_alt && t2 == t2_alt && h3 == h3_alt && t3 == t3_alt && h4 == h4_alt && t4 == t4_alt && h5 == h5_alt && t5 == t5_alt && h6 == h6_alt && t6 == t6_alt && h7 == h7_alt && t7 == t7_alt && h8 == h8_alt && t8 == t8_alt && h9 == h9_alt && t9 == t9_alt  )
         {
          //ne fais rien
         }
       else
        {
         client.publish("home/Arduino_rez","en Ligne", true);
    
         dtostrf(h,6, 1, humidity);
         dtostrf(t,6, 1, temperature);
      
         dtostrf(h1,6, 1, char_h1);
         dtostrf(t1,6, 1, char_t1);

         dtostrf(h2,6, 1, char_h2);
         dtostrf(t2,6, 1, char_t2);

         dtostrf(h3,6, 1, char_h3);
         dtostrf(t3,6, 1, char_t3);

         dtostrf(h4,6, 1, char_h4);
         dtostrf(t4,6, 1, char_t4);

         dtostrf(h5,6, 1, char_h5);
         dtostrf(t5,6, 1, char_t5);

         dtostrf(h6,6, 1, char_h6);
         dtostrf(t6,6, 1, char_t6);

         dtostrf(h7,6, 1, char_h7);
         dtostrf(t7,6, 1, char_t7);

         dtostrf(h8,6, 1, char_h8);
         dtostrf(t8,6, 1, char_t8);

         dtostrf(h9,6, 1, char_h9);
         dtostrf(t9,6, 1, char_t9);

         client.publish("home/Arduino_rez/ch_heather/humidite",humidity, true);
         client.publish("home/Arduino_rez/ch_heather/Temperature",temperature, true);

         client.publish("home/Arduino_rez/cuisine/humidite",char_h1, true);
         client.publish("home/Arduino_rez/cuisine/Temperature",char_t1, true);

          client.publish("home/Arduino_rez/caves/humidite",char_h1, true);
         client.publish("home/Arduino_rez/caves/Temperature",char_t1, true);

          client.publish("home/Arduino_rez/salle_de_jeu/humidite",char_h1, true);
         client.publish("home/Arduino_rez/salle_de_jeu/Temperature",char_t1, true);

          client.publish("home/Arduino_rez/salle_de_bain/humidite",char_h1, true);
         client.publish("home/Arduino_rez/salle_de_bain/Temperature",char_t1, true);

          client.publish("home/Arduino_rez/ch_parents/humidite",char_h1, true);
         client.publish("home/Arduino_rez/ch_parents/Temperature",char_t1, true);

          client.publish("home/Arduino_rez/ch_pacey/humidite",char_h1, true);
         client.publish("home/Arduino_rez/ch_pacey/Temperature",char_t1, true);

          client.publish("home/Arduino_rez/bureau/humidite",char_h1, true);
         client.publish("home/Arduino_rez/bureau/Temperature",char_t1, true);

          client.publish("home/Arduino_rez/salon/humidite",char_h1, true);
         client.publish("home/Arduino_rez/salon/Temperature",char_t1, true);

          client.publish("home/Arduino_rez/ch_kirsten/humidite",char_h1, true);
         client.publish("home/Arduino_rez/ch_kirsten/Temperature",char_t1, true);

       h_alt = h;       // annuler l'ancienne lecture ..
       t_alt = t;       // ... pour ne réagir qu'aux changements
       
       h1_alt = h1;  
       t1_alt = t1;

       h2_alt = h2;  
       t2_alt = t2;

       h3_alt = h3;  
       t3_alt = t3;

       h4_alt = h4;  
       t4_alt = t4;

       h5_alt = h5;  
       t5_alt = t5;

       h6_alt = h6;  
       t6_alt = t6;

       h7_alt = h7;  
       t7_alt = t7;

       h8_alt = h8;  
       t8_alt = t8;

       h9_alt = h9;  
       t9_alt = t9;

// ------------ Visu sur terminal ------------------

        Serial.print("humidite ch.Heather: ");
        Serial.print(h);
        Serial.print(" %\t");
        Serial.print("Temperature ch.Heather: ");
        Serial.print(t);
        Serial.println(" C");

        Serial.print("humidite cuisine: ");
        Serial.print(h1);
        Serial.print(" %\t");
        Serial.print("Temperature cuisine: ");
        Serial.print(t1);
        Serial.println(" C");

        Serial.print("humidite caves: ");
        Serial.print(h2);
        Serial.print(" %\t");
        Serial.print("Temperature caves: ");
        Serial.print(t2);
        Serial.println(" C");

        Serial.print("humidite salle de jeu: ");
        Serial.print(h3);
        Serial.print(" %\t");
        Serial.print("Temperature salle de jeu: ");
        Serial.print(t3);
        Serial.println(" C");

        Serial.print("humidite salle de bain: ");
        Serial.print(h4);
        Serial.print(" %\t");
        Serial.print("Temperature salle de bain: ");
        Serial.print(t4);
        Serial.println(" C");

        Serial.print("humidite ch. parents: ");
        Serial.print(h5);
        Serial.print(" %\t");
        Serial.print("Temperature ch. parents: ");
        Serial.print(t5);
        Serial.println(" C");

        Serial.print("humidite ch. Pacey: ");
        Serial.print(h6);
        Serial.print(" %\t");
        Serial.print("Temperature ch. Pacey: ");
        Serial.print(t6);
        Serial.println(" C");

        Serial.print("humidite bureau: ");
        Serial.print(h7);
        Serial.print(" %\t");
        Serial.print("Temperature bureau: ");
        Serial.print(t7);
        Serial.println(" C");

        Serial.print("humidite salon: ");
        Serial.print(h8);
        Serial.print(" %\t");
        Serial.print("Temperature salon: ");
        Serial.print(t8);
        Serial.println(" C");

        Serial.print("humidite ch. kirsten: ");
        Serial.print(h9);
        Serial.print(" %\t");
        Serial.print("Temperature ch. kirsten: ");
        Serial.print(t9);
        Serial.println(" C");
   
    }
 }
//-------- Fin Pgm --------------

Merci

Je dirais par exemple avant le boollean reconect.
Mais il faut aussi que tu fasses un subscribe quelque part dans ton code est que tu lances la fonction dans le callback associé.

Ok pour le boolean.
Mais alors pour le reste…
Seul, je n’y arriverai pas.
Je sais que pour les gens qui s’y connaissent ca a l’air simple mais pour moi, c’est du petit chinois.
Desolé.

Re,

J’ai fini par comprendre qu’il arrive que les dht se mettent parfois en défaut. C’est courant apparement.
Une solution consisterait à relier les fils + à un gpio plutot qu’au 5v.
Lorsqu’un problème se présente, mettre le gpio en LOW et puis sur High. Ceci afin de couper le courant des dht et de le remettre plutot que de rebooter.
Je pense que c’est une solution fort valable.

Alors, mon niveau d’arduino n’ayant pas changé, je ne sais toujours pas comment faire.
Sais -tu me dire

merci

Bonjour,
Pas toujours facile d’intervenir quand c’est pas son code mais j’essaie :slight_smile:

Pour le moment tu souscris déjà à un topic appelé « inTopic » mais tu ne fais rien sur le callback (ta fonction qui s’appelle callback) tu peux dans cette méthode faire un appel a la méthode software_Reset qui t’a été donnée plus haut.
Pour faire plus propre tu peux regarder si le message que tu as reçu sur le topic est égal à « reboot » avant de rebooter cela te permettrait de lancer une autre commande via ce topic (exemple forcer une mesure ou autre…)

cdlt,

PS: A priori tu envoies la même valeur sur tous les topics ca ne va pas bcp t’aider :wink:

Bonjour,

Alors, c’est fort gentil de ta part mais je n’ai rien compris du tout lol.
J’ai malheureusement décider d’abandonner l’univers des arduino. Je n’y comprends rien.
J’ai essayé du lire des tutos (celui d’eskimon entre autre) mais rien à faire, je sais faire les bases mais après, je coule. Dès qu’il faut adapter son code pour, par exemple, intégrer le mqtt, c’est mort.
Je reprends le code des autres, j’en comprends une petite partie mais il y a tellement de chose qui m’échappent que je fini par baisser les bras.
S’il suffisait de prendre la base arduino mqtt et y ajouter un code simple (comme on explique dans les livres), ca irait mais quand je vois le code que certains pondent, trop c’est trop.

En tout cas, merci à toi, à vous, d’avoir essayé.
J’ai décidé de me lancer dans l’univers esp qui est plus simple mais certaines contraintes me déranges.