Bonjour a tous, maraicher, j essai de creer une automation de gestion d arrosage. Il couple une gestion par le port serie et une programmation horaire.
Le port serie me permet de donner le "mode", Vanne Ouvert/fermé / renvoyer l heure ou Mettre en mode deux "programme "lié a un tableau.
Toute la partie If marche tres bien.
Par contre, quand je demande au programme de tournee sur le Programmateur 1, se positionner sur les horaire defini sur la ligne 1 du tableau, ca marche a l envoi de l info "P1", mais la loopP1 ne tourne qu une fois, alors que je voudrais qu elle tourne jusqu a ce que une nouvelle info arrive par le port serie.
J ai essayé While... etc rien ne marche.
*/
//String buffer/mémoire tampon
String cmd = String("");
// Initialiser la LED de la pin 13 comme sortie (OUTPUT)
int ledPin = 13;
byte PinSorties[8] = {14,15,16,17,2,3,11,12};
//////////////////////////////////////////////////////////
// horloge
#include <Wire.h>
#include <RTClib.h>
RTC_DS3231 RTC;
///RTC_DS3231 rtc;
RTC_Millis rtc;
char daysOfTheWeek[7][12] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
//Valeur programmateur
int TabEvt [4][4] =
{
{17,46,17,50},
{17,55,17,57},
{21,02,21,05},
{0,00,0,00},
};
////////////////////////////////////////////////////////////////////////////////////////////////////////////
void setup() {
// Initialise la communication série (et baud rate à 9600):
Serial.begin(9600);
Wire.begin();
RTC.begin();
// Initialisation A2,A3,2,3,11,12 en sorties
byte i; for ( i = 0; i < 6; i++ ) {pinMode(PinSorties[i], OUTPUT); digitalWrite (PinSorties[i], HIGH);}
pinMode(ledPin, OUTPUT);
// Affiche un message quand le port série est ouvert.
// Permet de vérifier que le programme est bien en court de fonctionnement
Serial.println("Serial communication is ready.");
/// recuperer l heure sur USB
rtc.begin(DateTime(F(__DATE__), F(__TIME__)));
////rtc.adjust(DateTime(2026, 10, 1, 11, 21, 20));
}
//////////////////////////////////////////////////////////
void loopP1 ()
{
// Rechercher si heure actuelle est dans dans la plage horaire de la voie 1
DateTime now = rtc.now();
Serial.println( "horloge1on" );
if (now.hour() >= TabEvt [0][0] && now.minute() >= TabEvt [0][1] && now.hour() <= TabEvt [0][2] && now.minute() < TabEvt [0][3] ) {
digitalWrite (PinSorties[0], LOW);
Serial.println( "Horloge1 RG Ouvert" );}
else {digitalWrite (PinSorties[0], HIGH);
Serial.println( "Horloge1 RG Ferme" );}
clearCmd();
delay (5000);
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////
void loop() {
digitalWrite (ledPin, HIGH);
// Vérifier si des caractères sont reçu sur le port série
if (Serial.available() > 0) {
// Variable temporaire pour copier le caractère lu
char SerialInByte;
// Lire un caractère (un Byte)
SerialInByte = Serial.read();
// Si c'est --> traiter la commande
if(SerialInByte==13){
ProcessCmd();
}else{
// sinon, ajouter le caractère à la mémoire tampon (cmd)
cmd += String(SerialInByte);
}
}
}
// Renvoyer la commande (contenu du buffer) sur le port série
void printCmd(){
Serial.println(cmd);
}
// Réinitialiser le buffer (et vider le port série)
void clearCmd(){
cmd="";
Serial.flush();
}
//........... Interpréter la commande reçue
//
void ProcessCmd() {
// Un petit message de débogage. La commande est entourée avec [] pour clairement
// identifier chacun des caractères qui la compose (même les espaces).
Serial.print( "Commande recu [" );
Serial.print( cmd );
Serial.println( "]" );
if(cmd.equals("R1")){
Serial.println( "RG Ouvert" );
digitalWrite(ledPin, HIGH);
digitalWrite (PinSorties[0], LOW);
clearCmd();}
else if(cmd.equals("R0")){
Serial.println( "RG Ferme" );
digitalWrite(ledPin, LOW);
digitalWrite (PinSorties[0], HIGH);
clearCmd();}
/////////////////////////////// demande heure
else if(cmd.equals("TH")){
DateTime now = rtc.now();
Serial.print(now.year(), DEC);
Serial.print('/');
Serial.print(now.month(), DEC);
Serial.print('/');
Serial.print(now.day(), DEC);
Serial.print(" ");
Serial.print(now.hour(), DEC);
Serial.print(':');
Serial.print(now.minute(), DEC);
Serial.println();
clearCmd();}
/////////////////////////////// programateur 1
else if(cmd.equals("P1"))
{
loopP1 ();
clearCmd();
}
/////////////////////////////// programateur 2
else if (cmd.equals("P2")){
Serial.println( "horloge2on" );
DateTime now = rtc.now();
// Rechercher si heure actuelle est dans dans la plage horaire de la voie 1
if (now.hour() >= TabEvt [2][0] && now.minute() >= TabEvt [1][1] && now.hour() <= TabEvt [1][2] && now.minute() < TabEvt [1][3] ) {
digitalWrite (PinSorties[0], LOW);
Serial.println( "Horloge2 RG Ouvert" );}
else {digitalWrite (PinSorties[0], HIGH);
Serial.println( "Horloge2 RG Ferme" );}
clearCmd();}
//////////////////////////////////////////// fin else
else{
// toutes les autres commandes sont ignorées.
Serial.println("unknown command!");
clearCmd();}
digitalWrite (ledPin, LOW);
delay (1000);
}