Allumer une LED entre 2 valeurs

Bonjour,

J'ai une petite question, j'aimerais allumer une LED quand les valeurs du potentiomètre sont comprises entre 9 et 19 par exemple.

Je sais allumer une LED quand la valeur est égale, supérieur ou inférieur mais pas quand c'est compris entre 2 ou plusieurs valeurs. Quel type de boucle je dois utiliser (while, for...), et comment faire.

Je vous mets mon code actuel :

int potentiometre = 0;
int heure = 0;

void setup()
{
 
 pinMode(9, OUTPUT);
 Serial.begin(9600);

}

void loop()
{
 potentiometre = analogRead(A2);
 heure = map(potentiometre, 0, 1023, 0, 23);
 Serial.print("heure = ");
 Serial.println(heure);
 delay(100);

  if (9 < (heure < 19)) {
   digitalWrite(9, HIGH);
 }
else {
   digitalWrite(9, LOW);
 }
}

Problème résolu :

Deux solutions possible, utiliser le "ET LOGIQUE" ou le "OU LOGIQUE".

Solution 1 : "ET LOGIQUE"

On allume quand la valeur du potentiomètre est comprise entre 9 et 19 sinon on éteint.

int potentiometre = 0;

int heure = 0;

void setup()
{
  
  pinMode(9, OUTPUT);
  Serial.begin(9600);

}

void loop()
{
  potentiometre = analogRead(A2);
  heure = map(potentiometre, 0, 1023, 0, 23);
  Serial.print("heure = ");
  Serial.println(heure);
   delay(100);
   if (heure > 9 && heure < 19) { 

// On allume quand la valeur du potentiomètre est comprise entre 9 et 19 sinon on éteint.
   
 digitalWrite(9, HIGH);
  } 
  else {
    digitalWrite(9, LOW);
  }
}

Solution 2 : "OU LOGIQUE"

On éteint quand la valeur du potentiomètre est inférieur à 9 ou supérieur à 19.

int potentiometre = 0;

int heure = 0;

void setup()
{
  
  pinMode(9, OUTPUT);
  Serial.begin(9600);

}

void loop()
{
  potentiometre = analogRead(A2);
  heure = map(potentiometre, 0, 1023, 0, 23);
  Serial.print("heure = ");
  Serial.println(heure);
   delay(100);
   if (heure < 9 || heure > 19) { 

// On éteint quand la valeur du potentiomètre est inférieur à 9 ou supérieur à 19.
   
 digitalWrite(9, LOW);
  } 
  else {
    digitalWrite(9, HIGH);
  }
}

PS: J'ai corrigé mon message, excusez moi, j'aurai dû lire les règles du forum ce qui est à présent est fait.

il suffit de faire un ET logique ([color=blue]&&[/color] ou [color=blue]and[/color]) entre vos 2 conditions, ça ne s'écrit pas

   if (9 < (heure < 19)) {

Merci de lire les règles du forum avant de poster.

corrigez votre post ci dessus et rajoutez les code tags autour du code:

[code]

[color=blue]// votre code ici[/color]

[/code]

.

ça doit ressembler à cela:

// votre code ici

(faites aussi ctrl-T (PC) or cmd-T (Mac) dans l'IDE avant de copier le code pour qu'il soit indenté correctement)

J-M-L:
il suffit de faire un ET logique ([color=blue]&&[/color] ou [color=blue]and[/color]) entre vos 2 conditions, ça ne s'écrit pas

   if (9 < (heure < 19)) {

Je vais me renseigner et essayer de corriger, merci de votre aide.

merci d'avoir corrigé votre post

if ((heure > 9) && (heure < 19)) { ... } else {...}ou encoreif ((heure > 9) and (heure < 19)) { ... } else {...}

J-M-L:
merci d'avoir corrigé votre post

if ((heure > 9) && (heure < 19)) { ... } else {...}ou encoreif ((heure > 9) and (heure < 19)) { ... } else {...}

J'ai update mon post avec les solutions :slight_smile:

Vaut mieux éviter de modifier un post déjà mis, sinon quelqu'un qui vient en cours de route ne comprend plus rien à la conversation - même si là vous avez bien séparé les deux.

Le plus simple reste de faire un post dans le fil et de noter le sujet résolu dans le titre du premier post

Notez que votre code ne fait pas exactement la même chose si on tombe pile sur 9h ou 19h

J-M-L:
Vaut mieux éviter de modifier un post déjà mis, sinon quelqu'un qui vient en cours de route ne comprend plus rien à la conversation - même si là vous avez bien séparé les deux.

Le plus simple reste de faire un post dans le fil et de noter le sujet résolu dans le titre du premier post

Notez que votre code ne fait pas exactement la même chose si on tombe pile sur 9h ou 19h

Effectivement il manque le = <= ou >= pour qu'à 19 et 9 la lumière reste allumé.

J'essaie de complexifier désormais en rajoutant une seconde variable "minute", pour avoir une plus grande précision...

aquajon:
J'essaie de complexifier désormais en rajoutant une seconde variable "minute", pour avoir une plus grande précision...

transformez votre temps en nombre de secondes depuis minuit par exemple (si vos tests ne sont que sur la journée) ça vous permet de comparer simplement deux moments entre eux.

Bon ben voilà normalement c'est correct.

Désormais entre 9h30 et 19h30 (19h 29 min et 59s) la lumière est allumée.

Il fallait rajouter un potentiomètre et deux nouveaux IF pour préciser les minutes lorsqu'il était 9h et 19h.

if (heure == 9 && minute < 30){
       digitalWrite(9, LOW);
     }
     
if (heure == 19 && minute >=30){
       digitalWrite(9, LOW);
     }

La méthode est la même pour les secondes...

Le code en entier :

int potentiometre = 0;
int potentiometre2 = 0;
int heure = 0;
int minute = 0;
void setup()
{
  
  pinMode(9, OUTPUT);
  Serial.begin(9600);

}

void loop()
{
  potentiometre = analogRead(A2);
  heure = map(potentiometre, 0, 1023, 0, 23);
  Serial.print("heure = ");
  Serial.print(heure);
  potentiometre2 = analogRead(A3);
  minute = map(potentiometre2, 0, 1023, 0, 59);
  Serial.print(" : ");
  Serial.println(minute);
   delay(500);
   if (heure >= 9 && heure <= 19) {
    digitalWrite(9, HIGH);
     
   if (heure == 9 && minute < 30){
       digitalWrite(9, LOW);
     }
     
    if(heure == 19 && minute >=30){
       digitalWrite(9, LOW);
     }

  } 
  else {
    digitalWrite(9, LOW);    
  }
 
}

euh avec un (heure == 9)vous n'allez pas capturer tous les moments AVANT 9h30 et si vous faites un (heure <= 9) && (minute < 30)ça ne fonctionne pas

Le plus simple est de créer une variable intermédiaire qui concatène l'heure et les minutes :

int temps = heure * 100 + minute;

Tu n'as plus qu'à comparer cette variable avec des nombres tels que 930 pour 9 heures 30 ou 1345 pour 13 heures 45.

Oui En multipliant par 100 ça à l'avantage d'être "lisible"

L'arduino s'en fiche et donc multiplier par 60 si on veut garder une certaine cohérence n'est pas non plus à exclure et ça permet de faire des opérations sur le temps par simple addition ou soustraction qui seraient un peu plus "mathématiques" sans cela.

Attention si l'idée ensuite vient d'étendre cela aux secondes, un int ne va que jusqu'à 32767 donc ne pas faire int temps = heure * 10000 + minute * 100 + seconde; // DEBORDEMENT D'ENTIER !!(ni avec 60 et 3600 d'ailleurs, il faut passer sur un long)

J-M-L:
euh avec un (heure == 9)vous n'allez pas capturer tous les moments AVANT 9h30 et si vous faites un (heure <= 9) && (minute < 30)ça ne fonctionne pas

Les deux marchent en tout cas avec le heure == 9 ça marche en simulation Tinkercad.

if (heure >= 9 && heure <= 19) {
    digitalWrite(9, HIGH);
    
   if (heure == 9 && minute < 30){
       digitalWrite(9, LOW);
     }
    
    if(heure == 19 && minute >=30){
       digitalWrite(9, LOW);
     }

  }
  else {
    digitalWrite(9, LOW);    
  }

Pas besoin de spécifier à nouveau, on a juste besoin de tester 9h car on a déjà dit que si l'heure était inférieur à 9h la led était éteinte :

if (heure >= 9 && heure <= 19) {
    digitalWrite(9, HIGH);
    
 
  else {
    digitalWrite(9, LOW);    
  }
}

on a juste besoin de tester 9h car on a déjà dit que si l'heure était inférieur à 9h la led était éteinte :

OK j'avais raté cette partie