Go Down

Topic: [NODEMCU V3] demande d'aide pour code (Read 165 times) previous topic - next topic

Chrisbx2

Bonjour. Voici mon problème:
 Je cherche désespérément depuis des jours comment rajouter une condition de temps sur mon programme.
 Ma carte est une nodemcu programmée par l'Ide d'arduino. Ce que je souhaiterai c'est activer une sortie au dela d'une certaine température ( pour le moment ça je sais faire) mais au bout d'un temps prédéfinie par exemple 5 min et je suis incapable de trouver la solution.
 Merci d'avance

lesept

Bonjour
Ton message est mal placé : demande (en utilisant le lien "Report to moderator") le déplacement dans la partie 'aide' du forum. Ici c'est les tutos...

Pour ton problème, il y a 2 cas :
  • Si tu veux lancer la mesure de température au bout de 5 minutes, et ensuite activer la sortie au delà d'un seuil : alors tu peux utiliser un delay. delay(30000) permet d'attendre 5 minutes avant de passer à la suite
  • Si tu veux lancer la mesure mais activer la sortie si la température dépasse le seuil seulement après 5 minutes, il faut utiliser une stratégie de gestion du temps, pour laquelle il existe pas mal de tutos sur le net et sur le forum.
A force d'essayer on finit par réussir... Donc, plus ça rate, plus on a de chances que ça marche (proverbe Sharduinok).

Chrisbx2

Merci de ta réponse.
Je viens de faire la demande de déplacements aux modérateurs.
C'est bien la 2ème idée qui m'interesse et je ne suis vrai qu'un novice et je ne trouve pas d'exemple concret dont je pourrais m'inspirer.
 Je vais chercher à nouveau. Merci

lesept

Un tuto en anglais mais vraiment bien sur ce sujet. Lis-le et essaye de l'adapter à ton besoin. Si tu as besoin d'aide reviens en postant ton code et expliquant ce qui coince...

A+ !
A force d'essayer on finit par réussir... Donc, plus ça rate, plus on a de chances que ça marche (proverbe Sharduinok).

Chrisbx2

Merci beaucoup je vais regarder ça. Bonne soirée

Chrisbx2

 Je viens d'aller voir et à moins de ne pas avoir bien compris, mais ça ne traite pas de la même chose on dirait.
 Je souhaiterai qu'une sortie soit activer seulement si une consigne est dépassée pendant un temps prédéfinie.
 Par exemple dans un conservateur à -20°c, si ma température ambiante remonte à -15°c pendant + de 1H, une sortie alarme serait activée, ce qui éviterait tout déclenchement lors d'un dégivrage ou d'une ouverture de porte.
 
 Voici une partie de mon code (soyez indulgent n'ayant aucune notion je ne fais que reprendre des codes ailleur que j'essai d'adapter)
 
Code: [Select]
void loop()
{
  timer.run(); // Initiates SimpleTimer
  Blynk.run();
   if (temp > -15 )
 {
       ledBlynk.on();
 }
 else if (temp < 15)
 {
   ledBlynk.off();
  }

}


Il me manque la condition de temps d'une heure en dessous de -15°c pour allumer la Led
Merci à ceux qui auront la patience de m'aider.

lesept

#6
Nov 08, 2018, 11:17 pm Last Edit: Nov 08, 2018, 11:18 pm by lesept
Quote
Par exemple dans un conservateur à -20°c, si ma température ambiante remonte à -15°c pendant + de 1H, une sortie alarme serait activée
Je vais supposer qu'il s'agit de détecter que la température remonte à -15°C ou plus : OK ?

Il s'agit donc de créer un chrono :
Code: [Select]
unsigned long chrono = 0;et de l'initialiser lorsque la température passe au dessus de ton seuil (-15):
Code: [Select]
#define seuil -15
if (temp > seuil) chrono = millis();

Ensuite, tu vérifies régulièrement que le temps depuis le lancement du chrono ne dépasse pas la durée limite (une heure soit 60000 ms). Lorsque cette durée est dépassée tu lances ton alarme :
Code: [Select]
#define dureemax 60000
if (millis()-chrono > dureemax) alarme();


Mais, une question se pose : que se passe-t-il si pendant cette durée, la température repasse en dessous de ton seuil de -15 ? A priori, tu peux choisir de réinitialiser le chrono :
Code: [Select]
if (temp < seuil) chrono = millis();et ensuite attendre qu'elle repasse en dessus du seuil (il faudrait en toute logique arrêter le chrono, mais ça revient au même).

Là, tu dois prendre en compte une notion d'hystérésis : si ta température oscille entre -14.5 et -15.5 par exemple, ce genre de code ne verra rien et ne lancera pas l'alarme. Or c'est pourtant proche des conditions de l'alarme. Donc si la température redescend sous le seuil, il faut arrêter le chrono un peu au dessous du seuil et pas juste au seuil (prendre une marge).
Code: [Select]
if (temp < seuil-marge) chrono = millis();

Tout ceci est juste un exemple, que je n'ai pas testé. Il doit exister des bibliothèques basées sur des machines à états (avec des conditions non pas de durée mais de valeurs de certaines variables) qui pourraient faire ça plus simplement et l'étendre à des conditions plus complexes.
A force d'essayer on finit par réussir... Donc, plus ça rate, plus on a de chances que ça marche (proverbe Sharduinok).

Chrisbx2

Merci beaucoup de ta réponse. J'essaierai d'intégrer ce code. Je reviens vers toi pour te dire si j'y arrive ou pas.

lesept

Un autre tuto ici, plus orienté sur un scheduler c'est à dire le lancement de tâches à des instants donnés et non en fonction de valeurs de variables.
A force d'essayer on finit par réussir... Donc, plus ça rate, plus on a de chances que ça marche (proverbe Sharduinok).


Go Up