Probleme de loop, sur un renvoi

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);
}

Comment est réglé le moniteur série - qu’envoyez vous en fin de ligne ? (Juste \n ou alors les deux CR LF (\r\n) ?

Bonjour tobascourtois

Le fait que void loop() tourne en permanence est inhérent au langage/concept Arduino, le fait que tu appelles ta fonction loopP1 ne la fait pas tourner continuellement, c'est à toi de le faire, ainsi:

void loopP1 ()
{
	while (1)
	{
		// 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);
	}
}

Avec une boucle while (1), du fait que la condition est toujours vrai, le while tourne en continu.
A l'intérieur de cette boucle tu peux créer une condition qui provoque un break qui te fera sortir de ce while.

Cordialement
jpbbricole

La fonction loop est placée dans une boucle infinie dont on ne peut pas sortir.
C’est une obligation avec les tous les microcontroleurs.
Ce serait la même chose avec un microprocesseur d’ordinateur s’il n’y avait pas un système d’exploitation.

S’il n’y avait pas de boucle infinie le programme se déroulerait linéairement puis arrivé à la fin de la mémoire il s’arrêterait.
Pour le relancer il faudrait appuyer sur le bouton Reset.

Dans les fichiers de l’IDE, dans le sous répertoire ”core” il y a un fichier ”main.cpp” qui est le squelette du fichier que l’IDE arduino ”fabrique” a partir du fichier ino.

Contrairement au fichier ino, ce fichier main.cpp est totalement conforme aux regle du C/Cpp. C’est ce fichier main.cpp qui est transmis au compilateur.
C’est dans ce fichier main.cpp que l’on trouve l’appel à des fonctions init_xyz() qui servent à la configuration du micro ”à la sauce arduino”.

J’ai toujours conseillé de lire le squelette du fichier main.cpp, c’est très formateur.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.