Novembre 2017
LunMarMerJeuVenSamDim
  12345
6789101112
13141516171819
20212223242526
27282930   

Calendrier Calendrier


Serveur Web ARDUINO sur réseau local

Voir le sujet précédent Voir le sujet suivant Aller en bas

Serveur Web ARDUINO sur réseau local

Message  Serge le Sam 1 Déc 2012 - 9:45

Plusieurs d'entre nous  cherchent à réaliser un petit serveur de page WEB qui leur permettra de contrôler à distance une carte Arduino via un réseau local ...
- consulter l'état des entrées de la carte,
- modifier l'état des sorties de la carte.

Je vous propose ma dernière adaptation. Elle est prête à l'emploi  Smile
N'hésitez pas à y apporter vos améliorations et à les partager par retour de forum.
Pour accéder à une copie écran de la page d'accueil Arduino WebServ -> http://i45.servimg.com/u/f45/17/95/97/13/arduin10.png
et voici les sources:
*** Le code source du 1 Déc. 2012 a été remplacé *** voir post suivant (Serge/05/12/2014)
Code:
/*===============================================================================
eth_webserv_02 / SMS / - Démo fonctionnelle pour Atelier Arduino/AMICRO
=================================================================================
Ce module configure une carte ARDUINO ETHERNET en serveur HTTP sur réseau local.
et génére une page HTML permettant à l'utilisateur de contrôler la carte à distance (via le réseau):
- consultation de l'état des entrées/sorties numériques et analogiques de la carte
- commande de l'état d'une LED de la carte.

*** Le code source du 1 Déc.. 2012 a été remplacé *** voir post suivant (Serge/05/12/2014)


Dernière édition par Serge le Ven 5 Déc 2014 - 18:52, édité 4 fois
avatar
Serge
Admin

Messages : 58
Date d'inscription : 12/10/2011

http://www.amicro44.com

Revenir en haut Aller en bas

Re: Serveur Web ARDUINO sur réseau local

Message  Serge le Ven 5 Déc 2014 - 18:37

Après 2 années d'un profond sommeil Sleep  ... l'atelier ARDUINO animé par Bertrand a redémarré en ce mois de novembre 2014 ...
Souhaitons une meilleure persévérance à ses nouveaux membres qui semble t'il ne manquent pas de motivation !

Pour que les débutants soient très rapidement dans le bain, nous leur proposons de pratiquer ce qui a été vu en cours, en  apportant quelques améliorations à des  exercices déjà effectués par leur prédécesseurs:

Pour commencer, revisitons le serveur WEB sur carte UNO ETHERNET ->
- voici le résultat qui sera visualisé sur la page Internet -> http://i45.servimg.com/u/f45/17/95/97/13/arduin10.png
- voici le code réactualisé qui annule et remplace l'ancien code de mon post précédent:
-> (Sélectionner le code et faire copier, puis  coller dans l'EDI ARDUINO)
Code:

/*===============================================================================
eth_webserv - Serveur WEB sur carte ARDUINO -
Version V04/SMS/05/12/2014 - Version opérationnelle pour Atelier AMICRO
26/11/2014/SMS - reprise du code du code, suite à redémarrage atelier ARDUINO
01/12/2012/SMS - 1ère mise en ligne sur le forum amicro-actif
=================================================================================
Ce sketch génère la  page HTML sur petit Serveur WEB embarqué sur une carte
ARDUINO ETHERNET, donc accessible en réseau local.
La page HTML permet à partir d'un PC ou d'un mobile:
- de consulter l'état de ses entrées/sorties numériques et analogiques
- de commander l'état de ses entrées sorties numériques.

--- OBJECTIF DE L'ATELIER ----
  * Appliquer quelques fonctions de base de l'ARDUINO (pinMode, digitalWrite, digitalRead, analogRead)
  * Apréhender les mécanismes de contrôle d'un processus distant via le reseau,
  * Aperçu sur la génération d'une page HTML interactive (formulaire simple,
  * tableaux de valeurs, méthode POST, GET, etc)
  * Découverte des mécanismes de contrôle du réseau: fonctions Ethernet.begin, server.available etc

--- MATERIEL NECESSAIRE ---
  * une carte ARDUINO Ethernet
  * utilisation de la LED embarquée sur la carte

--- MISE EN OEUVRE ---
1) Connecter la carte au réseau local
2) Charger le programme (sketch) sur la carte ARDUINO (via la liaison série)
3) Vérifier la présence de la carte sur le réseau (commande "ping")
4) Sur le navigateur internet du PC, taper l'adress réseau de la carte, afin d'afficher la page WEB


 --- HISTORIQUE DU MODULE ---
 Ce code est du domaine public
 - Sources - inspirées de http://arduino.cc/forum/index.php/topic,33290.0.html
  - traduit et amélioré le 1 Nov. 2012 par Serge (SMS) pour l'Atelier AMICRO/ARDUINO http://www.amicro44.com

--- AMELIORATIONS A PREVOIR EN ATELIER ---
 - améliorer la présentaion de la page WEB(mise en forme, tableaux de valeurs)
 - améliorer et fiabiliser l'interface de réglages analogiques, par exemple
   en y incorporant des objets graphiques sous JavaScript tels que :
   Gauges, vu-mètres, etc... http://www.highcharts.com/demo/gauge-vu-meter
 - Donnez libre cours à votre créativité !!!!  
  -
 --- 05/12/2014: ****BUG A CORRIGER**** (Piste pour Aurélien) : Le rafraîchissement de la page en ligne transmet systématiquement deux le "GET" successifs à la carte,
   ce qui fait tomber la télécommande... (un GET "normal" sur le "ON" voyant suivi d'un GET "parasite" contenant "favicon.icon" ...
   Solution possible -> Eliminer la demande parasite en s'inspirant du filtre suivant:
      SI       réception = "GET /?L=1 HTTP/1.1" ALORS Allumer Led
      SINON SI réception = "GET /?" ALORS Eteindre Led
      SINON ne rien faire (cas de GET /favicon.ico et autres éventuels spams intenpestifs)
=======================================================================================*/
#include <SPI.h>            // Serial Peripheral Interface (Interface Série pour périphérique)
                            // http://www.mon-club-elec.fr/pmwiki_reference_arduino/pmwiki.php?n=Main.LibrairieSPI
#include <Ethernet.h>       // http://www.mon-club-elec.fr/pmwiki_reference_arduino/pmwiki.php?n=Main.LibrairieEthernet
#include <String.h>

// Définition des constantes
#define NbCarMax  30        // taille du buffeur d'échanges ETH
#define ledPin  9           // N° de la LED (9 sur carte ETH, 13 sur carte UNO)


  // Données générales
  boolean DEBUG = true;      // pour afficher ou pas les traces de TEST
  
  // Données de communications
 // byte ip[] = { 192, 168, 2 , 50 };      // Si Atelier CAPELLIA
 // byte gateway[] = { 192, 168, 2, 1 };   // Si Atelier CAPELLIA
  byte ip[] = { 192, 168, 1 , 110 };       // Si domicile SMS
  byte gateway[]  = { 192, 168, 1, 1 };    // Si domicile SMS
  byte subnet[] = { 255, 255, 255, 0 };                  
  byte mac[] = { 0x90, 0xA2, 0xDA, 0x00, 0x72, 0x6B }; //Carte ETH_SMS_01
  int posit = 0;                           // retour recherche sous-chaîne dans chaîne
  EthernetServer server(80);               //déclaration de server port
  String BufReception = String(NbCarMax);  //buffeur de réception réseau
  boolean LEDON = false;                   //Etat de la LED

// Données process ARDUINO
  int Ana0, Ana1, Ana2, Ana3, Ana4, Ana5, Ana6=0; // Broches ANALOGIQUES
  int pin0, pin1, pin2, pin3, pin4, pin5, pin6, pin7, pin8, pin9, pin10, pin11, pin12=0; // Broches E/S TOR,



//==== INITIALISATION DE LA CARTE
void setup(){
  Serial.begin(9600);    // Initialise la laison série
  Serial.flush();
  //
  Ethernet.begin(mac, ip, gateway, subnet);      
  delay(50);  
  Serial.print("Serveur ARDUINO- adresse IP= ");   Serial.println(Ethernet.localIP());  
  //
  // init des ETOR (inutilisées dans cet exemple)
  for (int i=2;i<9;i++) {  //pins 0 and 1 réservé aux communications séries
    pinMode(i,INPUT);
    }
    // initialisation des STOR
   digitalWrite(2, HIGH);    digitalWrite(3, LOW);    digitalWrite(4, HIGH);
   digitalWrite(5, LOW);     digitalWrite(6, HIGH);   digitalWrite(7, LOW);

  // init de la STOR qui sera allumée ou éteinte à la demande du Browser Internet
  pinMode(ledPin, OUTPUT); // *****  9 sur carte  UNO ETH, 13 sur carte UNO simple
  BufReception="\0"; // RAZ du buffeur de réception des échanges GET/POST
  
  Serial.print("FIN INIT");

} // fin traitements d'initialisation

//==== TRAITEMENT PRINCIPAL
void loop(){
      
  // On regarde en permanence si un message est en cours de réception Ethernet
  EthernetClient client = server.available();
  
    if (client) { // Si oui, on déclenche les traitements  
    // Lectures des valeurs TOR stockées dans variables provisoires
    pin2  = digitalRead(2);     pin3 = digitalRead(3);     pin4 = digitalRead(4);
    pin5 = digitalRead(5);      pin6 = digitalRead(6);     pin7 = digitalRead(7);
    delay(10);  

    // Idem pour valeurs analogiques avec adaptation du facteur d'échelle (octets)
    Ana0 = analogRead(0)/4;
    delay(10);                         // Temps de latence entre 2 décodages
    Ana1 = analogRead(1)/4;
    delay(10);
    Ana2 = analogRead(2)/4;
    delay(10);
    Ana3 = analogRead(3)/4;
    delay(10);
    Ana4 = analogRead(4)/4;
    delay(10);
    Ana5 = analogRead(5)/4;
    delay(10);  

    // TRAITEMENT DE LA DEMANDE DU BROWSER INTERNET
    while (client.connected()) { // analyse des caractères reçus
      if (client.available()) {        // Tant que la connexion est valide
        char c = client.read();         // Reception caractère par caractères jusqu'au  '\n' pour le .length()
        // --- PRISE EN COMPTE DES ORDRES DE TELECOMMANDE
        if (BufReception.length() < NbCarMax) {
          BufReception += c; //SMS: j'ai supprimé le  String.append(c) qui bugait dans la classe string!!!
        }  
        // ----
        if (c == '\n') { // On a reçu le message complet pour préparer la page
          Serial.print("\nRECU [");Serial.print (BufReception.length());Serial.print("] car.->"); Serial.print(BufReception); // Affichage de la demande reçue
          // Analyse de la demande
          posit = BufReception.indexOf("L=1");  // on détermine la commande STOR à effectuer
          if (DEBUG){Serial.print("posit= ");Serial.println(posit);} // Affichage de la demande reçue
          if(posit>0) { //allumage led
            digitalWrite(ledPin, HIGH); // set the LED on
            LEDON = true;
          }
          else{ //extinction led
            digitalWrite(ledPin, LOW);
            LEDON = false;
          }
          BufReception="\0"; // RAZ pour prochaine demande après prise en compte de posit ;=)

          // --- Réponse au client ---
          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println();
          //--
          // --- ELABORATION & TRANSMISSION DE LA PAGE QUI SERA AFFICHEE DANS LE BROWSER DU CLIENT
          client.println("<html>");
          client.println("<head>");
          client.println("<title>Serveur Web Arduido</title>");
          client.println("</head");
          //--
          client.println("<body>");
          client.println("<center>");
        client.println("<font size = 5 color='Black' align=center>*** SERVEUR HTTP embarqué sur carte ARDUINO ***</font><br>");
        client.println("<font size = 5 color='Grey' align=center>*** Accès via laison ETHERNET ***</font>");
          client.println("<hr align=center width =60%/>");
        client.print("<p>Bonjour, amis de L´AMICRO,<br><br>Cette page vous permet de consulter ");
        client.print("l'état des entrées-sorties numériques et analogiques de votre carte ARDUINO<br>");
        client.println("et de commander une LED de la carte.<br>");
          client.println("</p>");
          client.println("<hr align=center width =60%/>");
          client.println("</center>");
          //--
          //positionnement de la check-box
          client.println("<center>");
          client.println("<h0>Commander la LED</h0>");
          client.println("<form method=get name=LED><input type=CHECKBOX name=L value=1>LED<input type=submit value=Valider></form>");
          //printing LED status
          client.print("<font size='3'>Etat de la LED: ");
          if (LEDON)
             client.println("<font color='green' size='3'><b>ON</b>");
          else
            client.println("<font color='red' size='3'><blink><b>OFF</b><blink>");
          //--
          //affichage des valeurs TOR
          client.print("<table border=2 cellspacing=3><tr><td colspan=6 align=center bgcolor='yellow'>");
          client.print("<font color='black'>Etat des entrees TOUT-OU-RIEN:</font></td>");
          client.print("<tr><td>Tor2</td><td>Tor3</td><td>Tor4</td><td>Tor5</td><td>Tor6</td><td>Tor7</td></tr>");
          client.print("<tr><td>"); client.print(pin2,BIN);
          client.print("</td><td>"); client.print(pin3,BIN);
          client.print("</td><td>"); client.print(pin4,BIN);
          client.print("</td><td>"); client.print(pin5,BIN);
          client.print("</td><td>"); client.print(pin6,BIN);
          client.print("</td><td>"); client.print(pin7,BIN);
          client.print("</td></tr>");
          client.print("</table");
          // client.println("<b/>");
          client.println("<br/>");  
          //--
          //affichage des valeurs ANALOGIQUES
          client.print("<table border=2 cellspacing=3><tr><td colspan=6 align=center bgcolor='yellow'>");
          client.print("<font color='black'>Etat des entrees ANALOGIQUES:</font></td>");
          client.print("<tr><td>Ana1</td><td>Ana2</td><td>Ana3</td><td>Ana4</td><td>Ana5</td><td>Ana6</td></tr>");
          client.print("<tr><td>"); client.print(Ana0,DEC);
          client.print("</td><td>");  client.print(Ana1,DEC);
          client.print("</td><td>");  client.print(Ana2,DEC);
          client.print("</td><td>");  client.print(Ana3,DEC);
          client.print("</td><td>");  client.print(Ana4,DEC);
          client.print("</td><td>");  client.print(Ana5,DEC);
          client.print("</td></tr>");
          client.print("</table");
          //--
          // client.println("<b/>");
          client.println("<br/>");
          client.println("</center>");
 
          client.println("</body>");
          client.println("</html>");
 
          //préparation du prochain échange
          digitalWrite(2, !pin2); // "bidouille" pour faire forcer en aléatoire les ETOR ...
          digitalWrite(3, !pin3); //  je ne m'étalerais pas sur ma méthode brutale ....
          digitalWrite(4, !pin4);
          digitalWrite(5, !pin5);
          digitalWrite(6, !pin6);
          digitalWrite(7, !pin7);        
  
          // déconnection du client
          BufReception="\0"; // RAZ du buffeur de réception pour la prochaine demande
          Serial.println("Fin page");
          Serial.flush();  //*SMS*
          client.stop();
        
        } // FIN SI c == '\n' (elaboration de la page)
      } // Fin  Si client.available
    } // Fin While client.connected
  } // Fin Si Client
} // FIN Loop

//==== PROCEDURES ET FONCTIONS COMPLEMENTAIRES
void generer_page_html(){  // en réserve
// sans objet
}

_________________
"Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie." Confucius
avatar
Serge
Admin

Messages : 58
Date d'inscription : 12/10/2011

http://www.amicro44.com

Revenir en haut Aller en bas

Voir le sujet précédent Voir le sujet suivant Revenir en haut

- Sujets similaires

 
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum