Fonction delay() et moniteur série

Bonjour a tous!

Je suis débutant et j’aimerais que vous m’éclaireriez a propos de la fonction delay. Dans mon code, je veux qu’elle serve èa faire tourner une pompe pendant un certain moment sans otutefois altérer mon affichage dans le moniteur série.
Voici mon code (je parle des deux délais(2000 et 5000) dans le if a la toute fin du programme) :

[code]
//-----------------------------------------------------------Capteur-------------------------------------------------------------------
int Pourcentage = 0 ;
//-------------------------------------------------------------LCD----------------------------------------------------------------------------
#include <LiquidCrystal.h>
const int rs = 12, en = 11, d4 = 6, d5 = 5, d6 = 4, d7 = 3;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
//-----------------------------------------------------------Boutons--------------------------------------------------------------------------
const int BoutonDown = 7;  
const int BoutonUp = 8;
const int BoutonACK = 2;
int BoutonsState = 0;
int BoutonDownState = 0;
int BoutonUpState = 0;
int BoutonACKState = 0;
//------------------------------------------------------------Pompe---------------------------------------------------------------------

int in1 = 10;
int in2 = 9;
//---------------------------------------------------------SpeedControl-------------------------------------------------------------------


//---------------------------------------------------------------Setup----------------------------------------------------------------------
void setup() {
Serial.begin(9600);
lcd.begin(16, 2);
pinMode(BoutonDown, INPUT);
pinMode(BoutonUp, INPUT);


pinMode(in1, OUTPUT);
pinMode(in2, OUTPUT);
digitalWrite(in1, LOW);
digitalWrite(in2, LOW);
}
static int Setpoint = 50;
void loop() {
//---------------------------------------------------------Affichage LCD----------------------------------------------------------------
{
lcd.clear();
lcd.setCursor(0, 0); 
lcd.print("Humidity: ");
lcd.print(Pourcentage);
lcd.print("%");
lcd.setCursor(0, 1); 
lcd.print("Setpoint :");
lcd.print(Setpoint);
lcd.print("%");
delay(50);
}
//-----------------------------------------------------------Boutons/SP/LCD--------------------------------------------------------------------------
BoutonDownState = digitalRead(BoutonDown);
BoutonUpState = digitalRead(BoutonUp);
BoutonACKState = digitalRead(BoutonACK);
if (BoutonDownState == HIGH) {
delay(75);
int plus = --Setpoint ;
}
if (BoutonUpState == HIGH) {
int plus = ++Setpoint ;
}
if (BoutonsState == LOW) {
delay(75);
int plus = Setpoint ;
int ValeurA0  = analogRead(A0); 
Pourcentage = map(ValeurA0 , 620, 245, 0, 100); 
Serial.print("ValeurA0 = ");
Serial.print(ValeurA0);
Serial.print("        PourcentageA0 = ");
Serial.print(Pourcentage) ;
Serial.print(" %") ;
Serial.print("        SP = ");
Serial.print(plus);
Serial.print("        BoutonDownState = ");
Serial.print(BoutonDownState);
Serial.print("        BoutonUpState = ");
Serial.print(BoutonUpState);
Serial.print("        BoutonACKState = ");
Serial.print(BoutonACKState);
Serial.println("        PumpState = ");


}

//----------------------------------------------------Marche/Arrêt de la pompe------------------------------------------------------

if (Setpoint > Pourcentage){ 
digitalWrite(in1, LOW) ;
  digitalWrite(in2, HIGH) ;
  

delay(2000) ;
digitalWrite(in1, LOW) ;
  digitalWrite(in2, LOW);
  delay(5000) ;


}

[/code]

Merci!

Donc, ce que tu veux faire c'est un code non bloquant. Pour cela, il faut autant que possible éviter d'utilise la fonction delay. Tu trouveras pas mal d'exemples sur le forum ainsi que des tutos.

Merci pour les tutos! Je réécris ici si jamais j'ai des difficultés a l'appliquer. :slight_smile:

Bonjour!

Peu importe ce que j’essaie, je ne suis pas capable de faire fonctionner la fonction millis(). J’ai toujours ce code d’erreur: (expected ‘)’ before ‘;’ token) et je ne comprends pas très bien la fonction. J’ai de la difficulté à intéger le if du millis dans mon if (à la fin du programme). Voici mon code :

[code]
//-----------------------------------------------------------Capteur-------------------------------------------------------------------
int Pourcentage = 0 ;
//-------------------------------------------------------------LCD----------------------------------------------------------------------------
#include <LiquidCrystal.h>
const int rs = 12, en = 11, d4 = 6, d5 = 5, d6 = 4, d7 = 3;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
//-----------------------------------------------------------Boutons--------------------------------------------------------------------------
const int BoutonDown = 7;  
const int BoutonUp = 8;
const int BoutonACK = 2;
int BoutonsState = 0;
int BoutonDownState = 0;
int BoutonUpState = 0;
int BoutonACKState = 0;
//------------------------------------------------------------Pompe---------------------------------------------------------------------
int in1 = 10;
int in2 = 9;
unsigned long Timer ;
//---------------------------------------------------------------Setup----------------------------------------------------------------------
void setup() {
Serial.begin(9600);
lcd.begin(16, 2);
pinMode(BoutonDown, INPUT);
pinMode(BoutonUp, INPUT);
pinMode(in1, OUTPUT);
pinMode(in2, OUTPUT);
digitalWrite(in1, LOW);
digitalWrite(in2, LOW);
}
static int Setpoint = 50;
//----------------------------------------------------------Loop---------------------------------------------------------------------
void loop() {
//---------------------------------------------------------Affichage LCD----------------------------------------------------------------
{
lcd.clear();
lcd.setCursor(0, 0); 
lcd.print("Humidity: ");
lcd.print(Pourcentage);
lcd.print("%");
lcd.setCursor(0, 1); 
lcd.print("Setpoint :");
lcd.print(Setpoint);
lcd.print("%");
delay(50);
}
//-----------------------------------------------------------Boutons/SP/LCD--------------------------------------------------------------------------
BoutonDownState = digitalRead(BoutonDown);
BoutonUpState = digitalRead(BoutonUp);
BoutonACKState = digitalRead(BoutonACK);
if (BoutonDownState == HIGH) {
delay(75);
int plus = --Setpoint ;
}
if (BoutonUpState == HIGH) {
int plus = ++Setpoint ;
}
if (BoutonsState == LOW) {
delay(75);
int plus = Setpoint ;
int ValeurA0  = analogRead(A0); 
Pourcentage = map(ValeurA0 , 620, 245, 0, 100); 
Serial.print("ValeurA0 = ");
Serial.print(ValeurA0);
Serial.print("        PourcentageA0 = ");
Serial.print(Pourcentage) ;
Serial.print(" %") ;
Serial.print("        SP = ");
Serial.print(plus);
Serial.print("        BoutonDownState = ");
Serial.print(BoutonDownState);
Serial.print("        BoutonUpState = ");
Serial.print(BoutonUpState);
Serial.print("        BoutonACKState = ");
Serial.print(BoutonACKState);
Serial.println("        PumpState = ");
}
//----------------------------------------------------Marche/Arrêt de la pompe------------------------------------------------------

if (Setpoint > Pourcentage){ 
Timer = millis ;
digitalWrite(in1, LOW) ;
digitalWrite(in2, HIGH) ;
}
if (millis - Timer >= 3000UL ;
digitalWrite(in1, LOW) ;
digitalWrite(in2, LOW);

}
}

[/code]

Tu sais te servir d'une montre ?
Alors tu sais te servir de la fonction millis() car c'est c'est exactement la même chose.

Un appel à millis() te donne l'heure. Pas l'heure officille comptée depuis 0h,
mais l'heure exprimée en temps passé depuis le départ du programme.

millis() ne fait rien d'autre !

Donc tu l'utilises comme tu utiliserais une montre : tu lis l'heure, plus tard tu relis l'heure et tu fais la différence pour savoir combien de temps a passé. Y'a pas plus simple.

bonjour,

Dans ce bout de code

if (millis - Timer >= 3000UL ;
digitalWrite(in1, LOW) ;
digitalWrite(in2, LOW);

après le 3000UL supprime le ; et il manque )
ils manquent les deux { } d'ouverture et fermeture des instructions de la condition if

Et puis change la vitesse de la liaison série : 9600 c'était pour l'antiquté dans les communications mais il faut croire que beaucoup de momies continuent à écrire des exemples pour arduino.

Des ralentissements peuvent se produire si tu dépasses la capacité de la mémoire tampon (buffer) de la liaison série.
Donc plus tu vides rapidement le tampon moins tu vois les ralentissements.
Passer systématiquement à 115200 ou plus est une bonne habitude à prendre.

Si tu vois des caractères incompréhensibles c'est parce que tu n'aura pas aussi changer la vitesse par défaut du moniteur série.
La liaison série ne transmet pas une horloge, juste les données. La reconnaissance du message suppose que la fréquence de l'horloge est connue de l'émetteur(carte arduino) et du récepteur (moniteur série).

EGT59:
bonjour,

Dans ce bout de code

if (millis - Timer >= 3000UL ;

digitalWrite(in1, LOW) ;
digitalWrite(in2, LOW);



après le 3000UL supprime le ; et il manque ) 
ils manque les deux { } d'ouverture et fermeture des instructions de la condition if

...et les parenthèses (voir la réponse de Biggil) :

if (millis() - Timer >= 3000UL) {
  digitalWrite(in1, LOW);
  digitalWrite(in2, LOW);
}

Merci pour vos réponses! Je crois que c'est au niveau de cette partie que ça ne fonctionne pas :

if (Setpoint > Pourcentage){ 
Timer = millis ;
digitalWrite(in1, LOW) ;
digitalWrite(in2, HIGH) ;
}

Lorsque je change mon Setpoint, le moteur ne cesse de tourner.

Timer = millis ;

Je suppose que c'est

Timer = millis();

Fâché avec les parenthèses ? :slight_smile:

En mettant les parenthèses, le programme ne fonctionne pas.

Timer = millis()  ;

Toutefois, sans les parenthèses, le moteur commence à tourner lorsque le Setpoint est plus bas que le Pourcentage mais il ne s'arrête jamais ensuite et ce, même si le Setpoint est redevenu plus haut que la valeur de pourcentage. C'est comme si le timer n'arrête pas la pompe lorsqu'il est a 3000UL.

Il y a une autre fois millis:

if (millis - Timer >= 3000UL ;

millis c'est l'adresse de la fonction, millis() c'est la valeur retournée en ms de la fonction. Il faut mettre:

if (millis() - Timer >= 3000UL ;

Fâché avec les parenthèses ? :) (bis)

vileroi:
Il y a une autre fois millis:

if (millis - Timer >= 3000UL ;

millis c'est l'adresse de la fonction, millis() c'est la valeur retournée en ms de la fonction. Il faut mettre:

if (millis() - Timer >= 3000UL ;

Fâché avec les parenthèses ? :) (bis)

Merci milles fois! C'est tout ce qui me manquait pour faire fonctionner mon projet!!! :slight_smile: