Bonjour à vous, les spécialistes et les bénévoles qui passés un peu de temps à dépanner les faibles...
Je me suis lancé, non sans mal, dans mon 1er projet Arduino, aucun mérite puisque j'ai recopié un projet existant mais j'ai un petit bug. voici le lien vers la source et d'autres explications : Arduino et Porte automatique de poulailler | Oui Are Makers
Je vous ai mis le prog en PJ, le menu et le câblage...
Le système est simple et à pour but d'automatiser l'ouverture et la fermeture d'une porte (celle du poulailler) il y a un moteur, 2 capteurs fin de course, 1 cellule photo, 1 horloge et quelques options (cf prog)
Le menu fonctionne bien et il y a une gestion forcée des mouvements bien pratique pour la mise au point, donc quand j'appuis sur flèche haut, la porte s'ouvre jusqu'au moment où le capteur haut est activé et le moteur s'arrête...idem fleche bas, fermeture, capteur bas -> arrêt tout est nickel !
Tout bascule quand je souhaite programmer des heures d'ouverture et de fermeture et que le laisse le mode automatique se faire, le temps passe et à l'heure H c'est parti sauf que dans ce cas le moteur ne s'arrête pas, j'ai bien l'info du capteur mais le moteur continue sans cesse ! C'est la cata et je ne comprend pas pourquoi donc il y a une erreur dans le code mais je sèche...
Pouvez vous m'aider à trouver cette fichue erreur ?
Je me demande si ma fonction millis() est bien initialisée ? d'après ce que j'ai trouvé dans la fonction millis() tombé dans le panneau du dépassement et comme j’additionne timeout_porte qui vaut 15 je peux créer un dépassement dans timeout...
Merci d'avance
voici la partie de code qui me pose problème
void fermer_porte()
{
unsigned long timeout = millis() + (timeout_porte * 1000);
//long timeoutcapthaut = millis() + 2000;
while ((millis() < timeout) && (digitalRead(capteur_bas) == false))
{
/*//vérifie si la porte commence bien à descendre
if ((millis() > timeoutcapthaut) && digitalRead(capteur_haut))
{
timeout = 1000;
}*/
DateTime now = rtc.now();
lcd.setCursor(7,1);
if ((now.second() % 2) == 0){
lcd.write(byte(1));
}
else{
lcd.write(" ");
}
digitalWrite(enable, HIGH);
digitalWrite(in1, LOW);
digitalWrite(in2, HIGH);
}
/*digitalWrite(in1, HIGH); //freine et bloque l'inertie du moteur
digitalWrite(in2, LOW);
sleep(250);*/
digitalWrite(in2, LOW);
digitalWrite(in1, LOW);
delay(250);
digitalWrite(enable, LOW);
if (digitalRead(capteur_bas) == false){
erreur = true;
}
}
void ouvrir_porte()
{
unsigned long timeout = millis() + (timeout_porte * 1000);
//long timeoutcaptbas = millis() + 2000;
while ((millis() < timeout) && (digitalRead(capteur_haut) == false))
{
/*//vérifie si la porte commence bien à monter
if ((millis() > timeoutcaptbas) && digitalRead(capteur_bas))
{
timeout = 1000;
}*/
DateTime now = rtc.now();
lcd.setCursor(7,1);
if ((now.second() % 2) == 0){
lcd.write(byte(0));
}
else{
lcd.write(" ");
}
digitalWrite(enable, HIGH);
digitalWrite(in1, HIGH);
digitalWrite(in2, LOW);
}
/*digitalWrite(in2, HIGH); //freine et bloque l'inertie du moteur
digitalWrite(in1, LOW);
sleep(250);*/
digitalWrite(in1, LOW);
digitalWrite(in2, LOW);
delay(250);
digitalWrite(enable, LOW);
if (digitalRead(capteur_haut) == false){
erreur = true;
}
}
poulailler.ino (19.5 KB)
menu.h (688 Bytes)
calculEphemeride.h (1.06 KB)