aide pour millis

Bonjour a tous!

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();
}

Voila ce que je viens d'essayer et qui fonctionne pas.

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 ButtonUp(){
 
 if (buttonState1 == HIGH) {
   TimerA = millis();
  digitalWrite(ledPinRed, HIGH);
   if (millis() - TimerA >= 5000);
} else { 
  digitalWrite(ledPinRed, LOW);
 }
}

void ButtonDown(){
 
 if (buttonState2 == HIGH) {
   TimerB = millis();
   digitalWrite(ledPinGreen, HIGH);
   if (millis() - TimerB >= 5000);
} else {
  digitalWrite(ledPinGreen, LOW);
  }
}

void loop() {
 
 buttonState1 = digitalRead(buttonPinOpen);
 buttonState2 = digitalRead(buttonPinClose);
 
 ButtonUp();
 ButtonDown();
}

(post deleted by author)

C'est normal que ça ne fonctionne pas. Quand tu fais ça :

void ButtonUp(){
 if (buttonState1 == HIGH) {
   TimerA = millis();
  digitalWrite(ledPinRed, HIGH);
   if (millis() - TimerA >= 5000);
} else {
  digitalWrite(ledPinRed, LOW);
 }
}

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.

Au temps pour moi, j'ai fait une erreur à la fin de la loop
Il faut écrire

 if (millis() - TimerA >= duration) digitalWrite(ledPinRed, LOW);

... d'où ma remarque sur les noms de variables... :slight_smile:

Au final :

const unsigned long duration = 5000ul;
const int buttonPinOpen = 2;
const int buttonPinClose = 3;
const int ledPinOpen =  8;
const int ledPinClose =  9;

int sensorPin = A0;
int buttonStateOpen = 0;
int buttonStateClose = 0;

unsigned long TimerOpen;
unsigned long TimerClose;

void setup() {
  Serial.begin(9600);

  pinMode(ledPinOpen, OUTPUT);
  pinMode(ledPinClose, OUTPUT);

  pinMode(buttonPinOpen, INPUT);
  pinMode(buttonPinClose, INPUT);

}

void loop() {

  buttonStateOpen = digitalRead(buttonPinOpen);
  buttonStateClose = digitalRead(buttonPinClose);

  if (buttonStateOpen == HIGH) {
    TimerOpen = millis();
    digitalWrite(ledPinOpen, HIGH);
    delay(20);
  }

  if (buttonStateClose == HIGH) {
    TimerClose = millis();
    digitalWrite(ledPinClose, HIGH);
    delay(20);
  }
  if (millis() - TimerOpen >= duration) digitalWrite(ledPinOpen, LOW);
  if (millis() - TimerClose >= duration) digitalWrite(ledPinClose, LOW);
}

Wow merci je m'en était pas appercu, meme en relisant plusieurs fois. J'ai changer pour Open et Close le Red et le Green.

Apres ca, j'ai appris d'etre plus attentifs au mot utiliser et j'ai compris le principe du millis, enfin j'espere lol

la maintenant je dois faire la même chose, mais avec une lecture Analogique, donc ''back'' a mes lectures.

Encore merci!