Journal Hacker sa pompe de relevage 2 !

Posté par  . Licence CC By‑SA.
23
2
mar.
2025

Sommaire

journal precedent : https://linuxfr.org/users/chocolatineflying/journaux/hacker-sa-pompe-de-relevage

Je vais vous faire un résumé ici, ce sera plus intéressant que de chercher les pépites dans les sources sur github.

https://github.com/ygueparm/lift_pump2

Première difficulté : Mise à jour de l'IDE Arduino

Lorsque j'ai mis à jour l'IDE Arduino sans faire attention, j'ai découvert que la version 3.x.x du core ESP32 par Espressif n'est pas compatible avec certaines bibliothèques comme AsyncWebServer et d'autres que j'utilise. J'ai passé beaucoup de temps à résoudre ce problème, mais vraiment beaucoup.

Conseil : Utilisez la version 2.0.9 du core ESP32 par Espressif et évitez toute mise à jour ultérieure.

j’étais pas fan de l'ide 2.X de arduino, finalement effectivement ça fait gagner vraiment plus de temps que la version 1.8.X MAIS c'est super lent pour compiler, deja que c'etait pas fameux.

Watchdog Timer

J'ai mis en place le watchdog interne de l'ESP32. Ce n'était pas facile à trouver, mais c'est simple à implémenter. Le temps est configuré en secondes :

#include <esp_task_wdt.h>

void setup() {
  esp_task_wdt_init(10, true); // Initialisation du watchdog (10 secondes)
  esp_task_wdt_add(NULL);      // Ajout de la tâche principale au watchdog
}

void loop() {
  esp_task_wdt_reset(); // Réinitialisation du watchdog à chaque itération
}

Si vous utilisez une instruction delay() supérieure à 10 secondes, cela bloquera l'ESP32 et le redémarrera automatiquement. donc attention a vos delay un peu partout dans le code

Refonte de l'IHM

je ne mets qu'une copie d’écran, le reste sur github

ihm

j'utilise un affichage conditionnel, if elseif elseif else pour afficher les différente page web en fonction de l’état des capteurs, j'ai voulu faire autrement sans succées, finalement ca fonctionne plutôt bien uniquement car je n'ai pas trop de page a afficher.

https://github.com/ygueparm/lift_pump2/blob/main/web_server.cpp

Utilisation de Preferences.h pour stocker les valeurs de configuration

J'ai utilisé la bibliothèque Preferences.h pour sauvegarder les paramètres de configuration et le temps de démarrage. c'est stocké dans l'eeprom interne, pour mon cas je trouvais cela plus simple, et c'est écrit une fois tous les 2 à 15 jours suivant les fonctionnement, très simple a utiliser, a éviter pour écrire beaucoup d'information taille environ 81920 octets

#include <Preferences.h>

// Instance pour sauvegarder les données
Preferences prefsPompe;

void setup() {
  prefsPompe.begin("pompe", false); // Namespace "pompe"
}

void loop() {
  unsigned long dernierDemarrage = millis();
  prefsPompe.putULong("dernierDemarrage", dernierDemarrage); // Sauvegarde du dernier démarrage dans le stockage pompe
}

Utilisation de SPI et LittleFS pour les logs

Pour enregistrer les logs, j'ai utilisé la bibliothèque LittleFS. Voici un exemple de fonction pour écrire des compteurs dans un fichier, principalement les log de debug que j'affiche dans le terminal série, la j'enregistre tous dans la flash environ 2Mo de disponible :

#include "LittleFS.h"

void enregistrerCompteurs(int niveauHaut, int etatContacteur, int etatRelaisSecurite, int moteurEnMarche, int capteurBloque) {
  File file = LittleFS.open("/compteurs.txt", FILE_WRITE);
  if (!file) {
    Serial.println("Erreur lors de l'ouverture du fichier compteurs pour écrire");
    return;
  }

  file.printf("Niveau haut: %d\nContacteur: %d\nRelais sécurité: %d\nMoteur en marche: %d\nCapteur bloqué: %d\n",
              niveauHaut, etatContacteur, etatRelaisSecurite, moteurEnMarche, capteurBloque);

  file.close();
  Serial.println("Compteurs enregistrés");
}

c'est un peu plus lourd que l'utilisation de préférence, pour moi.

Utilisation de millis() pour afficher des messages régulièrement

Pour éviter de surcharger la sortie série avec trop d'informations, j'ai utilisé la fonction millis() pour afficher des messages de manière régulière et non à chaque itération :

unsigned long previousMillis_print = 0;
const unsigned long interval_print = 5000; // Interval de 5 secondes

void loop() {
  unsigned long currentMillisled = millis();

  if (currentMillisled - previousMillis_print >= interval_print) {
    previousMillis_print = currentMillisled;

    Serial.print("État du capteur de niveau haut : ");
    Serial.println(capteurs.niveauHaut);
    Serial.print("État contacteur : ");
    Serial.println(capteurs.etatContacteur);
    Serial.print("État du relais sécurité : ");
    Serial.println(capteurs.etatRelaisSecurite);
    Serial.print("Moteur en marche : ");
    Serial.println(moteurEnMarche);
    Serial.print("État si le capteur a été bloqué : ");
    Serial.println(capteurBloque);

   }
}

les résistances de tirage

ça aussi j'ai découvert un peu tard

  //résistance de tirage pour les entrée :
  pinMode(CAPTEUR_NIVEAU_HAUT, INPUT_PULLDOWN); //ajouter la mention PULLDOW ou PULLUP
  pinMode(RELAIS_SECURITE, INPUT_PULLDOWN);
  pinMode(CAPTEUR_CONTACTEUR, INPUT_PULLDOWN);

suivant votre utilisation, sa simplifie le montage grandement !

conclusion

C'est maintenant bien plus agréable de se connecter à l'interface avec un téléphone. Je ne perds plus les valeurs qui étaient stockées en RAM, ni le temps total de fonctionnement de la pompe, ni les logs. et ca c'est cool pour analyser si il y a eu un pb

Cette partie est terminée, je pense. La factorisation nécessiterait encore plus de travail pour rendre le code encore plus clair. J'ai passé environ 100 heures pour passer du fichier original à celui-ci. C'était un peu la misère ! Une personne expérimentée aurait probablement fait cela beaucoup plus vite et n'aurait pas tous mis dans un seul fichier au depart.

Pas de regrets sur la simplification du code, même si elle reste subjective. J'ai utilisé un IA principalement pour orienter mes choix stratégiques plutôt que pour générer du code directement. On atteint rapidement les limites des outils IA pour des cas spécifiques comme celui-ci.

En production, cela ne fonctionnait pas au début, mais grâce à une structure relativement propre, j'ai pu identifier rapidement d’où cela provenait, un niveau actif a LOW plutôt qu'a HIGH, bref c'etait assez satisfaisant a corriger. et sans IA !

Je travaille avec des lunettes anti-lumière bleue (de couleur rouge ou orange) pour éviter les maux de tête ou de yeux après de longues heures devant l'écran. D'où les émoticônes un peu partout dans le code, car les couleurs d'indentation ne sont pas très visibles pour moi. Tous les IA m'ont supplié de ne pas les garder, car cela ne semble pas professionnel, mais c'est moi qui ai mal à la tête ou aux yeux ! et ca a transformé ma vie au travail, mais il faut assumer de les mettre : https://fr.aliexpress.com/item/1005006898114168.html je conseil fortement, c'est impressionnant d'efficacité et mocheté. adieu l'indentation coloré pour retrouver ses petites lignes

le futur oui j'aime l'amelioration

La version 3 inclura :

Un module IR pour mesurer la vitesse de rotation de l'arbre de la pompe. Il y a suffisamment de place à l'intérieur de la pompe pour le faire.
Un accéléromètre pour enregistrer les vibrations et réaliser une analyse fréquentielle.
j'ai trouvé la meme pompe que moi sur lbc pour pas trop chère ca me permet de la modifier tranquillement.

et je pense passer par domoticz ou qqhchoses d’équivalents, imaginons avoir 40 pompes a surveiller, dans une piscine public par exemple, ce serait dommage de ne pas utiliser qqchoses d'existant et d'avoir un écran centralisé pour surveiller tous cela !

Maintenant que tout fonctionne correctement, je peux enfin monter ma startup !

  • # Les émoticônes

    Posté par  (site web personnel) . Évalué à 3 (+1/-0).

    J'aime beaucoup les émoticônes, c'est sympa. Ça rend les messages bien plus lisibles, et on les repère très vite dans le code.

    Je note.

    Pourquoi bloquer la publicité et les traqueurs : https://greboca.com/Pourquoi-bloquer-la-publicite-et-les-traqueurs.html

  • # Quelques remarques

    Posté par  . Évalué à 2 (+1/-0).

    Pour les résistances de pullup, effectivement tu peux activer celles inclues dans le die ESP32 mais elles sont de très grandes valeurs, laissant très peu de mA passer. C'est bien pour la planète mais j'ai déjà eu des soucis avec des câbles un peu long (même avec des câbles réseau donc paire torsadée et blindés). Symptôme : le montage fonctionne en maquette et mal dans la vraie vie, à cause de parasites. La solution est de gérer la résistance et d'ajouter un condensateur, voir d'isoler les alimentations (celle de l'ESP32 et celles des capteurs/actionneurs …) bref le montage se complique de nouveau. Les parasites (surtout avec un moteur comme celui de la pompe) peuvent de temps en temps même faire planter l'ESP.

    Tu parles d'intégrer tout cela à domoticz, perso je suis passé sur home assistant, et du coup je n'utilise plus de code c complet pour mes microcontroleurs ESP, je fais tout avec esphome, c'est très pratique et ça s'intègre directement avec home assistant. Esphome permet de coder simplement les fonctions dont tu as besoin en c, le reste est déjà prévu (watchdog, wifi, serveur web, remontée des logs, mise à jour OTA, …)

    Dans ton journal précédent tu avais des instabilités de l'ESP32, finalement as-tu trouvé pourquoi ?

    • [^] # Re: Quelques remarques

      Posté par  . Évalué à 1 (+0/-0).

      non toujours pas trouvé pourquoi, mais c'est toujours présent, ca redémarre entre 1h et jusqu’à 1 mois, c'est très étrange. C'est une de mes motivation pour factoriser et sauvegarder les données pour les garder même en cas de redémarrage.

      merci pour le tuyau ESPhome, je vais voir cela

      • [^] # Re: Quelques remarques

        Posté par  . Évalué à 3 (+2/-0).

        Pour tes redémarrages : ça fait bien longtemps que je n'ai pas manipé sur ce type de matos, mais il me semble qu'il y a dans l'api espressif une fonction esp_reset_reason() qui comme son nom l'indique te renvoie la cause du dernier reset. À appeler au démarrage. J'avais utilisé ça pour faire la différence entre un démarrage à froid et une sortie de veille profonde sur timer.
        Pas une solution miracle mais ça pourrait peut-être t'aiguiller vers une cause soft (ex watchdog) ou hard (reset pin/alim/…)

        Attention aux redémarrages intempestifs et aux écritures en mémoire non-volatile, notamment en flash. Si ça redémarre pendant une écriture ça peut être la misère (corruption très crédible). Ajouter un CRC pourrait être une bonne idée.

Envoyer un commentaire

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.