Bonjour, j'ai créé un automatisme pour piloter l'ouverture / fermeture de mon poulailler. Ca fonctionne depuis un an environ avec de temps en temps des défauts que je ne comprends pas. J'ai passé un peu plus de temps pour analyser la situation et le moteur qui sert dans un sens pour l'ouverture et dans l'autre sens pour la fermeture, ne tourne pas toujours dans le sens voulu. Ca n'arrive pas souvent mais ça arrive. J'ai fait plusieurs tests. Le programme actuel fonctionne avec les deux sorties actiees (forward, backward). J'ai essayé de verrouiller le problème en n'acionnant que la sortie du sens voulu (forward ou backward), mais dans ce cas, le moteur ne tourne plus du tout, ni en envoyant une tension analogique sur l'une ou l'autre des broches pour piloter la vitesse. Donc je suis perdu. J'ai essayé de simplifier le programme pour ne garder que les parties qui concernent ce probleme. Voir ci dessous. Le problème est à la ligne 112 (14 lignes avant la fin) : analogWrite(analog_Out_moteur_ouverture, Output_Moteur_Ouverture); // On désactive le capteur ouverture (cable dans mauvais sens) là ou il y a un emoji. A cette commande, le moteur tourne quelquefois dans un sens, quelquefois dans l'autre
//#include <LiquidCrystal.h>
// Constantes Entrées Sorties Analogiques
const int analog_Out_moteur_ouverture = 11; // Analog output pin that the LED Bleue is attached to (simul moteur ouverture)
const int analog_Out_moteur_fermeture = 10; // Analog output pin that the LED Jaune is attached to (simul moteur fermeture)
// Constantes Sorties digitales
const int moteur_forward_ferme = 12; // pin commande sens de rotation
const int moteur_backward_ouvre = 13; // pin commande sens de rotation
// Constantes Entrees Digitales
const int fin_course_ouvert = 2; // pin fin de course ouvert (trappe)
const int fin_course_ferme = 4; // pin fin de course fermé (trappe)
// Constantes pour le programme
const int Output_Value_min = 100; // valeur de démarrage moteur - 100 pour tige filetee - 60 pour gros tube ==> 80
const int Tempo_Time_out = 12000; // Time out fermeture ou ouverture portillon ==> 12 secondes
const int Tempo_Time_out_ouv_lente = 25000; // Time out ouverture lente portillon ==> 25 secondes
const int tempo_test_capt_o_f = 2000; // Tempo test capteur ouv ferm
// Variables discretes (booleen):
bool Etat_fin_course_ouvert; // variable for reading etat fin de course ouverture
bool Etat_fin_course_ferme; // variable for reading etat fin de course fermeture
// Variables entieres:
int Output_Moteur_Ouverture = 0; // value output to the PWM (analog out)
int Output_Moteur_Fermeture = 0; // value output to the PWM (analog out)
// Gestion du temps
unsigned long currentTime_1 = 0; // Chrono LED moteur
unsigned long currentTime_2 = 0; // Chrono time-out moteur
//Library version:1.1 Ecran LCD
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2); // set the LCD address to 0x27 for a 16 chars and 2 line display
void setup() {
// INITIALISATION
// Initialisation Ecran LCD
lcd.init(); // initialize the lcd
// initialize the pushbutton pin as an input:
pinMode(fin_course_ouvert, INPUT); // pinMode (fin_course_ouvert, INPUT_PULLUP); // active la résistance interne de la broche concernée
pinMode(fin_course_ferme, INPUT); // pinMode (fin_course_ferme, INPUT_PULLUP); // active la résistance interne de la broche concernée
// init sorties commande sens moteur
pinMode(moteur_forward_ferme, OUTPUT);
pinMode(moteur_backward_ouvre, OUTPUT);
// init valeur sortie moteur
digitalWrite(moteur_forward_ferme, HIGH); // Autorise fermeture
digitalWrite(moteur_backward_ouvre, HIGH); // Autorise Ouverture
// Init sorties commande analogique moteur à 0
Output_Moteur_Ouverture = 0;
Output_Moteur_Fermeture = 0;
analogWrite(analog_Out_moteur_ouverture, Output_Moteur_Ouverture);
analogWrite(analog_Out_moteur_fermeture, Output_Moteur_Fermeture);
//
// Lecture capteurs et initialisation valeur moteur
Etat_fin_course_ouvert = digitalRead(fin_course_ouvert);
Etat_fin_course_ferme = digitalRead(fin_course_ferme);
Output_Moteur_Ouverture = Output_Value_min; // Init waleur moteur
// Portillon ouvert : il faut vérifier que le câble est dans le bon sens
// On fait tourner le moteur un court instant pour desactiver capteur ouverture et donc verifier que le cable est dans le bon sens
currentTime_2 = millis(); // Démarrage du chrono Time-out
while (millis()-currentTime_2 <= tempo_test_capt_o_f) {
lcd.setCursor(0, 1);
lcd.print ("Fermeture lente "); // affichage mode normal
Output_Moteur_Fermeture = Output_Value_min; // Démarrage moteur vitesse min
analogWrite(analog_Out_moteur_fermeture, Output_Moteur_Fermeture);
}
// Time-out atteint, arret moteur
Output_Moteur_Fermeture = 0; // arrêt moteur pour vérifier sens du cable
analogWrite(analog_Out_moteur_fermeture, Output_Moteur_Fermeture);
delay (2000);
Etat_fin_course_ouvert = digitalRead (fin_course_ouvert); // lecture etat capteur pour verifier décolement
//
if (Etat_fin_course_ouvert == LOW) { // le capteur est décollé ==> enroulement ok ==> on ouvre
lcd.setCursor(0, 1);
lcd.print ("Ouverture lente "); // affichage mode normal
//
currentTime_2 = millis(); // Démarrage du chrono Time-out
Output_Moteur_Fermeture = Output_Value_min; // Démarrage moteur vitesse min // NEW
while (Etat_fin_course_ouvert == LOW && (millis() - currentTime_2) < tempo_test_capt_o_f) { // Boucle jusqu'à ouverture ou time-out
analogWrite(analog_Out_moteur_ouverture, Output_Moteur_Ouverture);
Etat_fin_course_ouvert = digitalRead(fin_course_ouvert);
}
analogWrite(analog_Out_moteur_ouverture, 0); // arrêt moteur
lcd.setCursor(0, 1);
lcd.print ("Portillon ouvert"); // affichage mode normal
}
else { // le capteur est toujours actif ==> défaut d'enroulement.
// Il faut tourner dans l'autre sens (ouverture) pour fermer. D'abord réenrouler le cable O ==> F ==> O, puis fermer
lcd.setCursor(0, 1);
lcd.print ("Repar posit cabl"); // affichage mode normal
repare_cable(); // re-enroule cable dans le bon sens
}
}
void loop() {
}
void repare_cable() { // Sous programme pour ré-enrouler le cable dans le bon sens
//
Output_Moteur_Ouverture = Output_Value_min; // Démarrage moteur vitesse min
// On décole le capteur ouverture
delay(500);
currentTime_2 = millis(); // Démarrage du chrono Time-out
while ((millis() - currentTime_2) < tempo_test_capt_o_f) {
analogWrite(analog_Out_moteur_ouverture, Output_Moteur_Ouverture); // On désactive le capteur ouverture (cable dans mauvais sens). :weary_face:
}
// Réenrouler cable dans le bon sens
Etat_fin_course_ouvert = digitalRead (fin_course_ouvert);
currentTime_2 = millis(); // Démarrage du chrono Time-out
while (Etat_fin_course_ouvert == LOW && (millis() - currentTime_2) < Tempo_Time_out_ouv_lente) {
analogWrite(analog_Out_moteur_ouverture, Output_Moteur_Ouverture); // Le portillon va se fermer puis s'ouvrir car le câble est dans le mauvais sens
Etat_fin_course_ouvert = digitalRead (fin_course_ouvert);
}
Output_Moteur_Ouverture = 0;
analogWrite(analog_Out_moteur_ouverture, Output_Moteur_Ouverture);
}