Bonjour,
Pour un système de trappe d'un poulailler. Je souhaite actionner un moteur en fonction de l'heure. J'ai cherché et trouvé plusieurs programmes déjà existants, mais étant novice je n'ai pas tout compris... Du coup j'ai essayé de faire quelque chose de simple par rapport à mon besoin.
J'utilise une carte nano et un DS3231, la partie horloge semble bien fonctionner vu l'affichage du moniteur de série (c'est de la récup). Le programme se compile (c'est déjà ça...) mais je pense que je n'arrive pas a lire et/ou comparer les variables et donc ne pas remplir les bonnes conditions.
Merci d'avance pour votre aide
// Appel des bibliothèques
#include <Wire.h>
#define ADRESSE_I2C_RTC 0x68
// Déclaration des variables
const int vitesse = 9; // pin PWM permet de régler la vitesse du moteur
const int capteur_bas = 4;
const int capteur_haut = 5;
int cde_moteur_A = 7;
int cde_moteur_B = 8;
int mode = 11;// high = mode manuel
int manuel = 12;
byte seconde, minute, heure, numJourSemaine, numJourMois, mois, annee;
String jourDeLaSemaine[8] = {"","Dim", "Lun", "Mar", "Mer", "Jeu", "Ven", "Sam"};
byte heure_ouverture;
byte minute_ouverture;
byte heure_fermeture;
byte minute_fermeture;
void setup() {
Wire.begin();
Serial.begin(9600);
pinMode (capteur_bas, INPUT);
pinMode (capteur_haut, INPUT);
pinMode (vitesse, OUTPUT);
pinMode (cde_moteur_A, OUTPUT);
pinMode (cde_moteur_B, OUTPUT);
pinMode (mode, INPUT);
pinMode (manuel, INPUT);
}
void loop() {
// Réception de l'heure et de la date
Wire.beginTransmission(ADRESSE_I2C_RTC);
Wire.write(0); // Positionner le pointeur de registre sur 00h
Wire.endTransmission();
Wire.requestFrom(ADRESSE_I2C_RTC, 7);
// Accède aux données de l'horloge (à partir du registre 00h)
seconde = bcdToDec(Wire.read() & 0x7f);
minute = bcdToDec(Wire.read());
heure = bcdToDec(Wire.read() & 0x3f);
numJourSemaine = bcdToDec(Wire.read());
numJourMois = bcdToDec(Wire.read());
mois = bcdToDec(Wire.read());
annee = bcdToDec(Wire.read());
// Affichage de l'heure (moniteur série)
if (heure<10){Serial.print("0");}
Serial.print(heure, DEC);
Serial.print(":");
if (minute<10){Serial.print("0");}
Serial.print(minute, DEC);
Serial.print(":");
if (seconde<10){Serial.print("0");}
Serial.println(seconde, DEC);
// Affichage de la date (moniteur série)
Serial.print(jourDeLaSemaine[numJourSemaine]);
Serial.print(" ");
if (numJourMois<10){Serial.print("0");}
Serial.print(numJourMois, DEC);
Serial.print("/");
if (mois<10){Serial.print("0");}
Serial.print(mois, DEC);
Serial.print("/");
Serial.println(annee, DEC);
delay(1000);
// parametrage des heures en fonction du mois de l'année (heure au soleil, sans +1 ou +2 heures)
switch (mois){
case 1:
case 12:
heure_ouverture=7;
minute_ouverture=45;
heure_fermeture=17;
minute_fermeture=45;
break;
case 2:
case 11:
heure_ouverture=7;
minute_ouverture=30;
heure_fermeture=18;
minute_fermeture=15;
break;
case 3:
case 10:
heure_ouverture=6;
minute_ouverture=30;
heure_fermeture=19;
minute_fermeture=00;
break;
case 4:
case 9:
heure_ouverture=5;
minute_ouverture=30;
heure_fermeture=19;
minute_fermeture=50;
break;
case 5:
case 8:
heure_ouverture=5;
minute_ouverture=00;
heure_fermeture=20;
minute_fermeture=30;
break;
case 6:
case 7:
heure_ouverture=5;
minute_ouverture=00;
heure_fermeture=20;
minute_fermeture=45;
break;
}
// lecture des capteurs et lancement des cycles de porte
digitalRead(capteur_bas);
digitalRead(capteur_haut);
digitalRead(mode);
digitalRead(manuel);
// mode manuel
if ((mode==HIGH)&&(manuel==HIGH)&&(capteur_bas==HIGH)){
Serial.print("mode manuel ouverture");// affichage pour test
do{
ouverture();
digitalRead(capteur_haut);
}while (capteur_haut==HIGH);
}
if ((mode==HIGH)&&(manuel==HIGH)&&(capteur_haut==HIGH)){
Serial.print("mode manuel fermeture");// affichage pour test
do{
fermeture();
digitalRead(capteur_bas);
}while (capteur_bas==HIGH);
}
// mode auto
if ((mode==LOW)&&(heure==heure_ouverture)&&(minute==minute_ouverture)&&(capteur_haut!=HIGH)){
ouverture();
}
if ((mode==LOW)&&(heure==heure_fermeture)&&(minute==minute_fermeture)&&(capteur_bas!=HIGH)){
fermeture();
}
else{
arret();
}
}
// Convertir les nombres décimaux codés binaires en décimaux normaux
byte bcdToDec(byte val){return( (val/16*10) + (val%16));}
// sous programmes de cycles de portes
void ouverture(){
digitalWrite (cde_moteur_A,HIGH);
digitalWrite (cde_moteur_B,LOW);
analogWrite (vitesse,50);
}
void fermeture(){
digitalWrite (cde_moteur_A,LOW);
digitalWrite (cde_moteur_B,HIGH);
analogWrite (vitesse,50);
}
void arret(){
digitalWrite (cde_moteur_A,LOW);
digitalWrite (cde_moteur_B,LOW);
analogWrite (vitesse,0);
}