Compteur arduino

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 :sweat_smile:
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 :upside_down_face:

Hello
Sans aller plus loin, as tu déclarée l'entrée "sensor"?
pinMode ( etc...

Hello merci pour ta réponse, j'avais en effet oublié de déclarer l'entrée sensorPin :sweat_smile: après correction il n'y a pas de différence j'ai le même problème :smiling_face_with_tear:

Bonjour siete2000

As tu une résistance de PULLDOWN sur la pin d'entrée du bouton, 10 k va bien?

Cordialement
jpbbrcole

Bonjour ! Oui j'ai mis une pull down de 10 kohms

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.