Académique Documents
Professionnel Documents
Culture Documents
Aprs avoir branch le shield sur la carte, il est tant de sintresser la bibliothque Wifi
officielle. Celle-ci est relativement simple dutilisation, si vous avez dj utilis le shield Ethernet,
alors vous constaterez de grandes similitudes.
Dans un tout premier temps, il faut inclure deux librairies, la SPI, pour communiquer avec le
shield et le wifi pour faciliter cette communication.
#include <SPI.h>
#include <WiFi.h>
Ensuite, pour dmarrer la liaison wifi, il existe une fonction trs simple : begin. En fonction type
de connexion (sans mot de passe, WPA, WEP), il vous faudra soit seulement le nom du rseau,
soit son nom et le mot de passe, et dans le cas du WEP rajouter son KeyIndex. Cela nous donne
les lignes suivantes :
int keyIndex = 0;
void setup() {
Vous remarquerez que jai rcuprer le retour de la fonction begin dans la variable status, cela
me permet de vrifier le statut du shield (connect, absent), cela nous permet de rajouter
quelques scurits, comme celle-ci qui vrifie que le shield est bien prsent (notez bien que
dans ce cas ce nest pas la variable status mais une fonction de la librairie, car on na pas encore
appel la fonction begin) et que lon est bien connect :
int keyIndex = 0;
void setup() {
Serial.begin(9600);
if (WiFi.status() == WL_NO_SHIELD) {
Serial.println("WiFi shield non connecte");
// don't continue:
while(true);
}
status = WiFi.begin(ssid); // reseau sans mot de passe
Mais il existe une manire plus intelligente de tester si lon est connect, en effet, on peut faire
une boucle que tourne en boucle tant que lon est pas connect, cela ressemble ce bout de
code :
Ensuite, il peut tre utilise dafficher les diffrents paramtres du shield une fois connect, pour
retrouver son IP local par exemple, pour cela, la documentation dArduino nous fournit une
fonction toute faite :
void printWifiStatus() {
// print the SSID of the network you're attached to:
Serial.print("SSID: ");
Serial.println(WiFi.SSID());
Voila, il me semble que vous tes bon au niveau des rglages! Nous allons ensuite passer aux
deux fonctions du shield : le serveur et le client.
Le mode serveur
Voila un exemple de la documentation officielle Arduino, qui affiche une page web contenant la
valeur de 6 potentiomtres relis lArduino. Nous allons dcortiquer le code ensemble :
/*
WiFi Web Server
A simple web server that shows the value of the analog input pins.
using a WiFi shield.
Circuit:
* WiFi shield attached
* Analog inputs attached to pins A0 through A5 (optional)
*/
#include <SPI.h>
#include <WiFi.h>
WiFiServer server(80);
void setup() {
//Initialize serial and wait for port to open:
Serial.begin(9600);
while (!Serial) {
; // wait for serial port to connect. Needed for Leonardo only
}
void loop() {
// listen for incoming clients
WiFiClient client = server.available();
if (client) {
Serial.println("new client");
// an http request ends with a blank line
boolean currentLineIsBlank = true;
while (client.connected()) {
if (client.available()) {
char c = client.read();
Serial.write(c);
// if you've gotten to the end of the line (received a newline
// character) and the line is blank, the http request has ended,
// so you can send a reply
if (c == '\n' && currentLineIsBlank) {
// send a standard http response header
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println("Connection: close"); // the connection will be
closed after completion of the response
client.println("Refresh: 5"); // refresh the page automatically
every 5 sec
client.println();
client.println("<!DOCTYPE HTML>");
client.println("<html>");
// output the value of each analog input pin
for (int analogChannel = 0; analogChannel < 6; analogChannel++) {
int sensorReading = analogRead(analogChannel);
client.print("analog input ");
client.print(analogChannel);
client.print(" is ");
client.print(sensorReading);
client.println("<br />");
}
client.println("</html>");
break;
}
if (c == '\n') {
// you're starting a new line
currentLineIsBlank = true;
}
else if (c != '\r') {
// you've gotten a character on the current line
currentLineIsBlank = false;
}
}
}
// give the web browser time to receive the data
delay(1);
void printWifiStatus() {
// print the SSID of the network you're attached to:
Serial.print("SSID: ");
Serial.println(WiFi.SSID());
Ensuite vient tout la partie dinitialisation que lon a dj vu ensemble. Mais on remarque aussi
le server.begin () qui comme son nom lindique dmarre le serveur.
Puis vient la partie intressante. Dans la fonction loop() de notre programme on regarde si un
client essaye de se connecter notre serveur de cette faon :
Ces manipulations sont un peu plus complexes comprendre mais rien de bien inquitant. Tout
dabord, on peut rcuprer les caractre que nous envoie le client laide de client.read(); qui
marche comme pour la liaison srie en quelque sorte. On sait aussi quune requte HTTP finie
par une ligne blanche, autrement dit, lorsque lon trouvera deux /n la requte sera termine et
on pourra crire notre rponse. On peut donc maintenant comprendre le code suivant :
if (client) {
Serial.println("new client");
boolean currentLineIsBlank = true;
while (client.connected()) {
if (client.available()) {
char c = client.read();
Serial.write(c);
// pour ecrire vos propres reponses, renseignez vous sur le protocol HTTP,
voila une reponse classique
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println("Connection: close");
client.println("Refresh: 5");
client.println();
// maintenant place au code HTML
client.println("<!DOCTYPE HTML>");
client.println("<html>");
for (int analogChannel = 0; analogChannel < 6; analogChannel++) {
int sensorReading = analogRead(analogChannel);
client.print("analog input ");
client.print(analogChannel);
client.print(" is ");
client.print(sensorReading);
client.println("<br />");
}
client.println("</html>");
break;
}
if (c == '\n') {
// On commence une nouvelle ligne
currentLineIsBlank = true;
}
else if (c != '\r') {
currentLineIsBlank = false;
}
}
}
delay(1);
client.stop();
Serial.println("client deconnecte");
}
Comme vous laurez vu, ds que le client se dconnecte, on appelle la fonction client.stop() pour
stopper la connexion de notre cot aussi.
Voila, vous savez maintenant programmer un serveur web avec votre Arduino, notez bien que
vous ntes pas obligs de suivre le protocole HTTP mais que vous pouvez aussi inventer les
vtres si vous avez des besoins spcifiques.
Le mode client
Voila maintenant un code, pris de la documentation officielle encore une fois, qui envoie par
liaison srie la rponse HTML de google sur la recherche de tutoarduino , nous allons de la
mme faon dcortiquer ce code :
/*
Web client
Circuit:
* WiFi shield attached
#include <SPI.h>
#include <WiFi.h>
void setup() {
//Initialize serial and wait for port to open:
Serial.begin(9600);
while (!Serial) {
; // wait for serial port to connect. Needed for Leonardo only
}
void loop() {
// if there are incoming bytes available
// from the server, read them and print them:
while (client.available()) {
char c = client.read();
Serial.write(c);
}
// do nothing forevermore:
while(true);
}
}
void printWifiStatus() {
// print the SSID of the network you're attached to:
Serial.print("SSID: ");
Serial.println(WiFi.SSID());
Dans ce code, on retrouve deux nouvelles variables, une chane de caractre server qui contient
lURL du serveur auquel on veut se connecter, cela peut aussi tre une IP. Et une variable de
type WifiClient que lon a dj rencontr auparavant, qui va nous servir interagir avec le
serveur de google.
if (client.connect(server, 80)) {
Serial.println("connected to server");
// Make a HTTP request:
client.println("GET /search?q=arduino HTTP/1.1");
client.println("Host: www.google.com");
client.println("Connection: close");
client.println();
}
Ensuite, on peut agir dans la fonction loop() comme en quelque sorte avec une liaison srie, on
utilise la fonction read() pour lire les caractres envoys, et on peut dans cet exemple les
envoyer par liaison srie, ce qui nous donne ce code :
while (client.available()) {
char c = client.read();
Serial.write(c);
}
Enfin, il faut penser vrifier que lon est toujours connect au serveur, pour pouvoir fermer la
connexion au besoin, pour cela, il existe la fonction connected() qui renvoie true ou false, on
arrive donc ce bout de code :
if (!client.connected()) {
Serial.println();
Serial.println("deconnecte du server");
client.stop();
// on arrete le programme
while(true);
}
Et voila, ce tutoriel touche sa fin ,normalement vous tes capables de manipuler votre shield
comme vous le souhaitez. Pour plus de dtails sur des fonctions plus techniques, pensez vous
rendre sur la documentation officielle ou poser une question en commentaire ou sur notre
forum, rponse rapide assure!!