Vous êtes sur la page 1sur 90

AVANT DE COMMENCER

la premire connexion du IoT-WiFi-Boards (ci-aprs galement


appel NanoESP) il peut arriver que lordinateur ne trouve pas automatiquement le
pilote indispensable pour le convertisseur srie USB. Si cest le cas, vous devez
tlcharger le pilote depuis la page www.iot.fkainka.de/driver et linstaller manuellement. Dans le logiciel Arduino vous pouvez ensuite slectionner le port et
comme carte Arduino Nano (processeur : Atmega328). Ensuite le contrleur
doit tre prt lemploi.
Pour travailler avec le moniteur srie vous devez en effet procder des paramtrages. Le dbit en bauds utilis ici est 19 200 Bauds. Pour envoyer des instructions vous devez dautre part slectionner loption CR et NL ct du menu pour
le dbit en bauds.

Les paramtrages corrects dans lenvironnement Arduino

Jai travaill avec les versions Arduino IDE 1.6 5 et 1.6 6. Les versions plus anciennes peuvent provoquer des problmes. Vous trouverez la version actuelle

Arduino-IDE sur le site internet www.arduino.cc.


En cas de difficults ou de problmes avec la carte ou le kit dapprentissage vous
pouvez trouver de laide tout moment sur la page webwww.iot.fkainka.de. Sur
cette page vous trouverez de plus un forum, de nouveaux projets dutilisateurs et
galement tous les programmes prsents ici dans la toute dernire version.
Dans le kit dapprentissage se trouve une platine dexprimentation sur laquelle
vous pouvez enficher le
NanoESP, comme indiqu sur la figure ci-dessous. Cela laisse plus de place pour
lexprimentation pendant que le module WLAN derrire dpasse sur la platine
dexprimentation. Le cble micro USB peut ensuite tre enfich, comme indiqu
sur la figure dans la section suivante, et la perturbation est minimale. Des figures
de montage dtailles se trouvent dans les chapitres respectifs.

La carte IoT-WiFi (NanoESP)


Llment principal de ce kit dapprentissage est la carte IoT-WiFi (NanoESP).
Comme on le remarque trs bien sur la carte, celle-ci est constitue de deux composants. Sur la moiti gauche il sagit dun systme microcontrleur compatible
Arduino qui est comparable au nano Arduino. La partie droite est le module WLAN
avec la dsignation ESP8266.
Ces deux composants communiquent entre eux par linterface srie gnre par
logiciel.

NanoESP sur la platine dexprimentation

Disposition des broches de la platine


Sur la platine il y a beaucoup dlments diffrents, tels que les broches (pin),
parmi lesquels certains ont une fonction particulire, ou galement des DELs, dont
les fonctions ne sont pas toujours claires au premier coup d'il. Pour que vous ne
perdiez pas la vue densemble, les fonctions et dsignations les plus importantes
des diffrents lments sont rpertories dans les figures suivantes.
Les broches les plus importantes et dsignations de la platine

Le module WLAN est contrl par ce quon appelle les commandes AT. La partie
Arduino de la platine est relie au module WLAN par les broches 11 et 12. Un petit
circuit convertit le niveau 5 V en niveau compatible 3,3 V. Vous ne devez donc pas
utiliser les broches 11 et 12 dans vos propres projets.
Dautres proprits hardware importantes de la carte sont brivement numres
dans le tableau ci-dessous.

Donnes techniques
Microcontrleur :
ATmega328
Mmoire-flash :
32 kB (dont 0,5 kB pour le bootloader)
SRAM (mmoire vive statique) : 2 kB
EEPROM (mmoire morte effaable lectriquement et programmable) :
1 kB
Signal dhorloge :
16 MHz
Broches E/S :
20 (dont 2 pour la communication avec le module
WLAN)
U dont MLI :
6
U dont entres analogiques : 6
USB pour puce de srie :
CH340G
Tension de service :
5V
Tension dentre recommande : 7 12 V
Courant maximum par broche E/S :
40 mA
Charge admissible de la sortie 3,3 V : 50 mA
Module WLAN :
SPI-Flash
Tension de service :
Normes WLAN :
Modes WLAN :
Firmware :
Divers :

ESP8266
4 Mbit
3,3 V
802.11 b/g/n
Wi-Fi Direct (P2P), Soft-AP
AT-Firmware Version 0.22
Pile TCP/IP intgre
Puissance de sortie +19,5 dBm en mode 802.11b

Faible puissance CPU 32 bit intgre


Communication via UART

ELEMENTS DU KIT
DAPPRENTISSAGE
Ci-dessous se trouve un aperu des lments contenus dans le kit
dapprentissage.
1
carte IoT-WiFi (NanoESP)
1
platine dexprimentation
1m
fil lectrique
2
boutons-poussoirs
1
cosse clip 9 V
1
DEL (rouge)
1
DEL RGB (4 pattes de raccordement)
1
rsistance 10 kOhm (marron, noire, orange)
1
rsistance 1 kOhm (marron, noire, rouge)
1
phototransistor (2 pattes de raccordement)
1
NTC 10 kOhm
1
haut-parleur Piezo
1
potentiomtre 10 kOhm avec bouton rotatif rouge

CONNAITRE LE MODULE
Ce premier chapitre aborde les fonctions de base du module WLAN. Le module
est contrl par ce quon appelle les commandes AT. Vous retrouverez tous les
exemples de programmes utiliss ainsi que laide et dautres information sur
www.iot.fkainka.de

Le plus simple est de tlcharger le rpertoire zip complet et de copier le dossier


dcompress compltement dans votre dossier Sketch. Ensuite vous pouvez
ouvrir tous les programmes lun aprs lautre confortablement depuis linterface
Arduino.

1.1 | Commandes AT essentielles


Cest tout simplement en lessayant que lon obtient la meilleure premire impression des commandes AT. Cest pourquoi vous allez vous familiariser dans cette
section avec quelques unes des commandes de base du module.
Ouvrez pour cela le programme P01_SoftwareSerial dans Arduino-IDE. Il sagit
ici dun programme simple qui ne fait rien de plus que transfrer les donnes reues par linterface hardware du microcontrleur au contrleur ESP par linterface
logiciel dfinie. Tout fonctionne galement en sens inverse. Comme on peut le voir
dans le code source, les deux connexions de linterface logiciel sont les broches
11 et 12. Celles-ci ne doivent pas tre utilises comme broches GPIO dans vos
propres projets. Dautre part, vous avez besoin de la librairie SoftwareSerialLibrary, qui est dj prinstalle dans la plupart des versions Arduino. Dans le
cas contraire, vous devez tlcharger la libraire par le gestionnaire.
Une fois le programme tlcharg, vous pouvez dmarrer le moniteur srie de
linterface Arduino. Avant de le lancer, vous devez encore procder deux paramtrages importants sur le moniteur srie, savoir placer le dbit en bauds sur
19 200 dans le coin infrieur droit et procder au paramtrage CR et NL dans la
case ct gauche.
Vous pouvez maintenant dj voir un message, savoir AT et quelques lignes en
dessous OK. La commande AT a t envoye par le microcontrleur au module
ESP et le module a rpondu par OK. partir de l vous pouvez remarquer que le
module WLAN fonctionne et est prt tre utilis.

Paramtrages du terminal : CR et NL et un dbit en bauds de 19 200

1.1.1 | Commandes de base


Vous pouvez dsormais tester certaines commandes de base du module, en saisissant simplement la commande et en lenvoyant au module par [Enter].
Lutilisation des majuscules pour linstruction a son importance ici. Vous pouvez
transmettre votre premire instruction en saisissant
AT

dans le moniteur en srie et en appuyant sur [Enter]. Le programme tlcharg


transmet linstruction au module ESP qui rpond par retour AT et ensuite OK .
La commande suivante que vous pouvez tester est :
AT+GMR

Le firmware actuel et le numro de version sont affichs par cette instruction.


Avec linstruction
AT+RST

Vous pouvez rinitialiser le module. Vous voyez dabord dans le terminal quelques
caractres illisibles et au bout readycomme caractre, indiquant que le module est
prt maintenant. Une autre instruction est :
ATE0

Avec celle-ci on peut dsactiver ce quon appelle lcho du module. Cela signifie
que vous navez pas reu la commande envoye mais seulement la rponse. Si
par exemple vous envoyez AT il ny a pas dabord AT et ensuite OK, mais seulement OK en retour. Pour vos premiers pas, il est cependant souhaitable que lcho
ATE1

soit de nouveau activ.

Premiers essais avec les instructions AT

1.1.2 | Instructions WLAN


Avec les commandes WLAN suivantes vous pouvez modifier les proprits WLAN
du module. Avec la plupart des instructions vous pouvez non seulement dfinir un
tat mais galement vrifier ltat actuel. Cela se fait en ajoutant un point
dinterrogation directement aprs linstruction, p. ex.
AT+CWMODE?

Comme valeur de retour est gnralement prsente


+CWMODE=2

suivie de OK. Si vous saisissez

AT+CWMODE=?

Le module vous rpond avec les paramtres possibles de linstruction, savoir ici
1-3. AvecCWMODE il sagit dailleurs de linstruction avec laquelle vous pouvez
dterminer le mode WLAN.
Il y a trois modes de fonctionnement que je peux appeler lun aprs lautre.
1 AT+CWMODE=2 le module comme point daccs (Access Point mode AP)
la livraison, le module est un point daccs. Cela signifie que vous pouvez enregistrer avec un appareil compatible WLAN, comme un smartphone ou un PC, une
connexion directe avec le module. Pour cela, recherchez simplement le WLAN ouvert avec le nom NanoESP et connectez-le avec. En rglage usine, aucun mot de
passe nest attribu de faon ce que la connexion ne reprsente aucun problme.
Lorsque vous tes connect au module, vous navez pas de connexion internet car
le module nest pas un routeur avec une propre connexion au rseau tlphonique.
Ce mode WLAN est nanmoins utile si vous avez besoin par exemple dun rseau
ferm scuris. propos de scurit : Il est galement possible dattribuer un mot
de passe au rseau et ce par linstruction :
AT+CWSAP

Des paramtres doivent encore tre indiqus et dans lordre et spars par des
virgules :
U le nom du rseau entre guillemets,
U le mot de passe entre guillemets,
U lidentifiant du canal (Channel ID de prfrence une valeur entre 1 et 13),
U et le mode de cryptage (valeur de 0 4).
Un paramtrage potentiel serait :
AT+CWSAP="MyNanoESP","MyPassword",5,3

Aprs un bref moment apparat OK comme confirmation. Si ERROR apparat,


vrifiez nouveau vos donnes, avant tout les guillemets. Si cependant ERROR
apparat, vrifiez si le CWMODE est vraiment 2.
Si tout a fonctionn, vous pouvez vous connecter avec un appareil compatible
WLAN avec la platine. Vous pouvez afficher tous les appareils connects au module avec les adresses IP et MAC par linstruction
AT+CWLIF

Module en mode socle LIP de lordinateur connect est marque.

2 AT+CWMODE=1 Module en mode socle


Avec linstruction
AT+CWMODE=1

Mettez le module en mode socle. Ce mode vous permet de mettre en place une
connexion votre routeur WLAN. De ce fait, le module est galement connect
internet et a plusieurs possibilits.
Vous pouvez dabord lister avec linstruction
AT+CWLAP

tous les rseaux porte et ainsi vrifier si votre rseau est dans le rayon de rception. Pour pouvoir tablir une connexion votre routeur, vous avez besoin de
linstruction

AT+CWJAP

Celle-ci, comme linstruction CWSAP, a des paramtres importants, savoir le


nom du rseau WLAN (galement appel SSID) et le mot de passe, les deux de
nouveau entre guillemets et spars par une virgule. La mise en place dune connexion un deuxime module, paramtr avec les donnes mentionnes dans la
section prcdente, ressemblerait donc :
AT+CWJAP="MyNanoESP","MyPassword"

La mise en place de la connexion peut durer quelques secondes et devrait ensuite


renvoyer OK. Vous pouvez dailleurs appeler lIP du module attribue par le routeur par linstruction
AT+CIFSR

. Cela sera important plus tard si vous voulez tablir une connexion au serveur
TCP du module. Avec linstruction
AT+CWQAP

Vous pouvez nouveau sparer la connexion de votre routeur.

La platine tablit une connexion un deuxime NanoESP.

3 AT+CWMODE=3 le mode double


Le troisime mode possible de paramtrage WLAN est le mode double. Il permet,
comme son nom le laisse entendre, dutiliser le module en modes socle et AP.
Cela signifie quil peut la fois tablir une connexion sans fil avec le module ou
atteindre le module via le routeur en station intermdiaire. Un mode pratique lorsquon envisage un rseau interne avec plusieurs
ctions dans lannexe et sur la page
modules et que cependant un module doive servir
de serveur, qui livre les donnes au rseau. Mais
des importantes se trouvent dailleurs
davantage ce sujet plus tard.
la page web dj mentionn
Certaines commandes, telles que le
bauds nont pas t rpertories voes peuvent rendre le module inutilisa-

1.2 | Configuration automatique


Vous pouvez dj tester les instructions de base manuellement. Dans ce chapitre

la question est maintenant de prciser comment ces instructions peuvent tre


actionnes directement par le contrleur. Dautre part, vous vous familiarisez avec
une autre instruction avec laquelle vous pouvez tester si un PC dans un rseau ou
un serveur sur internet peut tre atteint. Dans cet exemple le serveur Google est
en effet pingu. Dans ce programme dexempleP02_GooglePing les processus,
que vous avez saisis manuellement dans le premier exemple, sont maintenant
principalement automatiss. Le contrleur envoie des instructions les unes aprs
les autres au module ESP et tablit ainsi la connexion au WLAN. Les diffrents
longs Timeout (temps de latence) donnent suffisamment de temps de rponse au
module.
Avant que le programme puisse cependant fonctionner correctement, vous devez
inscrire vos donnes derrire #define SSID et #define PASSWORD ds le dbut du
programme code source. Le module ncessite en effet un accs internet pour pouvoir
excuter sa dernire instruction. Avec linstruction
AT+PING

dautres appareils peuvent tre pingus au rseau. Le ping signifie que lon demande si un ordinateur est gnralement accessible. Ici la commande ping est
envoy au serveur Google-Server avec AT+PING="www.google.de". Si une information revient, un message de russite apparat dans le moniteur en srie et la
DEL inscrite avec D3 qui est connecte la broche D13 de la platine est active.
Alors la premire communication avec internet aurait russi.
Le programme
Par la suite nous analyserons progressivement les fonctions du programme. Pour
commencer nous abordons la communication avec le module.
1 Communication srie
Lensemble fonctionne par linterface logiciel srie qui est fournie avec SoftwareSerial-Library . linitialisation les broches utilises doivent en outre tre indiques, dans ce cas les broches 11 et 12.
001 #include <SoftwareSerial.h>
002 SoftwareSerial esp8266(11, 12);

Prcisment comme avec linterface srie normale des octets ou des lignes entires peuvent tre transmises avec linstruction esp8266.print ou esp8266.println .
Les instructions esp8266.find et esp8266.findUntil, avec lesquelles un flux entrant
sur certaines chanes de caractres peut tre contrl, sont particulirement pratiques. De ce fait, il est trs simple dintercepter la rponse approprie du module.
Toutefois, si une chane de caractres attendue nest pas change, cela peut
prendre un certain temps avant que le programme continue. Le temps de latence

(Timeout) est dfini par esp8266.setTimeout . Avec findUntil() une deuxime chane de caractres peut cependant tre dfinie par laquelle la fonction de recherche
sarrte et fournit false comme valeur de retour. Nous exploitons ceci dans la fonction sendCom():
001 //-------Controll ESP-------002
003 boolean sendCom(String command, char respond[])
004 {
005

esp8266.println(command);

006

if (esp8266.findUntil(respond, "ERROR"))

007

008

return true;

009

010

else

011

012

debug("ESP SEND ERROR: " + command);

013

return false;

014

015 }

Si vous appelez la fonction, vous devez galement remettre la fonction


linstruction et la valeur de retour attendue, p. ex. AT et la valeur de retour attendue OK. La commande est transmise par println() et finalement attendue jusqu la
valeur de retour attendue ou un ERROR est reu. Si lattente est remplie, la fonction renvoie la valeur true . Dans le cas contraire, le module transmet par la fonction debug()-un ESP SEND ERROR et la commande envoye revient pour pouvoir
contrler facilement quelle instruction est lorigine des problmes.
Pas toutes les instructions ATont une valeur de retour explicite ou une ligne. Si
par exemple ladresse IP est interroge, il ny a pas ncessairement de valeur
connue lavance. Cest pourquoi il y a une deuxime fonction sendCom()qui na
besoin que du paramtre command et renvoie ensuite toute la chane (string)
reue. La chane ne doit cependant pas tre trop longue car la mmoire tampon
du SoftwareSerial peut tre dpasse.

001 String sendCom(String command)


002 {
003

esp8266.println(command);

004

return esp8266.readString();

005 }

2 Recherche des erreurs


En dveloppant le programme il y a souvent des erreurs et des complications.
Pour avoir vraiment une chance, il y a deux fonctions debugqui sont actives ou
dsactives par un paramtre au tout dbut du programme.
#devine DEBUG true

La premire fonction na pas plus deffet quune simple dition de texte par
linterface srie dfinie comme standard. Lorsque la constante DEBUGest vraie, le
contenu de la chane de caractres Msgest envoy.
001 void debug(String Msg)
002 {
003

if (DEBUG)

004

005
006

Serial.println(Msg);
}

007 }

La deuxime fonction est rapidement explique. Si la fonction


serialDebug est appele, le programme passe dans une boucle et se comporte
partir de l comme le premier programme SoftwareSerialtest. Cela signifie que
toutes les donnes qui ont t envoyes par le moniteur srie au contrleur passent directement sur le module et inversement. En cas derreur on peut appeler la
fonction et envoyer des instructions manuellement pour tester o se trouve
lerreur.
001 //---Debug Functions---

002 void serialDebug() {


003

while (true)

004

005

if (esp8266.available())

006

Serial.write(esp8266.read());

007

if (Serial.available())

008
009

esp8266.write(Serial.read());
}

010 }

3 Configuration
Pour rendre les programmes en gnral plus clairs, la plupart des paramtres sont
externaliss dans des fonctions propres, tous dans la fonction espConfig, dans
laquelle sont placs les principaux paramtres pour le programme respectif.
001 //---Config ESP8266--002 boolean espConfig()
003 {
004

boolean success = true;

005

esp8266.setTimeout(5000);

006

success &= sendCom("AT+RST", "ready");

007

esp8266.setTimeout(1000);

008
009 if (configStation(SSID, PASSWORD)) {
010

success &= true;

011

debug("WLAN Connected");

012

debug("My IP is:");

013

debug(sendCom("AT+CIFSR"));

014

015

else

016

017
018

success &= false;


}

019
020

success &= sendCom("AT+CIPMODE=0", "OK");

021

success &= sendCom("AT+CIPMUX=0", "OK");

022
023

return success;

024 }

Au dbut de la fonction la variable success est dabord pose sur true , car cette
variable est lie dsormais avec diffrentes fonctions et. Cela signifie que mme si
une seule des fonctions retourne la valeur, falsesuccess est donc immdiatement
false et toue la configuration a chou. La premire instruction AT contrle avec
succs est linstruction Resetqui est presque toujours excute au dbut du programme, pour sassurer que les essais prcdents ne revendiquent pas encore le
module. Cela peut durer en effet jusqu cinq secondes jusqu ce que le module
renvoie le message ready. Cest pourquoi brivement avant la fonction sendCom()le temps de latence pour esp8266.findUtil est fix haut. Aprs le reset, le
temps de latence et de nouveau tabli sur la valeur standard dune seconde.
Ce qui suit ensuite est lappel dune fonction elle-mme dfinie avec le nom
configStation()qui est aborde dans la section suivante. Elle sert connecter le
module avec son rseau domestique. cette fin, les paramtres SSID et PASSWORD que vous avez enregistrs au dbut du programme, sont transmis. Si la
connexion a t tablie avec succs, le message de russite dabord et ensuite
ladresse IP actuelle du module sont transfrs au module srie. la fin de la
fonction sont encore fixs des paramtres sur lesquelles je reviendrai plus tard.
Enfin la variable success est renvoye qui, nous lesprons, a gard le valeur true.
001 boolean configStation(String vSSID, String vPASSWORT)
002 {
003

boolean success = true;

004

success &= (sendCom("AT+CWMODE=1", "OK"));

005
006

esp8266.setTimeout(20000);
success &= (sendCom("AT+CWJAP=\"" + String(vSSID) + "\",\""
+ String(vPASSWORT) + "\"", "OK"));

007

esp8266.setTimeout(1000);

008

return success;

009 }

La fonction configStation() a t appele dans la fonction espConfig(). Ici le paramtrage du mode WLAN sur le mode socle a t entrepris avec la commande
CWMODE et ensuite la connexion avec le rseau par linstruction CWJAP. Cela
peut durer relativement longtemps jusqu ce que la connexion soit tablie, cest
pourquoi le temps de latence est brivement dpass 20 secondes. Si vous
prfrez le mode sans fil double, vous pouvez inscrire ici pour CWMODEun3.
001 boolean configAP()
002 {
003

boolean success = true;

004
005
006

success &= (sendCom("AT+CWMODE=2", "OK"));


success &= (sendCom("AT+CWSAP=\"NanoESP\",\"\",5,0",
"OK"));

007
008

return success;

009 }

La fonction configAP() nest pas appele dans cet exemple mais doit tre cependant traite brivement. Elle reprsente pour ainsi dire la contrepartie la fonction
configStation()car le module est ici paramtr comme point daccs. Un temps de
latence plus long nest pas ncessaire ici car le module peut transformer la commande CWSAPplus rapidement. Dans des essais ultrieurs dans la fonction espConfig() la place de configStation() la fonctionconfigAP()sera appele.

001 void setup()


002 {
003

// Open serial communications and wait for port to open:

004

Serial.begin(19200);

005

// set the data rate for the SoftwareSerial port

006

esp8266.begin(19200);

007
008

if (!espConfig()) serialDebug();

009

else debug("Config OK");

010
011

if (sendCom("AT+PING=\"www.google.de\"", "OK"))

012

013

Serial.println("Ping OK");

014

digitalWrite(13, HIGH);

015

016

else

017

018
019

Serial.println("Ping Error");
}

020 }
021
022 void loop() // run over and over
023 {
024

//Start serial Debug Mode - Type Commandos over serial Monitor

025

serialDebug();

026 }

Les fonctions les plus importantes que vous trouverez dans presque tous les programmes sont traites ainsi. Dans les fonctions Arduino connues setup() et loop()
ces fonctions sont maintenant utilises. Les deux interfaces srie sont dabord
initialises avec 19 200 bauds. Ensuite seulement est appele la fonction espConfig(). En cas derreur la fonction serialDebug()est immdiatement lance. Si
tout est correct un message de russite est envoy. Dans les programmes ultrieurs, la DEL la broche 13 qui est marque D3 sur la platine sallumera en plus
dans une configuration russie. Pour cela vous avez galement un retour si le
module nest pas connect un PC avec un moniteur srie. Dans cet essai la DEL
est en effet ncessaire pour le message de retour du statut ping La requte
sexcute galement dans les lignes suivantes aprs la configuration. La commande AT+PINGest envoye comme paramtre ladresse Google. Vous pouvez
appeler galement une adresse IP dans votre rseau local la place de cette
adresse. En cas de russite un message apparat et la DEL nomme D3 est active. En dernire action le programme saute la fonction loopqui de son ct
appelle la fonction serialDebug()-. Vous pouvez donc tester dautres instructions
aprs le programme et par exemple envoyer une commande ping dautres
adresses.

1.3 | Dtection dun rseau

Dans ce chapitre entre autres il sagit pour la premire fois dune petite structure
hardware. Le but de ce projet est un type d'alarme qui ragit quand un certain
rseau est porte ou est activ.
Il ne ncessite que deux composants et un peu de
fil. Vous pouvez voir la conception prcise dans
ssaires
les figures de construction.
nanoESP, 1 piezo, fil lectrique

Branchement du haut-parleur piezo

Le code source pour ce projet est diffrent de lessai prcdent principalement


pour les fonctions suivantes :
001 void findSSID()
002 {
003
004
005

esp8266.println("AT+CWLAP");
if (esp8266.findUntil(ToFindSSID,"OK")) alarm();
else debug("SSID not found!");

006 }
007
008 void alarm()
009 {
010

debug("alarm!");

011
012

digitalWrite(LED_ALARM, HIGH);

013
014

for (int i; i <=30; i++)

015

016

tone(PIEZO, 400, 500);

017

delay(500);

018

tone(PIEZO, 800, 500);

019

delay(500);

020

021
022 digitalWrite(LED_ALARM, LOW);
023 }

La fonction findSSID() est appele environ toutes les 30 secondes dans la routine
loopet recherche ensuite tous les rseaux avoisinants. Lorsque le rseau a t
trouv, la fonction alarm() est dclenche, qui active la DEL D3 et met un signal
sonore sur le piezo. Dans le programme dexemple, un rseau est recherch avec
le SSID NanoESP donc en fait dautres rseaux nanoESP porte. Vous pouvez
cependant simplement au dmarrage du programme enregistrer une autre SSID
par #define ToFindSSID . De ce fait vous pouvez par exemple vrifier la distance
de porte de votre rseau WLAN.

UDP ET IP
Il sagit dans ce chapitre de lchange de donnes entre deux systmes via un
rseau WLAN. Nous aborderons les sujets tels que ports IP et protocole UDP.
Ces concepts de base doivent dabord tre expliqus.

Quest-ce quune adresse IP ?


Une adresse IP fonctionne comme une adresse postale. Un ordinateur du rseau
peut tre identifi et adress clairement par celle-ci. Une adresse IP selon la norme IPv4 encore en cours est la suivante :
192.168.4.1

Il sagit de quatre chiffres ou plus prcisment de quatre octets. Cela signifie que
la valeur dun chiffre peut tre 255 maximum. Fondamentalement, il y a des
adresses IP locales qui sont rparties sur les ordinateurs et appareils de votre
rseau domestique et des IP globales.
Les IP locales sont en gnral rparties par votre routeur. La plupart commence
par 192 168. Le chiffre qui suit est diffrent de routeur routeur. Lorsque le NanoESP fonctionne en point daccs et se connecte aux ordinateurs dans son rseau, les PC reoivent une adresse qui commence par 192 168.4. En mme
temps il y a un sous-rseau tendu. Les routeurs Fritz!Box rpartissent en gnral
des adresses IP locales selon le schma 192.168.178.X. Vous pouvez trouver
votre IP en entrant par exemple dans Windows dans linvite de commande (sous
Start-> Programmes->Accessoires->Invite de commande) linstruction ipconfig.
Une plus longue liste apparat qui contient galement le point adresse IPv4 avec
votre IP locale dans le rseau..
Les IP globales sont transmises en gnral par le fournisseur internet. Il sagit par
exemple de ladresse par laquelle votre routeur peut tre atteint dans le rseau
mondial. Le routeur fixe le rseau local et rpartit les donnes aux clients. Une
possibilit de trouver votre adresse IP globale est par exemple dappeler la page
web http://www.meine-aktuelle-ip.de/. Sur la page sont prsentes en plus
dautres donnes visibles par un serveur web. Sur internet vous n'tes donc pas
aussi anonyme que vous le croyez.
Quest-ce quun port ?
Par analogie ladresse postale, un port pourrait tre quelque chose comme la
porte dentre dun immeuble. Un ordinateur avec une IP unique peut fournir diffrents services par diffrents ports. Vous pouvez atteindre le serveur par lIP mais
vous devez choisir le service utiliser via le port. Cela peut tre par exemple le
port 20 pour le transfert de donnes FTP ou le port 23 pour une connexion telnet.
En gnral, vous pouvez choisir librement le port, en effet, il y a des ports normaliss qui rendent le traitement des applications web plus facile. Vous trouverez une
liste des ports normaliss dans
https://de.wikipedia.org/wiki/Liste_der_standardisierten_Ports
Quest-ce que UDP ?
UDP est labrviation de User Datagram Protocol (protocole de datagramme utilisateur). Il sagit dun protocole rseau minimal sans connexion. Cest dire quil

est plus minimaliste et simple que tous les autres protocoles internet, comme p.
ex. TCP que nous aborderons ultrieurement. La comparaison ce stade nest
pas encore particulirement simple mais vous pouvez vous rappeler ce qui suit sur
les proprits du protocole :
U UDP peut transmettre.
U Il ny a aucun contrle de lexactitude des donnes et aucune
correction des erreurs.
U Il ny a galement aucune garanties que les donnes ont t
transmises avec succs.
U Il ny a dautre part aucune garantie que les donnes ne sont pas
corrompues pendant la transmission ou interceptes par un tiers.
U Il nest pas ncessaire dtablir une connexion mais cest plutt un
change de donnes plus rapide.
U Il ny a pratiquement pas de fluctuations de retards de transfert.
U Le format est adapt par exemple VoIP (Voice over IP tlphone
via internet).
Ce sont en premier lieu les bases les plus importantes pour les principes des projets suivants. On pourrait traiter le sujet de faon plus approfondie et au moment
opportun dautres informations suivront. Mais dabord la partie pratique.

2.1 | changer des donnes entre la platine et le PC avec lUDP


Dans ce premier projet pour le sujet UDP des donnes sont changes entre la
platine et le PC via WLAN. condition que votre ordinateur dispose dun adaptateur WLAN. Un programme du ct PC assure la bonne rception des messages.
Une structure hardware nest pas ncessaire pour cette exprience.
Le programme
Lorsque vous chargez le programme P04_UDPBasics.ino sur le contrleur, le
contrleur est configur comme point daccs et vous pouvez trouver un rseau
ouvert appel NanoESP. Avant de vous connecter avec le rseau, vous devez
dabord tlcharger un programme pour le PC depuis internet. Pour mes tests jai
utilis le programme Packet Sender de Dan Nagle, que vous pouvez tlcharger
par le lien suivant :
https://packetsender.com/
Aprs le chargement et linstallation du programme, vous pouvez connecter votre
PC avec le rseau ouvert NanoESP. Assurez-vois que le firewall reconnat le
rseau comme rseau domestique pour quaucune donne ne soit bloque. Votre
ordinateur doit avoir reu maintenant lIP 192.168.4.2. Vous pouvez le vrifier en

envoyant linstruction
AT+CWLIF

au module via le moniteur srie. Cette instruction indique tous les ordinateurs
connects au point daccs avec ladresse IP et MAC.
Maintenant lancez Packet Sender, tablissez sous Paramtres -> Rseau le port
du serveur UDP sur 90 et cliquez la case Activer le serveur UDP . En gnral en
bas gauche se trouve UDP:90 . Dans le cas contraire, vous devez redmarrer le
logiciel.

Les paramtrages corrects du programme Packet Sender

Le programme sur lordinateur est utilis maintenant comme serveur UDP pendant
que le contrleur est paramtr en client UDP. Dans le protocole UDP la distinction client/serveur nest pas essentielle, mais dans ce cas cela signifie que vous
envoyez des donnes votre ordinateur avec le contrleur.

Le message
a t transmis avec succs.

Pour envoyer des donnes, utilisez linstruction :


AT+CIPSEND=7

Ici 7 reprsente le nombre de caractres envoyer. Le caractre > apparat comme valeur de retour. Cela signifie que vous pouvez maintenant transfrer votre
message. Saisissez Hello et confirmez nouveau par [Enter]. Le module envoie
comme valeur de retour SEND OK, et cela mme si vous navez saisi que cinq
caractres. Cela vient du fait quaprs votre saisie, encore que Carriage Return et
New Lineont t envoys, donc deux caractres de plus que vous devez calculer
dans votre longueur de message.
Si vous basculez nouveau Packet Sender et regardez l sous journal de trafic,
vous pouvez voir lentre du message. Dans laffichage ASCII vous voyez mme
les deux caractres envoys reprsents par \r et \n.

Le message a t reu par Packet Sender.


001 boolean configUDP()
002 {
003

boolean success = true;

004
005

success &= (sendCom("AT+CIPMODE=0", "OK"));

006

success &= (sendCom("AT+CIPMUX=0", "OK"));

007

008

success &=
sendCom("AT+CIPSTART=\"UDP\",\"192.168.4.2\",90", "OK");
//UDP-Server
return success;

009 }

Dans le programme Arduino la fonction configUDP() est avant tout dcisive pour le
trajet de communication. Ici sont entrepris les paramtrages importants pour le
transfert. Dabord, le mode transparence des donnes est plac avec CIPMODE
sur0. Ensuite avec CIPMUX=0 est paramtr la connexion dune seule connexion.
Linstruction essentielle est CIPSTART. Avec celle-ci une connexion est tablie et
notamment lIP 192.168.4.2, donc votre PC, et le PORT 90, auquel le programme Packet Sender coute avec son serveur UDP. Ce sont avant tout les tapes
ncessaires pour tablir une premire connexion.

2.2 | Envoyer et recevoir des donnes avec UDP


Dans le projet prcdent, la communication UDP a t teste dans une direction,
savoir de la platine au PC. Dans ce programme le module est paramtr de telle
manire quune communication dans lautre direction est galement possible,
presque comme dans un chat.
Le programme
Dans le fond, le programme comporte seulement une modification minime qui a
cependant un effet important sur la communication avec le protocole UDP. Lorsque vous tlchargez le programme, un point daccs est nouveau tabli avec
lequel vous pouvez vous connecter votre PC. Ici aussi vous avez besoin de
Packet Sender ou dun programme similaire. Dmarrez le programme et prenez
les mmes paramtrages que prcdemment (Fichier -> Paramtres -> Rseau :
Activer serveur UDP, Port 90). Enfin vous devez encore saisir dans la fentre
principale dans le champ Adresse IP ladresse du module (192.168.4.1), placer le
Port sur 91 et dans le menu droulant plus loin droite choisir le point UDP. Si
ces paramtrages sont faits et le moniteur srie ouvert, vous pouvez envoyer le
premier message au module en tapant p. ex. Hi dans le champ tiquet ASCII .
Lorsque vous cliquez sur Send apparat dans le moniteur srie :
001 +IPD,2:Hi
002 OK

Packet Sender a transmis Hi avec succs.

Le message a donc t reu. Vous pouvez rpondre en utilisant linstruction CIPSENDdonc p. ex. :
001 AT+CIPSEND=7
002 >Hello

La diffrence par rapport au projet prcdent rside dans une seule ligne :
success &= sendCom("AT+CIPSTART=\"UDP\",\"192.168.4.2
\",90,91", "OK");

Comme vous voyez, un deuxime port a t indiqu. Ce port dans ce cas avec le
numro 91 est le port par lequel le module surveille de son ct les donnes entran-

tes. Avec lajout de cette simple ligne, il est possible galement denvoyer des donnes au module. Vous pouvez dailleurs surveiller le mme port auquel vous envoyez. Vous pourriez donc attribuer le chiffre 90 aux deux ports. Thoriquement, il
est cependant possible avec la modification que le module reoive ses propres donnes.

2.3 | Activer une DEL avec UDP

Dans le programme P06_UDPLED.ino il sagit maintenant finalement de commander du matriel via le protocole UDP. Avec ce programme il est possible dallumer et
dteindre une DEL avec de simples instructions. De plus, un autre paramtre sur la
communication UDP est effectu, qui permet de contrlr la matriel simultanment
de plusieurs ordinateurs. Pour cela vous avez besoin dun circuit comme le montre
limage la figure ci-dessous. La DEL ressemble beaucoup un autre composant, le
phototransistor. Vous pouvez distinguer les deux
ssaires
composants en regardant la tte du dispositif den
haut. Lintrieur de la DEL a une grande surface
NanoESP, 1 DEL (rouge), 1 rsistanblanche.
noir, rouge), fil lectrique

Packet Sender a transmis Hi avec succs.

Le programme
Alors que les programmes dexemples prcdents demandaient beaucoup de
saisie de lutilisateur via le moniteur srie, ce programme doit travailler de manire

autonome. Toutefois, des fins de debugage dautres informations seront transmises via le moniteur srie.
Le contrleur attend les donnes reues par le module WLAN, qui ont t annonces par le message +IPD. Les commandes lgitimes, que vous pouvez envoyer
par Packet Sender sappellent led1 et led0. Le contrleur les interprte et allume
ou teint la DEL en fonction. Un message de retour est transmis lmetteur. Si
une autre commande a t envoye, le message Wrong UDP Command apparat sur le moniteur srie. Le mme message est transmis lmetteur via le
rseau. Dans le code source nous examinons nouveau dabord une ligne dans
la fonction configUDP():
success &= sendCom("AT+CIPSTART=\"UDP\",\"192.168.4.255
\",90,91", "OK");

Cette fois lIP est modifie. Cette IP doit vous paratre surprenante car il ne sagit
pas de lIP de votre ordinateur. Alors comment les donnes peuvent-elles arriver ?
Cette IP fonctionne car il sagit dune toute autre IP, savoir une IP que nous
appelons IP de diffusion (Broadcast). Diffusion (Broadcast) signifie traduit en
rayonnement, p. ex par les missions radio. Comme avec les missions radio, des
donnes de diffusion peuvent tre rceptionnes par plusieurs participants, dans
ce cas par tous les participants qui sont eux-mmes dans le sous-rseau.
Ladresse 255 la fin de lIP est toujours une adresse de diffusion. Vous pouvez
maintenant lancer le programme Packet Sender sur un autre ordinateur et couter
tous les messages envoys et galement envoyer des commandes. La communication ne se fait plus uniquement entre deux participants.
001 void loop() {
002

if (esp8266.available())

003

004

if (esp8266.find("+IPD,"))

005

006

if (esp8266.find("led")) {

007

int setLed = esp8266.parseInt();

008

digitalWrite(LED, setLed);

009
010

debug("LED=" + String(setLed));

011

if (sendCom("AT+CIPSEND=7", ">"))

012

013

sendCom("LED=" + String(setLed), "OK");

014

015

016
017

else {

018

debug("Wrong UDP Command");

019

if (sendCom("AT+CIPSEND=19", ">"))

020

021

sendCom("Wrong UDP Command", "OK");

022

023
024

025
026

}
}

027 }

Lanalyse des instructions qui arrivent a lieu dans la routine loopqui tourne en
permanence. Sil y a des donnes du module (esp8266.available()), elles sont
analyses sur la prsence des caractres +IPD, . Si dautre part linstruction
led est trouve, linstruction parseInt()mmorise automatiquement les prochains
nombres dans les variables setLed. Grce notre dfinition des instructions, ce
doit tre soit 1 ou 0 pour ainsi activer ou dsactiver la DEL. Ensuite, la fonction
debug transmettra une confirmation lordinateur via linstruction CIPSEND. Si
linstruction led ne faisait pas partie des donnes reues par le module, un message d'erreur informe dune instruction dfaillante. La premire commande par le
rseau serait ainsi complte.

2.4 | Commutateur rseau


Dans le programme prcdent, les premires commandes ont t values et une
DEL active en fonction.

Le programme suivant comprend cette fonction mais peut en plus de manire


autonome envoyer une commande au rseau.
ssaires
Connectez un bouton-poussoir avec le contrleur
NanoESP, 1 DEL (rouge), 1 boutoncomme indiqu dans lillustration.
ce 1 kOhm (marron, noir, rouge), fil

Commutateur compact connect D8

Le programme
Le programme continue valuer les instructions qui entrent. De plus, le bouton
est interrog continuellement. Sil est actionn par lutilisateur, le contrleur envoie
le code
Bouton = 1

au rseau. Tous les appareils connects au module avec un serveur UDP au port
90 peuvent recevoir linstruction. Vous pouvez nouveau vrifier cela avec Packet
Sender. Si vous disposez de deux contrleurs, vous pouvez tablir le mme circuit
sur le deuxime contrleur et uploader le programme sur les deux contrleurs
avec une lgre variation. En effet, si vous transmettez la place de Bouton=1 la
commande led=1 , vous pouvez contrler la LED de chaque contrleur en appuyant sur une touche. En revanche, il peut arriver que vous contrliez simultanment la DEL du propre contrleur.

Droulement dans Packet Sender

Les modifications du programme sont avant tout dans la routine loop. Une simple
requte ifcontrle en appuyant sur le commutateur. Si cest le cas, le contrleur
transmet le message Bouton=1 au rseau. De plus il y a un message debug. La
boucle whilequi suit a pour effet quun flux de commandes ne soit pas immdiatement envoy tant que vous appuyez sur le bouton. Vous devez donc dabord relcher le bouton avant de poursuivre le programme.
001 if (!digitalRead(SWITCH))
002 {
003

debug("Button=1");

004

sendUDP("Button=1");

005

while (!digitalRead(SWITCH)) {}

006 }

Dans un projet dautomatisation de la maison, un serveur recevrait maintenant le


message dtat par exemple dun capteur de proximit et enverrait ensuite la
commande dallumer la lumire un autre contrleur. Ainsi se monte tout un rseau de capteurs et acteurs.

2.5 | Capteur analogique

Le dernier projet a trait la forme la plus simple dun capteur avec un boutonpoussoir. Cette fois il faut utiliser un potentiomtre comme capteur analogique
pour envoyer des valeurs de mesure en permassaires
nence au rseau. Le potentiomtre livr 10 k est
NanoESP, 1 DEL, 1 rsistance 1
utilis. Le montage est indiqu sur la figure cirouge), 1 potentiomtre, fil lectrique dessous.

Montage avec potentiomtre sur A6

Le programme
ct du capteur analogique, il y a encore une autre modification du programme.
Cette fois-ci le contrleur ne doit plus tre exploit en mode point daccs mais se
connecter avec votre rseau domestique. Vous pouvez galement cette fois-ci
inscrire vos donnes de station tout simplement en haut dans le programme.
Aprs lupload il peut scouler un moment jusqu ce que la connexion au rseau
soit tablie. Si elle est russie, la DEL D3, qui est assemble solidement sur la
platine, commence sclairer. Cest le signe que le contrleur est prt. Tant que
le moniteur srie est actif, vous verrez un message correspondant, mais pour les
tests ultrieurs vous voulez ventuellement utiliser la platine de faon autonome et

ce retour peut donc savrer trs utile. Par le moniteur srie vous recevez galement linformation sur quelle adresse IP le routeur a affect la platine. Cette IP est
importante, dans la mesure o vous voulez adresser la platine ultrieurement.
La communication avec la platine fonctionne de manire similaire aux tests prcdents. Seules les IP du module et de son ordinateur ont t modifies car une IP a
t attribue par le routeur aux deux appareils. Aprs le lancement Packet Sender
ne reoit dabord aucun rsultat de mesure. Vous devez dabord envoyer un message, p. ex. la commande led=1 au module. cela indiquez Packet Sender la
nouvelle IP du module que vous pouvez connatre par le module srie. Aprs
linstruction des nouvelles donnes de mesure arrivent env. toutes les secondes.

Les donnes de mesure ont t reues par Packet Sender

Dans ce programme, il y a une autre modification dans linstruction CIPSTART.


Dune part ladresse de diffusion a t tendue, parce quon ne peut pas prdire
quel sous-rseau votre routeur tend. La deuxime modification rside dans
l'ajout dun paramtre, ici le deuxime. Le nouveau paramtre permet de changer
ladresse de destination de la commande
CIPSEND. Le module coute dabord dans tout lespace qui commence
par192.168. Et ds quune commande est reue, le module se rgle sur la nouvel-

le IP.
success &=sendCom("AT+CIPSTART=\"UDP\",\"
192.168.255.255\",90,91,2", "OK");

Pour ce paramtre, il y a les possibilits suivantes :


1 Mode 0: Cela signifie que lIP et le port ne se modifient pas. Cest galement la
configuration par dfaut, ce qui est clair si vous considrez dautres modes.
2 Mode 1: Les paramtres se modifient une fois. Cela signifie ce qui suit : si le
module dmarre avec ladresse de diffusion dj utilise et reoit ensuite quelque
chose dun PC, le module se rgle sur la nouvelle adresse du PC. En dautres
termes, lIP de destination que vous avez enregistre devient superflue et il est
envoy la place la nouvelle adresse. Cette adresse reste valable mme si le
module reoit des donnes envoyes dun autre module.
3 Mode 2: Les paramtres se modifient chaque rception dun nouvel appareil.
Cela signifie que lIP, mme si elle avait dj t modifie une fois, peut cependant se rgler sur un nouveau PC.
C'est galement la raison pour laquelle vous devez dabord envoyer une instruction au module avant de pouvoir recevoir des donnes. Vous devez aussi pouvoir
recevoir des donnes depuis cet ordinateur. Sauf si vous envoyez nouveau un
message au module depuis le nouveau PC.
001 boolean sendUDP(String Msg)
002 {
003

boolean success = true;

004
005

success &= sendCom("AT+CIPSEND=" + String(Msg.length() + 2),

006

if (success)

007

008

success &= sendCom(Msg, "OK");

009

010

return success;

011 }

Lenvoi de la valeur analogique se fait dans la routine loop. Dailleurs la nouvelle


fonction sendUDP() est utilise, et rend les fonctions connues plus facilement
accessibles. Il ne doit pas y avoir ncessairement de retard entre les envois
dinstructions car le transfert dure un certain temps. En effet, la frquence, par
laquelle les nouvelles donnes sont transfres, est tellement leve que le PC
est littralement bombard de messages.

CLIENT TCP
Le dernier chapitre a trait du protocole UDP avec lequel les donnes sont envoyes et reues de faon simple. Une multitude dapplications peut dj tre
ralise avec le protocole. Dans ce chapitre nous allons nous intresser au protocole TCP (Transmission Control Protocol). Le module va prendre le rle dun client
TCP dans ce chapitre. Cest le rle que prend votre PC domicile face un serveur web. La diffrence entre TCP et UDP se rsume en gros dans les mots-cls
suivants :
U La connexion est prcisment uniquement entre deux appareils.
U Les paquets envoys sont contrls sur les erreurs de transfert et
corrigs le cas chant.
U TCP est avant tout utilis pour internet.
U Le protocole est un peu plus lent que UDP mais plus sr.
Le protocole est galement utilis par votre PC et un serveur web, dont vous voulez charger une page web, pour tablir une connexion entre les deux participants.
Les contenus vritables des pages web sont transfrs ensuite sous format HTTP
(HyperText Transfer Protocol). Nous verrons dans le chapitre suivant comment
cela fonctionne exactement.

3.1 | Un navigateur
Cet essai utilise nouveau linstallation existante. Il sagit de se familiariser avec
les structures de base de la communication TCP avec le moniteur srie.

Le programme
Le programme dans son mode de fonctionnement ressemble SoftwareSerial-

Le programme du premier test tablit entre autres la connexion WLAN indpendamment au dmarrage. Vous conomisez ainsi une quantit de travail dcriture
et pouvez commencer plus vite. Noubliez pas de transfrer les donnes de votre
rseau domestique dans le programme. Saisissez ensuite dans le moniteur srie
les lignes de commandes suivantes :
AT+CIPSTART="TCP","www.example.com",80

Avec cette commande vous tablissez une connexion TCP avec le site web
www.example.com. Le port 80 est le port par dfaut pour les requtes HTTP.
Aprs confirmation de la connexion par OK vous pouvez saisir linstruction suivante que vous connaissez dj.
AT+CIPSEND=40

Vous voulez maintenant envoyer un message par la connexion tablie. Lorsque


vous tes invit par > saisir un code, tapez dabord
GET / HTTP/1.1

et appuyez ensuite sur [Enter]. [Enter]napparat pas dans le moniteur srie


mais le module le reoit. Ensuite le message continue avec
Host:www.example.com

suivi deux fois par[Enter]. Vous devez en effet envoyer les saisies lune aprs
lautre trs vite. Le mieux est de prparer un document texte partir duquel vous
pouvez copier rapidement les lignes. Un long texte revient. La premire partie est
la rponse du serveur et contient quelques informations pour le navigateur. Le
texte aprs <!doctype html> est la page web que vous voyez galement quand
vous appelez directement la page www.example.com ici en format texte brut. Un
navigateur interprterait ce texte et nous le reprsenterait dans une forme courante.

Extrait de la rponse du serveur web

Sur cet exemple vous voyez les principes de base du format HTTP. Un client tablit une connexion avec un serveur web. Que vous ne deviez pas saisir ladresse
IP, mais que vous puissiez utiliser le nom de domaine en format texte est li ce
quon appelle le DNS (Domain Name System). Cela transmet la requte lIP
difficile remarquer. Si le client est connect, le navigateur envoie une requte
Get Request. La page appele ou les ressources (dans ce cas la page principale),
le protocole utilis (http 1.1) et lhte demand (www.example.com) doivent au
moins tre indiqus dans cette requte. Les donnes de lhte sont importantes
car il peut y avoir plusieurs adresses internet sur un serveur et avec derrire une
IP. Si vous souhaitez demander une autre page que la page principale, crivez
la place p. ex. /example.html. ct de la sous-page demande votre navigateur
envoie dailleurs une quantit dinformations en plus des ressources appeles.
Des donnes telles que navigateur utilis, systme d'exploitation, rsolution de
lcran et dautres encore sont transmises. Ainsi le serveur peut ajuster les contenus. Ensuite arrive la rponse du serveur qui dabord semble complexe. La partie
entte de la rponse comprend beaucoup dinformations supplmentaires pour
votre navigateur. Uniquement la fin suit le contenu rel de la page web.

3.2 | Une horloge internet


Ce projet ncessite de connatre les chapitres prcdents pour que le NanoESP
rcupre de faon autonome les informations dun site web. Concrtement, le
programme charge lheure en cours depuis une page spcialement conue pour
cela et rgle ainsi lheure interne du contrleur ralise par librairie pour afficher
une heure prcise. Lheure est donne par le moniteur srie. Pour l'installation
vous navez besoin que de la platine.

Le programme
Lors du programme prcdent, il devait encore tre principalement utilis manuellement, celui-ci travaille de faon autonome. Le contrleur se connecte compltement automatiquement au site web :
http://chronic.herokuapp.com/
Diffrents systmes et fuseaux horaires peuvent tre demands par lURL.
Lheure actuelle en hiver en Allemagne est demande par lURL
http://chronic.herokuapp.com/utc/in-one-hour
. Cest pourquoi se trouve dans lappel de la fonction explique ultrieurement
getTime() comme deuxime paramtre utc/in-one-hour. Sur la base de lUTC
(temps universel coordonn) vous devriez changer lappel pour utc/in-two-hours.
Selon le mme systme vous pouvez traiter galement les autres fuseaux horaires.
Le temps dtermin est maintenant remis la time library (librairie heure) par
Michael Margolis (source http://www.pjrc.com/teensy/td_libs_Time.html). Pour des
raisons pratiques, une copie de la version time library que jai utilise se trouve
dans le dossier sketch. Elle doit tre copie dans le dossier librariesde votre dossier sketchbook. En arrire-plan la nouvelle heure est calcule en permanence et
chaque seconde transmise au terminal. Vous pourriez de manire simple programmer un rveil ou une autre application temporise. Pour que la rcupration
de lheure puisse fonctionner, une nouvelle fonction est utilise :
001 boolean getTime(String Host, String Subpage)
002 {
003
004

boolean success = true;


int xyear, xmonth, xday, xhour, xminute, xsecond; //lokal
variables

005
006

success &= sendCom("AT+CIPSTART=\"TCP\",\"" + Host +


"\",80", "OK");

007

String getRequest = "GET " + Subpage + " HTTP/1.1\r\nHost:" +


Host + "\r\n";

008

success &= sendCom("AT+CIPSEND=" +


String(getRequest.length() + 2), ">");

009
010

esp8266.println(getRequest);

011
012

if (esp8266.find("+IPD"))

013

014

if (esp8266.find("\r\n\r\n"))

015

016

xyear = esp8266.parseInt();

017

xmonth = esp8266.parseInt();

018

xday = esp8266.parseInt();

019

xhour = esp8266.parseInt();

020

xminute = esp8266.parseInt();

021

xsecond = esp8266.parseInt();

022
023

if (xday < 0) xday *= -1;


parseInt detects negativ integer

024

if (xmonth < 0) xmonth *= -1;


parseInt detects negativ integer

//Because of date seperator //Because of date seperator -

025
026
027

setTime(xhour, xminute, xsecond, xday, xmonth, xyear);

028

sendCom("AT+CIPCLOSE", "OK");

029

return true;

030

031

else return false;

032

033

else return false;

034 }

Des paramtres pour ladresse hte et la sous-adresse sont transmis cette fonc-

tion. Il en rsulte que la requte Get Request cre et, aprs la cration dune connexion, transmet au serveur TCP de la page web. La rponse du serveur doit
maintenant tre analyse. De plus, toute la partie Request Header est saute en
recherchant \r\n\r\n, qui ne signifie rien dautre que ce quil se passe aprs un
double Carriage Return und New Line. Les autres chiffres correspondent la date
et heure recherches qui ont t mmorises en variables intermdiaires par un
certain nombre de fonctions parseInt(). Il y a une particularit dans la date, car ici
les valeurs distinctes sont spares par un trait, ce que la fonction parseInt()interprte comme un chiffre ngatif. Par consquent, les valeurs sont simplement multiplies par -1. Enfin, lheure est rgle avec la fonction setTime()et
affiche par la routine loopune fois par seconde. Lheure est maintenant totalement oprationnelle.

3.3 | Affichage de la temprature

Avec ce projet il sagit de laffichage de la temprature actuelle et de la mto


gnrale. Cette fois galement les valeurs sont transmises par le moniteur srie. Il
y a en plus cependant une sortie intuitive avec la
ssaires
DEL RVB. On peut ainsi estimer par un seul coup
NanoESP, 1 DEL RVB, 3 rsistances
d'il sil est opportun demmener une veste chauir, rouge), fil lectrique
de.

Il est important lors du montage de brancher correctement la DEL RVB. RVB signifie Rouge, Vert, Bleu, car la DEL est compose de plusieurs DELs avec une
broche de cathode commune. Par une combinaison des diffrentes couleurs avec
des luminosits distinctes, il est possible de reprsenter pratiquement chaque
couleur. La DEL doit tre branche aux sorties PWM D3, D5 et D6 du contrleur
avec prrsistances, comme indiqu sur la figure.

Branchement de la DEL RVB aux broches D3, D5 et D6

Le programme
Dans Sketch il sagit nouveau de la requte dune page internet, mais cette fois il
sagit dune page spcialement programme pour ce projet qui prend des donnes
depuis la page mto
http://www.openweathermap.com/
. Sur cette page on peut obtenir des informations sur la mto dune ville par variation de lURL. Vous pouvez saisir la ville, que vous voulez interroger, simplement dans le code source derrire City. Comme exemple jutilise ma ville natale
Essen : www.temp.fkainka.de/?city=Essen
Le programme extrait la temprature de cette page et reprsente le rsultat en
couleur via la DEL RVB. Simultanment la valeur est transmise par le moniteur
srie. La plage de temprature utilise dans le programme dexemple pour la
reprsentation sur la DEL va de 20 C +40 C.
Fondamentalement le programme fonctionne rapidement comme le prcdent
mais avec quelques petites particularits. La fonction getTemp() est cette fois-ci
charge de lacquisition des donnes et renvoie la temprature actuelle, comme la
fonction de lheure du programme prcdent.
001 void rgbTemp(int val)

002 {
003

int green, blue, red ;

004
005
006
007

if (val <= 10 & val >= -20)


blue = map(val, -20, 10, 255, 0);
else blue = 0;

008
009
010

if (val >= 10 & val <= 40)


green = map(val, 10, 40, 255, 0);

011

else if (val >= -20 & val < 10) green = map(val, -20, 10, 0, 255);

012

else green = 0;

013
014

if (val > 10 & val <= 40) red = map(val, 10, 40, 0, 255);

015

else red = 0;

016
017

analogWrite(RED, red);

018

analogWrite(GREEN, green);

019

analogWrite(BLUE, blue);

020 }

L'ajustement des luminosits DEL est excut dans la fonction rgbTemp() .


laide de la commande maples valeurs sont bascules en valeurs octets (0-255)
adquates et dlivres la DEL. Bleu correspond aux tempratures particulirement froides et a un impact dans la plage de 20 C +10 C. Vert est dans toutes les plages de tempratures mais a un maximum avec la valeur 10 C. Rouge
dbute la valeur de +10 C avec un maximum +40 C. Ce codage intuitif est
conu pour valuer la temprature actuelle en plus de laffichage plus prcis dans
le moniteur srie.

SERVEUR TCP
Aprs avoir appris certains lments sur lutilisation du module en client TCP dans
le chapitre prcdent, le module doit maintenant agir comme serveur TCP. Dune
manire pratique il existe galement une instruction AT simple avec laquelle vous
pouvez dmarrer cette application serveur complexe. Le module se comporte
ensuite comme un serveur TCP internet, sauf que vous devez programmer vousmme lenvoi de la page web.

4.1 | Serfvice web TCP


Les premires tapes en terme de serveur web TCP se font sans configuration
matrielle supplmentaire. Testez dabord les instructions les plus importantes
simplement via le moniteur srie.
Le programme
Saisissez comme jusqu prsent les donnes WLAN et tlchargez le programme sur votre platine. Ensuite dmarrez le moniteur. Cela peut durer nouveau
quelques secondes jusqu ce que le message apparaisse, selon lequel la platine
est connecte. Lorsque le message de russite est apparu et lIP du module a t
affiche, vous pouvez dmarrer dans le moniteur srie avec la premire instruction :
AT+CIPMUX=1

Vous autoriser plusieurs connexions au module par cette instruction. Ainsi plusieurs ordinateurs peuvent accder au serveur web. Vous dmarrer le serveur
web avec linstruction suivante :
AT+CIPSERVER=1,80

Le paramtre 1 signifie que le serveur est dmarr. Avec0 vous arrtez le serveur. Le chiffre 80 reprsente le port par lequel le serveur est accessible. Les
requtes HTTP envoyes par le navigateur sont gnralement envoyes par le
port 80.
Vous pouvez maintenant ouvrir un navigateur de votre choix et saisir dans la barre
dadresse lIP du module et confirmer avec [Enter]. Dans le navigateur apparat
dabord un message de chargement mais vous pouvez remarquer une modification dans le moniteur srie. Vous voyez une requte similaire celle que vous

avez dj envoy manuellement.

La requte
du navigateur

Le navigateur attend une rponse et indique un caractre de chargement jusqu


ce que la connexion soit arrte en raison du temps de latence. Vous pouvez
envoyer un message avec une variante dune instruction connue au navigateur :
AT+CIPSEND=0,7

Le paramtre 0 indique ici le client auquel le message doit tre envoy. Ceci est
ncessaire car plusieurs connexions sont autorises et donc plusieurs clients
peuvent tre connects. Le deuxime paramtre, ici 7, indique de nouveau le
nombre de caractres envoyer. > apparat et vous pouvez saisir un simple
Salut

et envoyer avec [Enter]. Pourtant dans votre navigateur rien ne change dabord
car vous devez fermer la connexion. Utilisez pour cela la commande :
AT+CIPCLOSE=0

Maintenant vous pouvez voir Salut dans votre navigateur. Vous avez ralis ainsi
une premire application serveur web.
Ce premier test montre beaucoup sur les processus prcis de communication
dans internet. La reprsentation de Salut dans le navigateur est encore assez
facile car un texte plus simple la place dune page HTML complexe a t envoy. Pour une page HTML correcte vous avez d crire manuellement toute une
entte aussi bien pour la requte Get Request que pour le texte HTML. Je vous
pargne cet effort dans le premier test.

4.2 | Serveur web autonome

Les rsultats des essais prcdents vont maintenant tre utiliss dans un programme autonome. Le nouveau programme envoie non seulement une page web
au navigateur mais il permet galement de contrler une DEL. De plus, vous
voyez sur la figure du montage comment vous pouvez brancher une alimentation
lectrique externe la platine. Comme alternative
ssaires
ce type de courant lectrique soffre galement
une Power Bank (batterie externe, souvent pour
NanoESP, 1 clip 9 V, 1 DEL (rouge),
smartphone), qui peut alimenter simplement la
m (marron, noir, rouge), fil lectrique,
platine par la connexion micro USB.
apprentissage)

Vous connectez ainsi une pile au montage dessai.

Le programme
Le programme envoie une page plus complexe que lors de lessai prcdent.
Dautre part, vous pouvez activer la DEL la broche D9, en inscrivant /LED derrire lIP du module. Ltat actuel de la DEL est alors invers, ltat basculera donc
chaque fois (changement dtat).
Inscrivez vos donnes WLAN et tlchargez le programme. LIP de la platine est
affiche dans le moniteur srie. Vous pouvez ensuite ouvrir le navigateur et appeler lIP de la platine. La page web a maintenant un titre et un peu plus de texte. Le
texte vous indique comment contrler la DEL. Vous avez ainsi un premier serveur
web compltement autonome.

001 void loop() {


002

if (esp8266.available()) // check if the esp is sending a message

003

004

if (esp8266.find("+IPD,"))

005

006

debug("Incomming Request");

007

int connectionId = esp8266.parseInt();

008
009

if (esp8266.findUntil("LED","\n")) digitalWrite(LED, !digitalRead(LED));

010
011

String webpage = "<h1>Hello World!</h1>Open [IP]/LED to Toggle LED on D9";

012
013

if (sendCom("AT+CIPSEND=" + String(connectionId) + "," + String(webpage.length()),


">"))

014

015

sendCom(webpage,"SEND OK");

016

sendCom("AT+CIPCLOSE=" + String(connectionId),"OK");

017

debug("Send and Close");

018

019
020

}
}

021 }

Pour dmarrer le serveur web, on dispose dune fonction simple qui sappelle
configTCPServer(). Derrire ne se trouve rien dautre que ce que vous avez saisi
manuellement auparavant. Dans la routine loopsont attendues les donnes entrantes. Si ces donnes contiennent DEL , la LED change dtat. L la routine
ne fait aucune diffrence, l ou se trouve prcisment DEL , do la lgitimit
de la commande dans lURL transmise. Dans ce test, la page web elle-mme se
trouve dans la variable de la page web et comprend le texte suivant :

001 <h1>Hello World!</h1>


002 Open [IP]/LED to Toggle LED on D9

Ici <h1> est une indication pour le navigateur de reprsenter le texte jusqu </h1>
comme titre de type 1. Il ne sagit pas encore de vritable code HTML mais beaucoup plus dune forme simple de reprsentation de texte. La longueur de la page
web est passe avec webpage.length() (une fonction de la classe de chane) la
commande CIPSENDet transmise ensuite la page.

4.3 | Page web avec boutons


Dans ce test la reprsentation de la page web est encore plus sophistique.
Dautre part, il y a dsormais des lments de commande par lesquels une DEL
peut tre contrle vraiment confortablement. Le montage de ce test ne se diffrencie pas du prcdent : une DEL sur la broche D9 est contrle par le module.
Pour cela, il y a quelques nouveauts dans le code source.
Le programme
Aprs le tlchargement du programme vous pouvez nouveau appeler la page
web du contrleur via un navigateur. Pour cela vous devez seulement saisir lIP du
module qui a t donne au dmarrage par le moniteur srie. La page web ellemme dans ce projet est en effet mmorise un peu diffremment que dans le
prcdent.

La page web du serveur web

Alors quavant la page web tait simplement contenue dans le code source, cette

fois-ci elle est mmorise dans ce quon appelle des variables progmem (Program
Memory). Lutilisation de ce type de mmorisation dcharge la SRAM de la platine
qui serait autrement responsable du stockage des variables. La SRAM ne comporte que 2 kB et est dj trs charge par lutilisation des chanes. Le contenu du
site sera plac dans la mmoire du programme par la fonction progmem, qui est
beaucoup plus grande avec environ 32 kB. L'accs aux donnes est galement un
peu plus complexe.
001 const char site[] PROGMEM = {
002 "<HTML><HEAD>\n<meta name=\"viewport\" content=\"width=device-width, initialscale=2.0,
003 ()
004 };

Dans cet extrait on voit comment la page web est mmorise dans la variable
progmem. Il sagit dun document HTML plus grand dans un format compatible C.
Le format se caractrise entre autres par le fait que les guillemets sont affichs
sous la forme \" et les nouvelles lignes sous la forme \n. Vous connaissez cela
probablement dautres projets qui contiennent des chanes. Vous pouvez galement trouver un aperu de la page web au format HTML dans le dossier programme.
001 String createWebsite()
002 {
003

String xBuffer;

004
005

for (int i = 0; i <= sizeof(site); i++)

006

007

char myChar = pgm_read_byte_near(site + i);

008

xBuffer += myChar;

009

010
011
012 }

return xBuffer;

Dans la fonction createWebsite() le contenu de la variable progmem est charg et


retransmis en chane. On voit clairement comment la variable progmem est recharge depuis la mmoire du programme.
001 boolean sendWebsite(int connectionId, String webpage)
002 {
003

boolean success = true;

004
005

if (sendCom("AT+CIPSEND=" + String(connectionId) + "," +


String(webpage.length()), ">"))

006

007

esp8266.print(webpage);

008

esp8266.find("SEND OK");

009

success &= sendCom("AT+CIPCLOSE=" + String(connectionId),


"OK");

010

011

else

012

013

success = false;

014

015

return success;

016 }

Dans la routine loopon attend uniquement une demande Request. Si elle vient, la
fonction sendWebsite() est appele, qui transmet comme paramtre le rsultat de
la fonction createWebsite(). La longueur du texte est dtermine par la fonction
longueur(). Aprs le transfert du site web, la connexion avec linstruction AT+CIPCLOSEest
de nouveau ferme. Lactivation de la DEL fait partie de la routine loopet se diffrencie lgrement du schma prcdent. Comment prcisment, le cours intensif
HTML suivant le clarifie

4.4 | Parenthse: Cours intensif HTML


Dans de chapitre je vais donner un petit cours intensif en HTML. Plus prcisment
laccent sera mis sur la cration de pages web pour le contrle du NanoESP. Les
structures de base dun document HTML sont une partie de ce cours, la cration
dlments dentre et de sortie et enfin lintgration des propres pages web dans
le programme Arduino.
Une donne HTML est toujours reconnaissable par <HTML> au dbut du document. La fin du document doit tre reconnaissable par </HTML>. En gnral, le
dbut et la fin dune section ou dun lment sont affichs sous une forme comparable, comme on peut le voit sur lentte. Dans lentte se trouvent des informations et des formes importantes, comme dans ce cas le titre de la page web, qui
doit tre affich en haut dans la barre du navigateur. Dans ce cas il y a une autre
indication dans lentte qui nappartient pas aux bases HTML, mais qui amliore
laffichage sur les appareils mobiles (<meta name ="viewport" ). Vous pouvez
ajouter ces lignes tout moment dans votre page web HTML.
001 <HTML><HEAD>
002 <meta name="viewport" content="width=device-width, initial-scale=2.0, userscalable=yes">
003 <title>
004 Switch LED
005 </title>
006 </HEAD>

Aprs HEAD suit BODY. Celui-ici comporte le contenu de la page web. Dans la
zone de dmarrage BODY sont fixs les paramtres supplmentaires tels que
arrire-plan et couleur de texte. Vous pouvez bien entendu adapter ceux-ci tout
moment selon vos gots. Ensuite vient la dfinition de la police et de sa taille dans
llment FONT. Ceux-ci ne sappliquent ici que pour le texte Switch LED,qui
semble particulirement grand car ensuite llment FONTest de nouveau termin
par </FONT> .
001 <BODY bgcolor="#FFFF99" text="#000000">
002 <FONT size="6" FACE="Verdana">
003 Switch LED
004 </FONT>

La partie suivante se comporte exactement pareil avec seulement deux lments


nouveaux, savoir <HR>, qui produit une ligne horizontale sur la page web et
<BR>, qui gre le saut la ligne suivante.
001 <HR>
002 <BR>
003 <FONT size="3" FACE="Verdana">
004 Switch the LED <BR>
005 on D9 ON and OFF
006 <BR>
007 <BR>

Tous les lments prsents jusquici taient des facteurs de formes purs qui
servent la conception de la page web. Ensuite vient en effet llment important
formavec lequel lactivation de la DEL est ralise.
001 <form method="GET">
002

<button type="submit" name="led" value="1">LED ON</button>

003

<button type="submit" name="led" value="0">LED OFF</button>

004 </form>

Llment formest comme le nom le laisse entendre conu pour la production de formulaires sur internet. Il peut sagir de formulaires de message pour une page web ou
un sondage ou quelque chose de similaire. Le transfert des donnes saisies par
lutilisateur peut se produire totalement diffremment. Dans cet lment, nous utilisons
la mthode GET par laquelle les donnes saisies sont transfres simplement au
serveur web avec lURL. Dans ce formulaire, il y a deux boutons cet effet. Les deux
sont du type submit, ce qui signifie quen appuyant sur un des deux boutons le formulaire est directement transfr. Les deux boutons ont le nom led, mais chacun des
valeurs diffrentes (values). En appuyant sur le premier bouton qui porte linscription
LED ON, lURL actuelle est rappele avec un petit supplment. Derrire lURL, galement dans ce cas derrire lIP du module se trouve en effet /?led=1. Ce texte prcisment est valu dans le programme Arduino en recherchant puis le nombre suivant
est lu avec parseInt() et transmis la DEL Avec cette premire version simple dun
formulaire le contrle confortable dune DEL est possible sans problme.

Voici quoi ressemble lURL aprs avoir appuy sur le bouton LED ON.
001 <BR>
002 <HR>
003
004 </font>
005 </HTML>

Les dernires lignes de code source HTLM ne contiennent rien de nouveau. Un


saut la ligne suivante et une ligne horizontale compltent limage, avant que le
document avec </HTML> soit termin. Vous pouvez maintenant modifier la page
web dans le dossier sketch selon vos souhaits. Vous pourriez par exemple modifier la couleur de larrire-plan ou ajouter plus de texte sur la page web. Vous ne
devez cependant pas surcharger la page car la SRAM peut vite tre dborde.
Lorsque vous avez excut les modifications, il est temps de les transfrer dans
votre programme Arduino. Copiez le texte entier dans le presse-papiers et allez
sur la page web avec le Swiss Converter Tool:
http://www.percederberg.net/tools/text_converter.html

La page Swiss-Converter-Tool-aprs conversion russie

L collez le texte du presse-papiers et passez au point 2. Select Output : les paramtres C/C++/PHP StringText et UTF-8 Unix (LF). Dj le texte compatible
Arduino apparat dans la fentre infrieure que vous pouvez copier dans la variable progmem site . Lorsque vous tlchargez le programme modifi avec la nouvelle variable, vous voyez la nouvelle page web en appelant lIP de la platine dans
le navigateur.

4.5 | Contrler la DELRVB par TCP

Dans le projet actuel il sagit de la commande de la DEL RVB par une page web
sur un serveur web. La couleur de la DEL peut tre modifie par une interface
prcise. La page a t ajuste et doit tre bien
ssaires
affiche sur les smartphones. Le montage ncesNanoESP, 1 DEL RVB, 3 rsistances
saire est indiqu sur la figure ci-dessous.
ir, rouge), fil lectrique

Branchement de la DEL RVB aux broches D3, D5 et D6

Le programme
La nouvelle page web peut tre de nouveau trouve dans la variable progmem site.
Ici aussi vous pouvez consulter la page HTML dans le dossier sketch. Aprs le paramtrage des donnes WLAN et lupload du programme, la page web du serveur
web peut tre atteinte par lIP du module. La page est identique la prcdente en
ce qui concerne la couleur de larrire-plan et le titre. Pourtant il y a un nouvel lment sur la page, savoir llment HTML5Color Picker. Avec celui-ci on peut choisir une couleur pour la DEL. Ds que vous avez confirm la couleur, elle saffiche
depuis la DEL. Laffichage de llment Color-Picker peut fortement varier en fonction du navigateur slectionn.

La page web dans le navigateur

La slection
de la couleur dans
le navigateur Chrome

Mme si le design de la page web nest pas trs diffrent du prcdent, jaimerais
vous dcrire brivement de faon plus prcise quelques lments. Dabord il y a
une modification dans lentte du document HTML et ce concernant la ligne suivante :

<link rel="icon" href="data:;base64,iVBORw0KGgo=">

Cette ligne est l pour que le navigateur nessaie pas aprs le chargement de
charger ce quon appelle Favicon. En gnral, une page web a en effet un symbole particulier qui est diffrent des autres pages web et identifie clairement la page
web dans une barre du navigateur avec plusieurs onglets. Pour que le navigateur
puisse charger ces caractres, il envoie aprs lappel de la page une deuxime
requte et demande ce favicon. Dans les premiers essais avec le serveur TCP
vous avez peut-tre remarqu cette requte supplmentaire. Pour empcher ces
deux requtes et ne pas surcharger inutilement la platine, la deuxime ligne de
code ci-dessus fait comprendre au navigateur quil ne doit pas envoyer de
deuxime requte. Je vous recommande de prendre cette ligne pour vos propres
pages HTML.
La deuxime particularit de ce document est llment dj mentionn ColorPicker. Il remplace pour ainsi dire les boutons de lexemple prcdent. Il sagit
dun lment HTML5 relativement nouveau.
Dans la page web prcdente nous avons simplement choisi des boutons de type
submit pour que les valeurs du formulaire soient directement transmises en appuyant. Ceci nest malheureusement pas possible avec un lment de saisie de
type color. Une possibilit de rsoudre le problme serait de crer un bouton de
type submit qui devrait ensuite tre appuy aprs le paramtrage de la couleur.
Ceci sera dmontr dans un test ultrieur. Ici a t coll un petit code JavaScriptCode (il sagit de la partie onchange="this.form.submit()"), qui veille ce que le
formulaire soit directement transmis aprs une modification.

Llment Color-Picker-dans le navigateur Android-5.0.

On conomise un autre bouton.

001 <form method="GET">


002

<input type="color" name="rgb" onchange="this.form.submit()"><BR>

003 </form>

La couleur choisie est maintenant transmise sous la forme /?rgb=%23,suivie de


six autres caractres. Le terme %23 signifie quil sagit dune hexadcimale. Pour
la couleur blanche lURL est donc :
[IP]/?rgb=%23ffffff

Le contrleur doit maintenant extraire les couleurs respectives de la DEL de ce


nombre hexadcimal, ce qui se passe dans la partie suivante de la fonction loop :
001 if (esp8266.findUntil("?rgb=", "\n"))
002

003

String hexstring = esp8266.readStringUntil( );

004

long number = (long) strtol( &hexstring[3], NULL, 16);

005
006

int r = number >> 16;

007

int g = number >> 8 & 0xFF;

008

int b = number & 0xFF;

009
010

analogWrite(RED, r);

011

analogWrite(GREEN, g);

012

analogWrite(BLUE, b);

013

Par la fonction strtol() le texte reu derrire %23 devient dabord un longnombre et
est ensuite converti par manipulation de bits en trois valeurs doctets. Ceux-ci sont
finalement transmis par la fonction analogWrite()- la DEL RVB.

4.6 | Capteur de lumire

Dans ce projet, la page web du serveur web nest pas utilise comme interface de
commande mais comme lment de sortie. La luminosit mesure via un capteur
de luminosit est reprsente prcisment comme valeur relative avec un nouvel
lment HTML.
Pour le montage de lexprience il faut le phototransistor qui sert de capteur de
lumire. Le phototransistor peut tre facilement tre chang par une DEL. Vous
pouvez distinguer le phototransistor en regardant en haut dans la tte de
llment. La surface interne du phototransistor est grande et noire. La figure suivante montre le montage du test. Le collecteur du phototransistor est la plus petite
connexion, +5 V. La rsistance connecte en
ssaires
srie au phototransistor a 10 kOhm
NanoESP, 1 phototransistor, 1 rsisrron, noir, orange), fil lectrique

Branchement du phototransistor la broche A6 avec une rsistance de protection de


10 kOhm

Le programme
Jusqu prsent les pages web du serveur web consistaient toujours en une page
non modifiable qui envoyait les donnes au contrleur. Maintenant la page web
doit tre modifie avant le transfert au navigateur pour indiquer la luminosit mesure du phototransistor. Cela fonctionne car une sorte despace est cach dans
le code source de la page web. Le programme remplace maintenant au chargement des donnes de la variable progmem lespace rserv *bright* par la valeur
de luminosit actuelle. Ainsi le texte de sortie et lcart du curseur sont modifis.
Une autre ligne dans les donnes HTML assure que la page se recharge automa-

tiquement toutes les deux secondes. Dj, la luminosit actuelle est affiche clairement dans le navigateur.

La page web du capteur de luminosit

Pour que le systme puisse fonctionner, il y a quelques petites modifications dans


les donnes HTML. La premire modification se trouve de nouveau dans la zone
entte :
<meta http-equiv="refresh" content="3">

Cette petite ligne assure que le navigateur recharge la page web automatiquement toutes les trois secondes. Cela vous vite dappuyer constamment sur [F5]
pour pouvoir voir une nouvelle valeur.
La deuxime modification est l o se trouve normalement llment form :
001 <label for="hell">Current Brightness: *bright*</label> <BR>
002 <input type="range" max = "1024" name="hell" value=*bright*><BR>

Ici aucun formulaire nest ncessaire car vous nutilisez la page web quen sortie.
Les deux lments label et range servent dlment de sortie. Dans Label, qui est
normalement utilis pour le titre, on trouve dans le texte la place *bright* .
Llment curseur range reoit comme value la valeur *bright* assigne, qui nest
pas vraiment une valeur lgitime mais sera remplace par lune delles ultrieurement. La valeur maximale de range est 1 024 et a t adapte la plage 10 bits
du contrleur ADC.
Il faut encore veiller dans le code source avant le transfert de la page web ce
que lespace rserv *bright* soit remplac par une valeur lgitime.

001 String createWebsite()


002 {
003

String xBuffer;

004
005

for (int i = 0; i <= sizeof(site); i++)

006

007

char myChar = pgm_read_byte_near(site + i);

008

xBuffer += myChar;

009

010
011

xBuffer.replace("*bright*", String(analogRead(SENSOR)));

012
013

return xBuffer;

014 }

Le remplacement de lespace rserv est excut dans la fonction createWebsite(). Dabord la variable progmem est charge comme dhabitude sur la mmoire
et stocke dans une chane. Toutefois, avant que la fonction renvoie cette chane,
toutes les chanes de caractres *bright*sont remplaces par la valeur actuelle
mesure sur le capteur. La fonction String replace() excute la tche compltement automatiquement. Enfin la chane modifie est rendue et transfre par le
mcanisme connu sur votre navigateur.

4.7 | Commande GPIO


Ce nouveau projet permet la simple commande des broches numriques D2-D7
par la page web. Le statut des broches respectives est affich dans le navigateur
pour que lon ne perde jamais laperu.
Pour pouvoir vrifier correctement ltat de la broche, un montage tel que dans la
figure ci dessous est recommand. La DEL RVB ainsi que la DEL normale sont
utilises. Cependant les cathodes des DELs ne sont pas cette fois-ci branches
la longue ligne de masse sur la partie extrieure de la carte mais elle se trouvent
sur une sortie numrique. Les DELs peuvent sclairer seulement si ces broches

sont activs en position basse.

ssaires

NanoESP, 1 DEL RVB, 1 DEL (rouge),

Branchement des DELs sur D2-D7

Attention ! Les DELs ne doivent pas tre branches sans prrsistances. Ce qui
est admissible ici dpend des rsistances On du port interne FET denviron 30
ohm. tant donn que les DELs sont entre deux ports, elles travaillent donc avec
une prrsistance de 60 ohm. Selon le type et la couleur de DEL, un courant DEL
se rgle entre 15 mA et maximum 360 mA, ce qui est encore admissible.
Le programme
La page web de ce programme ncessite ce quon appelle les Checkbox comme
lments HTML. Quand vous tlchargez le programme et appelez la page de la
carte vous voyez une srie de cases cliquables. Une coche dans la case signifie
que le pin est haut. Pas de coche signifie bas. Vous pouvez maintenant tester
quels pins doivent tre hauts et lesquels bas pour que toutes les DELs sclairent.

La page web de la commande GPIO

Dans ce code HTML, la page web est utilise aussi bien en formulaire dentre
quen lment de sortie. Lorsque vous jetez un coup d'il llment du formulaire, vous voyez quune srie dlments dentre de type checkbox est utilise Il
vous affectera un nom individuel driv du nom des pins. Le texte *checkedX*sert
chaque fois despace rserv dans le texte. Lorsque le pin est bas, lespace
rserv est simplement supprim. Lorsque le pin est haut, le programme utilise
la place de *checkedX* CHECKED ,qui affiche la Checkbox au chargement avec
une coche. Cette fois il y a galement un bouton qui doit tre cliqu aprs la slection de la case correcte pour transfrer le formulaire.
001 <form method="GET">
002 <input type="checkbox" *checked2* name="ld2">D2
003 <input type="checkbox" *checked3* name="ld3">D3
004 <input type="checkbox" *checked4* name="ld4">D4
005 <br><br>
006 <input type="checkbox" *checked5* name="ld5">D5
007 <input type="checkbox" *checked6* name="ld6">D6
008 <input type="checkbox" *checked7* name="ld7">D7
009 <br><br>
010 <input type="submit" value="Send">
011 </form></HTML>

Lvaluation dans le programme fonctionne dsormais comme suit : Supposons


que les cases 3, 5 et 7 aient t slectionnes dans le formulaire. LURL se modifie pour :
[IP]/?ld3=on&ld5=on&ld7=on

Cela signifie que seules les cases slectionnes sont transmises et identifies
avec lindice. Dans la routine loopvoici ce quil se passe exactement : Dabord tout
le port D, sur lequel se trouvent les sorties numriques, est activ bas. Ensuite
une boucle whilerecherche toutes les Id dans le lien ressources. Sur la base
de lindice des ldtrouves, enld3 serait p. ex. la 3,loctet 0b0001000 se gnre par
le dcalage de 1 dans un octet autour de lindice dit 3. Il est ensuite li la valeur
actuelle de loctet. Cela se produit avec tous les indices transmis jusqu ce que le
registre de sorties de D trouve la valeur correcte. Cette forme de sortie au lieu de
digitalWrite() est sans doute quelque peu inhabituelle pour un utilisateur Arduino
dans ce cas mais bien plus pratique.
001 if (esp8266.find("+IPD,"))
002 {
003

debug("Incomming Request");

004

int connectionId = esp8266.parseInt();

005

if (esp8266.find("/?")) PORTD = B00000000;

006

while (esp8266.findUntil("ld", "\n"))

007

008

int ld = esp8266.parseInt();

009

PORTD |= (1 << ld);

010

011 }

linverse, la sortie des cases cocher fonctionne de la manire suivante : dans


la fonction createWebsite()les espaces rservs sont changs depuis le document HTML. Une boucle forpasse un par un tous les ports utiliss de la srie. Si le
pin est haut (galement remarqu ici par la comparaison dun octet qui a t gnr en dcalant les octets hauts), lespace rserv avec lindice est remplac par le
texte checked. Lorsque le pin est bas, lespace rserv est simplement seulement

supprim. Ainsi laffichage correct du port actif est garanti.


001 String createWebsite()
002 {
003

String xBuffer;

004
005

for (int i = 0; i <= sizeof(site); i++)

006

007

char myChar = pgm_read_byte_near(site + i);

008

xBuffer += myChar;

009

010
011

for (int x = 2; x <= 7; x++)

012

013

if (PORTD & (1 << x))

014

015

xBuffer.replace("*checked" + String(x) + "*", "checked");

016

017

else

018

019

xBuffer.replace("*checked" + String(x) + "*", "");

020

021

022

return xBuffer;

023 }

Lors de la cration de ce programme, jai eu quelques problmes dont la cause


ntait pas claire au dbut. Au chargement de la page web il y a eu des erreurs
tranges et souvent les cases cocher compltement errones taient slectionnes.

laide
de
la
librairie
Arduino-MemoryFree-Master-Library

(http://playground.arduino.cc/Code/AvailableMemory) je suis arriv la solution :


La mmoire SRAM tait pousse sa limite et pour cette raison causait des erreurs extraordinaires et imprvisibles. Jai d considrablement allger la version
originale du programme et le code HTML pour que le programme puisse fonctionner dans cette version. Je mentionne cela car la mme chose peut se produire
lors de la cration de votre propre programme. La raison de limportante sollicitation de la SRAM provient avant tout de lutilisation gnreuse certes bien pratique,
mais aussi lutilisation dvorante de ressources des fonctions chane et en gnral
de lutilisation de chanes la place de chanes char. Un string.replace() est trs
pratique mais rclame aussi beaucoup despace mmoire. Si vous tes face des
erreurs inexpliques, je vous recommande de rduire le code source du fichier
HTML et dautre part ventuellement doptimiser quelques oprations de chane.
La libraire nomme ci-dessus peut vous aider dans la recherche derreur.

4.8 | Parenthse: Accder la carte depuis internet


Beaucoup des tests prsents ici sont pratiques pour la commande de la carte
dans son propre rseau domestique. En tout cas cela peut tre utile pour atteindre
la carte depuis de plus grandes distances. On pourrait p. ex. activer lclairage
chez soi alors que lon est en vacances pour effrayer les cambrioleurs. Ou on
contrle par le capteur de lumire si la lumire est vraiment teinte. Ou on envoie
un message court ceux la maison quil se fait tard. Pour que ces ides puissent devenir ralit vous devez procder quelques paramtrages sur votre routeur.
En gnral, les diffrents types de routeurs utilisent galement diffrents logiciels.
Je vais prsenter ici les tapes principales avec un routeur Fritz!Box. Les paramtrages de votre routeur devraient tre similaires.
La plupart des routeurs modernes ont une interface web simple similaire celle
que nous avons cre avec le module. Vous avez besoin dun identifiant et dun
mot de passe pour pouvoir vous enregistrer sur linterface. Pour des routeurs de
type Fritz!Box lIP est souvent 192.168.178.1. Ou vous pouvez galement entrer
http://fritz.box. Si vous utilisez un autre routeur vous devez essayer de trouver lIP
adapte. En gnral le routeur utilise dans le sous-rseau lIP avec ladresse 1. Si
lIP de votre ordinateur est p. ex. 192.168.4.2, lIP de votre routeur sera vraisemblablement 192.168.4.1. Le mot de passe et lidentifiant se trouvent la plupart du
temps au dos du routeur ou dans le manuel correspondant.
Lorsque vous vous tes inscrit dans linterface utilisateur vous devez trouver le
point renvoi de port ou redirection de port. Dans ma Fritz!Box le point se trouve
sous Internet -> Renvoi. Crez une nouvelle rgle de port. Les paramtres doivent
tre choisis de faon ce que les requtes externes sur le port 80 soient rediriges sur lIP de votre carte et sur le port 80. Dans le menu de la Fritz!Box le rglage est facilit et jai juste d choisir le point HTTP-Serverensuite jai pu choisir
dans le menu droulant simplement dans les IP prsentes. Le rsultat doit tre

identique sur tous les ordinateurs.

Les paramtrages corrects dans la Fritz!Box

Les paramtrages sur le routeur seraient ainsi clarifis et on peut tenter un premier test. Pour cela, cette fois-ci vous avez besoin de lIP, pas de lIP de la carte
dans votre rseau locale mais de lIP globale. Vous pouvez trouver celle-ci sur la
page
http://www.meine-aktuelle-ip.de/
. Si vous entrez l lIP transmise maintenant dans votre navigateur, la page web
du module doit apparatre. Cette fois-ci toutefois le long chemin est pris via internet. Si vous ntes pas convaincu que la carte peut maintenant tre atteinte via
internet, vous pouvez utiliser un smartphone avec internet mobile et appeler ainsi
la page. Si le smartphone nest pas connect directement votre WLAN, la page
peut dans tous les cas tre appele via internet.
Le systme que vous avez tabli se prte bien aux tests, il y a cependant deux
problmes pour une utilisation pratique. Dune part lIP ne se remarque pas facilement et dautre part elle change assez frquemment. La plupart des routeurs se
reconnecte au moins une fois par jour pour que lIP globale de votre routeur change galement. Pour ce problme, il y a un remde, cest dire le Domain Name
System (DNS). Ce systme permet p. ex. que vous puissiez appeler
www.google.de et ne deviez pas saisir lIP car il encode des IP compliques dans
des noms faciles remarquer. Chaque site internet normal utilise un DNS et il
existe galement pour vous la possibilit dutiliser ce systme gratuitement.

Il y a diffrents sites web gratuits qui proposent des DDNS. DDNS signifie Dynamic Domain Name System et est un service qui garantit que votre IP est associe
au domaine correct. Je propose ici le service du site http://www.anydns.info/ et
vous pouvez galement utiliser tout autre service web qui propose ce service.

Le site web info AnyDns

Vous devez dabord vous inscrire sur le site et dj indiquer un nom de domaine.
Jai choisi le nom nanoesp et comme hte dynpc.net. Le domaine qui en rsulte
aprs linscription :
http://nanoesp.dynpc.net/
Maintenant le service doit encore apprendre votre IP. Transfrez le service dans
votre routeur de faon quune nouvelle IP soit dirige directement au service
DDNS. Dans la Fritz!Box je devais dabord cliquer sous laffichage : tendu pour
que toutes les options soient affiches. Ensuite je pouvais sous Partages enregistrer galement le service DDNS.

Les paramtrages de la Fritz!Box pour lutilisation du Dynamic DNS

Quelques mots encore en avertissement :


Le service DDNS est sans doute trs pratique, cependant vous devez tre prudent
lorsque vous donnez votre nom de domaine. Ils vous rendent accessible car un
hacker na besoin de connatre que votre domaine et pas votre IP actuelle pour
accder votre routeur. Cest pourquoi je laisserai dans le rseau la page nomme ci-dessus comme test.

THINGSPEAK
Dans ce dernier chapitre il sagit dun tout nouveau sujet, savoir la plate-forme
ThingSpeak. Ce site a t spcialement dvelopp pour le sujet Internet of Things
et met votre disposition diffrentes fonctions pratiques. Entre autres, vous pouvez laide de cette page dune manire simple journaliser une surveillance longue dure de capteurs de mesure et les reprsenter sous forme plus claire. Tant
que vous tes connect internet, vous vous pargnez lenregistrement des valeurs sur un support de stockage externe. De plus, vous pouvez raliser diffrentes commandes via internet. Vous apprendrez au cours de ce chapitre quoi
ressemblent exactement ces fonctions.

5.1 | ThingSpeak
Comme dhabitude, avant de voir le montage et le programme, vous devez vous
crer dabord un compte sur le site
www.ThingSpeak.com
. Connectez-vous ensuite avec vos donnes utilisateur sous le point Sign In .
Vous voyez une page qui indique votre canal (channel). Comme vous navez encore aucun canal cette page semble plutt vide. Cliquez sur New Channel et
donnez un nom p. ex. Light,car dans ce projet vous allez mesurer la luminosit.
Sous le point Field 1 vous pouvez encore donner un nom pour le champ, ventuellement Brightness. Tous les autres champs peuvent rester vides pour
linstant.

Cration dun canal sur le site ThingSpeak

Cliquez sur Save Channel pour sauvegarder les paramtres. Vous tes redirig
sur la page de votre canal sur laquelle on peut voir uniquement un diagramme
vide. Cliquez dans longlet ci-dessus sur API Keys. Les suites de chiffres et de
lettres que vous trouvez sous le point Write API Key vous serviront bientt.

Le montage de ce test consiste en un capteur sur lentre analogique A6. Un diviseur de tension avec une rsistance de 10 k et un phototransistor permet la
mesure de la luminosit actuelle. Vous pouvez galement utiliser le capteur de
temprature. Le circuit reste peu prs le mme
ssaires
sauf que vous remplacez le transistor de lumire
NanoESP, 1 phototransistor, 1 rsispar la thermistance NTC noire. La polarit est
rron, noir, orange), fil lectrique
arbitraire en NTC.

Montage avec phototransistor sur A6

Le programme
Le programme mesure maintenant la luminosit. Mais contrairement
lexprience prcdente, les donnes ne sont pas sur une page web mais directement envoyes sur le site ThingSpeak. Ce site ne mmorise pas seulement les
donnes, il les reprsente galement en aperu dans un diagramme une fonction trs pratique pour une station de mesure avec surveillance longue dure.
Pour que le programme puisse envoyer au site web, vous devez enregistrer
dabord, en plus de vos donnes WLAN, la cl API mentionne ci-dessus sous le
point ThingSpeakKEY dans le programme. Aprs lupload vous voyez les valeurs
de mesures actuelles dans le moniteur srie. Pendant 15 secondes les donnes
sont rassembles et ensuite transmises. Cette valeur est ensuite inscrite dans le
site ThingSpeak. Les 15 secondes sont importantes car vous ne pouvez pas surcharger le site ThingSpeaktoutes les secondes avec de nouvelles valeurs. Vous
visualisez le rsultat de la mesure maintenant sur votre page canal dans le diagramme de reprsentation en bas.

Les rsultats de mesure dans le diagramme

Le code source semble trs diffrent de tous les programmes prcdents. Il sagit
cependant essentiellement dune compilation des lments bien connus. La requte HTTP contient une variable progmem qui doit tre envoye sur le site
ThingSpeak ct de quelques espaces rservs qui doivent tre remplacs en
fonction des requtes.
001 POST *URL* HTTP/1.1
002 Host: api.thingspeak.com
003 Connection: close
004 Content-Type: application/x-www-form-urlencoded
005 Content-Length: *LEN*
006
007 *APPEND*

Comme vous voyez, lappel correspond presque lappel get. Ici galement une
*URL* doit tre prcise. De plus vous devez remplacer *LEN* par la longueur du
message que vous saisissez la place de *APPEND* .
Ceci est le format universel valide pour les sites web avec les donnes qui sont
envoyes avec POSTrequte sur le site. Si vous voulez enregistrer maintenant,
comme indiqu dans lexemple, les donnes de mesure dans un canal dans votre

compte, vous devez utiliser la structure suivante : *URL* est


/update. Cest le sous-site sur lequel les donnes doivent tre envoyes. Le message est maintenant compos de votre cl API, du champ remplir et de la valeur. La longueur du message se dtermine facilement par la longueur de la chane. Dans lensemble, un exemple POST ressemble ceci :
001 POST /update HTTP/1.1
002 Host: api.thingspeak.com
003 Connection: close
004 Content-Type: application/x-www-form-urlencoded
005 Content-Length: 35
006
007 api_key=GXE93O4WF03Q3X8I&field1=954

Le site web peut clairement identifier lutilisateur et le canal par la cl API et enregistre les valeurs. Lensemble de la fonctionnalit de la compilation des requtes
est cache derrire plusieurs fonctions. Pour envoyer la nouvelle valeur vous
devez seulement appeler la fonction sendThingPost() qui a besoin comme paramtre de la KEY et des donnes du capteur. Tout le reste est excut automatiquement en arrire-plan.

5.2 | Affichage Twitch


Le site web ThingSpeak propose un peu plus que la surveillance longue dure de
capteurs. Le projet suivant est similaire au projet du client TCP. Les informations
sont en effet obtenues depuis un site web sur internet. Dans ce cas il sagit de
savoir sil y a dj ou non un flux en ligne.
Il y a deux avantages significatifs de la variante ThingSpeak par rapport aux premires expriences. Premirement, dautres sites web peuvent tre traits par
ThingSpeak via HTTPS (HyperText Transfer Protocol Secure) alors que le module
de supporte que le protocole HTTP qui est bien moins sr. Deuximement le site
web peut dj prfiltrer des informations et ainsi rduire la quantit de donnes
traiter par le contrleur.
Dans ce projet vous raliserez un affichage Twitchen streaming comme exemple
type pour diffrentes possibilits. Twitch (www.twitch.tv) est un site web sur lequel
des jeux en live ou dautres contenus autour des jeux sur ordinateur sont diffuss.
Un des canaux les plus connus de streaming est RocketBeansTV lancien concepteur de GameOne. Ce canal diffuse 24/24 et pour cela est bien adapt pour un

ssaires
NanoESP, 1 DEL (rouge), 1 rsistannoir, rouge), fil lectrique

premier essai. Ultrieurement vous pouvez bien


entendu utiliser un canal de votre choix.

Montage de lexprience avec une DEL sur le pin D9

Le programme
ct de la structure hardware quelques tapes sur le site ThingSpeaksont ncessaires. Lorsque vous cliquez sur le site tout en haut dans le menu Apps
une srie de diffrentes applications saffiche. Cette fois-ci nous nous occupons
de lappli ThingHTTP. Lorsque vous cliquez sur le bouton correspondant, une
interface compltement vide saffiche. Cliquez sur New ThingHTTP. Dans le formulaire qui est apparu saisissez ce qui suit :
Nom :
Twitch
URL :
https://api.twitch.tv/kraken/streams?channel=
rocketbeanstv
Mthode :
GET
HTTP Version: 1.1
Parse String:
_total
Si vous prfrez un autre canal de streaming, vous pouvez entrer dans lURL
derrire channel un autre canal. Cliquez sur Save ThingHTTP et copiez ensuite la
cl API apparue dans laperu dans le presse-papiers. Vous devez maintenant
copier la cl dans le programme et derrire #define ThingHTTP. Ne pas oublier les
donnes WLAN et vous pouvez dj uploader le programme. Une fois par minute
la prsence dun flux est contrle. Si cest le cas, la DEL commence s clairer.
Ce programme est possible dans la mesure o les informations du site Twitchsont

galement disponibles dans le format connu JSON. Par le site


https://api.twitch.tv/kraken/streams?channel=rocketbeanstv
Vous pouvez regarder la sortie en format JSON. Cest une quantit de texte mais
seul lattribut nous intresse _total,qui affiche le nombre de flux actifs Si ce chiffre
est suprieur zro, cela signifie quau moins un flux est actif. Cet attribut est
automatiquement pranalys par ThingSpeaket sorti en valeurs plus claires. Cette
valeur est ensuite facilement appele et value dans le programme par la fonction getThingSpeakHttp().

5.3 | Systme dalarme Twitter

Dans ce projet il sagit dun systme dalarme avec lequel vous pouvez par exemple contrler si quelquun ouvre un tiroir sans autorisation. En cours la lumire est
contrle sur le capteur de lumire connect si la luminosit fixe diminue. Si cest
le cas, un signal d'alarme est mis et en plus un message est envoy via Twitter.
Le montage est sur la figure ci-dessous. Ou bien vous pouvez naturellement galement ici utiliser le capteur de temprature et
ssaires
surveiller le dpassement dune certaine tempraNanoESP, 1 phototransistor, 1 rsisture.
rron, noir, orange), 1 piezo, fil lectri-

Capteur de lumire sur A0, piezo sur D8

Le programme
Le sujet est ici entre autres lappli Twitter du site ThingSpeak. Cliquez donc sur
Apps et ensuite sur ThingTweet. En cliquant sur Link TwitterAccount et en saisissant vos donnes daccs, vous tablissez une connexion entre les deux services.
Si vous navez pas encore de compte Twitter, cela vaut la peine de crer un
compte pour travailler avec le kit dapprentissage pour les essais. Une fois que
Twitter a t li avec succs avec ThingSpeak vous pouvez sous
Apps/ThingTweet enregistrer la cl API derrire le point #define TwitterKEY .
Le programme vrifie maintenant en permanence si la luminosit mesure passe
au-dessus dune valeur de 500. Si cest le cas, un message Twitter est envoy et
lalarme sonne et ce tant que la luminosit nest pas redescendue sous 500. Vous
pouvez suivre les valeurs de luminosit actuelles mesures par le moniteur srie.
Pour les premires expriences je recommande de couvrir le capteur de lumire
pour que lalarme ne se dclenche pas trop tt.
La nouvelle fonction dans ce projet sappelle sendTwitterPost(). Seuls TwitterKEY
et le message doivent tre spcifis comme paramtres. La fonction regroupe
toutes les parties ncessaires pour en faire un post ThingSpeak. Vous pouvez
galement envoyer des messages en appuyant sur le bouton ou publier les rsultats de mesure. Tout cela grce ThingSpeak-API.

5.4 | TalkBack

Dans ce projet il sagit dune autre appli du site ThingSpeak savoir lappli TalkBackAvec cette fonction il est possible de crer une instruction qui est lue et excute par le contrleur. Ce qui semble inutile avec un seul contrleur prend tout
son sens lorsque lon utilise deux contrleurs ou mme tout un rseau de contrleurs. Certaines cartes peuvent agir comme capteurs, par exemple avec des capteurs de proximit, et lors de la dtection dun mouvement envoyer une instruction
TalkBack. Un autre module lit linstruction du site ThingSpeaket ouvre ensuite la
porte ou dclenche lalarme.
Pour le montage de lexprience vous avez besoin
ssaires
de deux boutons. Une DEL avec prrsistance
NanoESP, 2 boutons,1 DEL (rouge),
affiche ltat actuel.
m (marron, noir, rouge), fil lectrique

Montage avec deux interrupteurs sur D5 et D10 et une LED sur D9

Le programme
Dabord il faut mettre en place surApps/TalkBack un nouveau canalTalkBack.
Vous pouvez utiliser comme nom p. ex. Doors. Si vous souhaitez vous pouvez
galement enregistrer la commande sur un canal. Il peut sagir du canal light dj
cr de la premire exprience ThingSpeak
ou dun propre canal. Toutes les commandes sont ensuite journalises. Ce qui est
important avant tout cest la cl API que vous enregistrez via #define TalkBackKEY . En plus de la cl API, il faut cette fois une ID que vous trouvez sous TalkBack ID aprs avoir cliqu sur Save TalkBack. Vous enregistrez cette ID derrire
#define TalkBackID dans le programme.
Si maintenant vous avez tlcharg le programme et appel le moniteur srie,
vous verrez dabord le message No Command. Appuyez maintenant sur un des
deux boutons. Aprs un bref moment apparat le message OpenDoor ou CloseDoorselon le bouton sur lequel vous avez appuy. Avec la commande OpenDoorla DEL commence sclairer.

Laperu TalkBack lors de lenregistrement dune commande

Il existe une possibilit par laquelle vous pouvez saisir les commandes directement sur internet. Lorsque vous cliquez sur le site TalkBacksur votre canal Door
vous voyez sous loption Add a new command. Avec celle-ci vous pouvez saisir
manuellement la commande OpenDoor ou CloseDoor et ainsi piloter le module.
Vous pouvez donc piloter la platine depuis plusieurs sources par les commandes
TalkBack. Dans le code source, la fonction getTalkBackCom() supporte la requte
de nouvelles commandes. Lorsque quelque chose a t trouve, la commande est
retourne. Vous devez uniquement indiquer les paramtres key et id .

5.5 | Cheerlights

Cette exprience est base sur un projet de Hans Scharler, qui sappelle Cheerlights. Lide : Dans le monde il y a des lumires en rseau qui se commandent
simultanment via les commandes Twitter. Un bon
ssaires
exemple est que le monde et internet se dvelopNanoESP, 1 DEL RVB, 3 rsistances
pent ensemble.
ir, rouge), fil lectrique

Les DEL RVB sur le circuit imprim aux broches D3, D5 et D6

Le programme
Pour ce programme exceptionnellement vous ne devez procder aucune modification ThingSpeakcar le projet a dj un canal public que vous trouvez sous
https://thingspeak.com/channels/1417
. Sur le site vous trouvez dautre part toujours la couleur actuelle ainsi que dautres
informations sur le projet.

Le site Cheerlights
avec la
couleur actuelle mauve

Pour ce programme il faut en plus la librairie Crossfade de Radek Wierzbicki


(source
:
https://github.com/radekw/Arduino/tree/5f24ce7c8db9dfbb5252b59824c3217d851
b3a3c). Pour des raisons pratiques, une copie de la version library utilise se
trouve dans le dossier sketch. Elle doit tre copie dans le dossier libraries de
votre dossier sketchbook. La librairie permet de dfinir des couleurs rapidement et
simplement et veille ce que les DELs apparaissent lentement dans une autre
couleur (fade).
Lorsque vous tlchargez le programme, la couleur actuelle de la DEL s'affiche
aprs quelques secondes. Vous pouvez maintenant soumettre un message Twitter et donc modifier votre couleur et galement celle des autres utilisateurs Cheerlights. Le message doit contenir pour lun #Cheerlights, @Cheerlights ou simplement juste le mot-cl Cheerlights et pour lautre une des couleurs prdfinies derrire le mot-cl. Font partie des couleurs prdfinies :

red, green, blue, cyan, white, warmwhite, purple,


magenta, yellow, orange, pink

Un Tweet possible pourrait par exemple ressembler :


Testing my #cheerlights project on my #NanoESP with the
color blue #ThingSpeak #IoT

Et dj vous avez transmis au monde entier une nouvelle couleur.


La requte de la couleur actuelle est ralise avec la fonction getCheerlightColor()
. Comme paramtres sont indiqus lhte, donc api.thingssspeak.comet lURL, ici
/channels/1417/field/1/last.txt. Il sagit donc dune requte client TCP simple de
type connu. Ici galement la rponse du serveur est rduite au texte pertinent et
renvoye. La comparaison avec les mots-cls donne la couleur recherche qui
apparat ensuite laide de la libraire crossfade. Un essai comparativement plus
simple avec cependant un effet aah plus important.

5.6 | Dtecteur dincendie Twitter avec fonction TalkBack

Ce projet de dtecteur dincendie relie deux lments que avez rencontrs au


cours du travail avec le kit dapprentissage. La platine est utilise entre autres
pour la surveillance longue dure de la temprature. En mme temps la platine
dclenche un signal dalarme si la temprature dpasse une valeur dfinie, p. ex
lapparition dun incendie. Ici la surveillance du dpassement de seuil nest pas la
tche de la platine mais de ThingSpeak-App React.
Pour le dtecteur dincendie, le type CTN (Coefficient de Temprature Ngative)
prsent seulement comme alternative de capteur de lumire est utilis cette foisci comme capteur. Celui-ci modifie sa rsistance en fonction de la temprature.
Vous pouvez le commuter contre une rsistance
ssaires
10 kOhm, mais dans ce cas le potentiomtre est
NanoESP, 1 potentiomtre, 1 piezo, 1
utilis car on ne peut pas encore ajuster la mesul lectrique
re.

Le montage du projet dtecteur dincendie

Le programme
Le programme doit runir plusieurs lments. Ici le site ThingSpeaka de nouveau
une grande importance. La surveillance du dpassement de seuil du CTN est
cette fois-ci supporte entre autre par une appli ThingSpeak. Les actions dalarme
sont galement excutes de l, cest dire un message Twitter envoy et une
commande TalkBackinsre qui dclenche lalarme sur le contrleur.
La premire tape est de crer un nouveau canal sur la page ThingSpeak. Vous
pouvez par exemple lappeler FireAlarm . Le champ 1 reoit ensuite la dsignation
Temp. Sous API Key se trouve la premire cl que vous devez enregistrer pour
ThingSpeakKEY . Dj avec cela la transmission de la valeur actuelle de temprature serait garantie.
La deuxime tape est la cration dun nouvel lment TalkBack. Vous pouvez par
exemple utiliser comme nom Alarms. Dautre part vous pouvez laisser se connecter
les commandes dans le canal FireAlarm. Vous devez enregistrer la cl API derrire
TalkBackKEY et lID derrire TalkBackID. Vous pouvez dsormais envoyer des
commandes la platine. Vous pouvez galement enregistrer les commandes manuellement, en cliquant dans laperu TalkBack du canal dalarme sur Add a new
Command et l enregistrer sous Command String Alarm . Une indication de la position nest pas ncessaire puisque linstruction est mmorise automatiquement la
premire place. Vous pouvez maintenant tlcharger et tester le programme, si la

transmission de la valeur de temprature actuelle fonctionne et si la platine excute


la commande. cette position cela vaut la peine de calibrer le CTN sur le potentiomtre par un thermomtre dintrieur.
Au fond, ce serait dj un projet de valeur mais il manque les fonctions bonus.
Celles-ci en effet ne doivent plus tre excutes dans le programme mais sur le
site ThingSpeak. Pour cela allez sur Apps et slectionnez ensuite React . Avec React il y peut y
avoir une raction certains rsultats . Crez donc en cliquant sur New React une
nouvelle fonction Reactet saisissez les valeurs suivantes :
Name:
FireDetect1
Condition Type: Numeric
Test Frequency: On Data Insertion
Condition:
If Channel
FireAlarm
field 1 (Temp)
is greater than
40
Action:
ThingTweet
then tweet:
Fire Alarm on the #NanoESP! Temp: %%trigger%%C #ThingSpeak #IoT
Using Twitter Account
[Twitter Account]
Options:
Run action only the first time the condition is met
Avec Save Reactvous enregistrez les paramtres. Ainsi la premire tape de la
surveillance est excute. Si la valeur est dpasse ThingSpeak envoie un message Twitter par votre compte. Pour la deuxime tape, linsertion de la commande alarme, vous devez encore piocher un peu plus au fond dans la bote astuces
car cette fonction nest pas prise en compte automatiquement. Mais ce qui est pris
en compte cest ThingHTTP. Donc cliquez sur Apps et ensuite sur ThingHTTP. L
crez un nouvel lment et saisissez ce qui suit :
Name:
Alarm
URL :
https://api.thingspeak.com/talkbacks/[YOUR
TALKBACK ID]/commands
Method:
POST
HTTP Version: 1.1
Host:
api.thingspeak.com
Headers:

Body:

api_key=[YOUR TALKBACK ID]Key command_string=Alarm&position=1


Assurez-vous de remplacer [YOUR TALKBACK ID] et [YOUR TALKBACK KEY]
dans lURL et le Body-Part par votre TalkBack ID et votre KEY . Maintenant vous
pouvez crer un autre lment Reactqui comporte les mmes paramtres que le
premier avec seulement la modification que vous avez slectionne par Action
ThingHTTP et l le point Alarm . Vous avez ainsi garanti quune alarme se dclenche si la valeur critique est dpasse.
Vous pouvez dailleurs laisser sonner lalarme temporise. Pour cela vous devez
cliquer sous Apps sur TimeControl et crer un nouvel lment, avec p. ex. le nom
AlarmClock. L procdez aux paramtrages suivants :
Name:
Presents
Frequency:
One Time
Time Zone:
Berlin
Run At:
2015-24-12 7:00 am
Fuzzy Time:
0 minutes
TalkBack:
Alarms, add command: Alarm

Les paramtres TalkBack corrects pour lalarme incendie

Pour un premier test il est recommand de choisir un temps de quelques minutes.


Lorsque cela a fonctionn, on peut rgler le temps correct. Ce nest certainement
pas le meilleur son pour tre rveill mais cest certainement plus efficace.

ANNEXE

Commandes AT
Instruction

Orthographe

fondamentale
Instruction de test

AT

Reset

AT+RST

Infos firmware

AT+GMR

Echo marche/arrt

ATE<1/0>

Instructions WLAN
Mode WLAN
(1 = Client, 2 = AP, 3 = Dual)

AT+CWMODE=<mode>

Chercher le rseau WLAN

AT+CWLAP

Connecter WLAN

AT+CWJAP=<ssid>,<pass
>

Sparer WLAN

AT+CWQAP

Rglages point daccst WLAN

AT+CWSAP=<ssid>,<pas
s>[,<chan>,<enc>]

Donner adresse IP

AT+CIFSR

Activer/dsactiver DHCP

AT+CWDHCP=<1/0>

Connecter automatiquement au
WLAN

AT+CWAUTOCONN=<1/0>

Modifier ladresse Mac du poste

AT+CIPSTAMAC=<MAC>

Paramtrer ladresse IP (poste)

AT+CIPSTA=<IP>

Paramtrer ladresse IP (point


daccs)

AT+CIPAP=<IP>

Dmarrage SmartConfig

AT+CWSTARTSMART=<typ>

Arrt SmartConfig

AT+CWSTOPSMART

Communication
Fonction ping

AT+PING=<HOST>

Autoriser plusieurs connexions

AT+CIPMUX=<mode>

Mode donnes
(0=Transparent, 1=mode donnes)

AT+CIPMODE=<mode>

Structure donnes reues

+IPD,<id>,<len>:<data>

Connecter

AT+CIPSTART=<type>,<a
ddress>,<port>

Envoyer des donnes

AT+CIPSEND=<id>,<len>

Dconnecter

AT+CIPCLOSE=<id>

Instructions serveur
Dmarrer le serveur

AT+CIPSERVER=1,<port>

Arrter le serveur

AT+CIPSERVER=0

Statut du serveur et des clients connects

AT+CIPSTATUS

Dfinir le Server-Timeout

AT+CIPSTO=<timeout>

Afficher les clients connects

Pinout

AT+CWLIF