Bonjour à tous,
(EDIT: en post #25 la meme chose pour une carte esp8266 genre Wemos D1 R2)
comme j'ai vu pas mal de questions concernant l'usage d'un shield Ethernet pour permettre de piloter son Arduino par une page web, ou simplement d'afficher de l'information en provenance de son Arduino sur un navigateur, je me suis dit qu'en cette fin de journée pluvieuse ce serait un petit exercice sympa à partager.
Le montage physique est super simple:
Vous connectez le shield ethernet sur votre UNO
Vous connectez la pin 7 à l'Anode (longue broche) d'une LED rouge (fil rouge sur la photo)
Vous connectez la cathode de la LED à une Résistance de limitation de courant (200 à 300Ω)
Vous connectez l'autre côté de la résistance au GND de la carte arduino (fil vert sur la photo)
Vous branchez un câble ethernet relié à votre réseau local dans la prise ethernet du shield
Vous branchez le câble USB vers votre ordinateur favori et chargez le programme, ouvrez la console à 115200 bauds
Vous prenez un navigateur web d'un ordinateur quelconque qui se trouve sur le réseau local pour vous connecter
L'idée est d'afficher une page HTML qui permet
- de modifier l'état d'une PIN pour allumer ou éteindre la LED
- de visualiser et interagir avec des variables dans le programme (V et W)
Modification de l'état d'une pin
on se connecte depuis un navigateur sur son arduino par le biais de la liaison ethernet locale et de son shield ethernet. le programme vous dira quelle URL utiliser, ouvrez la console à 115200 bauds et vous n'aurez plus qu'à copier coller l'URL. Pour moi c'est http://192.168.1.29
Voilà ce que l'on fait:
(1) on clique sur le bouton "LED ON"
(2) ça envoie un requête à votre Arduino sous la forme
http://192.168.1.29/[color=red]LED=1[/color]
. L'aduino reçoit la requête, va analyser le LED=1 pour comprendre ce que vous voulez faire, modifier l'état de la LED (l'allumer) puis l'Arduino va(3) régénérer la page web mais ce coup ci de bouton va dire "LED OFF" (pour éteindre la LED)
Modification d'une variable dans le programme
De la même manière quand vous
(1) cliquez sur le bouton [b]V +1[/b]
(2) une URL déclenchera une requête particulière http://192.168.1.29/[color=red]V=1[/color]
. L'aduino reçoit la requête, va analyser le V=1 pour comprendre ce que vous voulez faire, modifier la valeur de la variable V et
(3) afficher à nouveau la page, avec la valeur de V modifiée
Il en va de même pour W mais ici le code incrémente ou décrémente de 5 en 5 suivant le bouton et l'URL générée est http://192.168.1.29/[color=red]W=5[/color]
Enfin Si vous cliquez sur le bouton RESET, l'URL générée tient compte des valeurs des variables et va envoyer par exemple http://192.168.1.29/[color=red]LED=0,V=0,W=-5[/color]
. L'aduino reçoit la requête, va analyser chacune des commandes séparées par des virgules et faire ce qui est demandé. ça vous donnera l'occasion de voir comment utiliser la fonction strtok()
qui est bien pratique pour l'analyse de chaînes de caractères.
Bien sûr si vous tapiez directement l'URL http://192.168.1.29/[color=red]W=-70[/color]
à la main, le code fonctionnera et reconnaitra que vous voulez modifier la variable W et ajouter -70 (donc soustraire 70).
C'est pas trop commenté mais bon, ça devrait se lire sans trop de problème.
le code de connexion au réseau provient de l'exemple standard DHCP fournit avec l'IDE et donc dépend d'un serveur DHCP (qui vous fournit une adresse IP quand vous vous branchez sur le réseau, toutes les box internet font cela en standard) - sinon faudra modifier quelques lignes pour passer en adresse statique sur votre réseau (cf la doc standard de la libraire Ethernet)
La partie serveur HTTP provient pour la base de l'exemple standard /WebServer fournit avec l'IDE.
J'ai organisé le code en gros comme ceci:
la loop() vérifie que le shield dispose toujours d'une adresse IP par renewDHCPLease())
puis appelle handleClient();
. Cette fonction regarde s'il y a une requête HTTP qui arrive, si oui trouve la partie qui commence par "GET /...." car c'est notre commande (le reste c'est du bavardage du protocole HTTP) et extrait ce que je mets en rouge dans les URL ci dessus, par exemple [color=red]LED=1[/color]
(stockée dans la chaîne urlCommand
)
Une fois que la requête HTTP a été entièrement lue (elle se termine par une ligne vide) alors on appelle la fonction handleCommand();
qui va d'abord analyser la commande par la fonction parseCommand();
et effectuer ce qui est demandé puis refabriquer la page web avec la fonction sendHTTPResponse()
et clore la connexion.
ethernetShieldDemo.ino (8.71 KB)