Problème de delay

Bonsoir,

Débutant en arduino, je suis confronté à un problème :

Grâce à une pompe de machine à café, un capteur DHT22 et un relais piloté par Arduino, je veux créer un système de brumisation. J’ai donc fait un programme, renvoyant la valeur de température et d’humidité mesurée par le capteur, et fermant ou non le relais si l’humidité est en dessous d’un certain seuil.

Cependant, la pompe doit observer un temps de pause d’une minute entre chaque utilisation, j’ai donc utilisé un delay(60000). Or j’aimerais que le capteur renvoie les valeurs de température et d’humidité toutes les secondes. Mais le delay(60000) prend le dessus et je n’arrive donc pas à obtenir les valeurs du capteur toutes les secondes…

Pourriez-vous m’aider svp ? (j’ai joint le programme au post)

Merci d’avance

#include <DHT.h>
#include <Adafruit_Sensor.h>
#define DHTPIN 2
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);

int pinRelais=8;
float h = 0;//DEFINITION DE LA VARIABLE HUMIDITE
float t = 0;//DEFINITION DE LA VARIABLE TEMPERATURE

void setup(){
       Serial.begin(9600);//INITIALISATION DE LA COMUNICATON
       dht.begin();//INITIALISATION DU CAPTEUR
       pinMode(pinRelais,OUTPUT);
}

void loop(){ //EXECUTION A L'INFINI
       h = dht.readHumidity();
       t = dht.readTemperature();
       if (isnan(t) || isnan(h))//VERIFICATION DE LA VALIDITE DES INFORMATIONS RECUES (VALEURS NUMERIQUES)
       {
               Serial.println( "Lecture impossible !");
       }
       else{
               Serial.print("Humidite :");
               Serial.print(h);
               Serial.print(" %\t");
               Serial.print("Temperature :");
               Serial.print(t);
               Serial.println(" *C");
               if(h<47){
                 digitalWrite(pinRelais,HIGH); 
                 delay(2000);
                 digitalWrite(pinRelais,LOW);
                 }
               else{
                 digitalWrite(pinRelais,LOW);
                 }
               delay(60000);
}}

asservissement_humidite.ino (1.2 KB)

Code entre balise !!!
Delay est bloquant, regarde l'exemple blink whithout delay

Merci de la réponse

L'idée de blink without delay c'est de créer un chrono en utilisant la fonction millis() et en vérifiant à chaque passage dans la loop si le chrono dépasse un délai choisi à l'avance. Si oui, tu fais l'action requie, tu remets le chrono à zéro et ça recommence.

Le temps écoulé depuis la mise à zéro du chrono se calcule avec (par exemple) :
long tempsEcoule = millis() - chrono;où chrono est une variable de type long ou unsigned long et on reset le chrono par

chrono = millis();

Tu as les bases, à toi de continuer.

Bonsoir,

unsigned long previousMillis = 0;

const long interval = 1000; // tempo

unsigned long currentMillis = millis();


void setup(){
//ton code setup

}

void loop(){

 if (currentMillis - previousMillis >= interval) {


// ton code de relevée de température toutes les secondes, car interval réglé à 1000.


previousMillis = currentMillis;


}

}

Je n'ai fais que reprende l'exemple inclus dans l'IDE

Bonne soirée.

IHM-3D:
Bonsoir,

...

void loop(){
// ========== MANQUE UN TRUC ICI !! :slight_smile: ==============
if (currentMillis - previousMillis >= interval) {
      // ton code de relevée de température toutes les secondes, car interval réglé à 1000.
      previousMillis = currentMillis;
  }
}



Je n'ai fais que reprende l'exemple inclus dans l'IDE

Euh, vous avez juste oublié de mettre à jour currentMillis dans la loop()... :slight_smile:

En pratique il vaudrait mieux traiter le problème par une machine à état écrite « proprement » puisqu’il veut ausssi piloter un relais pour une minute. cf mon tuto Programmation Automate fini / Machine à état, dans la partie à la fin où j’introduis le temps de la minuterie, c’est assez similaire conceptuellement.