Pages: [1]   Go Down
Author Topic: Problème avec mon code  (Read 677 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Jr. Member
**
Karma: 0
Posts: 98
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.

Code:
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));
*/
 
 }
Logged

Offline Offline
Jr. Member
**
Karma: 0
Posts: 75
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Offline Offline
Jr. Member
**
Karma: 0
Posts: 75
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Il y a cette instruction pour verifier l'etat de la connexion:
http://arduino.cc/en/Reference/ClientConnected
Logged

0
Offline Offline
God Member
*****
Karma: 0
Posts: 798
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Veuillez indiquer [RESOLU] dans l'entête du titre en éditant votre premier message smiley-wink

Offline Offline
Jr. Member
**
Karma: 0
Posts: 98
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
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.

++
Logged

Offline Offline
Jr. Member
**
Karma: 0
Posts: 75
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Bretagne
Offline Offline
Edison Member
*
Karma: 11
Posts: 1308
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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...
Logged

Offline Offline
Jr. Member
**
Karma: 0
Posts: 98
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
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 :

Code:
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)

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

Je ne sais pas  smiley-confuse

++
Logged

Offline Offline
Jr. Member
**
Karma: 0
Posts: 98
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
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.

++
Logged

Offline Offline
Jr. Member
**
Karma: 0
Posts: 98
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Je n'ai toujours pas trouvé la solution.

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

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

Code:

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 ?  smiley-lol smiley-lol

++

EDIT : Je viens d'essayer de mettre ma fonction Do...While en début de loop, je verrais si cela fonctionne mieux dans 1h smiley-wink
« Last Edit: March 02, 2012, 07:16:28 am by Michel_B » Logged

Made in Belgium
Offline Offline
God Member
*****
Karma: 0
Posts: 756
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 ?

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 ( smiley-sweat) parce que occupé ailleurs dans ton code, ça marchera.

Code:
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.
« Last Edit: March 02, 2012, 08:35:04 am by osaka » Logged


Offline Offline
Jr. Member
**
Karma: 0
Posts: 98
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
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 !  smiley-red)

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 !

++
Logged

Pages: [1]   Go Up
Jump to: