Contrôler LED a distance

Bonjour,

J'aimerais contrôler des LED sur une page web sauf que lorsque j'actualise la page, ça fais comme si j'appuyais sur les boutons de contrôle de celle-ci

Merci d'avance pour votre aide :slight_smile:

Voici mon programme si vous avez moyen de m'aider :

#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(80); // 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
    }
  }
}

Tronconneuse:
J'aimerais contrôler des LED sur une page web sauf que lorsque j'actualise la page, ça fais comme si j'appuyais sur les boutons de contrôle de celle-ci

Il est possible qu'il change la led parce que l'adresse de la page actualisée contient la commande de mise à jour de la led. Quelles commandes tapes-tu dans ton browser pour afficher ta page ?

lesept:
Il est possible qu'il change la led parce que l'adresse de la page actualisée contient la commande de mise à jour de la led. Quelles commandes tapes-tu dans ton browser pour afficher ta page ?

Je tape l'adresse IP et une fois dessus j'appuie juste sur F5

Non. Ton parser (fonction GET) cherche les caractère '?' et ce qui le suit, donc ta commande est plus longue et peut être plus complexe.

Au départ l'URL est http://adresse_ip

Si tu cliques sur le lien la LED change d'état. Ton URL devient donc http://adresse_ip?N
Ensuite F5 renvoie la même URL, donc ça rebascule.

Entre nous tu utilises une URL du type http://adresse_ip?N où N est un numéro de LED.
Le standard serait plutôt http://adresse_ip?led=N

hbachetti:
Au départ l'URL est http://adresse_ip

Si tu cliques sur le lien la LED change d'état. Ton URL devient donc http://adresse_ip?N
Ensuite F5 renvoie la même URL, donc ça rebascule.

Entre nous tu utilises une URL du type http://adresse_ip?N où N est un numéro de LED.
Le standard serait plutôt http://adresse_ip?led=N

Ok, je viens de comprendre ce que tu m'as dit et effectivement ça marche si je recharge la page avec la bonne adresse IP

Merci beaucoup tu m'as beaucoup aïder