Condition While : est-elle "fluide" ?

Bonjour,

Dans ce bout de code, je voudrais savoir la fonction While était fluide ou pas :

  //code qu'il y a avant (LCD_I2C, température...)

lcd.setCursor(14, 1);
lcd.print(x);
   
while (x>T) {
    analogWrite(pinRELAIS_Ventilo, HIGH);
    lcd.setCursor(0, 0);
     lcd.print("Refroissement");
  }

// code qu'il y a après...

avec x qui diminue tout seul (prend la valeur s'une température) et T valeur constante

Je m'explique : est ce que pendant que x>T, l'affichage sera saccadé sur le LCD et le pinRELAIS_Ventilo sera alimenté, puis plus alimenté... donc lui aussi saccadé ?

Est ce que pendant qu'on est dans la boucle While, la partie en haut du code (lcd.print(x) ) continuera d'être actualisée ou bien il faut recopier ces instructions dans le While ?

Merci

hello

on suppose que X est une consigne et T une température lue par un capteur

le prg va rester dans les accolades du while tant que X>T

ce qui veut dire que dans les accolades, il faut lire T pour avoir une chance de sortir du while
sinon, le prg va tourner en boucle entre les accolades

while (X>T)
{
digitalWrite(pin_relais,HIGH);
T =digitalRead(pin_capteur);
}

D'accord, donc je suppose que ça répond aussi à ma 2e question : on doit mettre lcd.print(x) dans le while pour qu'il soit actualisé c'est bien ça ?

bonsoir,
ce que dfgh te dit c'est qu'il faut réactualiser soit x soit T dans ta boucle : examine bien son (tout petit et pourtant bien clair) bout de code, tu y trouveras la (une) solution

Bonsoir,

Oui, j'ai compris sa remarque : le x (variable) n'étant pas actualisé dans le While, il sera toujours supérieur à T (valeur constante) et donc le While sera infini.

Pour régler ce problème, je dois actualiser la valeur de x à l'intérieur du While, et là elle pourra diminuer pour devenir plus petite que T.

Donc cela implique que tout ce qui est en dehors du While pendant le While n'est pas pris en compte, donc pour actualiser l'affichage lcd.print(x) je dois le mettre aussi dans le While.

C'est ça ?
(autrement pour la fluidité, si vous avez la réponse... cf. premier message du topic)

ne mettons pas la charrue avant les bœufs, ni ne vendons la peau de l'ours ... oups, je vais trop loin :wink:

dfgh a supposé (et moi aussi par fainéantise) que X était une consigne, donc la valeur variable est T ;

dans ta boucle tu vérifies une relation entre X et T ;

puisque X est une consigne, donc fixe : la seule valeur qui peut varier (c'est trop drôle, on a dit plus haut que c'était une variable !) c'est donc T ;

la solution (clairement exprimée par le code de dfgh) c'est de mettre à jour T ;

la seule façon de l'actualiser est de la relire, pas de l'imprimer/afficher.

MAIS

ta variable n'est pas T mais X, tu l'as toi-même écrit, donc transpose et traduis ...

Et bien à quoi sert l'instruction while() ?
A exécuter un bout de code tant que une condition est vérifiée.
Quel bout de code ?
Ce qui se trouve entre les accolades qui suivent le while().

while ( condition ) {
  ... code à répéter
  ... et qui fait en sorte que 'condition' puisse être réévaluée
  ...
}
// ici code exécuté dès que 'condition' est testée à faux

Ou, s'il n'y a pas d'accolades, uniquement l'intsruction qui suit le while().

while ( condition ) // pas d'accolades 
  ... instruction à répéter ;
// ici code exécuté dès que 'condition' est testée à faux

biggil:
... et qui fait en sorte que 'condition' puisse être réévaluée ...

allez, j'en remets une couche pour bien appuyer là où ça fait mal c'est intéressant ... et éducatif

Oui ça j'ai bien compris.

En gros mon X c'est ma variable. Mon T est constant (=7).
Donc il faut que je mette

  sensors.requestTemperatures();
  float x=sensors.getTempCByIndex(0);
  
  lcd.setCursor(0, 1);
   lcd.print("T = ");
  
  lcd.setCursor(9, 1);
   lcd.print(x);
  
  lcd.setCursor(14, 1);
   lcd.print("'C");

dans mon While pour que le X soit actualisé et que la température s'affiche aussi actualisée.

En fait, on ne comprend rien car tu ne publies qu'une partie du code et tu ne dis pas clairement ce que tu voudrais obtenir donc on ne peut pas beaucoup t'aider à architecturer correctement ton programme.

Mon code est :

// LiquidCrystal - Version: Latest
// Wire for megaavr - Version: Latest
// OneWire(Edison) for i686 - Version: Latest
// DallasTemperature(Edison) for i686 - Version: Latest

#include <Wire.h>
#include <OneWire.h>
#include <LiquidCrystal_I2C.h>
#include <DallasTemperature.h>

#define ONE_WIRE_BUS 6                //numéro du PIN, à changer si on utilise un autre pin (voir schéma)
OneWire oneWire (ONE_WIRE_BUS) ;
DallasTemperature sensors (&oneWire) ;

int T = 7;
int pinRELAIS_PeltierVentilo = 10;
int pinRELAIS_electrovanne = 12;



LiquidCrystal_I2C lcd(0x27, 16, 2);


void setup(void) {

  lcd.init();
  lcd.backlight();

  pinMode(pinRELAIS_Ventilo, OUTPUT);

}

void loop() {

  sensors.requestTemperatures();
  float x = sensors.getTempCByIndex(0); // récupère la valeur de la température dans x

  lcd.setCursor(0, 1);
  lcd.print("T = ");

  lcd.setCursor(9, 1);
  lcd.print(x);

  lcd.setCursor(14, 1);
  lcd.print("'C");     //affiche "T=x°C" sur l'écran 16x02


  while (x > T) { //condition tant que la température mesurée est supérieur à 15°C, allumer les Ventilo, afficher "Refroidissement" en haut et la temp. en bas

    analogWrite(pinRELAIS_Ventilo, HIGH);
    lcd.setCursor(0, 0);
    lcd.print("Refroissement");

    sensors.requestTemperatures();
    float x = sensors.getTempCByIndex(0); // récupère la valeur de la température dans x

    lcd.setCursor(0, 1);
    lcd.print("T = ");

    lcd.setCursor(9, 1);
    lcd.print(x);

    lcd.setCursor(14, 1);
    lcd.print("'C");     //affiche "T=x°C" sur l'écran 16x02


  }//fin While(x>T)





}//fin void loop

Je voudrais :
1- que la valeur de la température soit actualisée tout le temps
2- savoir si c'est fluide, et pas saccadé.

ben si le code ne fait QUE ÇA alors oui c'est "fluide" mais vous êtes bloqué dans le while donc si vous aviez d'autre chose à effectuer que de surveiller la t° ça ne sera pas fait

sinon, le

    analogWrite(pinRELAIS_Ventilo, HIGH);
    lcd.setCursor(0, 0);
    lcd.print("Refroissement");

n'a pas besoin d'être dans le while.

et il faut sans doute éteindre le ventilateur quand vous sortez du while, non ? (et mettre à jour l'écran)

en fait je comprends pas pourquoi je suis bloqué dans le While.
J'ai pourtant l'instruction : float x = sensors.getTempCByIndex(0); // récupère la valeur de la température dans x et x qui descend naturellement.

(et le code n'est pas fini, mais oui, en sortant du while, il faut que les ventilateurs s'arrêtent)

je veux dire vous restez dans le while tant que la condition est vraie - pas une boucle infinie. mais le reste de la loop() n'est pas évalué. donc si vous vouliez faire clignoter une LED en même temps ou lire un bouton utilisateur etc ça ne serait pas évalué.

=> Suivant donc ce que doit faire votre programme ce sera fluide (si rien d'autre à faire en attendant que la t° baisse) ou pas.

ah oui ça je suis d'accord.
Tant que je suis dans le While, le programme ne prendra en compte que le While.
Pour ne pas interrompre le programme dans le While, si je veux allumer des LEDs dans le While je dois utiliser millis() c'est ça ?

Il ne manquerait pas un sensors.begin() dans le setup()?

Les exemples de la librairie, suggèrent de tester la valeur retournée par sensors.getTempCByIndex(0); pour vérifier qu'elle est valide.

 float tempC = sensors.getTempCByIndex(0);

  // Check if reading was successful
  if(tempC != DEVICE_DISCONNECTED_C) 
  {
    Serial.print("Temperature for the device 1 (index 0) is: ");
    Serial.println(tempC);
  } 
  else
  {
    Serial.println("Error: Could not read temperature data");
  }

Tprog:
ah oui ça je suis d'accord.
Tant que je suis dans le While, le programme ne prendra en compte que le While.
Pour ne pas interrompre le programme dans le While, si je veux allumer des LEDs dans le While je dois utiliser millis() c'est ça ?

Bonjour,

C'est une possibilité, mais ça commence franchement à faire 'bricolage'.
La meilleure solution est de ne pas utiliser de while et de faire les traitements dans la loop.

Pour ne pas interrompre le programme dans le While, si je veux allumer des LEDs dans le While je dois utiliser millis() c'est ça ?

oui, mais le mieux c'est de virer le while et laisser la loop faire la boucle pour vous. sinon ça devient vite du code spaghetti

La programmation par machine à états permet alors de traiter cela simplement (cf mon tuto éventuellement)

fdufnews, je n'ai pas compris ce que vous avez dit...

Tprog:
fdufnews, je n'ai pas compris ce que vous avez dit...

il dit qu'il ne faut pas oublier sensors.begin() dans le setup() et que la t° reçue suite à l'appel à la fonction n'est pas toujours valide et donc avant de prendre des décisions sur la base de cette valeur il faut tester si on n'aurait pas reçu DEVICE_DISCONNECTED_C