Bonjour, j'aimerais savoir si mon programme marche.
J'aimerais que quand la condition (photoresistance1) soit vraie, que la condition qui est à l'intérieur de la condition soit testé jusqu'à ce qu'elle soit vrai elle aussi. Es-ce que mon programme permet de faire ça ?
Si non, que puis-je faire ?
Bonne journée.
Tu auras un problème avec ce code : la valeur des tensions des photorésistances est lue uniquement au lancement du programme, dans les lignes qui contiennent les analogRead.
Les valeurs des variables photoresistance1 et photoresistance2 sont constantes, fixées dès le début et il est probable que ton relais ne fasse pas ce que tu attends...
Donc ceci serait plus efficace :
int relais = 2;
byte personne = 0
void setup() {
pinMode(relais, OUTPUT);
}
void loop() {
int photoresistance1 = analogRead(2);
if(photoresistance1 < 1000){
int photoresistance2;
do { photoresistance2 = analogRead(4); }
while (photoresistance2 < 1000);
personne=personne+1;
delay (500) ;
if(personne ≥ 1) digitalWrite(relais, HIGH);
else digitalWrite(relais, LOW);
}
Je ne sais pas si ça fera ce que tu veux, mais au moins ce sera dynamique. Par exemple, si le relais sert à ouvrir un passage, il ne se refermera qu'après 256 personnes détectées.
Tu veux faire un compteur de passages avec des barrières lumineuses ?
Note que ceci :
int photoresistance2;
do { photoresistance2 = analogRead(4); }
while (photoresistance2 < 1000);
peut se remplacer par : while (analogRead(4) < 1000);
C'est ce que ton programme fait puisque la loop est appelée en continu, le premier if est appelé continuellement et si vrai le deuxième if
Cependant je ne vois pas bien ce que ton programme est censé faire car personne est toujours incrémenté et jamais décrémenté.
edit: effectivement comme le dit @lesept il faut que les photo résistances soient relues dans la loop.
en faite j'amerais créer un système avec des photorésistances et des lasers pour allumer quand j'entre et éteindre quand je sors de ma chambre. Effectivement, merci beaucoup, je n'avais pas fait attention au photorésistances dans le setup. Et j'avais oublié une partie de mon code. J'aimerais en faite que l'arduino attende dans la première boucle que la deuxieme boucle soit verifié même si la première boucle n'est plus vrai...
Mais j'ai peur car si je fais le code ci-dessous, je ne pense pas que mon programme s'arrête tant que la condition à l'intérieur de la condition n'est pas vrai
int relais = 2;
byte personne = 0;
void setup() {
pinMode(relais, OUTPUT);
}
void loop() {
if(analogRead(2) < 1000)// ici je demande à l'arduino si la valeur de la première photorésistance est inferieur à 1000
{
while(analogRead (4) < 1000){ // ici je demande à l'arduino si la valeur de la seconde photorésistance est inferieur à 1000
personne=personne+1; // donc je peux lui dire que une personne est entrée dans la pièce
delay (500) ;
}
}
if(analogRead (4) < 1000){// ici je demande à l'arduino si la valeur de la seconde photorésistance est inferieur à 1000
while(analogRead(2) < 1000){// ici je demande à l'arduino si la valeur de la première photorésistance est inferieur à 1000
personne=personne-1;// donc je peux lui dire que une personne est sortie de la pièce
delay (500) ;
}
}
if(personne >= 1){
digitalWrite(relais, HIGH);
}
else{
digitalWrite(relais, LOW);
}
}
Ok donc tu dois détecter une entrée ou une sortie, c'est à dire détecter les passages devant chaque capteur, et surtout d'avoir dans quel ordre ils se déclenchent. Dans un ordre c'est une entrée, tu dois fermer la porte (on supporte quelle est ouverte déjà), dans l'autre c'est une sortie et tu dois ouvrir la porte (pour laisser le passage).
C'est ainsi que j'imagine ton système.
Donc il faut écouter tes deux capteurs en même temps. Lorsque l'un d'eux se déclenche tu écoutes l'autre. Lorsque le second de déclenche, tu agis sur le relais, en fonction de l'ordre dans lequel ils se sont déclenchés.
Merci beaucoup, j'avais déjà fait un test en faisant de cette maniere. Je pense que c'est une bonne solution. Je teste ça demain et je publierai également le code, si ça marche je mettrais ton commentaire en solution.
Merci encore et bonne soirée
Je peux essayer de t'aider mais il faut que tu expliques clairement le rôle de chaque "périphérique" : capteurs de lumière, bouton, relais. Si je n'arrive pas à comprendre le déroulement attendu, je n'arriverai pas à faire un truc qui fasse ce que tu attends...
Dans mon pseudocode du message 9, le bouton n'apparait pas, donc je ne connais pas son rôle.
J'ai enfin fini par y arriver...
Voici le code si ça peut en aider certains.
boolean etatbouton=0;
boolean relaisetat=0;
int nbPersonne=0;
void setup() {
// put your setup code here, to run once:
pinMode(2,OUTPUT);
pinMode(5, INPUT);
etatbouton=digitalRead(5);
Serial.begin(9600);
}
void loop() {
// put your main code here, to run repeatedly:
if (digitalRead(5)!=etatbouton){
digitalWrite(2, !relaisetat);
relaisetat=!relaisetat;
etatbouton=!etatbouton;
}
while ((analogRead(2)> 600 && analogRead(4)> 600 ) || (analogRead(2)< 600 && analogRead(4)< 600 )){
if (digitalRead(5)!=etatbouton){
digitalWrite(2, !relaisetat);
relaisetat=!relaisetat;
etatbouton=!etatbouton;
} }
if(analogRead(5)< 600 && relaisetat==0 ) {
if (analogRead(2)<600) {
nbPersonne=nbPersonne+1;
Serial.println(nbPersonne);
if (nbPersonne>=1){
digitalWrite(2,HIGH);
relaisetat=!relaisetat;
delay(2000);
}
}
if (analogRead(4)<600) {
Serial.println(nbPersonne);
delay(2000);
}
}
if (relaisetat==1) {
if (analogRead(2)<600) {
nbPersonne=nbPersonne+1;
Serial.println(nbPersonne);
delay(2000);
}
if (analogRead(4)<600) {
nbPersonne=nbPersonne-1;
if(nbPersonne<1){
digitalWrite(2, LOW);
relaisetat=0;
}
Serial.println(nbPersonne);
delay(2000);
}
}
}
J'ai finalement refait mon code de A à Z en changeant quelques trucs et en faisant au plus simple et ça marche parfaitement bien. Merci à tous pour votre aide.
J'ai un systeme qui allume et éteint la lumiere quand j'entre et sort de ma pièce, un interrupteur manuel et un capteur de lumière qui active le systeme d'entrée/sortie que lorsque la lumière ambiante n'est pas suffisante pour eclairer la piece...