Arduino ethernet shield CONNECTION TIME OUT

Bien le bonjour à tous,

J'ai un problème avec mon arduino UNO avec lequel j'ai une carte Ethernet shield.
J'ai fais quelques tests, fait une page web pour allumer et éteindre des LED (inspiré du code de openclassroom: [https://openclassrooms.com/courses/perfectionnez-vous-dans-la-programmation-arduino/pilotez-votre-carte-arduino-sur-le-reseau-local/ ).

Mais depuis quelques jours, après quelques tests de code (j'avoue avoir chargé quelques fois l'arduino d'affilée), je n'ai désormais plus aucune réponse via l'adresse IP de l'arduino http://192.168.1.123:8050/

J'arrive pourtant bien à le Pinger.

J'ai pensé à une erreur programme, j'ai alors repris un ancien programme (entre autre du site), mais rien n'y fait, je reste en

J'ai le message:
Ce site est inaccessible
192.168.1.123 a mis trop de temps à répondre.
Essayez les suggestions ci-dessous :
Vérifier la connexion
Vérifier le proxy et le pare-feu
Exécuter les diagnostics réseau de Windows
ERR_CONNECTION_TIMED_OUT

Pourriez-vous m'aider?

J'ai eu beau le laissé éteint des heures, laissé plusieurs seconde le bouton reset appuyé, rien n'y fait.

L'arduino en tant que tel fonctionne bien (j'active des led en fonction d'un sélecteur etc), c'est vraiment le côté serveur Web qui a un soucis...

Merci d'avance pour votre aide et joyeuses pâques :slight_smile:

un code?
l'ip répond au ping?
bref, trop d'inconnues pour répondre

J'arrive pourtant bien à le Pinger.

Votre Arduino n'a pas de demon qui répond à un ping - donc c'est un autre appareil qui a cette adresse IP, pas votre arduino....

Pourquoi vous compliquer la vie avec le port 8050? Restez sur le port 80 pour du HTTP

Bonjour,

Merci pour vos réactions.

J'ai effectivement réussis à pinger le composant, je ne sais pas si c'est l'arduino ou la partie serveur web qui répond, mais la partie communication répond au ping de l'adresse IP que j'ai mis dans le sketch.

Désolé de ne pas avoir expliqué le 8050, j'ai fait un port forwarding vers ce port spécifique (dans ma box, j'ai renvoyé ce port vers mon Arduino pour me permettre de voir l'arduino depuis le monde extérieur).

Voici le code chargé dans l'arduino.

#include <SPI.h> //bibliothèqe pour SPI
#include <Ethernet.h> //bibliothèque pour Ethernet
byte mac[] = {0x90, 0xA2, 0xDA, 0x0F, 0xDF, 0xAB}; //adresse mac de votre carte
byte ip[] = {192, 168, 1, 123}; //adresse IP
unsigned long tpsDep; //temps départ pour la gestion des LED
int pinLed[5] = {2, 3, 5, 6, 7}; //tableau des pins de LED
boolean etatLed[5] = {0, 0, 0, 0, 0}; //tableau des états des LED
int modeLed[5] = {0, 0, 0, 0, 0}; // tableau des modes des LED
EthernetServer serveur(8050); // déclare l'objet serveur au port d'écoute 80

void setup() {
  for (int l = 0; l < 5; l++) {
    pinMode(pinLed[l], 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
  gestionLed(); // fonction qui gère l'allumage des LED
}

//----------------------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>Web-Commande de LED</title></head>");
  cl.println("<body><h1>Web-Commande de LED</h1><hr>
");
}
//fonction de fabrication du corps de page
void corps(EthernetClient cl) {
  cl.println("
"); // saut de ligne
  //boucle pour construire chaque ligne en fonction des LED
  for (int l = 0; l < 5; l++) {
    cl.print("
LED ");
    cl.print(l);
    cl.print(" ");
    Serial.println(l);
    switch (modeLed[l]) {
      case 0:
        cl.print("OFF ");
        break;
      case 1:
        cl.print("ON ");
        break;
      case 2:
        cl.print("CLI ");
        break;
    }
    cl.print(" <a href=?"); //création du lien inutile de répéter l'adresse du site
    cl.print(l);
    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>");
}
//fonctin 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
      int led = int(c) - 48; //on la transforme en nombre
      modeLed[led] = (modeLed[led] + 1) % 3; //on change l'état de la LED
      delay(10);
      lu = 1; // on dit qu'on a lu l'info
    }

  }
}
//fonction d'allumage des LED par rapport au tableau de mode.
void gestionLed() {
  unsigned long tpsAct = millis(); // récupération du temps actuel
  if (tpsAct - tpsDep > 250) { //si délai dépassé
    for (int l = 0; l < 5; l++) { // chaque LED
      if (modeLed[l] == 0) { // si mode éteint
        etatLed[l] = 0; // on éteind
      }
      else if (modeLed[l] == 1) {// si mode allumé
        etatLed[l] = 1; //on allume
      }
      else if (modeLed[l] == 2) { //si mode clignotant
        etatLed[l] = !etatLed[l]; //on inverse l'état
      }
      digitalWrite(pinLed[l], etatLed[l]); //on met le pin à jour
      tpsDep = tpsAct; //on réinitialise le temps
    }
  }
}

Encore une fois, ce code fonctionnait avant (pendant des semaines).
J'ai fait quelques tests en chargeant des sketch et puis plus de réponses, même en remettant le code repris du net (voir le lien dans mon premier message).

Je suis parti sur une recherche pour faire un "reset" Hardware / Software, mais je vois de tout sur le net (raccorder un condo de 47µF entre 2 pines, lui charger un sketch spécifique etc...), mais je n'ai pas encore testé, est-ce cela que je devrais faire?.

À ma connaissance à moins que vous n'ayez implémentée un ping vous même (ICMP ping) votre shield n'a aucun code pour répondre au ping.

Donc ce n'est pas lui qui répond

Éteignez le shield et faites un ping sur 192.168.1.123 - ça dit quoi ?

Ne se pourrait-il pas qu'un autre appareil soit sur cette IP?

J-M-L:
À ma connaissance à moins que vous n'ayez implémentée un ping vous même (ICMP ping) votre shield n'a aucun code pour répondre au ping.
Donc ce n'est pas lui qui répond

si si JML avec un webserveur l'arduino répond au ping (je viens de faire l'essai)

Ah cool - je ne savais pas qu'il avait une instance ICMP alors

BON, grande nouvelle (enfin plutôt un pas en avant car je n'ai pas la solution finale)...

1)Je confirme que le ping répond lorsque j'ai connecté mon arduino au réseau et que le ping ne fonctionne plus lorsque je le débranche (j'ai une vue globale des composants connectés dans ma box sur le 192.168.1.1).

J'ai rechargé le code pris du NET en mettant bien le port 8050 (de base en 80 dans l'exemple) et ça fonctionne !!!
Par contre, je remet mon sketch modifié par mes soins et ça ne fonctionne plus?! (mon site est inaccessible).
Alors qu'il s'agit du même code dans lequel j'ai fait des modifications simples.

Ca me rassure dans le sens ou je n'ai pas "pèté" mon arduino ou surchargé quelques chose ou autre...
Il s'agit à mon avis d'une erreur de programmation, je creuse là dedans, mais si vous pouviez m'aider, ça serait TOP :slight_smile:

Donc je code qui marche est :

#include <SPI.h> //bibliothèqe pour SPI
#include <Ethernet.h> //bibliothèque pour Ethernet
byte mac[] = {0x90, 0xA2, 0xDA, 0x0F, 0xDF, 0xAB}; //adresse mac de votre carte
byte ip[] = {192, 168, 1, 123}; //adresse IP
unsigned long tpsDep; //temps départ pour la gestion des LED
int pinLed[5] = {2, 3, 5, 6, 7}; //tableau des pins de LED
boolean etatLed[5] = {0, 0, 0, 0, 0}; //tableau des états des LED
int modeLed[5] = {0, 0, 0, 0, 0}; // tableau des modes des LED
EthernetServer serveur(8050); // déclare l'objet serveur au port d'écoute 80

void setup() {
  for (int l = 0; l < 5; l++) {
    pinMode(pinLed[l], 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
  gestionLed(); // fonction qui gère l'allumage des LED
}

//----------------------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>Web-Commande de LED</title></head>");
  cl.println("<body><h1>Web-Commande de LED</h1><hr>
");
}
//fonction de fabrication du corps de page
void corps(EthernetClient cl) {
  cl.println("
"); // saut de ligne
  //boucle pour construire chaque ligne en fonction des LED
  for (int l = 0; l < 5; l++) {
    cl.print("
LED ");
    cl.print(l);
    cl.print(" ");
    Serial.println(l);
    switch (modeLed[l]) {
      case 0:
        cl.print("OFF ");
        break;
      case 1:
        cl.print("ON ");
        break;
      case 2:
        cl.print("CLI ");
        break;
    }
    cl.print(" <a href=?"); //création du lien inutile de répéter l'adresse du site
    cl.print(l);
    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>");
}
//fonctin 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
      int led = int(c) - 48; //on la transforme en nombre
      modeLed[led] = (modeLed[led] + 1) % 3; //on change l'état de la LED
      delay(10);
      lu = 1; // on dit qu'on a lu l'info
    }

  }
}
//fonction d'allumage des LED par rapport au tableau de mode.
void gestionLed() {
  unsigned long tpsAct = millis(); // récupération du temps actuel
  if (tpsAct - tpsDep > 250) { //si délai dépassé
    for (int l = 0; l < 5; l++) { // chaque LED
      if (modeLed[l] == 0) { // si mode éteint
        etatLed[l] = 0; // on éteind
      }
      else if (modeLed[l] == 1) {// si mode allumé
        etatLed[l] = 1; //on allume
      }
      else if (modeLed[l] == 2) { //si mode clignotant
        etatLed[l] = !etatLed[l]; //on inverse l'état
      }
      digitalWrite(pinLed[l], etatLed[l]); //on met le pin à jour
      tpsDep = tpsAct; //on réinitialise le temps
    }
  }
}

Merci encore pour vos réponses (on se sent moins seul) et merci d'avance pour le coup de main!!!

Et le code qui marche pas :

Le code qui marche pas est:

#include <SPI.h> //bibliothèqe pour SPI
#include <Ethernet.h> //bibliothèque pour Ethernet
byte mac[] = {0x90, 0xA2, 0xDA, 0x0F, 0xDF, 0xAB}; //adresse mac arduino
byte ip[] = {192, 168, 1, 123}; //adresse IParduino
unsigned long tpsDep; //temps départ pour la gestion des LED

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

void setup() { 
pinMode(2, INPUT); //Initilisation de la pin 2 en INPUT
pinMode(3, OUTPUT);//Initilisation de la pin 3 en INPUT
pinMode(5, INPUT);
pinMode(6, INPUT);
pinMode(7, INPUT);
pinMode(8, INPUT);
pinMode(9, OUTPUT);
pinMode(10, OUTPUT); //Sortie télérupteur

  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>MAISON</title></head>"); // nom de l'onglet
  cl.println("<body><h1>Commande maison test applique</h1><hr>
");     //titre dans la page
}

//fonction de fabrication du corps de page
void corps(EthernetClient cl) {
  cl.println("
"); // saut de ligne
 
// Ligne 1
cl.print("
Appliques murales ALLUMER: ");
cl.print(" <a href=?1"); //création du lien lorsqu'on clic sur SWITCH TO ON
cl.println(" target=_self > SWITCH TO ON</a>
");

// Ligne 2
cl.print("
Appliques murales ETEINDRE: ");
cl.print(" <a href=?0"); //création du lien lorsqu'on clic sur SWITCH TO OFF
cl.println(" target=_self > SWITCH TO OFF</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>");
}

//fonctin 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(1000); //delai de lecture
    if (c == '?' && lu == 0) { //si "?" repéré
      c = cl.read(); //on lit le caractère suivant qui contient la donnée

 digitalWrite(9, LOW );  //test de quand le programme passe ici
 
unsigned long tpsAct = millis(); // récupération du temps actuel
Serial.println(c); 
if (c == '0')    // si on a clické sur 
  { if (tpsAct - tpsDep > 250) 
    {( digitalWrite(10, LOW ));
     tpsDep = tpsAct;}} //on réinitialise le temps
else if (c == '1')
  { if (tpsAct - tpsDep > 250) 
    {( digitalWrite(10, HIGH ));
     tpsDep = tpsAct;}} //on réinitialise le temps
/*else {
  ( digitalWrite(10, LOW ));
      delay(1000);
      ( digitalWrite(10, HIGH ));
       delay(1000);}*/
            delay(1000); 
            lu = 1; // on dit qu'on a lu l'info
    } 
  }
}

AMHA c'est ton delay qui met la zone

 while (cl.available()) { // tant qu'il a des infos à transmettre
    char c = cl.read(); // on lit le caractère
    delay(1000); //delai de lecture

dans le code qui "fonctionne" delay(1) et non 1000

HO MY MOTHER FU**ING GOD, tu as trouvé !!!!

TOUT marche bien comme ça !

Super méga géniale nickel chrome toppissime :smiley:

Vous avez fait un homme heureux !

CE SOIR, J'ALLUME LES APPLIQUES DU SALON AVEC MON GSM :slight_smile:

Bonne soirée à tous, encore merci pour cette réactivité et sympathie !

content d'avoir aidé