Bonjour,
Je suis en train de faire une porte de poulailler automatique sauf que j'aimerais supprimer le fin de course bas par une temporisation
Le programme que j'ai actuellement fonctionne avec 2 fins de course haut et bas quand l'un ou l'autre est actionné lors de la fermeture ou l'ouverture de la porte celui ci arrête le moteur.
Je souhaiterais enlever le fin de course bas et arrêté le moteur lorsque j'ouvre la porte avec une temporisation.
Arduino Uno avec moteur dc et carte l293d
int commande_haut = 4; // Déclaration broche Bouton fermeture
int commande_bas = 5; // Déclaration broche Bouton ouverture
int fin_de_course_haut = 6; // Capteur fin de course haut
int fin_de_course_bas = 7; /// Capteur fin de course bas
int MotorPin1 = 8; // Déclaration broche IN1 L293D
int MotorPin2 = 9; // Déclaration broche IN2 L293D
int MotorPin3 = 10; // Déclaration broche IN3 L293D
int MotorPin4 = 11; // Déclaration broche IN4 L293D
int LuminositePin = A0; // Déclaration broche LDR
int Luminosite = 0; // Variable de la luminosité
int Tour = 0;
int delayTime = 10; // Temps entre chaque pas 10ms
int Seuil_Jour = 250; // Variable de luminosité seuil pour le jour
int Seuil_Nuit = 50; // Variable de luminosité seuil pour la nuit
int Tempo_luminosite = 10000; // Temporisation luminosité 10 secondes = 10000ms
boolean porte_fermee = false; //Déclaration variable porte fermée
boolean porte_ouverte = false; //Déclaration variable porte ouverte
boolean fdch = false; // Déclaration variable Fin de Course Haut
boolean fdcb = false; // Déclaration variable Fin de Course Bas
boolean etat_bp_h = false, etat_bp_b = false; // Déclaration des variables bas et haut
boolean mem_h = false, mem_b = false, mem_fdch = false, mem_fdcb = false; // Déclaration des mémoires
boolean mem_mouvement = false; // Déclaration de la mémoire mouvement
boolean mem_lumiere = false; // Déclaration de la mémoire lumière
boolean mem_init = false; // Déclaration de la mémoire initialisation
boolean Detecte_lumiere = false; // Déclaration variable détection lumière
boolean Jour = true; // Déclaration variable Jour = 1 | Nuit = 0
boolean Initialisation = false; // Déclaration variable initialisation
// État d'activation de la tempo
boolean tempoActive = false;
// Temps à l'activation de la tempo
unsigned long tempoDepart = 0;
void setup() {
Serial.begin(9600); // Ouverture du port série et debit de communication fixé à 9600 bauds
pinMode(commande_haut, INPUT_PULLUP); // Déclaration entrée pull-up sur entrée BP haut
pinMode(commande_bas, INPUT_PULLUP); // Déclaration entrée pull-up sur entrée BP bas
pinMode(fin_de_course_haut, INPUT_PULLUP); // Déclaration entrée pull-up sur entrée Fin de course haut
pinMode(fin_de_course_bas, INPUT_PULLUP); // Déclaration entrée pull-up sur entrée Fin de course bas
pinMode(MotorPin1, OUTPUT); // Déclaration de la sortie A- Moteur
pinMode(MotorPin2, OUTPUT); // Déclaration de la sortie A+ Moteur
pinMode(MotorPin3, OUTPUT); // Déclaration de la sortie B- Moteur
pinMode(MotorPin4, OUTPUT); // Déclaration de la sortie B+ Moteur
Lance_initialisation();
}
void Lance_initialisation() {
Fermer_porte_Initialisation();
}
void loop() {
Luminosite = analogRead(LuminositePin);
if (Initialisation) {
Serial.println(Luminosite); // Affichage sur le moniteur série du texte
if (Luminosite >= Seuil_Jour)
{
Detecte_lumiere = true;
}
if (Luminosite <= Seuil_Nuit)
{
Detecte_lumiere = false;
}
if (Detecte_lumiere != mem_lumiere) {
tempoActive = true;
tempoDepart = millis();
Serial.println("La lumière lance tempo"); // Affichage sur le moniteur série du texte
}
if (Detecte_lumiere && tempoActive && ((millis() - tempoDepart) >= Tempo_luminosite))
{
Jour = true;
Serial.println("Il fait jour"); // Affichage sur le moniteur série du texte
tempoActive = false;
if (!fdcb && !porte_ouverte) {
Ouvrir_porte();
}
}
mem_lumiere = Detecte_lumiere;
if (!Detecte_lumiere && tempoActive && (millis() - tempoDepart) >= Tempo_luminosite)
{
Jour = false;
Serial.println("Il fait nuit"); // Affichage sur le moniteur série du texte
tempoActive = false;
if (!fdch && !porte_fermee){
Fermer_porte();
}}
mem_lumiere = Detecte_lumiere;
}
etat_bp_h = !digitalRead(commande_haut); // Inverse de la lecture sur entrée BP haut
etat_bp_b = !digitalRead(commande_bas); // Inverse de la lecture sur entrée BP bas
fdch = !digitalRead(fin_de_course_haut); // Inverse de la lecture sur entrée Fin de course haut
fdcb = !digitalRead(fin_de_course_bas); // Inverse de la lecture sur entrée Fin de course bas
if (fdch != mem_fdch) // Changement d'état du fin de course haut (front montant ou descendant)
{
if (fdch)
{
Serial.println("Porte fermée !"); // Affichage sur le moniteur série du texte
}
if (!fdch)
{
Serial.println("Porte non fermée"); // Affichage sur le moniteur série du texte
}
}
if (fdcb != mem_fdcb) // Changement d'état du fin de course bas (front montant ou descendant)
{
if (fdcb)
{
Serial.println("Porte ouverte !"); // Affichage sur le moniteur série du texte
}
if (!fdcb)
{
Serial.println("Porte non ouverte"); // Affichage sur le moniteur série du texte
}
}
mem_fdcb = fdcb; // Mémorisation du nouvel état du fin de course bas
if (etat_bp_h != mem_h) // Changement d'état du bouton poussoir haut (front montant ou descendant)
{
Serial.println("Appui BP Haut"); // Affichage sur le moniteur série du texte
if (etat_bp_h && !etat_bp_b && !fdch && !porte_fermee) // Appui sur BP haut mais pas sur le bas
{
Fermer_porte(); // Lancer la fonction sens normal
}
}
mem_h = etat_bp_h; // Mémorisation du nouvel état du bouton haut
if (etat_bp_b != mem_b) // Changement d'état du bouton poussoir bas (front montant ou descendant)
{
if (etat_bp_b && !etat_bp_h && !fdcb && !porte_ouverte) // Appui sur BP bas mais pas sur le haut
{
Ouvrir_porte();
}
}
mem_b = etat_bp_b; // Mémorisation du nouvel état du bouton bas
}
void Fermer_porte_Initialisation() {
delay(5000);
while (!fdch) {
digitalWrite(MotorPin1, HIGH);
digitalWrite(MotorPin2, LOW);
digitalWrite(MotorPin3, HIGH);
digitalWrite(MotorPin4, LOW);
Serial.println("Fermer porte"); // Affichage sur le moniteur série du texte
fdch = !digitalRead(fin_de_course_haut);
etat_bp_b = !digitalRead(commande_bas); // Inverse de la lecture sur entrée BP bas
if (fdch)
{
Serial.println("Porte en haut"); // Affichage sur le moniteur série du texte
Arret();
porte_fermee = true;
porte_ouverte = false;
Initialisation = true;
break;
}
}
}
void Fermer_porte() {
while (!fdch) {
digitalWrite(MotorPin1, HIGH);
digitalWrite(MotorPin2, LOW);
digitalWrite(MotorPin3, HIGH);
digitalWrite(MotorPin4, LOW);
Serial.println("Fermer porte"); // Affichage sur le moniteur série du texte
fdch = !digitalRead(fin_de_course_haut);
etat_bp_b = !digitalRead(commande_bas); // Inverse de la lecture sur entrée BP bas
if (fdch || etat_bp_b)
{
porte_fermee = true;
porte_ouverte = false;
Serial.println("Porte en haut"); // Affichage sur le moniteur série du texte
Arret();
break;
}
}
}
void Ouvrir_porte() {
while (!fdcb) {
digitalWrite(MotorPin1, LOW);
digitalWrite(MotorPin2, HIGH);
digitalWrite(MotorPin3, LOW);
digitalWrite(MotorPin4, HIGH);
Serial.println("Ouvrir porte"); // Affichage sur le moniteur série du texte
fdcb = !digitalRead(fin_de_course_bas);
etat_bp_h = !digitalRead(commande_haut); // Inverse de la lecture sur entrée BP haut
if (fdcb || etat_bp_h)
{
porte_fermee = false;
porte_ouverte = true;
Serial.println("Porte en bas"); // Affichage sur le moniteur série du texte
Arret();
break;
}
}
}
void Arret() {
digitalWrite(MotorPin1, LOW);
digitalWrite(MotorPin2, LOW);
digitalWrite(MotorPin3, LOW);
digitalWrite(MotorPin4, LOW);
tempoActive = 0;
}