Bonjour,
Dans le cadre de ma spécialité ISN ( Informatique et Sciences du Numérique ) en Terminale S, on doit réaliser un projet qui consiste à construire une maquette de parking automatisée à l'aide d'Arduino.
Le problème étant que je n'arrive pas à faire fonctionner les deux barrières en même temps, c'est à dire que quand j'appuie sur le bouton d'une barrière, l'autre ne fonctionne pas tant que la première ne s'est pas fermée. Je vous fourni mon code en bas de mon message.
Donc au départ on avait une partie if pour chaque barrière, mais on a fini par réunir les deux en un.
Le problème étant que quand l'on appuie sur un bouton, cela rentre dans le if de la barrière en question et ne traite donc plus les informations en ce qui concerne l'autre barrière.
Est-il possible de faire fonctionner les deux barrières en même temps ?
Merci de vos réponses.
EDIT : J'ai oublié de préciser qu'on a rajouté des capteurs de lumières, faisant en sorte que la barrière ne se ferme pas lorsqu'une voiture est détectée en dessous, on a donc un delay, ce qui empêche l'autre barrière de fonctionner.
#include <Servo.h>
Servo entree; // create servo object to control a servo
// a maximum of eight servo objects can be created
Servo sortie;
int prPin = 0;
int prPin2 = 1;
int pos = 15; // variable to store the servo position
int pinBouton = 10;
int pinBouton2 = 12;
void setup()
{
Serial.begin(9600);
entree.attach(9);
sortie.attach(11);
pinMode(pinBouton, INPUT);
pinMode(pinBouton2, INPUT);
}
void loop()
{
boolean etatBouton1 = digitalRead(pinBouton);
boolean etatBouton2 = digitalRead(pinBouton2);
int lum = analogRead(prPin);
int lum2= analogRead(prPin2);
entree.write(pos);
sortie.write(pos);
Serial.println(lum);
Serial.println(lum2);
Serial.println(etatBouton1);
Serial.println(etatBouton2);
if (etatBouton1 == 1 || etatBouton2 == 1) {
if (etatBouton1 == 1)
entree.write(90);
else
sortie.write(90);
delay(5000);
lum = analogRead(prPin);
lum2 = analogRead(prPin2);
while (lum < 725 || lum2 < 725) {
if (lum<725)
entree.write(90);
else
sortie.write(90);
lum = analogRead(prPin);
lum2 = analogRead(prPin2);
}
delay(2000);
}
}
Peux tu mettre stp des commentaires sur ton programme?
il ne manque pas une partie à ton programme ?
je pense que tu pourrais tout simplement mettre des conditions du style :
if (etatBouton1 == 1 || etatBouton2 == 1) {
if (etatBouton1 == 1 && etatBouton2 == 0){
entree.write(90);
}
if ((etatBouton1 == 1 && etatBouton2 == 1){
sortie.write(90);
entree.write(90);
}
if ((etatBouton1 == && etatBouton2 == 1){
sortie.write(90);
}
Une question dans ton programme tu ne refermes jamais les barrières?
Au temps pour moi, je ne me rendais pas compte que le code non commenté n'était pas si évident à cerner.
#include <Servo.h>
Servo entree; // create servo object to control a servo
// a maximum of eight servo objects can be created
Servo sortie;
int prPin = 0;
int prPin2 = 1;
int pos = 15; // variable to store the servo position
int pinBouton = 10;
int pinBouton2 = 12;
void setup()
{
Serial.begin(9600);
entree.attach(9);
sortie.attach(11);
pinMode(pinBouton, INPUT);
pinMode(pinBouton2, INPUT);
}
void loop()
{
boolean etatBouton1 = digitalRead(pinBouton); // On lit la valeur transmise par le bouton d'entrée
boolean etatBouton2 = digitalRead(pinBouton2); // On lit la valeur transmise par le bouton de sortie
int lum = analogRead(prPin); // On lit la valeur du capteur de lumière de l'entrée
int lum2= analogRead(prPin2); // Pareil pour la sortie
entree.write(pos); // On ferme les barrières
sortie.write(pos);
Serial.println(lum);
Serial.println(lum2);
Serial.println(etatBouton1);
Serial.println(etatBouton2);
if (etatBouton1 == 1 || etatBouton2 == 1) { // On vérifie si l'on a appuyé sur l'un des boutons
if (etatBouton1 == 1)
entree.write(90); // On change le degré de rotation de la barrière pour ouvrir
else
sortie.write(90); // Pareil pour la sortie
delay(5000); // On laisse 5 secondes à l'utilisateur pour s'engager
lum = analogRead(prPin); // On vérifie les valeurs des capteurs
lum2 = analogRead(prPin2); //
while (lum < 725 || lum2 < 725) { // Si on voit que les capteurs détectent moins de lumière, on ne ferme pas
if (lum<725)
entree.write(90);
else
sortie.write(90);
lum = analogRead(prPin);
lum2 = analogRead(prPin2);
}
delay(2000); // 2 secondes d'attente après que la voiture ai dégagée le passage
}
}
J'avais plus ou moins compris tu as essayé la solution que je t'ai envoyé?
Alors oui j'ai essayé, seulement l'absence de délai change tout, puisque je reset la position à chaque début de loop, le write(90) ne se voit même pas, et j'ai besoin de laisser du temps à la barrière de se fermer si la voiture est bloquée en dessous.
Et si l'on ajoute du délai, le if que tu me propose deviens assez inutile puisque l'on doit attendre avant de pouvoir à nouveau lire l'état des boutons.
il suffit à mon avis de ne pas utiliser de delay() mais la fonction millis().
Tu peux regarder comment il fonctionne sur cette page : Redirection vers Introduire le temps
tout en bas.