// PROGRAMME PORTAIL COULISSANT BY CYPRIEN GARCIA
// Init PINS
const int RelaisOuverturepin = 13; // Pin pour le relais d'ouverture
const int RelaisFermeturepin = 12; // Pin pour le relais de fermeture
const int Openpin = 1; // Pin pour le bouton d'ouverture
const int CapteurPorteOuvertpin = 3; // Pin pour le capteur de porte ouverte
const int CapteurPorteFermerpin = 4; // Pin pour le capteur de porte fermée
const int CelluleObstaclepin = 2; // Pin pour la cellule de détection d'obstacle
// Init Variables
boolean Open_isPressed = false; // Variable pour suivre l'état du bouton d'ouverture
boolean OuverturePortailEnCours = false; // Variable pour suivre l'état d'ouverture du portail
boolean FermeturePortailEnCours = false; // Variable pour suivre l'état de fermeture du portail
unsigned long TimerCyle = 0; // Variable pour le timer de cycle
unsigned long TimerTempo = 0; // Variable pour le timer de tempo
int EtatMoteur = 0; // Variable pour l'état du moteur (0: arrêté, 1: ouverture, 2: attente, 3: fermeture)
const int MaxTimeCyle = 15000; // Durée maximale d'un cycle en millisecondes
const int SetTimeTempo = 20000; // Durée de tempo en millisecondes
void setup() {
pinMode(RelaisOuverturepin, OUTPUT); // Configurer le pin du relais d'ouverture comme sortie
pinMode(RelaisFermeturepin, OUTPUT); // Configurer le pin du relais de fermeture comme sortie
pinMode(Openpin, INPUT_PULLUP); // Configurer le pin du bouton d'ouverture comme entrée avec résistance pull-up
pinMode(CapteurPorteOuvertpin, INPUT_PULLUP); // Configurer le pin du capteur de porte ouverte comme entrée avec résistance pull-up
pinMode(CapteurPorteFermerpin, INPUT_PULLUP); // Configurer le pin du capteur de porte fermée comme entrée avec résistance pull-up
pinMode(CelluleObstaclepin, INPUT_PULLUP); // Configurer le pin de la cellule de détection d'obstacle comme entrée avec résistance pull-up
Serial.begin(9600); // Initialiser la communication série à 9600 baud
}
void loop() {
// Lire les entrées
bool Open = digitalRead(Openpin); // Lire l'état du bouton d'ouverture
bool CapteurPorteOuvert = digitalRead(CapteurPorteOuvertpin); // Lire l'état du capteur de porte ouverte
bool CapteurPorteFermer = digitalRead(CapteurPorteFermerpin); // Lire l'état du capteur de porte fermée
bool CelluleObstacle = digitalRead(CelluleObstaclepin); // Lire l'état de la cellule de détection d'obstacle
unsigned long currentMillis = millis(); // Obtenir le temps actuel en millisecondes
// Détection action sur contact OpenA
if (!Open && !Open_isPressed) { // Si le bouton d'ouverture est pressé et n'était pas déjà pressé
Open_isPressed = true; // Marquer le bouton comme pressé
EtatMoteur = (EtatMoteur + 1) % 4; // Passer à l'état suivant du moteur (0 -> 1 -> 2 -> 3 -> 0)
// Afficher l'état actuel du moteur
Serial.print("Changement d'etat: EtatMoteur = ");
}
if (Open) { // Si le bouton d'ouverture est relâché
Open_isPressed = false; // Marquer le bouton comme non pressé
}
// Actions moteur
switch (EtatMoteur) {
case 0: // Portail arrêté
case 2: // Portail en attente
OuverturePortailEnCours = false; // Arrêter l'ouverture du portail
FermeturePortailEnCours = false; // Arrêter la fermeture du portail
TimerCyle = 0; // Réinitialiser le timer de cycle
digitalWrite(RelaisFermeturepin, LOW); // Éteindre le relais de fermeture
digitalWrite(RelaisOuverturepin, LOW); // Éteindre le relais d'ouverture
// Afficher l'état du relais
Serial.println("Portail arrete ou en attente. ");
Serial.println(EtatMoteur);
Serial.println(Open_isPressed);
break;
case 1: // Ouverture du portail
if (!OuverturePortailEnCours) { // Si l'ouverture n'a pas déjà commencé
TimerCyle = currentMillis + MaxTimeCyle; // Démarrer le timer de cycle
}
OuverturePortailEnCours = true; // Marquer l'ouverture comme en cours
FermeturePortailEnCours = false; // Marquer la fermeture comme non en cours
digitalWrite(RelaisFermeturepin, LOW); // Éteindre le relais de fermeture
digitalWrite(RelaisOuverturepin, HIGH); // Allumer le relais d'ouverture
// Afficher l'état du relais
Serial.println("Ouverture du portail en cours.");
break;
case 3: // Fermeture du portail
if (!FermeturePortailEnCours) { // Si la fermeture n'a pas déjà commencé
TimerCyle = currentMillis + MaxTimeCyle; // Démarrer le timer de cycle
}
OuverturePortailEnCours = false; // Marquer l'ouverture comme non en cours
FermeturePortailEnCours = true; // Marquer la fermeture comme en cours
digitalWrite(RelaisFermeturepin, HIGH); // Allumer le relais de fermeture
digitalWrite(RelaisOuverturepin, LOW); // Éteindre le relais d'ouverture
// Afficher l'état du relais
Serial.println("Fermeture du portail en cours.");
break;
}
// Conditions capteur et autres
if (CelluleObstacle && FermeturePortailEnCours) { // Si un obstacle est détecté pendant la fermeture
EtatMoteur = 1; // Revenir à l'ouverture
// Afficher l'état du capteur
Serial.println("Obstacle detecte! Reouverture du portail.");
}
if (OuverturePortailEnCours && !CapteurPorteOuvert) { // Si le portail est en ouverture et atteint l'état ouvert
EtatMoteur = 2; // Passer à l'état d'attente
TimerCyle = 0; // Réinitialiser le timer de cycle
TimerTempo = currentMillis + SetTimeTempo; // Démarrer le timer de tempo
// Afficher l'état du capteur
Serial.println("Portail ouvert. Passage en mode attente.");
}
if (FermeturePortailEnCours && !CapteurPorteFermer) { // Si le portail est en fermeture et atteint l'état fermé
EtatMoteur = 0; // Arrêter le portail
TimerCyle = 0; // Réinitialiser le timer de cycle
// Afficher l'état du capteur
Serial.println("Portail ferme. Arret du portail.");
}
if (TimerCyle < currentMillis && (EtatMoteur == 1 || EtatMoteur == 3)) { // Si le timer de cycle est dépassé en ouverture ou fermeture
EtatMoteur = (EtatMoteur == 1) ? 2 : 0; // Passer à l'état d'attente (ouverture) ou arrêter (fermeture)
TimerCyle = 0; // Réinitialiser le timer de cycle
// Afficher l'état du timer
Serial.println("Timer de cycle depasse. Changement d'etat.");
}
if (TimerTempo < currentMillis && EtatMoteur == 2 && TimerTempo > 0) { // Si le timer de tempo est dépassé en état d'attente
EtatMoteur = 3; // Passer à l'état de fermeture
TimerTempo = 0; // Réinitialiser le timer de tempo
// Afficher l'état du timer
Serial.println("Timer de tempo depasse. Fermeture du portail.");
}
}