Problème avec mon code

Bonsoir tout le monde,

J'ai problème avec mon code.

Si je laisse à la fin le delay, toutes les 10 secondes la requete sera bien envoyée au serveur. De ce coté tout fonctionne bien.
Je souhaite remplacer le delay par une boucle while pour envoyer ma requete une fois, quand les minutes et secondes sont =0 (autrement dit 1 fois / heure).
Avec cette programmation je sort bien de ma boucle au moment décidé mais je n'ai plus ma connection au serveur et la requête n'est pas envoyée.

Si quelqu'un a une idée...

Merci d'avance

Voici le code, je l'ai alégé pour une comprehension plus aisée.

Client client(serverip, serverport);                     

bool connected = false;                                   
                                                
int Heure;
int Minute;
int Seconde;
int Mois;
int Jour;
int An;

void setup()
{
    lcd.begin(20, 4);
    Serial.begin(9600);
    Serial.println("Initializing Ethernet.");
    Ethernet. begin(hwaddr, ipaddr);                  // start up ethernet   
    sensors.begin();                                  // start up the library    
    sensors.getDeviceCount();               // store the number of sensors to the variable numSensors,
}

void loop()
{
  if(!connected)   {                                    // if "not" connected print: not connected ;)
     Serial.println("Not connected");  
         if (client.connect()){                             // if connected, set variable connected to "true" and    
         connected = true;                              
         sensors.requestTemperatures();                  // send the request for temperature to sensors (all sensors)       
         delay(100);

         	
          Heure=(RTC.get(DS1307_HR,true)); 
          ....
          ....

          client.print("GET /essaiArduinoBase2/update_db.php?");
          ...
          ...
      

          }
 
     else{
         Serial.println("Cannot connect to Server");         
         }
}
     else{
       delay(100);                                                
       while (client.connected() && client.available()) {         
       char c = client.read();                                    
       Serial.print(c);                                              
         }                                                            
 
Serial.println();                                                
 client.stop();                                              
 connected = false;                                           

 }
delay(10000);  // Avec ce delay c'est ok, on renvoie bien la requête au serveur

/*  // Si je remplace par cette boucle j'en sort bien, mais plus de connection au serveur
 do
{
 delay(1000);
 Minute=(RTC.get(DS1307_MIN,true));      
Seconde=(RTC.get(DS1307_SEC,true));
} while ((Minute !=0) || (Seconde !=0));
*/
 
 }

Je pense que tu ne dois plus etre connecté. Timeout sur la connection TCP_KEEPALIVE? Je ne sais pas si cela existe aexc la pile tcp de l'arduino

Il y a cette instruction pour verifier l'etat de la connexion:

Yep!

Plus simple. Tu stockes l'heure en cours dans une variable et tu la compare à l'heure.

If (heure != heure_precedente) {
...
do something;
...
heure_precedente = heure;
}

@+

Zoroastre.

Je pense que tu ne dois plus etre connecté.

Bonjour,

Même si je mets un delay d'une heure cela fonctionne donc ce n'est pas une question de durée.

Quelle est la difference pour mon prog entre un delay de 10 secondes par exemple et un do while qui va durer 10s avant de quitter la boucle ?
J'avoue que je ne pige pas trop sur ce coup la.

Si quelqu'un a une explication à me fournir ce serait cool car je n'ai vraiment aucune idée.

++

Ppeut-etre parce que delay() est non interruptible et maintient certaines pin actives. je ne suis pas certain a 100% de cette réponse mais je creuserais là dedans.
S

je pense qu'il faudrait que tu fouilles dans la lib RTC, je me demande si RTC.get() ne déconnecterait pas de ton serveur en allant utiliser une ressource qu'il ne faut pas (les incompatibilités de libs sont très fréquentes sur arduino), car si avec un delay() ça marche, c'est que c'est bien dans ta boucle do {} while(); que ça déconnecte.

Tu ne peux pas utiliser ta RTC pour biper l'arduino toutes les heures, et dans ce cas, ton soft serait entièrement libre de faire d'autres choses en attendant d'être "bipé"? je connais pas du tout le DS1307, peut-être que je dis des âneries...

je me demande si RTC.get() ne déconnecterait pas de ton serveur en allant utiliser une ressource qu'il ne faut pas

Merci Super_Cinci de te pencher sur mon problème.
Cela ne me semble pas être le cas vu qu'au début de mon prog il y a ça :

void loop(void)
{
  if(!connected)   {                                    
     Serial.println("Not connected");  
  if (client.connect()){                               
       connected = true;                              
       sensors.requestTemperatures();                         
       delay(100);
     temp = sensors.getTempCByIndex(0); 
       Heure=(RTC.get(DS1307_HR,true)); 
      Minute=(RTC.get(DS1307_MIN,false	  
      Seconde=(RTC.get(DS1307_SEC,false));
      Jour=(RTC.get(DS1307_DATE,false));
      Mois=(RTC.get(DS1307_MTH,false));
      An=(RTC.get(DS1307_YR,false));

Et que cela ne pose pas de problème quand je mets mon delay en fin de boucle (même un delay très court c'est ok)

Tu ne peux pas utiliser ta RTC pour biper l'arduino toutes les heures

Je ne sais pas :~

++

Ppeut-etre parce que delay() est non interruptible et maintient certaines pin actives. je ne suis pas certain a 100% de cette réponse mais je creuserais là dedans.
S

Cela peut être une idée effectivement, merci.
Je vais chercher si je trouve quelque chose la dessus.

++

Je n'ai toujours pas trouvé la solution.

Les pros de l'arduino vous n'avez pas une idée ? :smiley:

Je résume, toutes les heures je veux envoyer une fonction :

client.print("GET /essaiArduinoBase2/update_db.php?");
      client.print("degres=");
      client.print(temp);

En relevant l'heure sur mon module RTC

C'est pourtant simple non ? XD XD

++

EDIT : Je viens d'essayer de mettre ma fonction Do...While en début de loop, je verrais si cela fonctionne mieux dans 1h :wink:

Pourquoi une boucle obligatoirement ?
Tu risque de rester bloqué dans ta boucle temps que la condition n'est pas validée (si validé au bon moment) ?
Tu as essayé la proposition de Zoroastre ?

zoroastre:
Yep!

Plus simple. Tu stockes l'heure en cours dans une variable et tu la compare à l'heure.

If (heure != heure_precedente) {
...
do something;
...
heure_precedente = heure;
}

@+

Zoroastre.

Même si l'heure est dépassé d'une seconde ou 59min ( :sweat_smile:) parce que occupé ailleurs dans ton code, ça marchera.

byte heure_precedente = 0;

void loop()
{
  delay(100);
  Heure=(RTC.get(DS1307_HR,true));

  If (heure != heure_precedente) 
  {
    ...
    client.print("GET /essaiArduinoBase2/update_db.php?");
    client.print("degres=");
    client.print(temp);
    ...
    heure_precedente = heure;
  }
}

! mimi: Voir la fonction loop() comme une boucle infinie.

Tu as essayé la proposition de Zoroastre ?

Bonjour,

Tu viens de me faire réagir, j'avais bien lu sa proposition mais je l'ai mal interpretée.
En voyant dans son code "do something;" j'ai cru qu'il s'agissait d'une boucle comme la mienne qui fonctionnait, mais écrite d'une autre manière du coup j'ai pas insisté. J'avais pas vu son "if" au début. (fatigué le garçon ! :blush:)

Bref maintenant grâce à vous cela fonctionne. Juste un bug de lecture du RTC par moment, qui me sort des valeurs erronnées (déjà eu le pb avec un autre sketch) et du coup me déclanche deux voire trois lectures par heures.
J'ai changé les resistances de pull up du RTC qui étaient des 10k par des 2k2 et repris les soudures par la même occasion. Pour le moment cela à l'air d'être OK. On verra dans la durée, je releve pour mes tests en ce moment 1 valeur /min.

Encore merci !

++