Go Down

Topic: [Résolu] Arduino Mega, Ethernet Shild, perturbation des pin 22 a 53 ?? (Read 396 times) previous topic - next topic

boubil

Bonjour

J'ai mis au point un montage qui marche bien et qui utilise les pin 22 à 53 sur mon arduino Mega.

J'ai alors décidé d'ajouter l'Ethernet Shield pour piloter le tout à distance.

Et là plus rien ne marche :
les leds s'allument n'importe comment, ca sent même un peu le chaud. Du coup j'ai débranché les fils d'alim de ma breadboard pour développer la partie ethernet.

Que se passe-t-il ? Est ce que certain PIN sont "piloté" dans mon dos par la carte ethernet ?

Par ailleurs sur la partie Ethernet je ne suis pas sure d'avoir tout compris et j'ai pas mal tâtonné.
Mon objectif envoyer une commande POST a une URL pour enregistrer les données collectées par l'arduino.
J'y suis parvenue avec le code ci-dessous :

Code: [Select]
boolean  logDataToRemote(String msg)
{
 Serial.println("connecting...");

 if (!client.connect(server, 80)) {

    /* Erreur */
    Serial.println(F("Echec !"));
    return false;
  }
  Serial.println("connected");
     // Make a HTTP request:
  String PostData="msg="+ urlencode(msg);

    Serial.println(PostData);

 client.println("POST /arduino/save.php HTTP/1.1");
 client.println("Host:  www.monserveramoi.fr");
 client.println("User-Agent: Arduino/1.0");
 client.println("Connection: close");
 client.println("Content-Type: application/x-www-form-urlencoded;");
 client.print("Content-Length: ");
 client.println(PostData.length());
 client.println();
 client.println(PostData);
 /* Fin de la requete HTTP */
  Serial.println(F("Fin envoi ..."));
  delay(1000); /* Permet au serveur distant de recevoir les données avant de fermer la connexion */
  client.stop();

  /* Pas d'erreur */
  return true;
}


Ce qui me gène c'est que je suis obligée de mettre delay(1000) avant de clore la connexion sinon les données ne sont pas toujours envoyées. Dans l'exemple que j'avais trouvé il y avait delay(10). Chez moi ca ne marche pas. Ni avec 100. (perte de tout ou partie des requêtes)

Si je ne ferme pas la connexion, ca ne se passe pas bien non plus.
J'ai une petite idée de comment de vais régler ce problème mais je voudrais être sure d'avoir bien compris  le fonctionnement général suite a mes différents test.

Code: [Select]
client.connect(server, 80)
Cette commande ouvre une connexion vers le serveur distant.
Cette connexion tombe toute seule au bout d'un certain temps.

Code: [Select]
client.println("POST /arduino/save.php HTTP/1.1");
 client.println("Host:  www.petits-loups.fr");
 client.println("User-Agent: Arduino/1.0");
 client.println("Connection: close");
 client.println("Content-Type: application/x-www-form-urlencoded;");
 client.print("Content-Length: ");
 client.println(PostData.length());
 client.println();
 client.println(PostData);


Ces commandes permettent d'envoyer la requete au serveur (ici un POST mais c'est similaire pour un GET)
Lors de cette connexion on ne peut envoyer qu'une seule requête au serveur (un post ou un get).
J'ai essayé d'envoyer plusieurs get a la suite et seul le premier arrive.
On doit donc obligatoirement clore avant d'envoyer une nouvelle requête ?


Code: [Select]
  client.stop();
Ferme le connexion au serveur. Nécessaire si on veut envoyer une nouvelle requête.
On ne peut pas referme la connexion immédiatement après le dernier println sinon les données n'ont pas le temps d'être envoyés.

Par ailleurs la connexion tombe d'elle même au bout d'un certain temps.

Est ce que cette analyse est exacte ?

Donc mon idée est de bufferiser les données que j'ai à envoyer et de les envoyer par exemple toutes les 30 secondes.
Je commencerais alors par clore la connexion si elle est ouverte et j'en ouvrirai une autre pour envoyer les données sans la refermer à la fin. Ceci me permettant d'eviter le delay(1000). La connexion tombera d'elle-même ou sera refermée au début de l'envoi suivant ?

Merci d'avances pour vos lumières.



Geeker

J'ai déjà utilisé l'ethernet shield (l'officiel), mais pas avec une Mega. Pour ce qui est des pins utilisés, va voir ici, tu as une image de la Mega montrant tous les pins utilisés par le shield, leur description, etc.
On voit bien que les pins 50 à 53 sont utilisés. Essaie d'adapter ton code pour les changer (si possible) parce que c'est sûrement ça qui fait tout buguer.
Codeur en Lua, python, java, C,  Arduino, un peu d'assembleur ...

boubil

Oui effectivement, j'ai modifié pour ne plus utiliser les pins 50 à 53 et tout remarche. Ouf !

Par contre j'ai toujours du mal avec Ethernet. Je ne recois pas toutes les requêtes.

boubil

y-a-t-il une longueur max a respecter pour un String ?

y-a-t-il une taille de post max a respecter pour envoyer une requête ?

Go Up