Bonjour
l'année dernière avec l'aide de JML, j'ai pu encoder une machine à état avec un seul moteur électrique
Maintenant je suis une machine avec 3 moteurs
Le principe : un moteur central avec deux moteurs pour verrouiller un toit de serre. Chaque moteur possède deux capteurs de fin de course (ouverture & fermeture)
Je souhaite faire fonctionner les deux moteurs de verrouillage/déverrouillage en même temps pour ne pas déséquilibrer le moteur central, tout en ayant des capteurs indépendant et une durée de fonctionnement maxi différente
C'est cette durée que je n'arrive pas à paramétrer correctement car si je simule un défaut sur un des capteurs, le moteur ne s'arrête pas après un certain temps de fonctionnement
Votre aide me serait bien utile
Merci par avance
Voici l'ensemble du code
#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 2 // Broche de données du bus oneWire connécté sur la broche 2
OneWire oneWire_DS18B20(ONE_WIRE_BUS);// Créer une instance d'objet oneWire pour communiquer avec tous les périphériques OneWire
DallasTemperature sensors(&oneWire_DS18B20); //Transmettre notre référence oneWire au capteur de température Dallas
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 20, 4); //set the lcd adress to 0x27 for 16 chars and 2 line display
unsigned long tempsDebutAction01;
unsigned long tempsDebutAction02;
unsigned long tempsDernierAffichageEtat01;
unsigned long tempsDernierAffichageEtat02;
unsigned long tempsDerniereMesureTemperature;
float derniereTemperatureConnue;
const byte pinFinCourseDeverrouSud = 22; // bouton pin 22 -Bornier "Lib S"
const byte pinFinCourseVerrouSud = 24; // bouton pin 24 -Bornier "Ver S"
const byte pinFinCourseHaut = 26; // bouton pin 26 -Bornier "Haut"
const byte pinFinCourseBas = 28; // bouton pin 28 -Bornier "Bas"
const byte pinFinCourseDeverrouNord = 30; // bouton pin 30 -Bornier "Lib N"
const byte pinFinCourseVerrouNord = 32; // bouton pin 32 -Bornier "Ver N"
const byte pinLedDeverrouSud = 23; //Led Rouge Fil Gris
const byte pinLedVerrouSud = 25; //Led Verte Fil Violet
const byte pinLedHaut = 27; //Led Rouge Fil Bleu
const byte pinLedBas = 29; //Led Verte Fil Vert
const byte pinLedDeverrouNord = 31; //Led Rouge Fil Jaune
const byte pinLedVerrouNord = 33; //Led Verte Fil Orange
const byte pinMotDeverrouNord = 52; // moteur deverrou Nord -Bornier "Nord O"
const byte pinMotVerrouNord = 50; // moteur verrou Nord -Bornier "Nord F"
const byte pinMotOuvre = 48; // moteur ouverture -Bornier "Centre O"
const byte pinMotFerme = 46; // moteur fermeture -Bornier "Centre F"
const byte pinMotDeverrouSud = 44; // moteur deverrou Nord -Bornier "Sud O"
const byte pinMotVerrouSud = 42; // moteur verrou Nord -Bornier "Sud F"
int EtatCapteurVerrouNord = LOW; // etat du capteur verrou nord
int EtatCapteurDeverrouNord = LOW; // etat du capteur déverrou nord
int EtatCapteurVerrouSud = LOW; // etat du capteur verrou sud
int EtatCapteurDeverrouSud = LOW; // etat du capteur déverrou sud
int EtatCapteurBas = LOW; // etat du capteur bas
int EtatCapteurHaut = LOW; // etat du capteur haut
enum : byte {Fermer, EnDeverrou, Deverrou, EnOuverture, Ouvert, EnFermeture, EnVerrou, Verrou} etatToit;
// Afficher la température mesurée par DS18B20, stockée dans la variable globale derniereTemperatureConnue
// si elle a changée. appeler avec true en paramètre si on veut forcer l'affichage quand même
void afficherTemperature(bool forceAffichage = false)
{
static float ancienneTemperature = -100;
if (forceAffichage || derniereTemperatureConnue != ancienneTemperature) {
Serial.print("temperature DS18b20: ");
Serial.print(derniereTemperatureConnue);
Serial.println(" °C\n");
lcd.setCursor(0, 0);
lcd.print(derniereTemperatureConnue);
lcd.write((char)223);// initialiser le caractère ° dans le LCD
lcd.setCursor(6, 0);
lcd.print("C");
ancienneTemperature = derniereTemperatureConnue;
}
}
void fermerToit()
{
digitalWrite(pinMotFerme, HIGH);
digitalWrite(pinMotOuvre, HIGH);
digitalWrite(pinMotVerrouNord, HIGH);
digitalWrite(pinMotDeverrouNord, HIGH);
digitalWrite(pinMotVerrouSud, HIGH);
digitalWrite(pinMotDeverrouSud, HIGH);
etatToit = Fermer;
}
void lireTemperature()
{
sensors.requestTemperatures();
derniereTemperatureConnue = sensors.getTempCByIndex(0);
tempsDerniereMesureTemperature = millis();
}
void setup() {
pinMode(pinMotOuvre, OUTPUT);
pinMode(pinMotFerme, OUTPUT);
pinMode(pinFinCourseBas, INPUT);
pinMode(pinFinCourseHaut, INPUT);
pinMode(pinLedBas, OUTPUT);
pinMode(pinLedHaut, OUTPUT);
pinMode(pinMotVerrouNord, OUTPUT);
pinMode(pinMotDeverrouNord, OUTPUT);
pinMode(pinFinCourseVerrouNord, INPUT);
pinMode(pinFinCourseDeverrouNord, INPUT);
pinMode(pinLedVerrouNord, OUTPUT);
pinMode(pinLedDeverrouNord, OUTPUT);
pinMode(pinMotVerrouSud, OUTPUT);
pinMode(pinMotDeverrouSud, OUTPUT);
pinMode(pinFinCourseVerrouSud, INPUT);
pinMode(pinFinCourseDeverrouSud, INPUT);
pinMode(pinLedVerrouSud, OUTPUT);
pinMode(pinLedDeverrouSud, OUTPUT);
Serial.begin(115200);
lcd.init();// print a message to the lcd
lcd.backlight();
sensors.begin(); //Initialiser le capteur DS18B20
lireTemperature(); // obtention de la première température
fermerToit(); // mise en conditions initiales
afficherTemperature(true); // affichage initial
}
//boucle principale
void loop() {
if (millis() - tempsDerniereMesureTemperature >= 1500ul) lireTemperature(); // ne mettre à jour la T° que toutes les 15 secondes
if (millis() - tempsDernierAffichageEtat01 >= 3000ul) {
afficherTemperature(true); // afficher la température sur le LCD (et port série)
} else afficherTemperature();
EtatCapteurBas = digitalRead(pinFinCourseBas);
EtatCapteurHaut = digitalRead(pinFinCourseHaut);
EtatCapteurVerrouNord = digitalRead(pinFinCourseVerrouNord);
EtatCapteurDeverrouNord = digitalRead(pinFinCourseDeverrouNord);
EtatCapteurVerrouSud = digitalRead(pinFinCourseVerrouSud);
EtatCapteurDeverrouSud = digitalRead(pinFinCourseDeverrouSud);
if (EtatCapteurBas == HIGH)
digitalWrite(pinLedBas, HIGH);
else
digitalWrite(pinLedBas, LOW);
if ( EtatCapteurHaut == HIGH)
digitalWrite(pinLedHaut, HIGH);
else
digitalWrite(pinLedHaut, LOW);
if (EtatCapteurVerrouNord == HIGH)
digitalWrite(pinLedVerrouNord, HIGH);
else
digitalWrite(pinLedVerrouNord, LOW);
if ( EtatCapteurDeverrouNord == HIGH)
digitalWrite(pinLedDeverrouNord, HIGH);
else
digitalWrite(pinLedDeverrouNord, LOW);
if (EtatCapteurVerrouSud == HIGH)
digitalWrite(pinLedVerrouSud, HIGH);
else
digitalWrite(pinLedVerrouSud, LOW);
if ( EtatCapteurDeverrouSud == HIGH)
digitalWrite(pinLedDeverrouSud, HIGH);
else
digitalWrite(pinLedDeverrouSud, LOW);
switch (etatToit) {
case Fermer:
if ((derniereTemperatureConnue > 28) && (EtatCapteurVerrouNord == HIGH && EtatCapteurDeverrouNord == LOW)) {
digitalWrite(pinMotDeverrouNord, LOW); // le moteur du déverrouillage Nord est actionné
tempsDernierAffichageEtat01 = millis() ;
tempsDebutAction01 = tempsDernierAffichageEtat01;
if ( (derniereTemperatureConnue > 28) && (EtatCapteurVerrouSud == HIGH && EtatCapteurDeverrouSud == LOW)){
digitalWrite(pinMotDeverrouSud, LOW); // le moteur du déverrouillage Sud est actionné
tempsDernierAffichageEtat02 = millis() ;
tempsDebutAction02 = tempsDernierAffichageEtat02;}
lcd.clear();
lcd.setCursor(0, 1);
lcd.print("En Deverrouillage N");
lcd.setCursor(0, 2);
lcd.print("En Deverrouillage S");
etatToit = EnDeverrou; //c'est le nouvel état du toit qui devient En Déverrouillage
}
break;
case EnDeverrou:
if (( EtatCapteurDeverrouNord == HIGH && EtatCapteurVerrouNord == LOW) || (( millis() - tempsDebutAction01) >= 20000ul)) {
tempsDernierAffichageEtat01 = millis() ;
digitalWrite(pinMotDeverrouNord, HIGH); // le moteur du déverrouillage Nord est arreté
if (( EtatCapteurDeverrouSud == HIGH && EtatCapteurVerrouSud == LOW) || (( millis() - tempsDebutAction02) >= 20000ul)) {
tempsDernierAffichageEtat02 = millis() ;
digitalWrite(pinMotDeverrouSud, HIGH); }// le moteur du déverrouillage Sud est arreté
lcd.clear();
lcd.setCursor(0, 1);
lcd.print("Deverrou Nord OK");
lcd.setCursor(0, 2);
lcd.print("Deverrou Sud OK");
etatToit = Deverrou;//c'est le nouvel état du toit qui est Déverrouillé
}
break;
case Deverrou:
if ( (EtatCapteurBas == HIGH && EtatCapteurHaut == LOW && EtatCapteurDeverrouSud == HIGH)) {
digitalWrite(pinMotOuvre, LOW); // le moteur central est actionné en ouverture
tempsDernierAffichageEtat01 = millis() ;
tempsDebutAction01 = tempsDernierAffichageEtat01;
lcd.clear();
lcd.setCursor(0, 2);
lcd.print("En Ouverture");
etatToit = EnOuverture; //c'est le nouvel état du toit qui devient EnOuverture
}
break;
case EnOuverture:
if (( EtatCapteurHaut == HIGH && EtatCapteurBas == LOW) || (( millis() - tempsDebutAction01) >= 20000ul)) {
tempsDernierAffichageEtat01 = millis() ;
digitalWrite(pinMotOuvre, HIGH); // le moteur est arreté en ouverture
lcd.clear();
lcd.setCursor(0, 2);
lcd.print("Ouvert");
etatToit = Ouvert;
}
break;
case Ouvert:
if ((derniereTemperatureConnue < 25) && (EtatCapteurBas == LOW && EtatCapteurHaut == HIGH)) {
digitalWrite(pinMotFerme, LOW); // le moteur central est actionné en fermeture
tempsDernierAffichageEtat01 = millis() ;
tempsDebutAction01 = tempsDernierAffichageEtat01;
lcd.clear();
lcd.setCursor(0, 2);
lcd.print("En Fermeture");
etatToit = EnFermeture;
}
break;
case EnFermeture:
if (( EtatCapteurBas == HIGH && EtatCapteurHaut == LOW) || ((millis() - tempsDebutAction01) >= 20000ul)) {
digitalWrite(pinMotFerme, HIGH); // le moteur central est arreté en fermeture
tempsDernierAffichageEtat01 = millis() ;
lcd.clear();
lcd.setCursor(0, 2);
lcd.print("Clos");
etatToit = EnVerrou;
}
break;
case EnVerrou:
if ( (EtatCapteurDeverrouNord == HIGH && EtatCapteurVerrouNord == LOW && EtatCapteurBas == HIGH)) {
digitalWrite(pinMotVerrouNord, LOW); // le moteur du verrouillage Nord est actionné
tempsDernierAffichageEtat01 = millis() ;
tempsDebutAction01 = tempsDernierAffichageEtat01;
if ( (EtatCapteurDeverrouSud == HIGH && EtatCapteurVerrouSud == LOW)) {
digitalWrite(pinMotVerrouSud, LOW); // le moteur du verrouillage Sud est actionné
tempsDernierAffichageEtat02 = millis() ;
tempsDebutAction02 = tempsDernierAffichageEtat02;}
lcd.clear();
lcd.setCursor(0, 1);
lcd.print("En Verrouillage Nord");
lcd.setCursor(0, 2);
lcd.print("En Verrouillage Sud");
etatToit = Verrou; //c'est le nouvel état du toit qui devient en Verrouillage
}
break;
case Verrou:
if (( EtatCapteurVerrouNord == HIGH && EtatCapteurDeverrouNord == LOW) || (( millis() - tempsDebutAction01) >= 20000ul)) {
tempsDernierAffichageEtat01 = millis() ;
digitalWrite(pinMotVerrouNord, HIGH); // le moteur du Verrouillage Nord est arreté
if (( EtatCapteurVerrouSud == HIGH && EtatCapteurDeverrouSud == LOW) || (( millis() - tempsDebutAction02) >= 20000ul)) {
tempsDernierAffichageEtat02 = millis() ;
digitalWrite(pinMotVerrouSud, HIGH);} // le moteur du Verrouillage Sud est arreté
lcd.clear();
lcd.setCursor(0, 1);
lcd.print("Verrouillage Nord OK");
lcd.setCursor(0, 2);
lcd.print("Verrouillage Sud OK");
etatToit = Fermer;
}
break;
}
}