#include <Toggle.h> // https://github.com/Dlloydev/Toggle/blob/main/src/Toggle.h

const int in1 = 2;      // moteur tourne dans le sens des aiguilles
const int in2 = 3;      // moteur tourne dans le sens inverse des aiguilles
const int fdch = 5;     // Fin de course Haut
const int fdcb = 6;     // Fin de course Bas
const int soleil = 7;   // Capteur de luminosité HIGH == nuit

const unsigned long ATTENTE_MAX = 20000; // 20 secondes max pour ouvrir ou fermer

Toggle btnFdch(fdch);
Toggle btnFdcb(fdcb);

enum {DEBUT, EN_OUVERTURE, OUVERTE, EN_FERMETURE, FERMEE, ERREUR} etat = DEBUT;
unsigned long chronoDebutAction;

// ====================================
// ========= Fonctions d'aide =========
// ====================================
void ouvrir() {
  Serial.println(F("En ouverture"));
  digitalWrite(in1, LOW);
  digitalWrite(in2, HIGH);
  chronoDebutAction = millis();
  etat = EN_OUVERTURE;
}

void fermer() {
  Serial.println(F("En fermeture"));
  digitalWrite(in2, LOW);
  digitalWrite(in1, HIGH);
  chronoDebutAction = millis();
  etat = EN_FERMETURE;
}

void stop() {
  Serial.println(F("stop"));
  digitalWrite(in1, LOW);
  digitalWrite(in2, LOW);
}

void erreur() {
  static unsigned long chrono = millis();
  etat = ERREUR;
  // on clignotte 1Hz
  if (millis() - chrono >= 500) {
    digitalWrite(LED_BUILTIN, digitalRead(LED_BUILTIN) == HIGH ? LOW : HIGH);
    chrono = millis();
  }
}

bool ilFaitNuit() {
  return digitalRead(soleil) == HIGH;
}

bool ilFaitJour() {
  return digitalRead(soleil) == LOW;
}


// ====================================
// ========== CODE PRINCIPAL ==========
// ====================================

void setup() {
  Serial.begin(115200);
  pinMode(LED_BUILTIN, OUTPUT);
  pinMode(in1, OUTPUT); // Tension de sortie pour moteur sens 1
  pinMode(in2, OUTPUT); // Tension de sortie pour moteur sens 2
  stop();
  digitalWrite(LED_BUILTIN, LOW);
  btnFdch.begin(fdch);
  btnFdcb.begin(fdcb);
}

void loop() {

  // on met à jour l'état des FdC
  btnFdch.poll();
  btnFdcb.poll();

  // en fonction de notre état on décide quoi faire
  switch (etat) {
    case DEBUT:
      if (ilFaitJour()) {
        ouvrir();
      } else {
        fermer();
      }
      break;

    case EN_OUVERTURE:
      if (btnFdch.onPress()) {
        // on a touché le Fdc Haut
        stop();
        etat = OUVERTE;
      } else if (millis() - chronoDebutAction >= ATTENTE_MAX) {
        // erreur : le temps est dépassé
        stop();
        Serial.println(F("Erreur ouverure - Temps moteur dépassé"));
        erreur();
      } else if (btnFdcb.onPress()) {
        // erreur : on a touché l'autre FdC
        stop();
        Serial.println(F("Erreur ouverure - le moteur s'est inversé"));
        erreur();
      }
      break;

    case OUVERTE:
      if (ilFaitNuit()) fermer();
      break;

    case EN_FERMETURE:
      if (btnFdcb.onPress()) {
        // on a touché le Fdc Bas
        stop();
        etat = FERMEE;
      } else if (millis() - chronoDebutAction >= ATTENTE_MAX) {
        // erreur : le temps est dépassé
        stop();
        Serial.println(F("Erreur fermeture - Temps moteur dépassé"));
        erreur();
      } else if (btnFdch.onPress()) {
        // erreur : on a touché l'autre FdC
        stop();
        Serial.println(F("Erreur fermeture - le moteur s'est inversé"));
        erreur();
      }
      break;

    case FERMEE:
      if (ilFaitJour()) ouvrir();
      break;

    case ERREUR:
      erreur();
      break;
  }
}
Soleil
FdC H.
FdC B
PROBLEME A REGLER