Salut à tous
Je suis en train de faire une porte de poulailler automatique à base de Arduino Nano (clone chinois), de L298, de cellule photo électrique, deux capteurs à effet hall (fin de course) et deux potentiomètres pour régler les seuils d'ouverture/fermeture... Plus un peu de récup (moteur de perceuse)... Le tout alimenté par une batterie de voiture et un petit panneau solaire.
Le fonctionnement souhaité est le suivant :
Au lever du jour la porte s'ouvre, au coucher elle se ferme... Et si le moteur est alimenté pendant plus de 5 secondes sans que le stade ouvert ou fermé ne soit atteint c'est que la porte est coincée et le système se met en sécurité.
Mon montage est à priori OK, sauf problème Hardware non décelé...
Voici mon code :
/**
* Controle de la porte automatique de poulailler :
* Un potentiomètre détermine le seuil d'ouverture, un autre le seuil de fermeture.
* La cellule photoéléctrique déclenche le moteur dans un sens ou dans l'autre en fonction de ces seuils.
* Le mouvement de la porte s'arrète dès que 1 des capteurs fin de course est activé (1 haut, 1 bas).
* Une sécurité arrète tout si le moteur reste en tension plus de 5 secondes.
**/
// déclaration des pins utilisés sur la carte :
const int pinPotarJour = A3;
const int pinPotarNuit = A4;
const int pinCel = A1;
const int pinMoteur1 = 3;
const int pinMoteur2 = 4;
const int pinCapteurHaut = 8;
const int pinCapteurBas = 9;
const int pinControleVitesse = 6;
// déclaration des différentes variables liées aux composants :
int valeurCel, seuilPotarJour, seuilPotarNuit, vitesse;
// déclaration des variables de timer
unsigned long timerSecu, timer;
//flags porte ouverte/fermée et sécurité :
boolean porteOuverte, porteFermee, moteurOn, secu;
//---------------------------------------------------------------------------------------------------------//
// INITIALISATION DES VARIABLES, DES MODES ET DES ETATS //
void setup()
{
seuilPotarJour = 0; // Initialisation des variables
seuilPotarNuit = 0;
valeurCel = 0;
vitesse = 170;
porteOuverte = HIGH; // les flags sont mis à 0 par sureté (HIGH = pas d'aimant devant le capteur effet Hall)
porteFermee = HIGH;
moteurOn = 0;
timerSecu = 0;
timer = 0;
secu = 0;
pinMode(pinMoteur1, OUTPUT); //pin 3 et 4 en mode output, moteur à l'arrét par sureté
digitalWrite(pinMoteur1, LOW);
pinMode(pinMoteur2, OUTPUT);
digitalWrite(pinMoteur2, LOW);
pinMode(pinCapteurHaut, INPUT); // pin 8 et 9 en mode input (fin de course)
pinMode(pinCapteurBas, INPUT);
pinMode(pinControleVitesse, OUTPUT); // Le pin 6 active/desactive le pont H qui contrôle le moteur et controle la vitesse de rotation (presentement 170 sur 255)
digitalWrite(pinControleVitesse, LOW);
delay(100);
}
//-----------------------------------------------------------------------------------------------------------//
void loop() {
seuilPotarJour = analogRead(pinPotarJour); //lecture du seuil d'ouverture de la porte
seuilPotarNuit = analogRead(pinPotarNuit); //lecture du seuil de fermeture de la porte
valeurCel = analogRead(pinCel); //lecture de la valeur renvoyée par la cellule
porteOuverte = digitalRead(pinCapteurHaut); //vérifie si la porte est ouverte
porteFermee = digitalRead(pinCapteurBas); //verifie si la porte est fermée
//*********************************************************************************************************//
// OUVERTURE DE LA PORTE //
if (!porteFermee && !secu) // Si la porte est fermée et n'est pas en sécurité...
{
if (valeurCel >= seuilPotarJour) // et qu'il fait jour...
{
digitalWrite(pinMoteur1, LOW); //le moteur tourne et ouvre la porte
digitalWrite(pinMoteur2, HIGH);
analogWrite(pinControleVitesse, vitesse);
moteurOn = 1;
timerSecu = millis();
}
else if (valeurCel <= seuilPotarNuit) //Sinon, s'il fait nuit...
{
analogWrite(pinControleVitesse, 0); // le moteur est désactivé
moteurOn = 0;
}
}
//********************************************************************************************************//
// FERMETURE DE LA PORTE //
if (!porteOuverte && !secu) // Si la porte est ouverte et n'est pas en sécurité...
{
if (valeurCel <= seuilPotarNuit) // et qu'il fait nuit...
{
digitalWrite(pinMoteur1, HIGH); //le moteur tourne dans l'autre sens et ferme la porte
digitalWrite(pinMoteur2, LOW);
analogWrite(pinControleVitesse, vitesse);
moteurOn = 1;
timerSecu = millis();
}
else if (valeurCel >= seuilPotarJour) // Sinon, s'il fait jour...
{
analogWrite(pinControleVitesse, 0); // le moteur est désactivé
moteurOn = 0;
}
}
//*********************************************************************************************************//
// SÉCURITÉ //
if (moteurOn)
{
timer = millis();
if (timer - timerSecu >= 5000) // Si le moteur est sous tension depuis plus de 5 secondes et que la porte n'est ni ouverte ni fermée
{ // c'est qu'elle est probablement coincée...
analogWrite(pinControleVitesse, 0); // le moteur est désactivé quel que soit l'état de la porte
moteurOn = 0;
secu = 1; // Le système se met en sécurité, un appui sur reset est nécessaire.
}
}
//*********************************************************************************************************//
// ATTENTE AVANT DE RECOMMENCER LES TESTS //
delay(50); // La boucle recommence toutes les 0,05 secondes
}
C'est mon premier code (hors exercices pour apprendre un peu comment ça marche ce bazar) et il n'a pas le comportement attendu :
- La porte s'ouvre et se ferme bien en fonction de la luminosité mais la sécurité ne fonctionne pas.
- De temps en temps au lieu de se fermer la porte se ferme puis se ré-ouvre trois fois avant de se fermer pour de bon :o
J'ai beau relire mon code je ne pige pas ce qui ne vas pas, du coup je suis preneur de tout avis sur la question.
Merci d'avance