Bonjour à tous, ce topic fait suite à un précédent ou j'avais déjà reçu de l'aide mais je me retrouve encore bloqué sur l'état suivante
Je vous explique le contexte, j'utilise un moteur cc via un pont en h pour controler la montée et la descente d'un store. Le store doit : descendre durant 10 secondes, s'arrêter durant 15 secondes, remonter durant 10 secondes puis faire une pause de 30 secondes puis cycler de façon non bloquante. Cette partie la pas de soucis (grâce à l'aide de plusieurs membres du forum) !
Ensuite j'utilise un capteur photoélectrique qui compte le nombre de fois que le store passe devant lui. Un compteur est donc incrémenté. A chaque dizaine (10, 20, 30 etc) le compteur doit s'arrêter et mon moteur également. Il faut ensuite appuyer sur un bouton poussoir pour relancer le cycle. Le bouton est cablé avec une résistance pull down.
Voici le code
#include <LiquidCrystal.h>
LiquidCrystal lcd = LiquidCrystal(2, 3, 4, 5, 6, 7);
const int buttonPin = 10;
int buttonState = 0;
int lastButtonState = LOW;
int lastSensorState = LOW;
int counter = 0;
int sensorPin = 9;
int input = 0;
bool shouldPause = false;
const byte dirPin = 11; // broche de direction IN1
const byte pwmPin = 12; // broche de direction IN2, vitesse moteur
const byte enablePin = 13; // broche d'activation ENA
const unsigned long dureeEnMouvement = 10000ul;
const unsigned long petitePause = 15000ul;
const unsigned long grandePause = 30000ul;
enum {DEBUT, ETAPE1, ETAPE2, ETAPE3, ETAPE4} etapeEnCours = DEBUT;
unsigned long previousMillis;
void avant(const byte pwm) {
digitalWrite(enablePin, HIGH);
digitalWrite(dirPin, LOW);
analogWrite(pwmPin, pwm);
previousMillis = millis();
}
void arriere(const byte pwm) {
digitalWrite(enablePin, HIGH);
digitalWrite(dirPin, HIGH);
analogWrite(pwmPin, pwm);
previousMillis = millis();
}
void stop() {
digitalWrite(pwmPin, LOW);
digitalWrite(enablePin, LOW);
previousMillis = millis();
}
void setup() {
lcd.begin(16, 2);
Serial.begin(9600);
pinMode(buttonPin, INPUT);
pinMode(dirPin, OUTPUT);
pinMode(pwmPin, OUTPUT);
pinMode(enablePin, OUTPUT);
}
void loop() {
buttonState = digitalRead(buttonPin);
input = digitalRead(sensorPin);
if(buttonState == LOW) {
Serial.println("FALSE");
}
else if(buttonState == HIGH) {
Serial.println("TRUE");
}
// Détecter le front montant du bouton (passage de LOW à HIGH)
if (buttonState == HIGH && lastButtonState == LOW) {
// Si on doit attendre, alors relancer le compteur
if (shouldPause) {
shouldPause = false;
etapeEnCours = DEBUT; // Réinitialiser l'état de l'automate
//avant(255);
//delay(200); Anti-rebond
}
}
lastButtonState = buttonState;
// Gérer le compteur
if (!shouldPause && counter < 100) {
switch (etapeEnCours) {
case DEBUT:
avant(255);
etapeEnCours = ETAPE1;
break;
case ETAPE1:
if (millis() - previousMillis >= dureeEnMouvement) {
stop();
etapeEnCours = ETAPE2;
}
break;
case ETAPE2:
if (millis() - previousMillis >= petitePause) {
arriere(-255);
etapeEnCours = ETAPE3;
}
break;
case ETAPE3:
if (millis() - previousMillis >= dureeEnMouvement) {
stop();
etapeEnCours = ETAPE4;
}
break;
case ETAPE4:
if (millis() - previousMillis >= grandePause) {
avant(255);
etapeEnCours = ETAPE1;
}
break;
}
if(input == LOW && lastSensorState == HIGH) {
counter++;
lcd.setCursor(0, 1);
lcd.print(" ");
lcd.setCursor(0, 1);
lcd.print(counter);
//delay(200);
}
lastSensorState = input;
// S'arrêter à chaque dizaine
if (counter % 10 == 0 && counter != 100 && counter !=0) {
digitalWrite(pwmPin, LOW);
digitalWrite(enablePin, LOW);
shouldPause = true;
}
}
}
Mon problème est que ma fonction blocage fonctionne étrangement. Mon compteur compte bien jusque 10 puis s'arrête avec le moteur. Cependant un appui sur le bouton poussoir ne débloque pas le comptage et ne relance pas le moteur. Le compteur finit par se relancer aléatoirement plusieurs secondes voir minutes plus tard.
J'ai ajouté des lignes pour consulter l'état de mon bouton et il change bien d'état...
Merci d'avance pour votre aide à cette longue question