Impossible de récupérer la date RTC ou écrire sur carte SD avec MSTimer2

Bonjour,

J'ai actuellement un programme permettant de gérer l'enclenchement de pompes en fonction des conditions météorologiques (température, hygrométrie, luminosité ....).
J'utilise un timer d'interruption utilisant la librairie MSTimer2 (déclenchée toutes les 5 secondes) pour relever les valeurs des différents capteurs et les afficher dans le moniteur de série (Jusqu'ici, pas de problème).

Cependant, dans la routine d'interruption, lorsque je veux récupérer l'heure et la date avec la fonction "RTC.now()" ou que je veux écrire des données dans un fichier de la carte SD avec "sensorData = SD.open("releveCapteurs.csv", FILE_WRITE);" cela bloque tout le programme.

En revanche, si je test mes problématiques dans la fonction principale "loop", tout fonctionne correctement..

Quelqu'un à déjà rencontrer ce problème ?

Cordialement, Léo.

Bonspoir

montrez nous votre code... (exécutez vous vraiment l'action au sein de l'interruption où mettez vous juste un drapeau pour dire au code principal dans la loop d'effectuer le traitement ?)

hint : dans les interruptions, les interruptions sont bloquées et Wire utilise les interruptions

Bonjour

Merci pour votre réponse.
Effectivement je déclenche directement les actions dans la routine d'interruption et cela semble poser des problèmes d'utilisations simultanées de même librairie.

Pour être précis, c'est en fonction des relevés permanents des capteurs (interruption) que je vais décider d'enclencher (dans le loop) un cycle de pompe bien particulier.

Par exemple -> Si température extérieure > 21 degrés + Luminosité < 40% + ........
alors je rentre dans le cycle n°3 qui va enclencher la pompe 2min toutes les 2h.

En cas d'un changement brutal de conditions climatiques, je souhaite pouvoir basculer du cycle actuel vers un autre cycle qui sera, lui, adapté aux nouvelles valeurs des capteurs (2min toute les 10min, 2min toutes les heures, etc).

Seulement je suis bloqué par les delay() d'activation et de désactivation des pompes qui bloquent le programme principal, quelque soit les potentiels changement de conditions climatiques externes..

Je vous transmet le code pour y voir plus clair. Les problèmes se trouvent donc dans la fonction d'interruption : "Interrupt_capteurs()"

Cordialement, Léo.

Principal_program_tootem_V2.ino (23.9 KB)

Faut tout réécrire sans les délais... il faut faire une machine à états (cf mon tuto éventuellement)