Mode d'emploi | Conrad Components 10215 Profi Lernpaket Internet of Things Course material 14 years and over Manuel utilisateur

Ajouter à Mes manuels
90 Des pages
Mode d'emploi | Conrad Components 10215 Profi Lernpaket Internet of Things Course material 14 years and over Manuel utilisateur | Fixfr
AVANT DE COMMENCER
À la première connexion du IoT-WiFi-Boards (ci-après également
appelé NanoESP) il peut arriver que l’ordinateur ne trouve pas automatiquement le
pilote indispensable pour le convertisseur série USB. Si c’est le cas, vous devez
télécharger le pilote depuis la page www.iot.fkainka.de/driver et l’installer manuellement. Dans le logiciel Arduino vous pouvez ensuite sélectionner le port et
comme carte Arduino Nano (processeur : Atmega328). Ensuite le contrôleur
doit être prêt à l’emploi.
Pour travailler avec le moniteur série vous devez en effet procéder à des paramétrages. Le débit en bauds utilisé ici est 19 200 Bauds. Pour envoyer des instructions vous devez d’autre part sélectionner l’option CR et NL à côté du menu pour
le débit en bauds.
Les paramétrages corrects dans l’environnement Arduino
J’ai travaillé avec les versions Arduino IDE 1.6 5 et 1.6 6. Les versions plus anciennes peuvent provoquer des problèmes. Vous trouverez la version actuelle
Arduino-IDE sur le site internet www.arduino.cc.
En cas de difficultés ou de problèmes avec la carte ou le kit d’apprentissage vous
pouvez trouver de l’aide à tout moment sur la page webwww.iot.fkainka.de. Sur
cette page vous trouverez de plus un forum, de nouveaux projets d’utilisateurs et
également tous les programmes présentés ici dans la toute dernière version.
Dans le kit d’apprentissage se trouve une platine d’expérimentation sur laquelle
vous pouvez enficher le
NanoESP, comme indiqué sur la figure ci-dessous. Cela laisse plus de place pour
l’expérimentation pendant que le module WLAN derrière dépasse sur la platine
d’expérimentation. Le câble micro USB peut ensuite être enfiché, comme indiqué
sur la figure dans la section suivante, et la perturbation est minimale. Des figures
de montage détaillées se trouvent dans les chapitres respectifs.
La carte IoT-WiFi (NanoESP)
L’élément principal de ce kit d’apprentissage est la carte IoT-WiFi (NanoESP).
Comme on le remarque très bien sur la carte, celle-ci est constituée de deux composants. Sur la moitié gauche il s’agit d’un système microcontrôleur compatible
Arduino qui est comparable au nano Arduino. La partie droite est le module WLAN
avec la désignation ESP8266.
Ces deux composants communiquent entre eux par l’interface série générée par
logiciel.
NanoESP sur la platine d’expérimentation
Disposition des broches de la platine
Sur la platine il y a beaucoup d‘éléments différents, tels que les broches (pin),
parmi lesquels certains ont une fonction particulière, 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 d’ensemble, les fonctions et désignations les plus importantes
des différents éléments sont répertoriées dans les figures suivantes.
Les broches les plus importantes et désignations de la platine
Le module WLAN est contrôlé par ce qu’on appelle les commandes AT. La partie
Arduino de la platine est reliée 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.
D’autres propriétés hardware importantes de la carte sont brièvement énumérées
dans le tableau ci-dessous.
Données techniques
Microcontrôleur :
ATmega328
Mémoire-flash :
32 kB (dont 0,5 kB pour le bootloader)
SRAM (mémoire vive statique) : 2 kB
EEPROM (mémoire morte effaçable électriquement et programmable) :
1 kB
Signal d’horloge :
16 MHz
Broches E/S :
20 (dont 2 pour la communication avec le module
WLAN)
U dont MLI :
6
U dont entrées analogiques : 6
USB pour puce de série :
CH340G
Tension de service :
5V
Tension d’entrée recommandée : 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 intégrée
Puissance de sortie +19,5 dBm en mode 802.11b
Faible puissance CPU 32 bit intégrée
Communication via UART
ELEMENTS DU KIT
D’APPRENTISSAGE
Ci-dessous se trouve un aperçu des éléments contenus dans le kit
d’apprentissage.
1
carte IoT-WiFi (NanoESP)
1
platine d’expérimentation
1m
fil électrique
2
boutons-poussoirs
1
cosse clip 9 V
1
DEL (rouge)
1
DEL RGB (4 pattes de raccordement)
1
résistance 10 kOhm (marron, noire, orange)
1
résistance 1 kOhm (marron, noire, rouge)
1
phototransistor (2 pattes de raccordement)
1
NTC 10 kOhm
1
haut-parleur Piezo
1
potentiomètre 10 kOhm avec bouton rotatif rouge
CONNAITRE LE MODULE
Ce premier chapitre aborde les fonctions de base du module WLAN. Le module
est contrôlé par ce qu’on appelle les commandes AT. Vous retrouverez tous les
exemples de programmes utilisés ainsi que l’aide et d’autres information sur
www.iot.fkainka.de
Le plus simple est de télécharger le répertoire zip complet et de copier le dossier
décompressé complètement dans votre dossier Sketch. Ensuite vous pouvez
ouvrir tous les programmes l’un après l’autre confortablement depuis l’interface
Arduino.
1.1 | Commandes AT essentielles
C’est tout simplement en l’essayant que l’on obtient la meilleure première impression des commandes AT. C’est 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 s’agit
ici d’un programme simple qui ne fait rien de plus que transférer les données reçues par l’interface hardware du microcontrôleur au contrôleur ESP par l’interface
logiciel définie. Tout fonctionne également en sens inverse. Comme on peut le voir
dans le code source, les deux connexions de l’interface logiciel sont les broches
11 et 12. Celles-ci ne doivent pas être utilisées comme broches GPIO dans vos
propres projets. D’autre part, vous avez besoin de la librairie SoftwareSerialLibrary, qui est déjà préinstallée dans la plupart des versions Arduino. Dans le
cas contraire, vous devez télécharger la libraire par le gestionnaire.
Une fois le programme téléchargé, vous pouvez démarrer le moniteur série de
l’interface Arduino. Avant de le lancer, vous devez encore procéder à deux paramétrages importants sur le moniteur série, à savoir placer le débit en bauds sur
19 200 dans le coin inférieur droit et procéder au paramétrage CR et NL dans la
case à côté à gauche.
Vous pouvez maintenant déjà voir un message, à savoir AT et quelques lignes en
dessous OK. La commande AT a été envoyée par le microcontrôleur au module
ESP et le module a répondu par OK. À partir de là vous pouvez remarquer que le
module WLAN fonctionne et est prêt à être utilisé.
Paramétrages du terminal : CR et NL et un débit en bauds de 19 200
1.1.1 | Commandes de base
Vous pouvez désormais tester certaines commandes de base du module, en saisissant simplement la commande et en l’envoyant au module par [Enter].
L’utilisation des majuscules pour l’instruction a son importance ici. Vous pouvez
transmettre votre première instruction en saisissant
AT
dans le moniteur en série et en appuyant sur [Enter]. Le programme téléchargé
transmet l’instruction au module ESP qui répond par retour à AT et ensuite OK .
La commande suivante que vous pouvez tester est :
AT+GMR
Le firmware actuel et le numéro de version sont affichés par cette instruction.
Avec l’instruction
AT+RST
Vous pouvez réinitialiser le module. Vous voyez d’abord dans le terminal quelques
caractères illisibles et au bout readycomme caractère, indiquant que le module est
prêt maintenant. Une autre instruction est :
ATE0
Avec celle-ci on peut désactiver ce qu’on appelle l’écho du module. Cela signifie
que vous n’avez pas reçu la commande envoyée mais seulement la réponse. Si
par exemple vous envoyez AT il n’y a pas d’abord AT et ensuite OK, mais seulement OK en retour. Pour vos premiers pas, il est cependant souhaitable que l’écho
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 propriétés WLAN
du module. Avec la plupart des instructions vous pouvez non seulement définir un
état mais également vérifier l’état actuel. Cela se fait en ajoutant un point
d’interrogation directement après l’instruction, p. ex.
AT+CWMODE?
Comme valeur de retour est généralement présentée
+CWMODE=2
suivie de OK. Si vous saisissez
AT+CWMODE=?
Le module vous répond avec les paramètres possibles de l’instruction, à savoir ici
1-3. AvecCWMODE il s’agit d’ailleurs de l’instruction avec laquelle vous pouvez
déterminer le mode WLAN.
Il y a trois modes de fonctionnement que je peux appeler l’un après l’autre.
1 AT+CWMODE=2 – le module comme point d’accès (Access Point mode AP)
À la livraison, le module est un point d’accès. 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 réglage usine, aucun mot de
passe n’est attribué de façon à ce que la connexion ne représente aucun problème.
Lorsque vous êtes connecté au module, vous n’avez pas de connexion internet car
le module n’est pas un routeur avec une propre connexion au réseau téléphonique.
Ce mode WLAN est néanmoins utile si vous avez besoin par exemple d’un réseau
fermé sécurisé. À propos de sécurité : Il est également possible d’attribuer un mot
de passe au réseau et ce par l’instruction :
AT+CWSAP
Des paramètres doivent encore être indiqués et dans l’ordre et séparés par des
virgules :
U le nom du réseau entre guillemets,
U le mot de passe entre guillemets,
U l’identifiant du canal (Channel ID de préférence une valeur entre 1 et 13),
U et le mode de cryptage (valeur de 0 à 4).
Un paramétrage potentiel serait :
AT+CWSAP="MyNanoESP","MyPassword",5,3
Après un bref moment apparaît OK comme confirmation. Si ERROR apparaît,
vérifiez à nouveau vos données, avant tout les guillemets. Si cependant ERROR
apparaît, vérifiez 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 connectés au module avec les adresses IP et MAC par l’instruction
AT+CWLIF
.
Module en mode socle L’IP de l’ordinateur connecté est marquée.
2 AT+CWMODE=1 – Module en mode socle
Avec l’instruction
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 possibilités.
Vous pouvez d’abord lister avec l’instruction
AT+CWLAP
tous les réseaux à portée et ainsi vérifier si votre réseau est dans le rayon de réception. Pour pouvoir établir une connexion à votre routeur, vous avez besoin de
l’instruction
AT+CWJAP
Celle-ci, comme l’instruction CWSAP, a des paramètres importants, à savoir le
nom du réseau WLAN (également appelé SSID) et le mot de passe, les deux de
nouveau entre guillemets et séparés par une virgule. La mise en place d’une connexion à un deuxième module, paramétré avec les données mentionnées dans la
section précédente, ressemblerait donc à :
AT+CWJAP="MyNanoESP","MyPassword"
La mise en place de la connexion peut durer quelques secondes et devrait ensuite
renvoyer OK. Vous pouvez d’ailleurs appeler l’IP du module attribuée par le routeur par l’instruction
AT+CIFSR
. Cela sera important plus tard si vous voulez établir une connexion au serveur
TCP du module. Avec l’instruction
AT+CWQAP
Vous pouvez à nouveau séparer la connexion de votre routeur.
La platine établit une connexion à un deuxième NanoESP.
3 AT+CWMODE=3 – le mode double
Le troisième mode possible de paramétrage WLAN est le mode double. Il permet,
comme son nom le laisse entendre, d’utiliser le module en modes socle et AP.
Cela signifie qu’il peut à la fois établir une connexion sans fil avec le module ou
atteindre le module via le routeur en station intermédiaire. Un mode pratique lorsqu’on envisage un réseau interne avec plusieurs
ctions dans l’annexe et sur la page
modules et que cependant un module doive servir
de serveur, qui livre les données au réseau. Mais
des importantes se trouvent d’ailleurs
davantage à ce sujet plus tard.
la page web déjà mentionné
Certaines commandes, telles que le
bauds n’ont pas été répertoriées voes peuvent rendre le module inutilisa-
1.2 | Configuration automatique
Vous pouvez déjà tester les instructions de base manuellement. Dans ce chapitre
la question est maintenant de préciser comment ces instructions peuvent être
actionnées directement par le contrôleur. D’autre part, vous vous familiarisez avec
une autre instruction avec laquelle vous pouvez tester si un PC dans un réseau ou
un serveur sur internet peut être atteint. Dans cet exemple le serveur Google est
en effet pingué. Dans ce programme d’exempleP02_GooglePing les processus,
que vous avez saisis manuellement dans le premier exemple, sont maintenant
principalement automatisés. Le contrôleur envoie des instructions les unes après
les autres au module ESP et établit ainsi la connexion au WLAN. Les différents
longs Timeout (temps de latence) donnent suffisamment de temps de réponse au
module.
Avant que le programme puisse cependant fonctionner correctement, vous devez
inscrire vos données derrière #define SSID et #define PASSWORD dès le début du
programme code source. Le module nécessite en effet un accès internet pour pouvoir
exécuter sa dernière instruction. Avec l’instruction
AT+PING
d’autres appareils peuvent être pingués au réseau. Le ping signifie que l’on demande si un ordinateur est généralement accessible. Ici la commande ping est
envoyé au serveur Google-Server avec AT+PING="www.google.de". Si une information revient, un message de réussite apparaît dans le moniteur en série et la
DEL inscrite avec D3 qui est connectée à la broche D13 de la platine est activée.
Alors la première communication avec internet aurait réussi.
Le programme
Par la suite nous analyserons progressivement les fonctions du programme. Pour
commencer nous abordons la communication avec le module.
1 Communication série
L’ensemble fonctionne par l’interface logiciel série qui est fournie avec SoftwareSerial-Library . À l’initialisation les broches utilisées doivent en outre être indiquées, dans ce cas les broches 11 et 12.
001 #include <SoftwareSerial.h>
002 SoftwareSerial esp8266(11, 12);
Précisément comme avec l’interface série normale des octets ou des lignes entières peuvent être transmises avec l’instruction esp8266.print ou esp8266.println .
Les instructions esp8266.find et esp8266.findUntil, avec lesquelles un flux entrant
sur certaines chaînes de caractères peut être contrôlé, sont particulièrement pratiques. De ce fait, il est très simple d’intercepter la réponse appropriée du module.
Toutefois, si une chaîne de caractères attendue n’est pas échangée, cela peut
prendre un certain temps avant que le programme continue. Le temps de latence
(Timeout) est défini par esp8266.setTimeout . Avec findUntil() une deuxième chaîne de caractères peut cependant être définie par laquelle la fonction de recherche
s’arrête 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
l’instruction 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 reçu. Si l’attente 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 envoyée revient pour pouvoir
contrôler facilement quelle instruction est à l’origine des problèmes.
Pas toutes les instructions ATont une valeur de retour explicite ou à une ligne. Si
par exemple l’adresse IP est interrogée, il n’y a pas nécessairement de valeur
connue à l’avance. C’est pourquoi il y a une deuxième fonction sendCom()qui n’a
besoin que du paramètre command et renvoie ensuite toute la chaîne (string)
reçue. La chaîne ne doit cependant pas être trop longue car la mémoire tampon
du SoftwareSerial peut être dépassée.
001 String sendCom(String command)
002 {
003
esp8266.println(command);
004
return esp8266.readString();
005 }
2 Recherche des erreurs
En développant le programme il y a souvent des erreurs et des complications.
Pour avoir vraiment une chance, il y a deux fonctions debugqui sont activées ou
désactivées par un paramètre au tout début du programme.
#devine DEBUG true
La première fonction n’a pas plus d’effet qu’une simple édition de texte par
l’interface série définie comme standard. Lorsque la constante DEBUGest vraie, le
contenu de la chaîne de caractères Msgest envoyé.
001 void debug(String Msg)
002 {
003
if (DEBUG)
004
{
005
006
Serial.println(Msg);
}
007 }
La deuxième fonction est rapidement expliquée. Si la fonction
serialDebug est appelée, le programme passe dans une boucle et se comporte à
partir de là comme le premier programme SoftwareSerialtesté. Cela signifie que
toutes les données qui ont été envoyées par le moniteur série au contrôleur passent directement sur le module et inversement. En cas d’erreur on peut appeler la
fonction et envoyer des instructions manuellement pour tester où se trouve
l’erreur.
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 général plus clairs, la plupart des paramètres sont
externalisés dans des fonctions propres, tous dans la fonction espConfig, dans
laquelle sont placés les principaux paramètres 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 début de la fonction la variable success est d’abord posée sur true , car cette
variable est liée désormais avec différentes fonctions et. Cela signifie que même si
une seule des fonctions retourne la valeur, falsesuccess est donc immédiatement
false et toue la configuration a échoué. La première instruction AT contrôlée avec
succès est l’instruction Resetqui est presque toujours exécutée au début du programme, pour s’assurer que les essais précédents ne revendiquent pas encore le
module. Cela peut durer en effet jusqu’à cinq secondes jusqu’à ce que le module
renvoie le message ready. C’est pourquoi brièvement avant la fonction sendCom()le temps de latence pour esp8266.findUtil est fixé haut. Après le reset, le
temps de latence et de nouveau établi sur la valeur standard d’une seconde.
Ce qui suit ensuite est l’appel d’une fonction elle-même définie avec le nom
configStation()qui est abordée dans la section suivante. Elle sert à connecter le
module avec son réseau domestique. À cette fin, les paramètres SSID et PASSWORD que vous avez enregistrés au début du programme, sont transmis. Si la
connexion a été établie avec succès, le message de réussite d’abord et ensuite
l’adresse IP actuelle du module sont transférés au module série. À la fin de la
fonction sont encore fixés des paramètres sur lesquelles je reviendrai plus tard.
Enfin la variable success est renvoyée qui, nous l’espérons, 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é appelée dans la fonction espConfig(). Ici le paramétrage du mode WLAN sur le mode socle a été entrepris avec la commande
CWMODE et ensuite la connexion avec le réseau par l’instruction CWJAP. Cela
peut durer relativement longtemps jusqu’à ce que la connexion soit établie, c’est
pourquoi le temps de latence est brièvement dépassé à 20 secondes. Si vous
préférez 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() n’est pas appelée dans cet exemple mais doit être cependant traitée brièvement. Elle représente pour ainsi dire la contrepartie à la fonction
configStation()car le module est ici paramétré comme point d’accès. Un temps de
latence plus long n’est pas nécessaire ici car le module peut transformer la commande CWSAPplus rapidement. Dans des essais ultérieurs dans la fonction espConfig()à la place de configStation() la fonctionconfigAP()sera appelée.
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 traitées ainsi. Dans les fonctions Arduino connues setup() et loop()
ces fonctions sont maintenant utilisées. Les deux interfaces série sont d’abord
initialisées avec 19 200 bauds. Ensuite seulement est appelée la fonction espConfig(). En cas d’erreur la fonction serialDebug()est immédiatement lancée. Si
tout est correct un message de réussite est envoyé. Dans les programmes ultérieurs, la DEL à la broche 13 qui est marquée D3 sur la platine s’allumera en plus
dans une configuration réussie. Pour cela vous avez également un retour si le
module n’est pas connecté à un PC avec un moniteur série. Dans cet essai la DEL
est en effet nécessaire pour le message de retour du statut ping La requête
s’exécute également dans les lignes suivantes après la configuration. La commande AT+PINGest envoyée comme paramètre à l’adresse Google. Vous pouvez
appeler également une adresse IP dans votre réseau local à la place de cette
adresse. En cas de réussite un message apparaît et la DEL nommée D3 est activée. En dernière action le programme saute à la fonction loopqui de son côté
appelle la fonction serialDebug()-. Vous pouvez donc tester d’autres instructions
après le programme et par exemple envoyer une commande ping à d’autres
adresses.
1.3 | Détection d’un réseau
Dans ce chapitre entre autres il s’agit pour la première fois d’une petite structure
hardware. Le but de ce projet est un type d'alarme qui réagit quand un certain
réseau est à portée ou est activé.
Il ne nécessite que deux composants et un peu de
fil. Vous pouvez voir la conception précise dans
ssaires
les figures de construction.
nanoESP, 1 piezo, fil électrique
Branchement du haut-parleur piezo
Le code source pour ce projet est différent de l’essai précédent 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 appelée environ toutes les 30 secondes dans la routine
loopet recherche ensuite tous les réseaux avoisinants. Lorsque le réseau a été
trouvé, la fonction alarm() est déclenchée, qui active la DEL D3 et émet un signal
sonore sur le piezo. Dans le programme d’exemple, un réseau est recherché avec
le SSID NanoESP donc en fait d’autres réseaux nanoESP à portée. Vous pouvez
cependant simplement au démarrage du programme enregistrer une autre SSID
par #define ToFindSSID . De ce fait vous pouvez par exemple vérifier la distance
de portée de votre réseau WLAN.
UDP ET IP
Il s’agit dans ce chapitre de l’échange de données entre deux systèmes via un
réseau WLAN. Nous aborderons les sujets tels que ports IP et protocole UDP.
Ces concepts de base doivent d’abord être expliqués.
Qu’est-ce qu’une adresse IP ?
Une adresse IP fonctionne comme une adresse postale. Un ordinateur du réseau
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 s’agit de quatre chiffres ou plus précisément de quatre octets. Cela signifie que
la valeur d’un chiffre peut être 255 maximum. Fondamentalement, il y a des
adresses IP locales qui sont réparties sur les ordinateurs et appareils de votre
réseau domestique et des IP globales.
Les IP locales sont en général réparties par votre routeur. La plupart commence
par 192 168. Le chiffre qui suit est différent de routeur à routeur. Lorsque le NanoESP fonctionne en point d’accès et se connecte aux ordinateurs dans son réseau, les PC reçoivent une adresse qui commence par 192 168.4. En même
temps il y a un sous-réseau étendu. Les routeurs Fritz!Box répartissent en général
des adresses IP locales selon le schéma 192.168.178.X. Vous pouvez trouver
votre IP en entrant par exemple dans Windows dans l’invite de commande (sous
Start-> Programmes->Accessoires->Invite de commande) l’instruction ipconfig.
Une plus longue liste apparaît qui contient également le point adresse IPv4 avec
votre IP locale dans le réseau..
Les IP globales sont transmises en général par le fournisseur internet. Il s’agit par
exemple de l’adresse par laquelle votre routeur peut être atteint dans le réseau
mondial. Le routeur fixe le réseau local et répartit les données aux clients. Une
possibilité de trouver votre adresse IP globale est par exemple d’appeler la page
web http://www.meine-aktuelle-ip.de/. Sur la page sont présentées en plus
d’autres données visibles par un serveur web. Sur internet vous n'êtes donc pas
aussi anonyme que vous le croyez.
Qu’est-ce qu’un port ?
Par analogie à l’adresse postale, un port pourrait être quelque chose comme la
porte d’entrée d’un immeuble. Un ordinateur avec une IP unique peut fournir différents services par différents ports. Vous pouvez atteindre le serveur par l’IP mais
vous devez choisir le service à utiliser via le port. Cela peut être par exemple le
port 20 pour le transfert de données FTP ou le port 23 pour une connexion telnet.
En général, vous pouvez choisir librement le port, en effet, il y a des ports normalisés qui rendent le traitement des applications web plus facile. Vous trouverez une
liste des ports normalisés dans
https://de.wikipedia.org/wiki/Liste_der_standardisierten_Ports
Qu’est-ce que UDP ?
UDP est l’abréviation de User Datagram Protocol (protocole de datagramme utilisateur). Il s’agit d’un protocole réseau minimal sans connexion. C’est à dire qu’il
est plus minimaliste et simple que tous les autres protocoles internet, comme p.
ex. TCP que nous aborderons ultérieurement. La comparaison à ce stade n’est
pas encore particulièrement simple mais vous pouvez vous rappeler ce qui suit sur
les propriétés du protocole :
U UDP peut transmettre.
U Il n’y a aucun contrôle de l’exactitude des données et aucune
correction des erreurs.
U Il n’y a également aucune garanties que les données ont été
transmises avec succès.
U Il n’y a d’autre part aucune garantie que les données ne sont pas
corrompues pendant la transmission ou interceptées par un tiers.
U Il n’est pas nécessaire d’établir une connexion mais c’est plutôt un
échange de données plus rapide.
U Il n’y a pratiquement pas de fluctuations de retards de transfert.
U Le format est adapté par exemple à VoIP (Voice over IP – téléphone
via internet).
Ce sont en premier lieu les bases les plus importantes pour les principes des projets suivants. On pourrait traiter le sujet de façon plus approfondie et au moment
opportun d’autres informations suivront. Mais d’abord la partie pratique.
2.1 | Échanger des données entre la platine et le PC avec l’UDP
Dans ce premier projet pour le sujet UDP des données sont échangées entre la
platine et le PC via WLAN. À condition que votre ordinateur dispose d’un adaptateur WLAN. Un programme du côté PC assure la bonne réception des messages.
Une structure hardware n’est pas nécessaire pour cette expérience.
Le programme
Lorsque vous chargez le programme P04_UDPBasics.ino sur le contrôleur, le
contrôleur est configuré comme point d’accès et vous pouvez trouver un réseau
ouvert appelé NanoESP. Avant de vous connecter avec le réseau, vous devez
d’abord télécharger un programme pour le PC depuis internet. Pour mes tests j’ai
utilisé le programme Packet Sender de Dan Nagle, que vous pouvez télécharger
par le lien suivant :
https://packetsender.com/
Après le chargement et l’installation du programme, vous pouvez connecter votre
PC avec le réseau ouvert NanoESP. Assurez-vois que le firewall reconnaît le
réseau comme réseau domestique pour qu’aucune donnée ne soit bloquée. Votre
ordinateur doit avoir reçu maintenant l’IP 192.168.4.2. Vous pouvez le vérifier en
envoyant l’instruction
AT+CWLIF
au module via le moniteur série. Cette instruction indique tous les ordinateurs
connectés au point d’accès avec l’adresse IP et MAC.
Maintenant lancez Packet Sender, établissez sous Paramètres -> Réseau le port
du serveur UDP sur 90 et cliquez la case Activer le serveur UDP . En général en
bas à gauche se trouve UDP:90 . Dans le cas contraire, vous devez redémarrer le
logiciel.
Les paramétrages corrects du programme Packet Sender
Le programme sur l’ordinateur est utilisé maintenant comme serveur UDP pendant
que le contrôleur est paramétré en client UDP. Dans le protocole UDP la distinction client/serveur n’est pas essentielle, mais dans ce cas cela signifie que vous
envoyez des données à votre ordinateur avec le contrôleur.
Le message
a été transmis avec succès.
Pour envoyer des données, utilisez l’instruction :
AT+CIPSEND=7
Ici 7 représente le nombre de caractères à envoyer. Le caractère > apparaît comme valeur de retour. Cela signifie que vous pouvez maintenant transférer votre
message. Saisissez Hello et confirmez à nouveau par [Enter]. Le module envoie
comme valeur de retour SEND OK, et cela même si vous n’avez saisi que cinq
caractères. Cela vient du fait qu’après votre saisie, encore que Carriage Return et
New Lineont été envoyés, donc deux caractères 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 l’entrée du message. Dans l’affichage ASCII vous voyez même
les deux caractères envoyés représentés par \r et \n.
Le message a été reçu 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 décisive pour le
trajet de communication. Ici sont entrepris les paramétrages importants pour le
transfert. D’abord, le mode transparence des données est placé avec CIPMODE
sur0. Ensuite avec CIPMUX=0 est paramétré la connexion d’une seule connexion.
L’instruction essentielle est CIPSTART. Avec celle-ci une connexion est établie et
notamment à l’IP 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
nécessaires pour établir une première connexion.
2.2 | Envoyer et recevoir des données avec UDP
Dans le projet précédent, la communication UDP a été testée dans une direction,
à savoir de la platine au PC. Dans ce programme le module est paramétré de telle
manière qu’une communication dans l’autre 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 téléchargez le programme, un point d’accès est à nouveau établi avec
lequel vous pouvez vous connecter à votre PC. Ici aussi vous avez besoin de
Packet Sender ou d’un programme similaire. Démarrez le programme et prenez
les mêmes paramétrages que précédemment (Fichier -> Paramètres -> Réseau :
Activer serveur UDP, Port 90). Enfin vous devez encore saisir dans la fenêtre
principale dans le champ Adresse IP l’adresse du module (192.168.4.1), placer le
Port sur 91 et dans le menu déroulant plus loin à droite choisir le point UDP. Si
ces paramétrages sont faits et le moniteur série ouvert, vous pouvez envoyer le
premier message au module en tapant p. ex. Hi dans le champ étiqueté ASCII .
Lorsque vous cliquez sur Send apparaît dans le moniteur série :
001 +IPD,2:Hi
002 OK
Packet Sender a transmis « Hi » avec succès.
Le message a donc été reçu. Vous pouvez répondre en utilisant l’instruction CIPSENDdonc p. ex. :
001 AT+CIPSEND=7
002 >Hello
La différence par rapport au projet précédent réside dans une seule ligne :
success &= sendCom("AT+CIPSTART=\"UDP\",\"192.168.4.2
\",90,91", "OK");
Comme vous voyez, un deuxième port a été indiqué. Ce port dans ce cas avec le
numéro 91 est le port par lequel le module surveille de son côté les données entran-
tes. Avec l’ajout de cette simple ligne, il est possible également d’envoyer des données au module. Vous pouvez d’ailleurs surveiller le même port auquel vous envoyez. Vous pourriez donc attribuer le chiffre 90 aux deux ports. Théoriquement, il
est cependant possible avec la modification que le module reçoive ses propres données.
2.3 | Activer une DEL avec UDP
Dans le programme P06_UDPLED.ino il s’agit maintenant finalement de commander du matériel via le protocole UDP. Avec ce programme il est possible d’allumer et
d’éteindre une DEL avec de simples instructions. De plus, un autre paramètre sur la
communication UDP est effectué, qui permet de contrôlér la matériel simultanément
de plusieurs ordinateurs. Pour cela vous avez besoin d’un circuit comme le montre
l’image la figure ci-dessous. La DEL ressemble beaucoup à un autre composant, le
phototransistor. Vous pouvez distinguer les deux
ssaires
composants en regardant la tête du dispositif d’en
haut. L’intérieur de la DEL a une grande surface
NanoESP, 1 DEL (rouge), 1 résistanblanche.
noir, rouge), fil électrique
Packet Sender a transmis « Hi » avec succès.
Le programme
Alors que les programmes d’exemples précédents demandaient beaucoup de
saisie de l’utilisateur via le moniteur série, ce programme doit travailler de manière
autonome. Toutefois, à des fins de debugage d’autres informations seront transmises via le moniteur série.
Le contrôleur attend les données reçues par le module WLAN, qui ont été annoncées par le message +IPD. Les commandes légitimes, que vous pouvez envoyer
par Packet Sender s’appellent led1 et led0. Le contrôleur les interprète et allume
ou éteint la DEL en fonction. Un message de retour est transmis à l’émetteur. Si
une autre commande a été envoyée, le message « Wrong UDP Command » apparaît sur le moniteur série. Le même message est transmis à l’émetteur via le
réseau. Dans le code source nous examinons à nouveau d’abord une ligne dans
la fonction configUDP():
success &= sendCom("AT+CIPSTART=\"UDP\",\"192.168.4.255
\",90,91", "OK");
Cette fois l’IP est modifiée. Cette IP doit vous paraître surprenante car il ne s’agit
pas de l’IP de votre ordinateur. Alors comment les données peuvent-elles arriver ?
Cette IP fonctionne car il s’agit d’une 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
données de diffusion peuvent être réceptionnées par plusieurs participants, dans
ce cas par tous les participants qui sont eux-mêmes dans le sous-réseau.
L’adresse 255 à la fin de l’IP est toujours une adresse de diffusion. Vous pouvez
maintenant lancer le programme Packet Sender sur un autre ordinateur et écouter
tous les messages envoyés 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 }
L’analyse des instructions qui arrivent a lieu dans la routine loopqui tourne en
permanence. S’il y a des données du module (esp8266.available()), elles sont
analysées sur la présence des caractères « +IPD, ». Si d’autre part l’instruction
led est trouvée, l’instruction parseInt()mémorise automatiquement les prochains
nombres dans les variables setLed. Grâce à notre définition des instructions, ce
doit être soit 1 ou 0 pour ainsi activer ou désactiver la DEL. Ensuite, la fonction
debug transmettra une confirmation à l’ordinateur via l’instruction CIPSEND. Si
l’instruction led ne faisait pas partie des données reçues par le module, un message d'erreur informe d’une instruction défaillante. La première commande par le
réseau serait ainsi complète.
2.4 | Commutateur réseau
Dans le programme précédent, les premières commandes ont été évaluées et une
DEL activée en fonction.
Le programme suivant comprend cette fonction mais peut en plus de manière
autonome envoyer une commande au réseau.
ssaires
Connectez un bouton-poussoir avec le contrôleur
NanoESP, 1 DEL (rouge), 1 boutoncomme indiqué dans l’illustration.
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. S’il est actionné par l’utilisateur, le contrôleur envoie
le code
Bouton = 1
au réseau. Tous les appareils connectés au module avec un serveur UDP au port
90 peuvent recevoir l’instruction. Vous pouvez à nouveau vérifier cela avec Packet
Sender. Si vous disposez de deux contrôleurs, vous pouvez établir le même circuit
sur le deuxième contrôleur et uploader le programme sur les deux contrôleurs
avec une légère variation. En effet, si vous transmettez à la place de Bouton=1 la
commande led=1 , vous pouvez contrôler la LED de chaque contrôleur en appuyant sur une touche. En revanche, il peut arriver que vous contrôliez simultanément la DEL du propre contrôleur.
Déroulement dans Packet Sender
Les modifications du programme sont avant tout dans la routine loop. Une simple
requête ifcontrôlée en appuyant sur le commutateur. Si c’est le cas, le contrôleur
transmet le message Bouton=1 au réseau. De plus il y a un message debug. La
boucle whilequi suit a pour effet qu’un flux de commandes ne soit pas immédiatement envoyé tant que vous appuyez sur le bouton. Vous devez donc d’abord relâcher 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 d’automatisation de la maison, un serveur recevrait maintenant le
message d’état par exemple d’un capteur de proximité et enverrait ensuite la
commande d’allumer la lumière à un autre contrôleur. Ainsi se monte tout un réseau de capteurs et acteurs.
2.5 | Capteur analogique
Le dernier projet a traité la forme la plus simple d’un capteur avec un boutonpoussoir. Cette fois il faut utiliser un potentiomètre comme capteur analogique
pour envoyer des valeurs de mesure en permassaires
nence au réseau. Le potentiomètre livré 10 kΩ est
NanoESP, 1 DEL, 1 résistance 1
utilisé. Le montage est indiqué sur la figure cirouge), 1 potentiomètre, fil électrique dessous.
Montage avec potentiomètre sur A6
Le programme
À côté du capteur analogique, il y a encore une autre modification du programme.
Cette fois-ci le contrôleur ne doit plus être exploité en mode point d’accès mais se
connecter avec votre réseau domestique. Vous pouvez également cette fois-ci
inscrire vos données de station tout simplement en haut dans le programme.
Après l’upload il peut s’écouler un moment jusqu’à ce que la connexion au réseau
soit établie. Si elle est réussie, la DEL D3, qui est assemblée solidement sur la
platine, commence à s’éclairer. C’est le signe que le contrôleur est prêt. Tant que
le moniteur série est actif, vous verrez un message correspondant, mais pour les
tests ultérieurs vous voulez éventuellement utiliser la platine de façon autonome et
ce retour peut donc s’avérer très utile. Par le moniteur série vous recevez également l’information sur quelle adresse IP le routeur a affecté la platine. Cette IP est
importante, dans la mesure où vous voulez adresser la platine ultérieurement.
La communication avec la platine fonctionne de manière similaire aux tests précédents. Seules les IP du module et de son ordinateur ont été modifiées car une IP a
été attribuée par le routeur aux deux appareils. Après le lancement Packet Sender
ne reçoit d’abord aucun résultat de mesure. Vous devez d’abord envoyer un message, p. ex. la commande led=1 au module. À cela indiquez à Packet Sender la
nouvelle IP du module que vous pouvez connaître par le module série. Après
l’instruction des nouvelles données de mesure arrivent env. toutes les secondes.
Les données de mesure ont été reçues par Packet Sender
Dans ce programme, il y a une autre modification dans l’instruction CIPSTART.
D’une part l’adresse de diffusion a été étendue, parce qu’on ne peut pas prédire
quel sous-réseau votre routeur étend. La deuxième modification réside dans
l'ajout d’un paramètre, ici le deuxième. Le nouveau paramètre permet de changer
l’adresse de destination de la commande
CIPSEND. Le module écoute d’abord dans tout l’espace qui commence
par192.168. Et dès qu’une commande est reçue, le module se règle sur la nouvel-
le IP.
success &=sendCom("AT+CIPSTART=\"UDP\",\"
192.168.255.255\",90,91,2", "OK");
Pour ce paramètre, il y a les possibilités suivantes :
1 Mode 0: Cela signifie que l’IP et le port ne se modifient pas. C’est également la
configuration par défaut, ce qui est clair si vous considérez d’autres modes.
2 Mode 1: Les paramètres se modifient une fois. Cela signifie ce qui suit : si le
module démarre avec l’adresse de diffusion déjà utilisée et reçoit ensuite quelque
chose d’un PC, le module se règle sur la nouvelle adresse du PC. En d’autres
termes, l’IP de destination que vous avez enregistrée devient superflue et il est
envoyé à la place à la nouvelle adresse. Cette adresse reste valable même si le
module reçoit des données envoyées d’un autre module.
3 Mode 2: Les paramètres se modifient à chaque réception d’un nouvel appareil.
Cela signifie que l’IP, même si elle avait déjà été modifiée une fois, peut cependant se régler sur un nouveau PC.
C'est également la raison pour laquelle vous devez d’abord envoyer une instruction au module avant de pouvoir recevoir des données. Vous devez aussi pouvoir
recevoir des données 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 }
L’envoi de la valeur analogique se fait dans la routine loop. D’ailleurs la nouvelle
fonction sendUDP() est utilisée, et rend les fonctions connues plus facilement
accessibles. Il ne doit pas y avoir nécessairement de retard entre les envois
d’instructions car le transfert dure un certain temps. En effet, la fréquence, par
laquelle les nouvelles données sont transférées, est tellement élevée que le PC
est littéralement bombardé de messages.
CLIENT TCP
Le dernier chapitre a traité du protocole UDP avec lequel les données sont envoyées et reçues de façon simple. Une multitude d’applications peut déjà être
réalisée avec le protocole. Dans ce chapitre nous allons nous intéresser au protocole TCP (Transmission Control Protocol). Le module va prendre le rôle d’un client
TCP dans ce chapitre. C’est le rôle que prend votre PC à domicile face à un serveur web. La différence entre TCP et UDP se résume en gros dans les mots-clés
suivants :
U La connexion est précisément uniquement entre deux appareils.
U Les paquets envoyés sont contrôlés sur les erreurs de transfert et
corrigés le cas échéant.
U TCP est avant tout utilisé pour internet.
U Le protocole est un peu plus lent que UDP mais plus sûr.
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 véritables des pages web sont transférés 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 l’installation existante. Il s’agit de se familiariser avec
les structures de base de la communication TCP avec le moniteur série.
Le programme
Le programme dans son mode de fonctionnement ressemble à SoftwareSerial-
Le programme du premier test établit entre autres la connexion WLAN indépendamment au démarrage. Vous économisez ainsi une quantité de travail d’écriture
et pouvez commencer plus vite. N’oubliez pas de transférer les données de votre
réseau domestique dans le programme. Saisissez ensuite dans le moniteur série
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 défaut pour les requêtes HTTP.
Après confirmation de la connexion par OK vous pouvez saisir l’instruction suivante que vous connaissez déjà.
AT+CIPSEND=40
Vous voulez maintenant envoyer un message par la connexion établie. Lorsque
vous êtes invité par > à saisir un code, tapez d’abord
GET / HTTP/1.1
et appuyez ensuite sur [Enter]. [Enter]n’apparaît pas dans le moniteur série
mais le module le reçoit. Ensuite le message continue avec
Host:www.example.com
suivi deux fois par[Enter]. Vous devez en effet envoyer les saisies l’une après
l’autre très vite. Le mieux est de préparer un document texte à partir duquel vous
pouvez copier rapidement les lignes. Un long texte revient. La première partie est
la réponse du serveur et contient quelques informations pour le navigateur. Le
texte après <!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 interprèterait ce texte et nous le représenterait dans une forme courante.
Extrait de la réponse 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 l’adresse
IP, mais que vous puissiez utiliser le nom de domaine en format texte est lié à ce
qu’on appelle le DNS (Domain Name System). Cela transmet la requête à l’IP
difficile à remarquer. Si le client est connecté, le navigateur envoie une requête
Get Request. La page appelée ou les ressources (dans ce cas la page principale),
le protocole utilisé (http 1.1) et l’hôte demandé (www.example.com) doivent au
moins être indiqués dans cette requête. Les données de l’hôte sont importantes
car il peut y avoir plusieurs adresses internet sur un serveur et avec derrière une
IP. Si vous souhaitez demander une autre page que la page principale, écrivez à
la place p. ex. /example.html. À côté de la sous-page demandée votre navigateur
envoie d’ailleurs une quantité d’informations en plus des ressources appelées.
Des données telles que navigateur utilisé, système d'exploitation, résolution de
l’écran et d’autres encore sont transmises. Ainsi le serveur peut ajuster les contenus. Ensuite arrive la réponse du serveur qui d’abord semble complexe. La partie
entête de la réponse comprend beaucoup d’informations supplémentaires pour
votre navigateur. Uniquement à la fin suit le contenu réel de la page web.
3.2 | Une horloge internet
Ce projet nécessite de connaître les chapitres précédents pour que le NanoESP
récupère de façon autonome les informations d’un site web. Concrètement, le
programme charge l’heure en cours depuis une page spécialement conçue pour
cela et règle ainsi l’heure interne du contrôleur réalisée par librairie pour afficher
une heure précise. L’heure est donnée par le moniteur série. Pour l'installation
vous n’avez besoin que de la platine.
Le programme
Lors du programme précédent, il devait encore être principalement utilisé manuellement, celui-ci travaille de façon autonome. Le contrôleur se connecte complètement automatiquement au site web :
http://chronic.herokuapp.com/
Différents systèmes et fuseaux horaires peuvent être demandés par l’URL.
L’heure actuelle en hiver en Allemagne est demandée par l’URL
http://chronic.herokuapp.com/utc/in-one-hour
. C’est pourquoi se trouve dans l’appel de la fonction expliquée ultérieurement
getTime() comme deuxième paramètre utc/in-one-hour. Sur la base de l’UTC
(temps universel coordonné) vous devriez changer l‘appel pour utc/in-two-hours.
Selon le même système vous pouvez traiter également les autres fuseaux horaires.
Le temps déterminé 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 j’ai utilisée se trouve
dans le dossier sketch. Elle doit être copiée dans le dossier librariesde votre dossier sketchbook. En arrière-plan la nouvelle heure est calculée en permanence et
chaque seconde transmise au terminal. Vous pourriez de manière simple programmer un réveil ou une autre application temporisée. Pour que la récupération
de l’heure puisse fonctionner, une nouvelle fonction est utilisée :
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 paramètres pour l’adresse hôte et la sous-adresse sont transmis à cette fonc-
tion. Il en résulte que la requête Get Request crée et, après la création d’une connexion, transmet au serveur TCP de la page web. La réponse du serveur doit
maintenant être analysée. De plus, toute la partie Request Header est sautée en
recherchant \r\n\r\n, qui ne signifie rien d’autre que ce qu’il se passe après un
double Carriage Return und New Line. Les autres chiffres correspondent à la date
et heure recherchées qui ont été mémorisées en variables intermédiaires par un
certain nombre de fonctions parseInt(). Il y a une particularité dans la date, car ici
les valeurs distinctes sont séparées par un trait, ce que la fonction parseInt()interprète comme un chiffre négatif. Par conséquent, les valeurs sont simplement multipliées par -1. Enfin, l’heure est réglée avec la fonction setTime()et
affichée par la routine loopune fois par seconde. L’heure est maintenant totalement opérationnelle.
3.3 | Affichage de la température
Avec ce projet il s’agit de l’affichage de la température actuelle et de la météo
générale. Cette fois également les valeurs sont transmises par le moniteur série. 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 résistances
d'œil s’il est opportun d’emmener 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 composée de plusieurs DELs avec une
broche de cathode commune. Par une combinaison des différentes couleurs avec
des luminosités distinctes, il est possible de représenter pratiquement chaque
couleur. La DEL doit être branchée aux sorties PWM D3, D5 et D6 du contrôleur
avec prérésistances, comme indiqué sur la figure.
Branchement de la DEL RVB aux broches D3, D5 et D6
Le programme
Dans Sketch il s’agit à nouveau de la requête d’une page internet, mais cette fois il
s’agit d’une page spécialement programmée pour ce projet qui prend des données
depuis la page météo
http://www.openweathermap.com/
. Sur cette page on peut obtenir des informations sur la météo d’une ville par variation de l’URL. Vous pouvez saisir la ville, que vous voulez interroger, simplement dans le code source derrière City. Comme exemple j’utilise ma ville natale
Essen : www.temp.fkainka.de/?city=Essen
Le programme extrait la température de cette page et représente le résultat en
couleur via la DEL RVB. Simultanément la valeur est transmise par le moniteur
série. La plage de température utilisée dans le programme d’exemple pour la
représentation sur la DEL va de –20 °C à +40 °C.
Fondamentalement le programme fonctionne rapidement comme le précédent
mais avec quelques petites particularités. La fonction getTemp() est cette fois-ci
chargée de l’acquisition des données et renvoie la température actuelle, comme la
fonction de l’heure du programme précédent.
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 luminosités DEL est exécuté dans la fonction rgbTemp() . À
l’aide de la commande maples valeurs sont basculées en valeurs octets (0-255)
adéquates et délivrées à la DEL. Bleu correspond aux températures particulièrement froides et a un impact dans la plage de –20 °C à +10 °C. Vert est dans toutes les plages de températures mais a un maximum avec la valeur 10 °C. Rouge
débute à la valeur de +10 °C avec un maximum à +40 °C. Ce codage intuitif est
conçu pour évaluer la température actuelle en plus de l’affichage plus précis dans
le moniteur série.
SERVEUR TCP
Après avoir appris certains éléments sur l’utilisation du module en client TCP dans
le chapitre précédent, le module doit maintenant agir comme serveur TCP. D’une
manière pratique il existe également une instruction AT simple avec laquelle vous
pouvez démarrer cette application serveur complexe. Le module se comporte
ensuite comme un serveur TCP internet, sauf que vous devez programmer vousmême l’envoi de la page web.
4.1 | Serfvice web TCP
Les premières étapes en terme de serveur web TCP se font sans configuration
matérielle supplémentaire. Testez d’abord les instructions les plus importantes
simplement via le moniteur série.
Le programme
Saisissez comme jusqu’à présent les données WLAN et téléchargez le programme sur votre platine. Ensuite démarrez le moniteur. Cela peut durer à nouveau
quelques secondes jusqu’à ce que le message apparaisse, selon lequel la platine
est connectée. Lorsque le message de réussite est apparu et l’IP du module a été
affichée, vous pouvez démarrer dans le moniteur série avec la première instruction :
AT+CIPMUX=1
Vous autoriser plusieurs connexions au module par cette instruction. Ainsi plusieurs ordinateurs peuvent accéder au serveur web. Vous démarrer le serveur
web avec l’instruction suivante :
AT+CIPSERVER=1,80
Le paramètre 1 signifie que le serveur est démarré. Avec0 vous arrêtez le serveur. Le chiffre 80 représente le port par lequel le serveur est accessible. Les
requêtes HTTP envoyées par le navigateur sont généralement envoyées par le
port 80.
Vous pouvez maintenant ouvrir un navigateur de votre choix et saisir dans la barre
d’adresse l’IP du module et confirmer avec [Enter]. Dans le navigateur apparaît
d’abord un message de chargement mais vous pouvez remarquer une modification dans le moniteur série. Vous voyez une requête similaire à celle que vous
avez déjà envoyé manuellement.
La requête
du navigateur
Le navigateur attend une réponse et indique un caractère de chargement jusqu’à
ce que la connexion soit arrêtée en raison du temps de latence. Vous pouvez
envoyer un message avec une variante d’une instruction connue au navigateur :
AT+CIPSEND=0,7
Le paramètre 0 indique ici le client auquel le message doit être envoyé. Ceci est
nécessaire car plusieurs connexions sont autorisées et donc plusieurs clients
peuvent être connectés. Le deuxième paramètre, ici 7, indique de nouveau le
nombre de caractères à envoyer. > apparaît et vous pouvez saisir un simple
Salut
et envoyer avec [Enter]. Pourtant dans votre navigateur rien ne change d’abord
car vous devez fermer la connexion. Utilisez pour cela la commande :
AT+CIPCLOSE=0
Maintenant vous pouvez voir Salut dans votre navigateur. Vous avez réalisé ainsi
une première application serveur web.
Ce premier test montre beaucoup sur les processus précis de communication
dans internet. La représentation de « Salut » dans le navigateur est encore assez
facile car un texte plus simple à la place d’une page HTML complexe a été envoyé. Pour une page HTML correcte vous avez dû écrire manuellement toute une
entête aussi bien pour la requête Get Request que pour le texte HTML. Je vous
épargne cet effort dans le premier test.
4.2 | Serveur web autonome
Les résultats des essais précédents vont maintenant être utilisés dans un programme autonome. Le nouveau programme envoie non seulement une page web
au navigateur mais il permet également de contrôler 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 s’offre é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 d’essai.
Le programme
Le programme envoie une page plus complexe que lors de l’essai précédent.
D’autre part, vous pouvez activer la DEL à la broche D9, en inscrivant /LED derrière l’IP du module. L’état actuel de la DEL est alors inversé, l’état basculera donc à
chaque fois (changement d’état).
Inscrivez vos données WLAN et téléchargez le programme. L’IP de la platine est
affichée dans le moniteur série. Vous pouvez ensuite ouvrir le navigateur et appeler l’IP de la platine. La page web a maintenant un titre et un peu plus de texte. Le
texte vous indique comment contrôler la DEL. Vous avez ainsi un premier serveur
web complètement 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 démarrer le serveur web, on dispose d’une fonction simple qui s’appelle
configTCPServer(). Derrière ne se trouve rien d’autre que ce que vous avez saisi
manuellement auparavant. Dans la routine loopsont attendues les données entrantes. Si ces données contiennent « DEL », la LED change d’état. Là la routine
ne fait aucune différence, là ou se trouve précisément « DEL », d’où la légitimité
de la commande dans l’URL transmise. Dans ce test, la page web elle-même 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 représenter le texte jusqu’à </h1>
comme titre de type 1. Il ne s’agit pas encore de véritable code HTML mais beaucoup plus d’une forme simple de représentation de texte. La longueur de la page
web est passée avec webpage.length() (une fonction de la classe de chaîne) à la
commande CIPSENDet transmise ensuite à la page.
4.3 | Page web avec boutons
Dans ce test la représentation de la page web est encore plus sophistiquée.
D’autre part, il y a désormais des éléments de commande par lesquels une DEL
peut être contrôlée vraiment confortablement. Le montage de ce test ne se différencie pas du précédent : une DEL sur la broche D9 est contrôlée par le module.
Pour cela, il y a quelques nouveautés dans le code source.
Le programme
Après le téléchargement du programme vous pouvez à nouveau appeler la page
web du contrôleur via un navigateur. Pour cela vous devez seulement saisir l’IP du
module qui a été donnée au démarrage par le moniteur série. La page web ellemême dans ce projet est en effet mémorisée un peu différemment que dans le
précédent.
La page web du serveur web
Alors qu’avant la page web était simplement contenue dans le code source, cette
fois-ci elle est mémorisée dans ce qu’on appelle des variables progmem (Program
Memory). L’utilisation de ce type de mémorisation décharge la SRAM de la platine
qui serait autrement responsable du stockage des variables. La SRAM ne comporte que 2 kB et est déjà très chargée par l’utilisation des chaînes. Le contenu du
site sera placé dans la mémoire du programme par la fonction progmem, qui est
beaucoup plus grande avec environ 32 kB. L'accès aux données 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 mémorisée dans la variable
progmem. Il s’agit d’un document HTML plus grand dans un format compatible C.
Le format se caractérise entre autres par le fait que les guillemets sont affichés
sous la forme \" et les nouvelles lignes sous la forme \n. Vous connaissez cela
probablement d’autres projets qui contiennent des chaînes. Vous pouvez également trouver un aperçu 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 chaîne. On voit clairement comment la variable progmem est rechargée depuis la mémoire 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 appelée, qui transmet comme paramètre le résultat de
la fonction createWebsite(). La longueur du texte est déterminée par la fonction
longueur(). Après le transfert du site web, la connexion avec l’instruction AT+CIPCLOSEest
de nouveau fermée. L’activation de la DEL fait partie de la routine loopet se différencie légèrement du schéma précédent. Comment précisément, le cours intensif
HTML suivant le clarifie
4.4 | Parenthèse: Cours intensif HTML
Dans de chapitre je vais donner un petit cours intensif en HTML. Plus précisément
l’accent sera mis sur la création de pages web pour le contrôle du NanoESP. Les
structures de base d’un document HTML sont une partie de ce cours, la création
d’éléments d’entrée et de sortie et enfin l’intégration des propres pages web dans
le programme Arduino.
Une donnée HTML est toujours reconnaissable par <HTML> au début du document. La fin du document doit être reconnaissable par </HTML>. En général, le
début et la fin d’une section ou d’un élément sont affichés sous une forme comparable, comme on peut le voit sur l’entête. Dans l’entête 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 l’entête qui n’appartient pas aux bases HTML, mais qui améliore
l’affichage 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>
Après HEAD suit BODY. Celui-ici comporte le contenu de la page web. Dans la
zone de démarrage BODY sont fixés les paramètres supplémentaires tels que
arrière-plan et couleur de texte. Vous pouvez bien entendu adapter ceux-ci à tout
moment selon vos goûts. Ensuite vient la définition de la police et de sa taille dans
l’élément FONT. Ceux-ci ne s’appliquent ici que pour le texte Switch LED,qui
semble particulièrement grand car ensuite l’élément 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 éléments
nouveaux, à savoir <HR>, qui produit une ligne horizontale sur la page web et
<BR>, qui gère 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 éléments présentés jusqu’ici étaient des facteurs de formes purs qui
servent à la conception de la page web. Ensuite vient en effet l’élément important
formavec lequel l’activation de la DEL est réalisée.
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>
L’élément formest comme le nom le laisse entendre conçu pour la production de formulaires sur internet. Il peut s’agir de formulaires de message pour une page web ou
un sondage ou quelque chose de similaire. Le transfert des données saisies par
l’utilisateur peut se produire totalement différemment. Dans cet élément, nous utilisons
la méthode GET par laquelle les données saisies sont transférées simplement au
serveur web avec l’URL. Dans ce formulaire, il y a deux boutons à cet effet. Les deux
sont du type submit, ce qui signifie qu’en appuyant sur un des deux boutons le formulaire est directement transféré. Les deux boutons ont le nom led, mais chacun des
valeurs différentes (values). En appuyant sur le premier bouton qui porte l’inscription
LED ON, l’URL actuelle est rappelée avec un petit supplément. Derrière l’URL, également dans ce cas derrière l’IP du module se trouve en effet /?led=1. Ce texte précisément est évalué dans le programme Arduino en recherchant puis le nombre suivant
est lu avec parseInt() et transmis à la DEL Avec cette première version simple d’un
formulaire le contrôle confortable d’une DEL est possible sans problème.
Voici à quoi ressemble l’URL après avoir appuyé sur le bouton LED ON.
001 <BR>
002 <HR>
003
004 </font>
005 </HTML>
Les dernières lignes de code source HTLM ne contiennent rien de nouveau. Un
saut à la ligne suivante et une ligne horizontale complètent l’image, 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 l’arrière-plan ou ajouter plus de texte sur la page web. Vous ne
devez cependant pas surcharger la page car la SRAM peut vite être débordée.
Lorsque vous avez exécuté les modifications, il est temps de les transférer 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-après conversion réussie
Là collez le texte du presse-papiers et passez au point 2. Select Output : les paramètres C/C++/PHP – StringText et UTF-8 – Unix (LF). Déjà le texte compatible
Arduino apparaît dans la fenêtre inférieure que vous pouvez copier dans la variable progmem site . Lorsque vous téléchargez le programme modifié avec la nouvelle variable, vous voyez la nouvelle page web en appelant l’IP de la platine dans
le navigateur.
4.5 | Contrôler la DELRVB par TCP
Dans le projet actuel il s’agit de la commande de la DEL RVB par une page web
sur un serveur web. La couleur de la DEL peut être modifiée par une interface
précise. La page a été ajustée et doit être bien
ssaires
affichée sur les smartphones. Le montage nécesNanoESP, 1 DEL RVB, 3 résistances
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 trouvée dans la variable progmem site.
Ici aussi vous pouvez consulter la page HTML dans le dossier sketch. Après le paramétrage des données WLAN et l’upload du programme, la page web du serveur
web peut être atteinte par l’IP du module. La page est identique à la précédente en
ce qui concerne la couleur de l’arrière-plan et le titre. Pourtant il y a un nouvel élément sur la page, à savoir l’élément HTML5Color Picker. Avec celui-ci on peut choisir une couleur pour la DEL. Dès que vous avez confirmé la couleur, elle s’affiche
depuis la DEL. L’affichage de l’élément Color-Picker peut fortement varier en fonction du navigateur sélectionné.
La page web dans le navigateur
La sélection
de la couleur dans
le navigateur Chrome
Même si le design de la page web n’est pas très différent du précédent, j’aimerais
vous décrire brièvement de façon plus précise quelques éléments. D’abord il y a
une modification dans l’entête du document HTML et ce concernant la ligne suivante :
<link rel="icon" href="data:;base64,iVBORw0KGgo=">
Cette ligne est là pour que le navigateur n’essaie pas après le chargement de
charger ce qu’on appelle Favicon. En général, une page web a en effet un symbole particulier qui est différent 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 caractères, il envoie après l’appel de la page une deuxième
requête et demande ce favicon. Dans les premiers essais avec le serveur TCP
vous avez peut-être remarqué cette requête supplémentaire. Pour empêcher ces
deux requêtes et ne pas surcharger inutilement la platine, la deuxième ligne de
code ci-dessus fait comprendre au navigateur qu’il ne doit pas envoyer de
deuxième requête. Je vous recommande de prendre cette ligne pour vos propres
pages HTML.
La deuxième particularité de ce document est l’élément déjà mentionné ColorPicker. Il remplace pour ainsi dire les boutons de l’exemple précédent. Il s’agit
d’un élément HTML5 relativement nouveau.
Dans la page web précédente nous avons simplement choisi des boutons de type
submit pour que les valeurs du formulaire soient directement transmises en appuyant. Ceci n’est malheureusement pas possible avec un élément de saisie de
type color. Une possibilité de résoudre le problème serait de créer un bouton de
type submit qui devrait ensuite être appuyé après le paramétrage de la couleur.
Ceci sera démontré dans un test ultérieur. Ici a été collé un petit code JavaScriptCode (il s’agit de la partie onchange="this.form.submit()"), qui veille à ce que le
formulaire soit directement transmis après une modification.
L’élément 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 caractères. Le terme %23 signifie qu’il s’agit d’une hexadécimale. Pour
la couleur blanche l’URL est donc :
[IP]/?rgb=%23ffffff
Le contrôleur doit maintenant extraire les couleurs respectives de la DEL de ce
nombre hexadécimal, 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 reçu derrière %23 devient d’abord un longnombre et
est ensuite converti par manipulation de bits en trois valeurs d’octets. Ceux-ci sont
finalement transmis par la fonction analogWrite()-à la DEL RVB.
4.6 | Capteur de lumière
Dans ce projet, la page web du serveur web n’est pas utilisée comme interface de
commande mais comme élément de sortie. La luminosité mesurée via un capteur
de luminosité est représentée précisément comme valeur relative avec un nouvel
élément HTML.
Pour le montage de l’expérience il faut le phototransistor qui sert de capteur de
lumière. Le phototransistor peut être facilement être échangé par une DEL. Vous
pouvez distinguer le phototransistor en regardant en haut dans la tête de
l’élément. 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 résistance connectée en
ssaires
série au phototransistor a 10 kOhm
NanoESP, 1 phototransistor, 1 résisrron, noir, orange), fil électrique
Branchement du phototransistor à la broche A6 avec une résistance de protection de
10 kOhm
Le programme
Jusqu’à présent les pages web du serveur web consistaient toujours en une page
non modifiable qui envoyait les données au contrôleur. Maintenant la page web
doit être modifiée avant le transfert au navigateur pour indiquer la luminosité mesurée du phototransistor. Cela fonctionne car une sorte d’espace est caché dans
le code source de la page web. Le programme remplace maintenant au chargement des données de la variable progmem l’espace réservé *bright* par la valeur
de luminosité actuelle. Ainsi le texte de sortie et l’écart du curseur sont modifiés.
Une autre ligne dans les données HTML assure que la page se recharge automa-
tiquement toutes les deux secondes. Déjà, la luminosité actuelle est affichée clairement dans le navigateur.
La page web du capteur de luminosité
Pour que le système puisse fonctionner, il y a quelques petites modifications dans
les données HTML. La première modification se trouve de nouveau dans la zone
entête :
<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 d’appuyer constamment sur [F5]
pour pouvoir voir une nouvelle valeur.
La deuxième modification est là où se trouve normalement l’élément form :
001 <label for="hell">Current Brightness: *bright*</label> <BR>
002 <input type="range" max = "1024" name="hell" value=*bright*><BR>
Ici aucun formulaire n’est nécessaire car vous n’utilisez la page web qu’en sortie.
Les deux éléments label et range servent d’élément de sortie. Dans Label, qui est
normalement utilisé pour le titre, on trouve dans le texte la place *bright* .
L’élément curseur range reçoit comme value la valeur *bright* assignée, qui n’est
pas vraiment une valeur légitime mais sera remplacée par l’une d’elles ultérieurement. La valeur maximale de range est 1 024 et a été adaptée à la plage 10 bits
du contrôleur ADC.
Il faut encore veiller dans le code source avant le transfert de la page web à ce
que l’espace réservé *bright* soit remplacé par une valeur légitime.
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 l’espace réservé est exécuté dans la fonction createWebsite(). D’abord la variable progmem est chargée comme d’habitude sur la mémoire
et stockée dans une chaîne. Toutefois, avant que la fonction renvoie cette chaîne,
toutes les chaînes de caractères *bright*sont remplacées par la valeur actuelle
mesurée sur le capteur. La fonction String replace() exécute la tâche complètement automatiquement. Enfin la chaîne modifiée est rendue et transférée par le
mécanisme connu sur votre navigateur.
4.7 | Commande GPIO
Ce nouveau projet permet la simple commande des broches numériques D2-D7
par la page web. Le statut des broches respectives est affiché dans le navigateur
pour que l’on ne perde jamais l’aperçu.
Pour pouvoir vérifier correctement l’état de la broche, un montage tel que dans la
figure ci dessous est recommandé. La DEL RVB ainsi que la DEL normale sont
utilisées. Cependant les cathodes des DELs ne sont pas cette fois-ci branchées à
la longue ligne de masse sur la partie extérieure de la carte mais elle se trouvent
sur une sortie numérique. Les DELs peuvent s’éclairer seulement si ces broches
sont activés en position basse.
ssaires
NanoESP, 1 DEL RVB, 1 DEL (rouge),
Branchement des DELs sur D2-D7
Attention ! Les DELs ne doivent pas être branchées sans prérésistances. Ce qui
est admissible ici dépend des résistances On du port interne FET d’environ 30
ohm. Étant donné que les DELs sont entre deux ports, elles travaillent donc avec
une prérésistance de 60 ohm. Selon le type et la couleur de DEL, un courant DEL
se règle entre 15 mA et maximum 360 mA, ce qui est encore admissible.
Le programme
La page web de ce programme nécessite ce qu’on appelle les Checkbox comme
éléments HTML. Quand vous téléchargez le programme et appelez la page de la
carte vous voyez une série 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 s’éclairent.
La page web de la commande GPIO
Dans ce code HTML, la page web est utilisée aussi bien en formulaire d’entrée
qu’en élément de sortie. Lorsque vous jetez un coup d'œil à l’élément du formulaire, vous voyez qu’une série d’éléments d’entrée de type checkbox est utilisée Il
vous affectera un nom individuel dérivé du nom des pins. Le texte *checkedX*sert
à chaque fois d’espace réservé dans le texte. Lorsque le pin est bas, l’espace
réservé 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é après la sélection de la case correcte pour transférer 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>
L’évaluation dans le programme fonctionne désormais comme suit : Supposons
que les cases 3, 5 et 7 aient été sélectionnées dans le formulaire. L’URL se modifie pour :
[IP]/?ld3=on&ld5=on&ld7=on
Cela signifie que seules les cases sélectionnées sont transmises et identifiées
avec l’indice. Dans la routine loopvoici ce qu’il se passe exactement : D’abord tout
le port D, sur lequel se trouvent les sorties numériques, est activé bas. Ensuite
une boucle whilerecherche toutes les « Id » dans le lien ressources. Sur la base
de l’indice des ldtrouvées, enld3 serait p. ex. la 3,l’octet 0b0001000 se génère par
le décalage de 1 dans un octet autour de l’indice dit 3. Il est ensuite lié à la valeur
actuelle de l’octet. 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 }
À l’inverse, la sortie des cases à cocher fonctionne de la manière suivante : dans
la fonction createWebsite()les espaces réservés sont échangés depuis le document HTML. Une boucle forpasse un par un tous les ports utilisés de la série. Si le
pin est haut (également remarqué ici par la comparaison d’un octet qui a été généré en décalant les octets hauts), l’espace réservé avec l’indice est remplacé par le
texte checked. Lorsque le pin est bas, l’espace réservé est simplement seulement
supprimé. Ainsi l’affichage 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 création de ce programme, j’ai eu quelques problèmes dont la cause
n’était pas claire au début. Au chargement de la page web il y a eu des erreurs
étranges et souvent les cases à cocher complètement erronées étaient sélectionnées.
À
l’aide
de
la
librairie
Arduino-MemoryFree-Master-Library
(http://playground.arduino.cc/Code/AvailableMemory) je suis arrivé à la solution :
La mémoire SRAM était poussée à sa limite et pour cette raison causait des erreurs extraordinaires et imprévisibles. J’ai dû considérablement alléger la version
originale du programme et le code HTML pour que le programme puisse fonctionner dans cette version. Je mentionne cela car la même chose peut se produire
lors de la création de votre propre programme. La raison de l’importante sollicitation de la SRAM provient avant tout de l’utilisation généreuse certes bien pratique,
mais aussi l’utilisation dévorante de ressources des fonctions chaîne et en général
de l’utilisation de chaînes à la place de chaînes char. Un string.replace() est très
pratique mais réclame aussi beaucoup d’espace mémoire. Si vous êtes face à des
erreurs inexpliquées, je vous recommande de réduire le code source du fichier
HTML et d’autre part éventuellement d’optimiser quelques opérations de chaîne.
La libraire nommée ci-dessus peut vous aider dans la recherche d’erreur.
4.8 | Parenthèse: Accéder à la carte depuis internet
Beaucoup des tests présentés ici sont pratiques pour la commande de la carte
dans son propre réseau domestique. En tout cas cela peut être utile pour atteindre
la carte depuis de plus grandes distances. On pourrait p. ex. activer l’éclairage
chez soi alors que l’on est en vacances pour effrayer les cambrioleurs. Ou on
contrôle par le capteur de lumière si la lumière est vraiment éteinte. Ou on envoie
un message court à ceux à la maison qu’il se fait tard. Pour que ces idées puissent devenir réalité vous devez procéder à quelques paramétrages sur votre routeur.
En général, les différents types de routeurs utilisent également différents logiciels.
Je vais présenter ici les étapes principales avec un routeur Fritz!Box. Les paramétrages de votre routeur devraient être similaires.
La plupart des routeurs modernes ont une interface web simple similaire à celle
que nous avons créée avec le module. Vous avez besoin d’un identifiant et d’un
mot de passe pour pouvoir vous enregistrer sur l’interface. Pour des routeurs de
type Fritz!Box l’IP 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 l’IP
adaptée. En général le routeur utilise dans le sous-réseau l’IP avec l’adresse 1. Si
l’IP de votre ordinateur est p. ex. 192.168.4.2, l’IP de votre routeur sera vraisemblablement 192.168.4.1. Le mot de passe et l’identifiant se trouvent la plupart du
temps au dos du routeur ou dans le manuel correspondant.
Lorsque vous vous êtes inscrit dans l’interface utilisateur vous devez trouver le
point renvoi de port ou redirection de port. Dans ma Fritz!Box le point se trouve
sous Internet -> Renvoi. Créez une nouvelle règle de port. Les paramètres doivent
être choisis de façon à ce que les requêtes externes sur le port 80 soient redirigées sur l’IP de votre carte et sur le port 80. Dans le menu de la Fritz!Box le réglage est facilité et j’ai juste dû choisir le point HTTP-Serverensuite j’ai pu choisir
dans le menu déroulant simplement dans les IP présentes. Le résultat doit être
identique sur tous les ordinateurs.
Les paramétrages corrects dans la Fritz!Box
Les paramétrages sur le routeur seraient ainsi clarifiés et on peut tenter un premier test. Pour cela, cette fois-ci vous avez besoin de l’IP, pas de l’IP de la carte
dans votre réseau locale mais de l’IP globale. Vous pouvez trouver celle-ci sur la
page
http://www.meine-aktuelle-ip.de/
. Si vous entrez là l’IP transmise maintenant dans votre navigateur, la page web
du module doit apparaître. Cette fois-ci toutefois le long chemin est pris via internet. Si vous n’êtes 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 n’est pas connecté directement à votre WLAN, la page
peut dans tous les cas être appelée via internet.
Le système que vous avez établi se prête bien aux tests, il y a cependant deux
problèmes pour une utilisation pratique. D’une part l’IP ne se remarque pas facilement et d’autre part elle change assez fréquemment. La plupart des routeurs se
reconnecte au moins une fois par jour pour que l’IP globale de votre routeur change également. Pour ce problème, il y a un remède, c’est à dire le Domain Name
System (DNS). Ce système permet p. ex. que vous puissiez appeler
www.google.de et ne deviez pas saisir l’IP car il encode des IP compliquées dans
des noms faciles à remarquer. Chaque site internet normal utilise un DNS et il
existe également pour vous la possibilité d’utiliser ce système gratuitement.
Il y a différents sites web gratuits qui proposent des DDNS. DDNS signifie Dynamic Domain Name System et est un service qui garantit que votre IP est associée
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 d’abord vous inscrire sur le site et déjà indiquer un nom de domaine.
J’ai choisi le nom nanoesp et comme hôte dynpc.net. Le domaine qui en résulte
après l’inscription :
http://nanoesp.dynpc.net/
Maintenant le service doit encore apprendre votre IP. Transférez le service dans
votre routeur de façon à qu’une nouvelle IP soit dirigée directement au service
DDNS. Dans la Fritz!Box je devais d’abord cliquer sous l’affichage : Étendu pour
que toutes les options soient affichées. Ensuite je pouvais sous Partages enregistrer également le service DDNS.
Les paramétrages de la Fritz!Box pour l’utilisation du Dynamic DNS
Quelques mots encore en avertissement :
Le service DDNS est sans doute très pratique, cependant vous devez être prudent
lorsque vous donnez votre nom de domaine. Ils vous rendent accessible car un
hacker n’a besoin de connaître que votre domaine et pas votre IP actuelle pour
accéder à votre routeur. C’est pourquoi je laisserai dans le réseau la page nommée ci-dessus comme test.
THINGSPEAK
Dans ce dernier chapitre il s’agit d’un tout nouveau sujet, à savoir la plate-forme
ThingSpeak. Ce site a été spécialement développé pour le sujet Internet of Things
et met à votre disposition différentes fonctions pratiques. Entre autres, vous pouvez à l’aide de cette page d’une manière simple journaliser une surveillance longue durée de capteurs de mesure et les représenter sous forme plus claire. Tant
que vous êtes connecté à internet, vous vous épargnez l’enregistrement des valeurs sur un support de stockage externe. De plus, vous pouvez réaliser différentes commandes via internet. Vous apprendrez au cours de ce chapitre à quoi
ressemblent exactement ces fonctions.
5.1 | ThingSpeak
Comme d’habitude, avant de voir le montage et le programme, vous devez vous
créer d’abord un compte sur le site
www.ThingSpeak.com
. Connectez-vous ensuite avec vos données utilisateur sous le point Sign In .
Vous voyez une page qui indique votre canal (channel). Comme vous n’avez encore aucun canal cette page semble plutôt 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
l’instant.
Création d’un canal sur le site ThingSpeak
Cliquez sur Save Channel pour sauvegarder les paramètres. Vous êtes redirigé
sur la page de votre canal sur laquelle on peut voir uniquement un diagramme
vide. Cliquez dans l’onglet ci-dessus sur API Keys. Les suites de chiffres et de
lettres que vous trouvez sous le point Write API Key vous serviront bientôt.
Le montage de ce test consiste en un capteur sur l’entrée analogique A6. Un diviseur de tension avec une résistance de 10 kΩ et un phototransistor permet la
mesure de la luminosité actuelle. Vous pouvez également utiliser le capteur de
température. Le circuit reste à peu près le même
ssaires
sauf que vous remplacez le transistor de lumière
NanoESP, 1 phototransistor, 1 résispar 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 à
l’expérience précédente, les données ne sont pas sur une page web mais directement envoyées sur le site ThingSpeak. Ce site ne mémorise pas seulement les
données, il les représente également en aperçu dans un diagramme – une fonction très pratique pour une station de mesure avec surveillance longue durée.
Pour que le programme puisse envoyer au site web, vous devez enregistrer
d’abord, en plus de vos données WLAN, la clé API mentionnée ci-dessus sous le
point ThingSpeakKEY dans le programme. Après l’upload vous voyez les valeurs
de mesures actuelles dans le moniteur série. Pendant 15 secondes les données
sont rassemblées 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 résultat de la mesure maintenant sur votre page canal dans le diagramme de représentation en bas.
Les résultats de mesure dans le diagramme
Le code source semble très différent de tous les programmes précédents. Il s’agit
cependant essentiellement d’une compilation des éléments bien connus. La requête HTTP contient une variable progmem qui doit être envoyée sur le site
ThingSpeakà côté de quelques espaces réservés qui doivent être remplacés en
fonction des requêtes.
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, l’appel correspond presque à l’appel get. Ici également une
*URL* doit être précisée. 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 données qui sont
envoyées avec POSTrequête sur le site. Si vous voulez enregistrer maintenant,
comme indiqué dans l’exemple, les données de mesure dans un canal dans votre
compte, vous devez utiliser la structure suivante : *URL* est
/update. C’est le sous-site sur lequel les données doivent être envoyées. Le message est maintenant composé de votre clé API, du champ à remplir et de la valeur. La longueur du message se détermine facilement par la longueur de la chaîne. Dans l‘ensemble, 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 l’utilisateur et le canal par la clé API et enregistre les valeurs. L’ensemble de la fonctionnalité de la compilation des requêtes
est cachée derrière plusieurs fonctions. Pour envoyer la nouvelle valeur vous
devez seulement appeler la fonction sendThingPost() qui a besoin comme paramètre de la KEY et des données du capteur. Tout le reste est exécuté automatiquement en arrière-plan.
5.2 | Affichage Twitch
Le site web ThingSpeak propose un peu plus que la surveillance longue durée 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 s’agit de
savoir s’il y a déjà ou non un flux en ligne.
Il y a deux avantages significatifs de la variante ThingSpeak par rapport aux premières expériences. Premièrement, d’autres sites web peuvent être traités par
ThingSpeak via HTTPS (HyperText Transfer Protocol Secure) alors que le module
de supporte que le protocole HTTP qui est bien moins sûr. Deuxièmement le site
web peut déjà préfiltrer des informations et ainsi réduire la quantité de données à
traiter par le contrôleur.
Dans ce projet vous réaliserez un affichage Twitchen streaming comme exemple
type pour différentes possibilités. Twitch (www.twitch.tv) est un site web sur lequel
des jeux en live ou d’autres contenus autour des jeux sur ordinateur sont diffusés.
Un des canaux les plus connus de streaming est RocketBeansTV l’ancien concepteur de GameOne. Ce canal diffuse 24/24 et pour cela est bien adapté pour un
ssaires
NanoESP, 1 DEL (rouge), 1 résistannoir, rouge), fil électrique
premier essai. Ultérieurement vous pouvez bien
entendu utiliser un canal de votre choix.
Montage de l’expérience avec une DEL sur le pin D9
Le programme
À côté de la structure hardware quelques étapes sur le site ThingSpeaksont nécessaires. Lorsque vous cliquez sur le site tout en haut dans le menu Apps
une série de différentes applications s’affiche. Cette fois-ci nous nous occupons
de l’appli ThingHTTP. Lorsque vous cliquez sur le bouton correspondant, une
interface complètement vide s’affiche. 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
Méthode :
GET
HTTP Version: 1.1
Parse String:
_total
Si vous préférez un autre canal de streaming, vous pouvez entrer dans l’URL
derrière channel un autre canal. Cliquez sur Save ThingHTTP et copiez ensuite la
clé API apparue dans l’aperçu dans le presse-papiers. Vous devez maintenant
copier la clé dans le programme et derrière #define ThingHTTP. Ne pas oublier les
données WLAN et vous pouvez déjà uploader le programme. Une fois par minute
la présence d’un flux est contrôlée. Si c’est 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. C’est une quantité de texte mais
seul l’attribut nous intéresse _total,qui affiche le nombre de flux actifs Si ce chiffre
est supérieur à zéro, cela signifie qu’au moins un flux est actif. Cet attribut est
automatiquement préanalysé par ThingSpeaket sorti en valeurs plus claires. Cette
valeur est ensuite facilement appelée et évaluée dans le programme par la fonction getThingSpeakHttp().
5.3 | Système d’alarme Twitter
Dans ce projet il s’agit d’un système d’alarme avec lequel vous pouvez par exemple contrôler si quelqu’un ouvre un tiroir sans autorisation. En cours la lumière est
contrôlée sur le capteur de lumière connecté si la luminosité fixée diminue. Si c’est
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 température et
ssaires
surveiller le dépassement d’une certaine tempéraNanoESP, 1 phototransistor, 1 résisture.
rron, noir, orange), 1 piezo, fil électri-
Capteur de lumière sur A0, piezo sur D8
Le programme
Le sujet est ici entre autres l’appli Twitter du site ThingSpeak. Cliquez donc sur
Apps et ensuite sur ThingTweet. En cliquant sur Link TwitterAccount et en saisissant vos données d’accès, vous établissez une connexion entre les deux services.
Si vous n’avez pas encore de compte Twitter, cela vaut la peine de créer un
compte pour travailler avec le kit d’apprentissage pour les essais. Une fois que
Twitter a été lié avec succès avec ThingSpeak vous pouvez sous
Apps/ThingTweet enregistrer la clé API derrière le point #define TwitterKEY .
Le programme vérifie maintenant en permanence si la luminosité mesurée passe
au-dessus d’une valeur de 500. Si c’est le cas, un message Twitter est envoyé et
l’alarme sonne et ce tant que la luminosité n’est pas redescendue sous 500. Vous
pouvez suivre les valeurs de luminosité actuelles mesurées par le moniteur série.
Pour les premières expériences je recommande de couvrir le capteur de lumière
pour que l’alarme ne se déclenche pas trop tôt.
La nouvelle fonction dans ce projet s’appelle sendTwitterPost(). Seuls TwitterKEY
et le message doivent être spécifiés comme paramètres. La fonction regroupe
toutes les parties nécessaires pour en faire un post ThingSpeak. Vous pouvez
également envoyer des messages en appuyant sur le bouton ou publier les résultats de mesure. Tout cela grâce à ThingSpeak-API.
5.4 | TalkBack
Dans ce projet il s’agit d’une autre appli du site ThingSpeak à savoir l’appli TalkBackAvec cette fonction il est possible de créer une instruction qui est lue et exécutée par le contrôleur. Ce qui semble inutile avec un seul contrôleur prend tout
son sens lorsque l’on utilise deux contrôleurs ou même tout un réseau de contrôleurs. Certaines cartes peuvent agir comme capteurs, par exemple avec des capteurs de proximité, et lors de la détection d’un mouvement envoyer une instruction
TalkBack. Un autre module lit l’instruction du site ThingSpeaket ouvre ensuite la
porte ou déclenche l’alarme.
Pour le montage de l’expérience vous avez besoin
ssaires
de deux boutons. Une DEL avec prérésistance
NanoESP, 2 boutons,1 DEL (rouge),
affiche l’état actuel.
m (marron, noir, rouge), fil électrique
Montage avec deux interrupteurs sur D5 et D10 et une LED sur D9
Le programme
D’abord 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 s’agir du canal light déjà
créé de la première expérience ThingSpeak
ou d’un propre canal. Toutes les commandes sont ensuite journalisées. Ce qui est
important avant tout c’est 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 après avoir cliqué sur Save TalkBack. Vous enregistrez cette ID derrière
#define TalkBackID dans le programme.
Si maintenant vous avez téléchargé le programme et appelé le moniteur série,
vous verrez d’abord le message No Command. Appuyez maintenant sur un des
deux boutons. Après un bref moment apparaît le message OpenDoor ou CloseDoorselon le bouton sur lequel vous avez appuyé. Avec la commande OpenDoorla DEL commence à s’éclairer.
L’aperçu TalkBack lors de l’enregistrement d’une 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 l’option 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 requête
de nouvelles commandes. Lorsque quelque chose a été trouvée, la commande est
retournée. Vous devez uniquement indiquer les paramètres key et id .
5.5 | Cheerlights
Cette expérience est basée sur un projet de Hans Scharler, qui s’appelle Cheerlights. L’idée : Dans le monde il y a des lumières en réseau qui se commandent
simultanément via les commandes Twitter. Un bon
ssaires
exemple est que le monde et internet se dévelopNanoESP, 1 DEL RVB, 3 résistances
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 procéder à aucune modification ThingSpeakcar le projet a déjà un canal public que vous trouvez sous
https://thingspeak.com/channels/1417
. Sur le site vous trouvez d’autre part toujours la couleur actuelle ainsi que d’autres
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 utilisée se
trouve dans le dossier sketch. Elle doit être copiée dans le dossier libraries de
votre dossier sketchbook. La librairie permet de définir des couleurs rapidement et
simplement et veille à ce que les DELs apparaissent lentement dans une autre
couleur (fade).
Lorsque vous téléchargez le programme, la couleur actuelle de la DEL s'affiche
après 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 l’un #Cheerlights, @Cheerlights ou simplement juste le mot-clé Cheerlights et pour l’autre une des couleurs prédéfinies derrière le mot-clé. Font partie des couleurs prédéfinies :
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 déjà vous avez transmis au monde entier une nouvelle couleur.
La requête de la couleur actuelle est réalisée avec la fonction getCheerlightColor()
. Comme paramètres sont indiqués l’hôte, donc api.thingssspeak.comet l’URL, ici
/channels/1417/field/1/last.txt. Il s’agit donc d’une requête client TCP simple de
type connu. Ici également la réponse du serveur est réduite au texte pertinent et
renvoyée. La comparaison avec les mots-clés donne la couleur recherchée qui
apparaît ensuite à l’aide de la libraire crossfade. Un essai comparativement plus
simple avec cependant un effet aah plus important.
5.6 | Détecteur d’incendie Twitter avec fonction TalkBack
Ce projet de détecteur d’incendie relie deux éléments que avez rencontrés au
cours du travail avec le kit d’apprentissage. La platine est utilisée entre autres
pour la surveillance longue durée de la température. En même temps la platine
déclenche un signal d’alarme si la température dépasse une valeur définie, p. ex à
l’apparition d’un incendie. Ici la surveillance du dépassement de seuil n’est pas la
tâche de la platine mais de ThingSpeak-App React.
Pour le détecteur d’incendie, le type CTN (Coefficient de Température Négative)
présenté seulement comme alternative de capteur de lumière est utilisé cette foisci comme capteur. Celui-ci modifie sa résistance en fonction de la température.
Vous pouvez le commuter contre une résistance
ssaires
10 kOhm, mais dans ce cas le potentiomètre est
NanoESP, 1 potentiomètre, 1 piezo, 1
utilisé car on ne peut pas encore ajuster la mesul électrique
re.
Le montage du projet détecteur d’incendie
Le programme
Le programme doit réunir plusieurs éléments. Ici le site ThingSpeaka de nouveau
une grande importance. La surveillance du dépassement de seuil du CTN est
cette fois-ci supportée entre autre par une appli ThingSpeak. Les actions d’alarme
sont également exécutées de là, c’est à dire un message Twitter envoyé et une
commande TalkBackinsérée qui déclenche l’alarme sur le contrôleur.
La première étape est de créer un nouveau canal sur la page ThingSpeak. Vous
pouvez par exemple l’appeler FireAlarm . Le champ 1 reçoit ensuite la désignation
Temp. Sous API Key se trouve la première clé que vous devez enregistrer pour
ThingSpeakKEY . Déjà avec cela la transmission de la valeur actuelle de température serait garantie.
La deuxième étape est la création d’un nouvel élément TalkBack. Vous pouvez par
exemple utiliser comme nom Alarms. D’autre part vous pouvez laisser se connecter
les commandes dans le canal FireAlarm. Vous devez enregistrer la clé API derrière
TalkBackKEY et l’ID derrière TalkBackID. Vous pouvez désormais envoyer des
commandes à la platine. Vous pouvez également enregistrer les commandes manuellement, en cliquant dans l’aperçu TalkBack du canal d’alarme sur Add a new
Command et là enregistrer sous Command String Alarm . Une indication de la position n’est pas nécessaire puisque l’instruction est mémorisée automatiquement à la
première place. Vous pouvez maintenant télécharger et tester le programme, si la
transmission de la valeur de température actuelle fonctionne et si la platine exécute
la commande. À cette position cela vaut la peine de calibrer le CTN sur le potentiomètre par un thermomètre d’intérieur.
Au fond, ce serait déjà un projet de valeur mais il manque les fonctions bonus.
Celles-ci en effet ne doivent plus être exécutées dans le programme mais sur le
site ThingSpeak. Pour cela allez sur Apps et sélectionnez ensuite React . Avec React il y peut y
avoir une réaction à certains résultats . Créez 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 paramètres. Ainsi la première étape de la
surveillance est exécutée. Si la valeur est dépassée ThingSpeak envoie un message Twitter par votre compte. Pour la deuxième étape, l’insertion de la commande alarme, vous devez encore piocher un peu plus au fond dans la boîte à astuces
car cette fonction n’est pas prise en compte automatiquement. Mais ce qui est pris
en compte c’est ThingHTTP. Donc cliquez sur Apps et ensuite sur ThingHTTP. Là
créez un nouvel élément 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 l’URL et le Body-Part par votre TalkBack ID et votre KEY . Maintenant vous
pouvez créer un autre élément Reactqui comporte les mêmes paramètres que le
premier avec seulement la modification que vous avez sélectionnée par Action
ThingHTTP et là le point Alarm . Vous avez ainsi garanti qu’une alarme se déclenche si la valeur critique est dépassée.
Vous pouvez d’ailleurs laisser sonner l’alarme temporisée. Pour cela vous devez
cliquer sous Apps sur TimeControl et créer un nouvel élément, avec p. ex. le nom
AlarmClock. Là procédez aux paramétrages 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 paramètres TalkBack corrects pour l’alarme incendie
Pour un premier test il est recommandé de choisir un temps de quelques minutes.
Lorsque cela a fonctionné, on peut régler le temps correct. Ce n’est certainement
pas le meilleur son pour être réveillé mais c’est certainement plus efficace.
ANNEXE
Commandes AT
Instruction
Orthographe
fondamentale
Instruction de test
AT
Reset
AT+RST
Infos firmware
AT+GMR
Echo marche/arrêt
ATE<1/0>
Instructions WLAN
Mode WLAN
(1 = Client, 2 = AP, 3 = Dual)
AT+CWMODE=<mode>
Chercher le réseau WLAN
AT+CWLAP
Connecter WLAN
AT+CWJAP=«<ssid>«,«<pass
>«
Séparer WLAN
AT+CWQAP
Réglages point d’accèst WLAN
AT+CWSAP=«<ssid>«,«<pas
s>«[,<chan>,<enc>]
Donner adresse IP
AT+CIFSR
Activer/désactiver DHCP
AT+CWDHCP=<1/0>
Connecter automatiquement au
WLAN
AT+CWAUTOCONN=<1/0>
Modifier l’adresse Mac du poste
AT+CIPSTAMAC=<MAC>
Paramétrer l’adresse IP (poste)
AT+CIPSTA=<IP>
Paramétrer l’adresse IP (point
d’accès)
AT+CIPAP=<IP>
Démarrage SmartConfig
AT+CWSTARTSMART=<typ>
Arrêt SmartConfig
AT+CWSTOPSMART
Communication
Fonction ping
AT+PING=<HOST>
Autoriser plusieurs connexions
AT+CIPMUX=<mode>
Mode données
(0=Transparent, 1=mode données)
AT+CIPMODE=<mode>
Structure données reçues
+IPD,<id>,<len>:<data>
Connecter
AT+CIPSTART=«<type>«,«<a
ddress>«,<port>
Envoyer des données
AT+CIPSEND=<id>,<len>
Déconnecter
AT+CIPCLOSE=<id>
Instructions serveur
Démarrer le serveur
AT+CIPSERVER=1,<port>
Arrêter le serveur
AT+CIPSERVER=0
Statut du serveur et des clients connectés
AT+CIPSTATUS
Définir le Server-Timeout
AT+CIPSTO=<timeout>
Afficher les clients connectés
Pinout
AT+CWLIF

Manuels associés