[HELP] Comment faire un while dans un if ?

Bonsoir, je suis quasiment débutant en Arduino, même si je commence peu à peu à m’améliorer.
J’ai fait un programme pour allumer une LED et un Buzzer lorsque mon panneau solaire atteint une certaine valeur (j’ai que ça sous la main, c’est mieux avec un capteur d’ultra sons).
Voilà le code :

int pannel = 4; //Valeur analogique panneau solaire sur A4
int buzzer = 3; //Buzzer branché sur Pin 3
int note = 600; //Variable note = 600
int rouge = 9; //Pin 9 = Led Rouge
int vert = 13; //Pin 13 = Led Verte (je n'utilise qu'elle dans le programme)
void setup() {
  pinMode(pannel, INPUT); //Pannel (Pin 4) définie en entrée


}
void loop() {
  int val = analogRead(pannel); //val = valeur du panneau solaire
  int vale = map(val, 0, 130, 0, 100); //simplement convertir la valeur en pourcentage
  Serial.begin(9600);
  Serial.println(vale, DEC); //Ecrire la valeur en % du panneau sur le moniteur série
  if (vale <= 40) //si la valeur panneau est inférieure ou égale à 40, alors ...
{
  analogWrite(6, 255);
  analogWrite(vert, LOW);
  delay(100);
  analogWrite(vert, 100);
  tone(3, note);
  delay(200);
  tone(3, 500);
  delay(200);
  
}
else
{
 noTone(3);
 digitalWrite(rouge, LOW);
 digitalWrite(vert, HIGH);
 analogWrite(6, 0);
}

  delay(100);
  

}

En gros, lorsque je rapproche ma main du panneau, celui-ci capte moins de lumière, donc la condition “vale <= 40” est remplié, donc la partie “if” fonctionne.
Cependant, je voudrais savoir, comment faire pour qu’elle reste activée tant que je n’ai pas désactivé l’alarme ?
Car là, lorsque j’enlève ma main du panneau, elle se désactive, logique …
Je sais qu’il y a la fonction While qui permet cela, mais même avec des recherches, dans mon cas je n’ai pas réussi à la mettre en place !

Pouvez-vous m’éclairer ? Merci !!!

hello
on suppose que tu as un BP pour razer l’alarme;
int BP_raz_alarme = 4;//raz_alarme: BP entre D4 et GND
que tu le déclares en entrée pull up
pinMode(BP_raz_alarme, INPUT_PULLUP); //BP_raz_alarme (Pin D4) définie en entrée
et que ton while est là:
if (vale <= 40) //si la valeur panneau est inférieure ou égale à 40, alors …
{
while (digitalRead(BP_raz_alarme) = 1)
{
analogWrite(6, 255);
analogWrite(vert, LOW);
delay(100);
analogWrite(vert, 100);
tone(3, note);
delay(200);
tone(3, 500);
delay(200);
}
}

nota :
lorsque tu déclares:
int pannel = 4; //Valeur analogique panneau solaire sur A4
ce n’est pas A4 que tu initialises, mais D4
remplaces par :
int pannel = A4;

Hello. Tout d’abord, merci pour ta réponse !
J’avais essayé en déclarant int = A4 mais ça n’a pas fonctionné (A4 was not declared …) donc j’ai mis 4, et cela marche très bien, car une fois dans la fonction analogRead(A4); ça fonctionne !
Je vais essayer ce que tu m’as dit, mais quelle est la différence d’une entrée normale pu Pull up ? Merci !

const int pannel = A4;
input pull up ==> tu valides une résistance interne qui tire l'entrée en permanence vers le 5V.
avec ton BP entre l'entrée et GND, sur un appui tu mets GND sur l'entrée. au relachement, l'entrée repasse au 5 V

cela t'évite de mettre une résistance extérieure

Ah c’est pratique ! Merci !

J’ai essayé comme tu m’as dit, mais j’ai une erreur … :

const int pannel = A4; //Valeur analogique panneau solaire sur A4
int buzzer = 3; //Buzzer branché sur Pin 3
int note = 600; //Variable note = 600
int rouge = 9; //Pin 9 = Led Rouge
int vert = 13; //Pin 13 = Led Verte (je n'utilise qu'elle dans le programme)
int BP_raz_alarme = 5;//raz_alarme: BP entre D5 et GND
void setup() {
  pinMode(pannel, INPUT); //Pannel (Pin 4) définie en entrée


}
void loop() {
  int val = analogRead(pannel); //val = valeur du panneau solaire
  int vale = map(val, 0, 130, 0, 100); //simplement convertir la valeur en pourcentage
  Serial.begin(9600);
  Serial.println(vale, DEC); //Ecrire la valeur en % du panneau sur le moniteur série
  if (vale <= 40) //si la valeur panneau est inférieure ou égale à 40, alors ...
  {
    while (digitalRead(BP_raz_alarme) = 0)
    {

  analogWrite(6, 255);
  analogWrite(vert, LOW);
  delay(100);
  analogWrite(vert, 100);
  tone(3, note);
  delay(200);
  tone(3, 500);
  delay(200);
    }
  
}
else
{
 noTone(3);
 digitalWrite(rouge, LOW);
 digitalWrite(vert, HIGH);
 analogWrite(6, 0);
}

  delay(100);
  

}

J’ai remplacé 1 par 0, car je veux que l’alarme sonne tant que le bouton est à 0, donc j’ai changé.

Voilà l’erreur :

Arduino : 1.6.11 (Windows 7), Carte : "Arduino Leonardo"

C:\Users\Moi\Documents\Arduino\sketch_oct01a\sketch_oct02b\sketch_oct02b.ino: In function 'void loop()':

sketch_oct02b:19: error: lvalue required as left operand of assignment

     while (digitalRead(BP_raz_alarme) = 0)

                                       ^

exit status 1
lvalue required as left operand of assignment

Ce rapport pourrait être plus détaillé avec
l'option "Afficher les résultats détaillés de la compilation"
activée dans Fichier -> Préférences.

Je suis très embêté … As-tu une solution ?? Merci !

Bonjour,

La comparaison c'est == et non =

   while (digitalRead(BP_raz_alarme) == 0)

décidément, il y a des jours.............
je pensais à "!=1"

merci Kamill

Merci, le programme se téléverse, mais maintenant la LED et le buzzer ne fonctionnent plus du tout, même lorsque j’atteins la valeur … Je ne comprends plus rien !

const int pannel = A4; //Valeur analogique panneau solaire sur A4
int buzzer = 3; //Buzzer branché sur Pin 3
int note = 600; //Variable note = 600
int rouge = 9; //Pin 9 = Led Rouge
int vert = 13; //Pin 13 = Led Verte (je n'utilise qu'elle dans le programme)
int BP_raz_alarme = 5;//raz_alarme: BP entre D5 et GND
void setup() {
  pinMode(pannel, INPUT); //Pannel (Pin 4) définie en entrée


}
void loop() {
  int val = analogRead(pannel); //val = valeur du panneau solaire
  int vale = map(val, 0, 130, 0, 100); //simplement convertir la valeur en pourcentage
  Serial.begin(9600);
  Serial.println(vale, DEC); //Ecrire la valeur en % du panneau sur le moniteur série
  if (vale <= 10) //si la valeur panneau est inférieure ou égale à 40, alors ...
  {
    while (digitalRead(BP_raz_alarme) == 0)
    {

  analogWrite(6, 255);
  analogWrite(vert, LOW);
  delay(100);
  analogWrite(vert, 100);
  tone(3, note);
  delay(200);
  tone(3, 500);
  delay(200);
    }
  
}
else
{
 noTone(3);
 digitalWrite(rouge, LOW);
 digitalWrite(vert, HIGH);
 analogWrite(6, 0);
}

  delay(100);
  

}

==1

Merci ça fonctionne nickel !!
Mais while (digitalRead(BP_raz_alarme) == 1) ne veut pas dire "tant que boutton est HAUT" ? Je pensais qu'il fallait ==0 car je voulais "tant que bouton est à 0, continuer d'allumer l'alarme". Pourquoi faut-il mettre ==1 ? Je vous demande ça car cela m'apprend en même temps !
Merci beaucoup.

Double post :

Ahh, en fait vu que c'est du Pulldown, c'est inversé c'est ça ?
Je crois avoir compris !!
Dans le même exemple, j'ai des LED à anode (+) communes, et donc je dois chaque fois inverser, par exemple HIGH éteint la LED au lieu de l'allumer ...
Merci pour tout !!

Bonjour,

Effectivement ça dépend comment est cablé ton bouton
Soit avec pulldown:
Soit avec pullup:
Dans le 2ème cas tu peux utiliser le pullup interne.