Je vous explique. j'essaie de bâtir un programme pour un poulaillier, mais je procèdes par étape afin d'assimiler chaque apprentissage.
Pour le moment, je suis encore a l'étape des bouton pour ouvrir et fermé une porte. Mais j'utilise des LED pour faire office de signal pour un module de controle d'un verin.
Afin d'ouvrir mon verin au complet (il a des limit switch intégré) je dois installer un délais. Mais le ''delay'' bloque le reste du programme et empeche d'arreter en plein milieu ou d'inversé la commande a tout moment.
Donc je me suis mis a chercher et j'ai trouver la commande ''millis''. Ca fait au moins 16-20hrs que je fais des recherches et je tente des essaie et rien n'y fait. Pouvez-vous m'aider SVP.
J'ai join mon Setup en image et voila mon Code originale avec lequel je travail .
Merci pour toute aide que vous pourrai me donner.
const int buttonPinOpen = 2;
const int buttonPinClose = 3;
const int ledPinRed = 8;
const int ledPinGreen = 9;
int sensorPin = A0;
int buttonState1 = 0;
int buttonState2 = 0;
void setup() {
Serial.begin(9600);
pinMode(ledPinRed, OUTPUT);
pinMode(ledPinGreen, OUTPUT);
pinMode(buttonPinOpen, INPUT);
pinMode(buttonPinClose, INPUT);
}
void ButtonUp(){
if (buttonState1 == HIGH) {
digitalWrite(ledPinRed, HIGH);
} else {
digitalWrite(ledPinRed, LOW);
}
}
void ButtonDown(){
if (buttonState2 == HIGH) {
digitalWrite(ledPinGreen, HIGH);
} else {
digitalWrite(ledPinGreen, LOW);
}
}
void loop() {
buttonState1 = digitalRead(buttonPinOpen);
buttonState2 = digitalRead(buttonPinClose);
ButtonUp();
ButtonDown();
}
Lors de l'appui sur le bouton, tu inities le timer et immédiatement après tu testes s'il tourne depuis plus de 5 secondes. Ça ne risque pas d'être vrai.
Si je comprends bien ton besoin, tu cherches à lire les boutons et si un bouton est enfoncé, il faut allumer la led correspondante pendant 5 secondes. Pendant ce temps, il faut toujours surveiller les boutons.
Je verrais bien quelque chose comme ça :
const unsigned long duration = 5000ul;
const int buttonPinOpen = 2;
const int buttonPinClose = 3;
const int ledPinRed = 8;
const int ledPinGreen = 9;
int sensorPin = A0;
int buttonState1 = 0;
int buttonState2 = 0;
unsigned long TimerA;
unsigned long TimerB;
void setup() {
Serial.begin(9600);
pinMode(ledPinRed, OUTPUT);
pinMode(ledPinGreen, OUTPUT);
pinMode(buttonPinOpen, INPUT);
pinMode(buttonPinClose, INPUT);
}
void loop() {
buttonState1 = digitalRead(buttonPinOpen);
buttonState2 = digitalRead(buttonPinClose);
if (buttonState1 == HIGH) {
TimerA = millis();
digitalWrite(ledPinRed, HIGH);
delay(20); // debounce
}
if (buttonState2 == HIGH) {
TimerB = millis();
digitalWrite(ledPinGreen, HIGH);
delay(20); // debounce
}
if (millis() - TimerA >= duration) digitalWrite(ledPinGreen, LOW);
if (millis() - TimerB >= duration) digitalWrite(ledPinGreen, LOW);
}
Je n'ai pas testé...
Si tu dois faire un code plus complexe par la suite, je te conseille de mieux choisir tes noms de variables : à buttonPinOpen correspondent buttonState1 et TimerA !! Choisis des noms cohérents : buttonPinOpen, buttonStateOpen et TimerOpen.
Dans un premier temps, Merci pour ton aide. J'ai corriger les termes pour que je puisse faire un meilleur suivit, en effet c'est plus clair.
Mais j'ai essayer le code que tu m'as transmis, et la Led Open prend toujours 2 a 3 fois le 5sec avant de s'éteindre Et c'est si elle ne reste pas coller la . Et la Led Close, elle, elle respecte le ''duration'' de 5sec. J'ai essayer avec ton code et aussi avec le mien modifier et c'est le même résultat.
As tu une idée pourquoi?
Voila les deux code.
const unsigned long duration = 5000ul;
const int buttonPinOpen = 2;
const int buttonPinClose = 3;
const int ledPinRed = 8;
const int ledPinGreen = 9;
int sensorPin = A0;
int buttonStateOpen = 0;
int buttonStateClose = 0;
unsigned long TimerOpen;
unsigned long TimerClose;
void setup() {
Serial.begin(9600);
pinMode(ledPinRed, OUTPUT);
pinMode(ledPinGreen, OUTPUT);
pinMode(buttonPinOpen, INPUT);
pinMode(buttonPinClose, INPUT);
}
void ButtonUp(){
if (buttonStateOpen == HIGH) {
TimerOpen = millis();
digitalWrite(ledPinRed, HIGH);
delay(20);
}
if (millis() - TimerOpen >= duration) digitalWrite(ledPinGreen, LOW);
}
void ButtonDown(){
if (buttonStateClose == HIGH) {
TimerClose = millis();
digitalWrite(ledPinGreen, HIGH);
delay(20);
}
if (millis() - TimerClose >= duration) digitalWrite(ledPinGreen, LOW);
}
void loop() {
buttonStateOpen = digitalRead(buttonPinOpen);
buttonStateClose = digitalRead(buttonPinClose);
ButtonUp();
ButtonDown();
}
const unsigned long duration = 5000ul;
const int buttonPinOpen = 2;
const int buttonPinClose = 3;
const int ledPinRed = 8;
const int ledPinGreen = 9;
int sensorPin = A0;
int buttonStateOpen = 0;
int buttonStateClose = 0;
unsigned long TimerOpen;
unsigned long TimerClose;
void setup() {
Serial.begin(9600);
pinMode(ledPinRed, OUTPUT);
pinMode(ledPinGreen, OUTPUT);
pinMode(buttonPinOpen, INPUT);
pinMode(buttonPinClose, INPUT);
}
void loop() {
buttonStateOpen = digitalRead(buttonPinOpen);
buttonStateClose = digitalRead(buttonPinClose);
if (buttonStateOpen == HIGH) {
TimerOpen = millis();
digitalWrite(ledPinRed, HIGH);
delay(20);
}
if (buttonStateClose == HIGH) {
TimerClose = millis();
digitalWrite(ledPinGreen, HIGH);
delay(20);
}
if (millis() - TimerOpen >= duration) digitalWrite(ledPinGreen, LOW);
if (millis() - TimerClose >= duration) digitalWrite(ledPinGreen, LOW);
}
Pour ajouter a la problématique, quand la ledRed est allumer et que j'appuie sur le buttonClose la ledGreen ne s'allume que durant la période que j'appuie sur le button. Mais l'inverse ne se produit pas. J'ai essaie de changer la pin de la ledRed, mais ca change rien.