Besoin de vous pour problème d'organisation de code !

Bonjour à tous et d’avance merci pour votre aide !
Voilà tout, je souhaite créer un semblant de système domotique accessible depuis internet. J’ai réussi à coder tous les modules, mais lorsque je les assemble en un seul code, les problèmes commencent…

Voici un exemple : le module qui me permet de récupérer mon adresse IP externe (afin de m’envoyer un mail automatiquement s’il y a un changement.

Voici le code brut

#include <SPI.h>
#include <Ethernet.h>   //Utilise la libraire Ethernet

byte mac[] = {  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };

char server[] = "perso.numericable.fr";    // mon code php permettant de lire l'IP externe est sur une page perso numericable

EthernetClient client;

String chaineRecue=""; // déclare un string vide global
int comptChar=0; // variable de comptage des caractères reçus

void setup() {
  Serial.begin(9600);   //Pour le serial monitor (écran du PC)
  
  if (Ethernet.begin(mac) == 0) {  //Démarre la connexion Ethernet
    Serial.println("Echec de configuration Ethernet avec DHCP");
    // plus rien à faire
    for(;;)
      ;
  }
  //Laisser une seconde au shield Ethernet pour s'initialiser
  delay(1000);
  Serial.println("Connexion...");
  
    chaineRecue=""; // vide le String de reception
    comptChar=0; // compteur de caractères en réception à 0  
    
  if (client.connect(server, 80)) {  //Si ça se connecte
    Serial.println("connexion OK");
    // Faire une requète HTTP:
    Serial.println("Envoi de requete  ...");

    
    client.println("GET /************/****.php HTTP/1.1");  //Demander une page précise du site (php)
    client.println("Host: perso.numericable.fr");
    client.println();
  } 
  else {
    //Si on ne parvient pas à se connecte au serveur
    Serial.println("Echec de connexion");
  }
}

void loop()
{
  //Lire les octets qui arrivent et les afficher
  while (client.available()) {
    char c = client.read();
    comptChar=comptChar+1;
    
    if ((comptChar>=118) && (comptChar<=132)) chaineRecue=chaineRecue+c; // J'enregistre uniquement dans chaineRecue ce qui correspond à mon IP externe
  }

  // Si le server s'est déconnecté, stop le  client
  if (!client.connected()) {
    Serial.println();
    Serial.println("Deconnexion");
    client.stop();
    Serial.println("Affichage de la chaine recue");
    delay(2000);
    Serial.println(chaineRecue);

    // ne rien faire
    for(;;)
      ;
  }
}

Ce code fonctionne parfaitement, jusque là tout va bien. Maintenant je souhaite mettre tout ce qui fait l’aquisition de mon IP dans un “sous programme”, voici le code :

#include <SPI.h>
#include <Ethernet.h>   //Utilise la libraire Ethernet

void setup() {
  Serial.begin(9600);   //Pour le serial monitor (écran du PC)

}

void loop() {
  
  lectureIpPublique();
  Serial.println("Je suis retourne dans le loop");
  while(1);

}

void lectureIpPublique(){
char server[] = "perso.numericable.fr";    // 
byte mac[] = {  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
EthernetClient client;

int comptChar=0; // variable de comptage des caractères reçus
String chaineRecue=""; // déclare un string vide global

if (Ethernet.begin(mac) == 0) {  //Démarre la connexion Ethernet
    Serial.println("Echec de configuration Ethernet avec DHCP");
    // plus rien à faire
    for(;;)
      ;
  }
  //Laisser une seconde au shield Ethernet pour s'initialiser
  delay(1000);
  Serial.println("Connexion...");
  
if (client.connect(server, 80)) {  //Si ça se connecte
    Serial.println("connexion OK");
    // Faire une requète HTTP:
    Serial.println("Envoi de requete  ...");

    
    client.println("GET /************/*****.php HTTP/1.1");  //Demander une page précise du site (php)
    client.println("Host: perso.numericable.fr");
    client.println();
  } 
  else {
    //Si on ne parvient pas à se connecte au serveur
    Serial.println("Echec de connexion");
  }
  
    while (client.available()) {
    char c = client.read();
    comptChar=comptChar+1;
    
    if ((comptChar>=118) && (comptChar<=132)) chaineRecue=chaineRecue+c;
    Serial.print(c);
  }

  // Si le server s'est déconnecté, stop le  client
  if (!client.connected()) {
    Serial.println();
    Serial.println("Deconnexion");
    client.stop();
    Serial.println("Affichage de la chaine recue");
    delay(2000);
    Serial.println(chaineRecue);
  }
  }

Ce qui se passe, c’est que sur la console voici ce qui s’affiche :

"
Connexion…
connexion OK
Envoi de requete …
Je suis retourne dans le loop
"

Vous voyez comme moi qu’une partie du programme ne s’exécute pas !
Quelqu’un a t’il une explication à cela ?

Merci à vous !!

bonjour,
modifie comme ca

if (client.connect(server, 80)) {  //Si ça se connecte
    Serial.println("connexion OK");
    // Faire une requète HTTP:
    Serial.println("Envoi de requete  ...");

    
    client.println("GET /************/*****.php HTTP/1.1");  //Demander une page précise du site (php)
    client.println("Host: perso.numericable.fr");
    client.println();
    while (client.available()) {
    char c = client.read();
    comptChar=comptChar+1;
    
    if ((comptChar>=118) && (comptChar<=132)) chaineRecue=chaineRecue+c;
    Serial.print(c);
  }

  // Si le server s'est déconnecté, stop le  client
  if (!client.connected()) {
    Serial.println();
    Serial.println("Deconnexion");
    client.stop();
    Serial.println("Affichage de la chaine recue");
    delay(2000);
    Serial.println(chaineRecue);
  }
  } 
  else {
    //Si on ne parvient pas à se connecte au serveur
    Serial.println("Echec de connexion");
  }
  

  }

J'ai essayé en changeant mon code avec le tiens mais il n'y a aucun changement, le programme saute encore par dessus la lecture de l'adresse IP...

Le programme ne saute pas par dessus la lecture de l’adresse IP !

Une fois que tu as envoyé ta requête (client.println();), tu lis ce qu’il y a dans le flux retour du client tant qu’il y a des données. Sauf qu’au moment où tu vérifies s’il y des données, il n’y en a pas ! Donc tu sors immédiatement de ton while sans avoir rien lu.

La différence entre ton premier code et ton second, c’est que dans ton premier, le while et dans la fonction loop. Donc s’il n’y a pas encore de donné lors du premier passage au niveau du while, ce n’est pas grave, comme le programme va boucler, cela fonctionnera dès que tu auras des données en retour.

Par contre, dans ton second code, tu ne fais qu’une seule tentative pour voir s’il y a des informations en retour (et en plus immédiatement après avoir envoyé la requête) et comme la réponse n’est pas immédiate, tu sors de ta fonction et hop, pas de lecture du flux retour.

Il faut que tu revois ta fonction pour récupérer l’adresse IP en temporisant pour attendre une réponse. Par exemple 1 seconde et si tu n’as pas de réponse au bout d’une seconde, tu renvoies une erreur.

[Edit] c’est mon jour de bonté :slight_smile:

#include <SPI.h>
#include <Ethernet.h>   //Utilise la libraire Ethernet

void setup() {
  Serial.begin(9600);   //Pour le serial monitor (écran du PC)
}

void loop() {
  lectureIpPublique();
  Serial.println("Je suis retourne dans le loop");
  while(1);
}

void lectureIpPublique(){
  char server[] = "perso.numericable.fr";    // 
  byte mac[] = {  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
  EthernetClient client;
  unsigned long startTime;
  
  int comptChar=0; // variable de comptage des caractères reçus
  String chaineRecue=""; // déclare un string vide global

  if (Ethernet.begin(mac) == 0) {  //Démarre la connexion Ethernet
    Serial.println("Echec de configuration Ethernet avec DHCP");
    // plus rien à faire
    for(;;);
  }
  //Laisser une seconde au shield Ethernet pour s'initialiser
  delay(1000);
  Serial.println("Connexion...");
  
  if (client.connect(server, 80)) {  //Si ça se connecte
    Serial.println("connexion OK");
    // Faire une requète HTTP:
    Serial.println("Envoi de requete  ...");
    
    client.println("GET /************/*****.php HTTP/1.1");  //Demander une page précise du site (php)
    client.println("Host: perso.numericable.fr");
    client.println();

	startTime = millis();
	
	while (client.available() || startTime + 1000 < millis()) {
      char c = client.read();
      comptChar=comptChar+1;
    
      if ((comptChar>=118) && (comptChar<=132)) chaineRecue=chaineRecue+c;
      Serial.print(c);
    }

    // Si le server s'est déconnecté, stop le  client
    if (!client.connected()) {
      Serial.println();
      Serial.println("Deconnexion");
      client.stop();
      Serial.println("Affichage de la chaine recue");
      delay(2000);
      Serial.println(chaineRecue);
    }
  } else {
    //Si on ne parvient pas à se connecte au serveur
    Serial.println("Echec de connexion");
  }
}

J’ai mis une temporisation d’une seconde (+ 1000). Si ce n’est pas assez, tu peux l’augmenter.