#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