Serveur Web ARDUINO sur réseau local
Page 1 sur 1
Serveur Web ARDUINO sur réseau local
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
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 -> https://i.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)
- 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
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 -> https://i.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
Re: Serveur Web ARDUINO sur réseau local
Après 2 années d'un profond sommeil ... 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 -> https://i.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)
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 -> https://i.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
}
Sujets similaires
» Pour démarrer ce sujet ...
» Station météo pilotée par carte ARDUINO
» Mettre en réseau W7
» PING réseau à partir d'appareils mobiles ANDROÏD
» W10.V1909 bug à signaler! blocage de l'accès à un disque réseau.
» Station météo pilotée par carte ARDUINO
» Mettre en réseau W7
» PING réseau à partir d'appareils mobiles ANDROÏD
» W10.V1909 bug à signaler! blocage de l'accès à un disque réseau.
Page 1 sur 1
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum
|
|
Dim 2 Fév 2020 - 11:55 par Serge
» Parametrage de Firefox pour l'ouverture instantanée de gmail sur un clic d'adresse mail.
Jeu 31 Oct 2019 - 17:57 par Serge
» Gestion du port GPIO à partir du WEB (sans utilisation du fichier <sudoers>)
Jeu 5 Juil 2018 - 21:22 par gbern
» Pb avec sudo apt-get update
Mer 4 Juil 2018 - 21:51 par gbern
» Prise de main à distance VNC serveur (ou x11VNC) - réglages de la résolution graphique pour sortie HDMI
Jeu 19 Avr 2018 - 11:48 par Serge
» Les versions de RASPBERRY Pi ....
Jeu 12 Avr 2018 - 17:33 par Christian-F
» Les versions de Ubuntu MATE
Dim 8 Avr 2018 - 11:25 par Serge
» Application de sauvegarde du contenu de ton mobile
Sam 7 Avr 2018 - 8:54 par Serge
» Installation de XnViewMP 64 bits sur RASPBIAN
Sam 7 Avr 2018 - 8:08 par Serge