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