[RESOLU] erreur fonction Ethernet.localIP()

Bonjour a vous ,

Ayant recu mon shiel ethernet 2 et mon mega 2560 aujourd ’ hui , j ’ ai testé 2 3 trucs trouvé sur le net .

Lorsque je met :

#include <SPI.h> //bibliothèqe pour SPI
#include <Ethernet.h> //bibliothèque pour Ethernet
#include <SD.h> //bibliothèque pour carte micro-SD

byte mac[] = {0x90, 0xA2, 0xDA, 0x0F, 0xDF, 0xAB}; //adresse mac de votre carte
byte ip[] = {192, 168, 1, 123}; //adresse IP

EthernetServer serveur(80); // déclare l'objet serveur au port d'écoute 80

void setup() {

  Serial.begin (9600); //initialisation de communication série
  if (!SD.begin(4)) { //teste la communication avec la carte(pin 4)
    Serial.print("Communication SD impossible");
    return; //stoppe le programme
  }

  Serial.print("Communication SD ok !");

  Ethernet.begin (mac, ip); //initialisation de la communication Ethernet
  Serial.print("\n-> Le serveur est sur l'adresse : ");
  Serial.println(Ethernet.localIP()); //on affiche l'adresse IP de la connexion
  serveur.begin(); // démarre l'écoute
}

void loop() {
}

le retour du moniteur serie est :
Communication SD ok !
→ Le serveur est sur l’adresse : 0.15.15.15

bizzarre cette adresse locale …

je ne vois pas trop ou est mon erreur pourtant , votre aide est la bienvenue .

j ’ ai aussi testé avec " Ethernet2.h " , mais ca ne compile pas ( reference : http://www.arduino.org/learning/reference/ethernet-localip )

Et si vous essayez en mode DHCP?

J-M-L:
Et si vous essayez en mode DHCP?

Bonjour , en mode DHCP , ca plante on dirait , bien que aucune erreur n ’ apparaisse a la compilation ni dans le moniteur serie et rien dans la live box non plus .
voici le code que j ’ ai testé pour le DHCP :

#include <SPI.h> //bibliothèqe pour SPI
#include <Ethernet.h> //bibliothèque pour Ethernet
//#include <SD.h> //bibliothèque pour carte micro-SD

byte mac[] = {0x90, 0xA2, 0xDA, 0x0F, 0xDF, 0xAB}; //adresse mac de votre carte
//byte ip[] = {192, 168, 1, 123}; //adresse IP

EthernetServer serveur(80); // déclare l'objet serveur au port d'écoute 80

void setup() {

  Serial.begin (9600); //initialisation de communication série
  Serial.println("Moniteur serie initialisé !");
  /*if (!SD.begin(4)) { //teste la communication avec la carte(pin 4)
    Serial.print("Communication SD impossible");
    return; //stoppe le programme
  }

  Serial.print("Communication SD ok !");*/
/*
  Ethernet.begin(mac, ip); // forme conseillée pour fixer IP fixe locale
//Ethernet.begin(mac, ip, serverDNS, passerelle, masque); // forme complète
*/
// start the Ethernet connection:
  if (Ethernet.begin(mac) == 0) {
    Serial.println("Failed to configure Ethernet using DHCP");
    // no point in carrying on, so do nothing forevermore:
  }
  else {
    Serial.print("L'adresse IP du shield Ethernet est :" );
    delay(1000); // donne le temps à la carte Ethernet de s'initialiser
    Serial.println(Ethernet.localIP());
  serveur.begin(); // démarre l'écoute
  }
  Serial.println("test");
}

void loop() {
}

j ’ ai essayé de changer de cable ethernet , mis celui de mon PC sur le shiel ethernet et vice versa , mais ca n ’ a rien changé .

Meme le test ne s’ affiche pas sur le moniteur serie .

Comment connectez vous votre shield au MEGA?

l'adresse MAC que vous listez est-elle bien celle imprimée sur la carte?

rajoutez cela au tout début du setup()

pinMode(4, OUTPUT);
digitalWrite(4, HIGH);

pour vous assurer que la carte SD ne vienne pas mettre le bazar sur le SPI

le shield est actuellement directement enfiché sur le mega 2560 la prise RJ45 se retrouvant au dessus de la prise USB .

L ’ adresse mac entrée dans le code est bien celle figurant sur l ’ etiquette placée audessous du shield ( que j’ ai mise sur le port RJ 45 .

je vais tester de rajouter les modifs pour le pin 4 , et dire si cela change quelque chose .

voici donc le code testé :

#include <SPI.h> //bibliothèqe pour SPI
#include <Ethernet.h> //bibliothèque pour Ethernet
#include <SD.h> //bibliothèque pour carte micro-SD

byte mac[] = {0x90, 0xA2, 0xDA, 0x0F, 0xDF, 0xAB}; //adresse mac de votre carte
byte ip[] = {192, 168, 1, 123}; //adresse IP

EthernetServer serveur(80); // déclare l'objet serveur au port d'écoute 80

void setup() {

  pinMode(4, OUTPUT);
  digitalWrite(4, HIGH);
  Serial.begin (9600); //initialisation de communication série
  if (!SD.begin(4)) { //teste la communication avec la carte(pin 4)
    Serial.print("Communication SD impossible");
    return; //stoppe le programme
  }

  Serial.print("Communication SD ok !");

  Ethernet.begin (mac, ip); //initialisation de la communication Ethernet
  Serial.print("\n-> Le serveur est sur l'adresse : ");
  Serial.println(Ethernet.localIP()); //on affiche l'adresse IP de la connexion
  serveur.begin(); // démarre l'écoute
}

void loop() {
}

et le retour sur le moniteur serie :

Communication SD ok !
-> Le serveur est sur l'adresse : 0.15.15.15

OK

Vous utilisez quelle librairie?

lisez la réponse #1 de ce post

Bravo , apres lecture et implantation de la bibliotheque ethernet2.H je viens de faire un test et ca marche impec …

Merci pour la trouvaille :slight_smile:

solution a mon probleme :
If you’re using the arduino.cc (this website) IDE, which I would highly recommend, then you only need to install an Ethernet library that supports the W5500. There are a few choices:

Ethernet2 library - this is the same library included with the arduino.org IDE

Download https://github.com/adafruit/Ethernet2/archive/master.zip
Sketch > Include Library > Add .ZIP Library > select the downloaded file > Open
change the line #include <Ethernet.h> in your sketch to:#include <Ethernet2.h>

pourtant j ’ utilise l ’ IDE avec le repo specifique pour la version ubuntu , quand meme , inclure une bibliotheque de plus ou de moins ne doit pas changer grand chose au niveau taille de DL , mais eviterait bien des problemes ulterieurs .

Y a t ’ il d’ autres bibliotheques qui serait susceptibles d’ etre DL avant de rencontrer d’ autre peripeties du genre ?

Un grand merci pour votre aide en tout cas , je vais pouvoir vraiment tester mes codes plein pot a present !!

Par contre je n’ arrive toujours pas a afficher la page dans mon reseau local en tapant l ’ adresse ip fixe du shield de l’ arduino dans mon navigtateur , pourtant il m ’ affiche la bonne adresse maintenant et il est visible et configurable dans l ’ interface de la livebox , ca progresse bien tout de meme .

Super :slight_smile:

Quelle page voulez vous afficher ? Votre code ne fait rien...

je pense que ca doit etre un probleme lié a la configuration de la box , avec le code suivant :

#include <SPI.h> //bibliothèqe pour SPI
#include <Ethernet2.h> //bibliothèque pour Ethernet
#include <SD.h> //bibliothèque pour carte micro-SD

byte mac[] = {0x90, 0xA2, 0xDA, 0x10, 0x2F, 0x93}; //adresse mac de votre carte
byte ip[] = {192, 168, 1, 125}; //adresse IP
int pinRelais = 7; //variable de pin pour le Relais
boolean etatRelais = 0; //etat du pin
EthernetServer serveur(80); // déclare l'objet serveur au port d'écoute 80

void setup() {
  pinMode(pinRelais, OUTPUT); //pin en mode OUTPUT
  Serial.begin (9600); //initialisation de communication série
  Ethernet.begin (mac, ip); //initialisation de la communication Ethernet
  Serial.print("*\n-> Le serveur est sur l'adresse : ");
  Serial.println(Ethernet.localIP()); //on affiche l'adresse IP de la connexion
  serveur.begin(); // démarre l'écoute
}

void loop() {
  gestionClient(); // fonction qui gère toute la communication avec le client
}

//----------------------Fonctions----------------------
//fonction qui gère la communication avec le client
void gestionClient() {
  EthernetClient client = serveur.available(); //on écoute le port
  if (client) { //si client existe
    Serial.println("Client en ligne"); //on le dit...
    if (client.connected()) { // si le client est connecté
      GET(client); //appel de la fonction de décodage
      //réponse au client
      entete(client); // fonction pour l'entête de la page HTML
      corps(client); // fonction pour le corps
      piedPage(client); // fonction pour le pied de page
      Serial.println("Fin de communication avec le client\n");
      client.stop(); //on déconnecte le client
    }
  }

}

//fonction de fabrication de l'entête HTML
void entete(EthernetClient cl) {
  //infos pour le navigateur
  cl.println("HTTP/1.1 200 OK"); // type du HTML
  cl.println("Content-Type: text/html; charset=ascii"); //type de fichier et encodage des caractères
  cl.println("Connection: close");  // fermeture de la connexion quand toute la réponse sera envoyée
  cl.println();
  //balises d'entête
  cl.println("<!DOCTYPE HTML>");
  cl.println("<html>");
  cl.println("<head><title>Relais</title></head>");
  cl.println("<body><h1>Relais</h1><hr>
");
}
//fonction de fabrication du corps de page
void corps(EthernetClient cl) {
  cl.println("
"); // saut de ligne
  cl.print("
Relais ");
  if (etatRelais) { //si état sur 1
    cl.print("ON "); // on l'écrit
  }
  else { // sinon
    cl.print("OFF "); //on l'écrit aussi ;)
  }
  cl.print(" <a href=?"); //création du lien inutile de répéter l'adresse du site
  cl.print('c'); //code à recevoir
  cl.println(" target=_self >Change</a>
");
}

//fonction de fabrication du pied de page
void piedPage(EthernetClient cl) {
  //balises de pied de page
  cl.println("
<hr>");
  cl.println("</body>");
  cl.println("</html>");
}

//fonction décodage GET
void GET(EthernetClient cl) {
  boolean lu = 0; //variable pour indiquer l'état de lecture
  while (cl.available()) { // tant qu'il a des infos à transmettre
    char c = cl.read(); // on lit le caractère
    delay(1); //delai de lecture
    if (c == '?' && lu == 0) { //si "?" repéré
      c = cl.read(); //on lit le caractère suivant qui contient la donnée
      if (c == 'c') { //si code reçu
        etatRelais = !etatRelais; //on change l'état du relais
        digitalWrite(pinRelais, etatRelais); //on met à jour le pin
        Serial.println(etatRelais);
      }
      delay(10);
      lu = 1; // on dit qu'on a lu l'info
    }
  }
}

parfois ca affiche la page , parfois pas et si je clique pour changer l ’ etat du relais , ca cherche indefiniement .
Pourtant j ’ ai fait la translation de port du 43210 externe au 80 interne lié sur l ’ IP du shield ( 192.168.1.125 en DHCP statique dans la box ) .
et dans mon navigateur je tape : "mon_ip_publique:43210 le probleme doit venir du lien qui ne retranscris pas l ’ adresse , je vais voir si en mettant la bonne adresse " en dur " ca marche .

Dans les 2 cas ca patauge dans la semoule indefiniement…

Moi je virerais tous les délais - ils n’ont rien à faire dans un code asynchrone

oui , il est prevu de les deporter dans un fichier stocké sur la micro-SD , enfin si j ' arrive a faire marcher mon code a un moment donné :smiley: ! avant de me lancer dans une serie complete et plus complexe , mais pour le moment vu que certaines choses ne vont pas , j ' essai de resoudre les pb avant de me lancer dans la clarté du code et la simplification , j ' en suis qu ' a la phase de test actuellement .

Les delay peuvent introduire des bugs - saturation de mémoire par exemple

ok je vais changer pour : millis() si besoin et je retesterai ca demain soir et vous tiendrez au courant .

Merci pour votre aide :kissing:

Bonne soirée .