Académique Documents
Professionnel Documents
Culture Documents
Niveau LFI3
LM35
Temperature Sensor
1
1. Initiation Arduino
• Il existe plusieurs versions de cartes Arduino:
– Cartes: UNO, Mega2560, Mini, Nano, LilyPad, Fio, Pro, …
– Microcontrôleurs de Atmel AVR: Mega328, Mega1280, Mega4809,…
• Modules disponibles (Shields) avec les cartes Arduino
1. Initiation Arduino
Environnement de développement – Arduino IDE
(https://www.arduino.cc/en/Main/Software)
• Permet d’éditer, vérifier, compiler (verify/compile) et charger (upload) le
firmware dans la mémoire du microcontrôleur,
• De dialoguer avec la carte lors de son fonctionnement (serial monitor)
• Il fournit des bibliothèques de code pour étendre les fonctionnalités.
• Sélectionner la liaison série COM_XX (menu Tools\serial_port)
Programme Arduino:
Le programme est au moins constitué de 2 fonctions:
• La fonction void setup() qui assure l’initialisation des E/S du microcontroleur.
• La fonction void loop() (qui contient les instructions) est indéfiniment
exécuté.
2
2. Téléverser votre premier programme !
• Le matériel nécessaire : PC+Carte Arduino+cable USB.
• Le programme Blink (clignoter) fait clignoter une LED sur la carte Arduino !
(reliée au pin digital 13).
• Cette LED permet de vérifier qu’une carte Arduino fonctionne bien.
• Voici le programme :
void setup()
{ //On initilise le pin 13 qui est associé à la LED en sortie
pinMode(13, OUTPUT);
} //Fin de la fonction setup()
void loop()
{ //La fonction loop() se répète à l'infini une fois la fonction setup() exécutée
digitalWrite(13,HIGH); //Place le pin digital 13 à l'état HAUT (5V) -> Led allumée
delay(500); //Met en pause le programme pendant la valeur de 500 en ms
digitalWrite(13,LOW); //Place le pin digital 13 à l'état BAS (0V) -> Led éteinte
delay(500); //Met en pause le programme pendant la valeur de 500 en ms
} // Fin de la fonction loop() => on retourne au début de la fonction loop()
3
Faire communiquer le PC et la carte Arduino:
Liaison série
Voilà ce que donne le code complet :
void setup() {
// mettre ici le code qui sera répété qu'une fois:
Serial.begin(9600); // Permet d'initialiser le moniteur série à 9600 bauds
Serial.print("Hello les makers "); //Permet d'afficher Hello les makers sur le moniteur série
Serial.println(" j'espère que ce tutoriel vous plaît: ");
Serial.print(" signé : " );
void loop() {
Serial.println(« IoT-LFI3" );
// mettre ici le code qui sera répété en boucle:
}
if (Serial.available() )
void loop() {
{
// On ne fait strictement rien !
//Si un message a été reçu faire ceci
}
Serial.println(Serial.readString()); // Lit le message reçu
} //et l'affiche sur le moniteur
else
{
// Si rien n'est reçu faire cela
}
}
4
4. Introduction à l'interface série pour périphérique (SPI)
• SPI est un protocole de communication série synchrone (en mode full-duplex)
utilisé par les microcontrôleurs pour communiquer avec un ou plusieurs
composants périphériques sur de courtes distances.
• Elle peut être utilisé entre deux microcontrôleurs.
5
4. Introduction à l'interface série pour périphérique (SPI)
Le tableau suivant compare les protocoles de communication I2C, SPI et UART en
fonction de différentes catégories.
Description I2C SPI UART
Inventé par 1982 -Philips Semi- 1970 -Motorola 1960 -Gordon Bell -Digital
conducteur Equipment Corporation
Transfert de données Une ligne d'horloge est nécessaire pour Vrai Vrai Faux
synchrone synchroniser la communication
Au lieu d'un signal d'horloge, le flux de
Transfert de données données
asynchrone lui-même contient des signaux de Faux Faux Vrai
démarrage et d'arrêt
Débit (bits/s) 10 000 à 1 000 000 Jusqu’à 10 000 000 Jusqu'à 115 200
L'esclave a besoin Vrai Faux Faux
d'une adresse unique
Nombre de broches 2 4+ 2
requises
Protocole de
vérification des Vrai Faux Vrai
erreurs
Multi-master On peut avoir plusieurs maîtres contrôlant Vrai Faux Faux
un ou plusieurs esclaves
Multi-slave On peut connecter plusieurs esclaves à un Vrai Vrai Faux
seul maître
Commutation par Les données transférées sont regroupées en
packages / messages, constitués d'un en- Vrai Faux Faux
paquets tête et d'une charge utile
Asymétrique Les données sont transférées par un seul fil Vrai Serial Data Faux Master in Slave
Out (MISO)/ Master Faux
(SDA) Out Slave In (MOSI)
Connexion série Les données sont transférées petit à petit Vrai Vrai Vrai
le long d'un seul fil
6
Principe de mise en œuvre de la communication SPI
Il y a 4 modes de transmission qui combinent la polarité et la
phase d'horloge. La fonction SPI.setDataMode() est défini en
accord avec ce tableau:
Mode Clock Polarity (CPOL) Clock Phase (CPHA)
0 0 0
1 0 1
2 1 0
3 1 1
• Une fois que les paramètres SPI sont configurés, il ne reste
plus qu'à déterminer quels registres (32 registres internes 8
bits, R0 à R31) à utiliser.
• Pour inclure la librairie SPI dans un programme, on ajoutera au
programme la ligne : #include <SPI.h> ou le menu du logiciel
Arduino Programme > Importer Librairie > Nom_librairie
• Les fonctions de la librairie SPI: begin(), end(), setBitOrder(),
setClockDivider(), setDataMode() et transfer().
Tag
5. Objet IOT 2: Contrôle d'accès avec RFID
Connecter le module MFRC522
• Branchez le module LCD aux broches de l’Arduino comme
Radio Frequency
représenté ci-dessous : IDentification
• Table de correspondance
RFID-RC522 Arduino
VCC 3.3V
RST 9
GND GND
MISO 12
MOSI 11
SCK 13
NSS 10
IRC /
7
5. Objet IOT 2: Contrôle d'accès avec RFID
Installation de la bibliothèque
Pour pouvoir utiliser ce module, la
bibliothèque MFRC522 doit être installée:
• Ouvrez l’IDE Arduino et aller dans
Croquis Inclure une bibliothèque
Gérer les bibliothèques
• Dans le gestionnaire de bibliothèques,
recherchez « MFRC522 » et installez MFRC522:
8
5. Objet IOT 2: Contrôle d'accès avec RFID
Nous allons tester le module RFID en assemblant un contrôle d'accès qui vérifie
le droit d’accès (ou non) à travers une porte contrôlée par un servomoteur
(microservo 9G):
servomoteur
9
Fonctionnement et contrôle d'un servomoteur
• Cette consigne est transmise au moyen d'une impulsion
numérique (PWM).
• Pour que le servomoteur reste à une position donnée, il faut
transmettre toutes les 20 millisecondes (50Hz) une impulsion
d'une longueur comprise entre 1 et 2 millisecondes.
– Une impulsion de 1 milliseconde correspond à 0°.
– Une impulsion de 2 millisecondes correspond à 180.
– En envoyant une impulsion d'une longueur intermédiaire,
on obtient des angles différents.
10
#include <SPI.h>Contrôle d'accès avec RFID
for (byte i = 0; i < mfrc522.uid.size; i++) {
#include <MFRC522.h> Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ");
#include <Servo.h> Serial.print(mfrc522.uid.uidByte[i], HEX);
Servo microservo9g; contenu.concat(String(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " "));
#define SS_PIN 10 contenu.concat(String(mfrc522.uid.uidByte[i], HEX)); }
#define RST_PIN 9 Serial.println();
MFRC522 mfrc522(SS_PIN, RST_PIN); Serial.print(" Publier : ");
int led_libéré = 5; contenu.toUpperCase();
int led_refusé = 6; if (contenu.substring(1) == "D8 4B 12 22") {
char st[20]; microservo9g.write(-90);
void setup() { digitalWrite(led_libéré, HIGH);
pinMode(led_libéré, OUTPUT); Serial.println(" Carte 1 - Accès débloqué !");
pinMode(led_refusé, OUTPUT); Serial.println(); delay(3000);
microservo9g.attach(3); microservo9g.write(90);
microservo9g.write(90); digitalWrite(led_libéré, LOW); }
Serial.begin(9600); if (contenu.substring(1) == "87 4B DC 8A") {
SPI.begin(); Serial.println(" Carte 2 - Accès refusé !!");
mfrc522.PCD_Init(); Serial.println();
Serial.println(" Rapprochez votre carte du lecteur..."); for (int i= 1; i<5 ; i++) {
Serial.println(); } digitalWrite(led_refusé, HIGH);
void loop() { delay(200);
if ( ! mfrc522.PICC_IsNewCardPresent()) { digitalWrite(led_refusé, LOW);
return; } delay(200); }
if ( ! mfrc522.PICC_ReadCardSerial()) { return; } }
Serial.print(" Numéro d'identification UID:"); delay(1000);
String contenu= ""; }
byte lettre;
11
Application 1
ESP8266 Arduino
Étape 1: parler au module manuellement
GND GND
• L'ESP8266 n'est strictement alimenté VIN 3.3v
qu'en 3,3 V. ENABLE 3.3v
• Téléverser le Sketch Blink pour TX RX
allouer la liaison série, RX TX
• Régler le terminal pour envoyer Schéma pour initialiser
manuellement l'ESP8266
CR et LF en caractère de fin de avec les commandes AT
ligne et le débit à 115200 baud.
Puis envoyer la commande AT
(suivie d'un retour à la ligne).
12
Application 2
Réglage du téléphone Android:
1. Téléverser le code ci-après dans l’Arduino UNO
(esp8266Sample.ino).
2. Télécharger le client Telnet pour Android
3. Connecter au ESP8266 Wifi
4. Une fois connecté, obtenir l'adresse IP
5. Ouvrir le client Telnet sur le téléphone Android.
6. Créer une connexion en cliquant sur se connecter,
sur Ajouter IP et sur le port 80.
Une fois connecté, envoyez une demande en tapant:
esp8266: <any AT Commands>
Application 2
Étape 3: À propos du code
Toutes les requêtes lues et analysées sont dans la fonction loop()
if(wifiSerial.available()>0){
String message = readWifiSerialMessage();
if(find(message,"esp8266:")){
String result = sendToWifi(message.substring(8,message.length()),responseTime,DEBUG);
if(find(result,"OK"))
sendData("\n"+result);
else
sendData("\nErrRead"); //At command ERROR CODE for Failed Executing statement
}else
if(find(message,"HELLO")){ //receives HELLO from wifi
sendData("\\nHI!"); //arduino says HI
}else if(find(message,"LEDON")){
digitalWrite(13,HIGH);
}else if(find(message,"LEDOFF")){
digitalWrite(13,LOW);
} else{
sendData("\nErrRead"); //Command ERROR CODE for UNABLE TO READ
} }
13
Application 2
• Pour communiquer avec Arduino UNO on ajoute cette condition
if(find(message,""))
{ //something to do here
}
Lit dans le flux jusqu'à ce que le target donné soit trouvé (rep. vrai ou faux).
Application 3
• L’ESP démarre en mode Point d’Accès, on peut donc s’y connecter à l'aide
d'un smartphone pour un contrôle à distance.
• Séquence vidéo (https://www.youtube.com/watch?v=2cjufbgOBYo) illustre
les étapes à réaliser de l’application.
• Environnement de développement utilisé est Remotexy.
• Code voir: https://goo.gl/cxptgA#stay_creative #nothing_impossible
14
7. Diagrammes fonctionnels
Rappels
• Les appareils qui se connectent aux réseaux WiFi sont appelés stations (STA).
• La connexion au WiFi est assurée par un point d'accès (AP), qui fait office de
concentrateur pour une ou plusieurs stations.
• L’AP est connecté de l'autre extrémité à un réseau câblé.
• Un AP est généralement intégré à un routeur pour fournir l'accès d'un réseau
WiFi à l’Internet.
• Chaque AP est reconnu par un SSID (Service Set IDentifier), qui est
essentiellement le nom du réseau qu’on sélectionne lors de la connexion d'un
appareil (station) au WiFi.
Diagrammes fonctionnels
• L’ESP8266 peut fonctionner comme une station, nous pouvons donc le connecter
au réseau WiFi.
• Il peut également fonctionner comme un AP logiciel (soft-AP), pour établir son
propre réseau WiFi.
• Lorsque le module ESP8266 fonctionne comme un soft-AP, nous pouvons
connecter d'autres stations au module ESP.
• L'ESP8266 peut également fonctionner à la fois comme une station et un soft-
AP. Cela offre la possibilité de construire un réseaux maillés.
15
Diagrammes fonctionnels: Station
• Le mode Station (ST) est utilisé pour connecter le
module ESP à un réseau WiFi établi par un AP.
L’ESP8266 fonctionner
en mode soft-AP
16
Diagrammes fonctionnels: Client
La classe Client crée des clients qui peuvent accéder aux services fournis
par les serveurs afin d'envoyer, de recevoir et de traiter des données.
L’ESP8266 fonctionner
comme un Serveur
17
8. Ajouter un Shield GSM/GPRS à Arduino UNO
//Programme d'envoi d'un sms toutes les heures
//Shield GSM/GRPRS ITEA //Arduino uno //Pin 2 : TX //Pin 3 : RX
//Carte sim sans code pin
#include "SIM900.h"
#include <SoftwareSerial.h>
#include "sms.h"
SMSGSM sms;
int numdata;
boolean started=false;
char smsbuffer[160];
char n[20];
char num_tph[] = "+21698600000";
void setup(){
//Serial connection.
Serial.begin(9600);
Serial.println("GSM Shield testing.");
//Start configuration of shield with baudrate 2400(pour le shield ITEA)
if (gsm.begin(2400)) {
Serial.println("\nstatus=READY");
started=true;
} else Serial.println("\nstatus=IDLE");
if(started) {
if (sms.SendSMS(num_tph, "start"))
Serial.println("\nSMS sent OK"); }};
void loop(){
if(started) {
sms.SendSMS(num_tph, "message");
delay(3600000); }};
9. Application IOT-1
Problème
Un agriculteur, qui cultive des légumes sur un champ de 5
kilomètres carrés, cherche à mettre en œuvre un système Wi-Fi
de surveillance de la température et de l'humidité entièrement
indépendant, autonome et sans utiliser des fils.
Solution: Création d'un réseau Wi-Fi ESP8266
• Diviser le champ en 4 parties de zones,
• Dans chaque zone, on construit un sous-réseau de 9 ESP8266,
• Au centre du terrain, on place un boîtier central (central Box) contenant
– 1 module ESP8266,
– 1 Arduino uno,
– 1 module compatible GPRS Arduino.
• Dans chaque sous-réseau, on dispose :
– 3 ESP comme répéteurs de signaux (middleman)
– 6 autres ESP pour les lectures des capteurs (workers).
18
9. Application IOT-1
9. Application IOT-1
• Les 6 workers sont, la plupart du temps, en DEEP_SLEEP et se
réveillent à 1 heure d'intervalle pour lire les capteurs,
• Les 3 middleman sont à la fois en AP et ST avec un serveur Web
démarré, en attente des requêtes à venir des workers.
Comment programmer les modules?
• Chaque worker est programmé pour se réveiller de DEEP_SLEEP, lire les
capteurs, se connecter à l'AP ESP le plus proche et envoyer une requête
HTTP à son serveur avec les données,
• Si l'AP middleman le plus proche n'était pas disponible, les workers sont
programmés pour conserver jusqu'à 10 lectures dans leurs mémoires
internes, et les envoyer chaque fois que l'AP est réveillé,
• Les workers peuvent être alimentés par 4 piles Li-Ion 3,3 V, branchés en
parallèle et chargés par des panneaux solaires de 15 V,
• Les capteurs à utiliser sont à 1 fil.
19
9. Application IOT-1
• Chaque middleman est programmé pour écouter et recevoir les lectures des
workers, puis les envoyer au prochain middleman jusqu'à l'ESP du central Box,
• Les middlemans sont configurés à la fois en AP/ST.
• Les workers (client) utilisent des adresses IP statiques afin de réduire le
temps nécessaire pour se connecter à l'AP.
• Le central Box est chargé de recevoir et de traiter les données des
middlemans les plus proches, et de les envoyer dans une base de données
MySQL via le module GPRS au format JSON / XML, une fois par jour.
• Les données reçues (toutes les heures) peuvent être stockées (en format CSV)
sur un module de carte SD, attaché au module Arduino UNO.
• Les ESP central et middlemans sont programmés comme un agent de
découverte, en envoyant des requêtes PING vers les AP à proximité pour
vérifier la disponibilité et envoyer l'état et les mesures à la base de données.
9. Application IOT-1
Il existe de nombreux arrangements possibles à concevoir
pour le projet.
20
10. Application IOT-2
• Station météo à distance (humidité et température) en utilisant ThingSpeak,
• ThingSpeak est un service Cloud gratuit de surveillance et de contrôle des
systèmes à distance.
• Les composants à utiliser: Carte Arduino, capteur d'humidité et de
température DHT11 et le ESP8266 WIFI ,
21
11. Application IOT-3 avec la technologie LoRa
• Envoyer des valeurs prélevées par des capteurs vers une plateforme Web/IoT
publique en utilisant le kit LoRa de Dragino.
LoRa Node
with Sensors
WiFi
Ethernet 3G/4G LoRa
/WiFi Communication
Cloud
Ethernet
Server
LoRa Gateway
22
11. Application IOT-3 avec la technologie LoRa
Installation de l’environnement et des bibliothèques
Ajouter et installer le gestionnaire de carte correspondant :
1. Aller dans File --> Preference, de l’Arduino IDE
2. Dans la partie Additional Boards Manager URLs, ajouter le lien:
http://www.dragino.com/downloads/downloads/YunShield/package_dragino_
yun_test_index.json
3. Aller dans Tools --> Board --> Boards Manager, chercher la carte Dragino et
l’installer.
4. Aller dans Tools --> Board et vérifier la présence de la carte Dragino Yun-UNO or
LG01/OLG01
La bibliothèque Radiohead permet au MCU de communiquer et contrôler le module
LoRa pour envoyer et recevoir des paquets :
1. Télécharger la bibliothèque sur
https://github.com/dragino/RadioHead/archive/master.zip et la décompresser
dans le répertoire libraries de Arduino.
2. Redémarrer l’IDE et vérifier que les exemples de la bibliothèque Radiohead sont
bien présents dans File --> Examples.
Le noeud LoRa
1. Brancher le capteur DHT11 à une Arduino UNO selon le schéma donné.
2. Créer un nouveau sketch et copier le code client_lora_dht11.
3. Dans Tools --> Board, sélectionner la carte Arduino/Genuino UNO
4. Brancher la carte à un port USB, sélectionner le port correspondant (dans Tools
--> Port) puis téléverser le programme.
5. Ouvrir le moniteur série (Ctrl+Shift+M)
La passerelle
Afin d’accéder à un autre moniteur série
pour la passerelle, il faut lancer une
nouvelle instance de l’IDE Arduino.
1. Créer un nouveau sketch et copier le code
gateway_lora_local.
2. Dans Tools --> Board, sélectionner la Montage complet et branchement du
carte Dragino Yun-UNO or LG01/OLG01.capteur DHT11 avec la carte Arduino UNO
3. Dans Tools --> Port, sélectionner le port de la passerelle et téléverser le
programme.
4. Ouvrir le moniteur série.
23
Code client_lora_dht11 byte i = 0; Serial.println("C ");
#include <SPI.h> byte result = 0; break;
#include <RH_RF95.h> for(i = 0; i < 8; i++) case 1:
RH_RF95 rf95; // instancier l'objet pour communiquer { Serial.println("Error 1: DHT start condition 1 not met.");
#define dht_dpin XXX // broche de lecture du capteur while(digitalRead(dht_dpin) == LOW); break;
byte bGlobalErr; delayMicroseconds(30); case 2:
char dht_dat[5]; // stocker les données du capteur if (digitalRead(dht_dpin) == HIGH) Serial.println("Error 2: DHT start condition 2 not met.");
float frequency = XXX; // Fréquence du module result |=(1<<(7-i)); break;
void setup() while (digitalRead(dht_dpin) == HIGH); case 3:
{ } Serial.println("Error 3: DHT checksum error.");
InitDHT(); return result; break;
Serial.begin(9600); } default:
if (!rf95.init()) uint16_t calcByte(uint16_t crc, uint8_t b) Serial.println("Error: Unrecognized code encountered.");
Serial.println("init failed"); { break; }
// Paramétrer la fréquence ISM uint32_t i; // calcul de la longueur des données à envoyer
rf95.setFrequency(frequency); crc = crc ^ (uint32_t)b << 8; int dataLength = XXX;
// Paramétrer la puissance de transmission for ( i = 0; i < 8; i++) // calcul du CRC
rf95.setTxPower(13); { uint16_t crcData = XXX;
Serial.println("Humidity and temperature\n\n"); if ((crc & 0x8000) == 0x8000) unsigned char sendBuf[50] = {0}; // buffer d'envoie
} crc = crc << 1 ^ 0x1021; int i;
void InitDHT() // Initialise le capteur DHT11 else for(i = 0; i < dataLength; i++)
{ crc = crc << 1; XXX;
pinMode(dht_dpin,OUTPUT); } // Ajout de la première partie du CRC au paquet paquet LoRa
digitalWrite(dht_dpin,HIGH); } return crc & 0xffff; sendBuf[dataLength] = (unsigned char)crcData;
void ReadDHT() // Lit les valeur de température et d'humidité } // Ajout de la deuxième partie du CRC au paquet paquet LoRa
{ uint16_t CRC16(uint8_t *pBuffer,uint32_t length) sendBuf[dataLength+1] = (unsigned char)(crcData>>8);
bGlobalErr = 0; { rf95.send(XXX, XXX); // envoyer le paquet LoRa
byte dht_in; uint16_t wCRC16 = 0; uint8_t buf[RH_RF95_MAX_MESSAGE_LEN]; // buffer de la réponse
byte i; uint32_t i; uint8_t len = sizeof(buf); // longueur de la réponse
digitalWrite(dht_dpin,LOW); if (( pBuffer == 0 )||( length == 0 )) // attendre une reponse durant 3s
delay(30); { if (rf95.waitAvailableTimeout(3000))
digitalWrite(dht_dpin,HIGH); return 0; } {
delayMicroseconds(40); for ( i = 0; i < length; i++) if (rf95.recv(XXX, &len)) // vérifier si le message est correcte
pinMode(dht_dpin,INPUT); { {
dht_in = digitalRead(dht_dpin); wCRC16 = calcByte(wCRC16, pBuffer[i]); } // vérifier si le message est pour le noeud
if( dht_in ){ return wCRC16; if(buf[0] == X||buf[1] == X||buf[2] == X)
bGlobalErr = 1; } {
return; void loop() pinMode(4, OUTPUT);
} { digitalWrite(4, HIGH);
delayMicroseconds(80); ReadDHT(); Serial.print("got reply: "); // afficher la réponse
dht_in = digitalRead(dht_dpin); char data[50] = {0} ; Serial.println((char*)buf);
if( !dht_in ){ // Utiliser Data[0]. Data[1], Data[2] pour exprimer le deviceID. delay(400);
bGlobalErr = 2; data[0] = X ; digitalWrite(4, LOW);
return; data[1] = X ; Serial.print("RSSI: "); // afficher le RSSI
} data[2] = X ; Serial.println(rf95.lastRssi(), DEC);
delayMicroseconds(80); data[3] = dht_dat[0]; // ajouter la valeur de l'humidité }
for (i = 0; i < 5; i++) data[4] = dht_dat[2]; // ajouter la valeur de température }else{
dht_dat[i] = read_dht_dat(); switch (bGlobalErr) // traiter le retour de lecture Serial.println("recv failed");
pinMode(dht_dpin,OUTPUT); { XXX; // renvoyer le paquet
digitalWrite(dht_dpin,HIGH); case 0: }
byte dht_check_sum = dht_dat[0]+dht_dat[1]+dht_dat[2]+dht_dat[3]; Serial.print("Humdity = "); }else{
if(dht_dat[4]!= dht_check_sum) Serial.print(data[3], DEC); Serial.println("No reply, is rf95_server running?");
bGlobalErr = 3; } Serial.print("% "); XXX; // renvoyer le paquet }
byte read_dht_dat(){ Serial.print("Temperature = "); delay(30000); // Lire le capteur toutes les 30 secondes }
Serial.print(data[4], DEC);
24
Connexion à un serveur IoT
• La deuxième phase consiste à connecter la passerelle à Internet afin d’envoyer les données
collectées à une plateforme Web, ou serveur IoT, ou Cloud.
• Nous optons ici pour ThingSpeak comme serveur IoT.
• Généralement, l’envoie et l’accès aux données se fait avec une API RESTFul. Cette API utilise des
requêtes HTTP (GET, PUT, POST, DELETE) pour envoyer des données au serveur et réaliser ensuite
différentes opérations.
Configuration du serveur
1. Créer un compte sur https://thingspeak.com/users/sign_up
2. Créer un nouveau canal pour contenir les données collectées (New channel).
3. Renseigner les champs nécessaires et cocher une nouvelle case Field pour chaque type de donnée
contenu dans le projet (ici, température et humidité).
4. Dans l’onglet API Keys, copier la clé d’écriture (Write API Key) qui servira à sécuriser les requêtes
d’envoie de données au serveur.
5. Dans la section API Requests, le format des liens à utiliser sont donnés pour chaque opération. Nous
nous intéressons à la première.
6. Les données de chaque champ crée sont accessibles dans l’onglet Private View. Pour tester le
fonctionnement des liens, utiliser un navigateur et lancer par exemple le lien suivant :
https://api.thingspeak.com/update?api_key=XXXXX&field1=31 en remplaçant XXXXX par la clé
d’écriture copiée précédemment. Dans l’onglet Private View la valeur 31 s'affiche dans le graphe
quelques secondes après avoir lancé le lien.
25
Interface de visualisation des données reçues
Etapes de
communication
du noeud LoRa
au serveur IoT
26
Code gateway_lora_iot_server
Pour obtenir le programme correspondant, il faut compléter les blocs d’instructions suivants et les placer au
bon endroit dans le code donné par le code gateway_lora_local.
27
Aller plus loin
À partir de la configuration réalisée, deux pistes intéressantes peuvent être envisagées pour rendre le
scénario plus complexe :
Exécuter une commande sur le noeud LoRa à partir du serveur IoT : En plus de visualiser et traiter
les données, ThingSpeak propose un autre service permettant de créer une file de commandes côté
serveur qui seront exécutées par le noeud LoRa. Le noeud jouera dans ce cas le rôle d’un actionneur,
pour allumer/éteindre une lampe par exemple. Le principe de fonctionnement est similaire à celui de
l’envoie de données vue précédemment.
Réaliser une topologie maillée avec plusieurs passerelles LoRa : Pour couvrir des surfaces plus larges,
les données collectées par le noeud LoRa peuvent être envoyées sur plusieurs sauts. Pour cela, un
ensemble de passerelles (clients maillés) sont placées entre la passerelle principale (passerelle maillée
connectée à Internet) et les noeuds LoRa. Les clients maillés communiquent entre eux et avec la
passerelle principale. Les détails de configuration sont disponibles dans la documentation du kit
(http://www.dragino.com/)
Exécution de
commandes sur
le noeud LoRa
28
12. Autres outils à explorer
Microcontrôleur
• ESP32: Système à faible coût et consommation
d'énergie avec WiFi et Bluetooth à deux modes!
• La famille comprend les puces ESP32-D0WDQ6,
ESP32-D2WD, ESP32-S0WD, ESP-WROOM-32, etc…
• L'ESP32 est hautement intégré avec des
commutateurs d'antenne intégrés, un balun RF,
un amplificateur de puissance, un amplificateur
de réception à faible bruit, des filtres et des
modules de gestion de l'alimentation.
• Conçu pour les applications IoT,
Développement
• Esplorer: ESP-IDF (Espressif IoT Development Framework)),
• Ardublock ESP: (Programmer des objets connectés),
• Mblock: logiciel qui intègre les briques pour piloter toutes les cartes compatibles Arduino,
• MIT App Inventor : Environnement de développement d'applications pour Android.
29
12. Programmer ESP32 en utilisant IDE Arduino
• Vérifier et/ou modifier les paramètres de la carte Esp32 comme indiqué
ci-dessous
– Type de carte: ESP32 Dev Module
– Upload Speed: 115200 # Vitesse de transfert
– CPU Frequency: 240MHz (WIFI/BT)
– Flash Frequency: 80MHz
– Flash Mode: QIO
– Flash Sizes 4MB(32Mb)
– Partition scheme: Default 4MB with spiffs (1.2MB APP/1.5MB SPIFFS)
– Core Debug Level: Rien
– PSRAM: Disabled
– Port: COM4 # Votre n° de port COM - Windows
30
12. Programmer ESP32 en utilisant IDE Arduino
Vérification du Wifi avec la carte ESP32-WROOM
#include "WiFi.h" } else {
void setup() Serial.print(n);
{ Serial.println(" networks found");
Serial.begin(115200); for (int i = 0; i < n; ++i) {
// Set WiFi to station mode and disconnect from an AP if it // Print SSID and RSSI for each network found
// was previously connected Serial.print(i + 1);
WiFi.mode(WIFI_STA); Serial.print(": ");
WiFi.disconnect(); Serial.print(WiFi.SSID(i));
delay(100); Serial.print(" (");
Serial.println("Setup done"); Serial.print(WiFi.RSSI(i));
} Serial.print(")");
void loop() Serial.println((WiFi.encryptionType(i) ==
{ WIFI_AUTH_OPEN)?" ":"*");
Serial.println("scan start"); delay(10);
// WiFi.scanNetworks will return the number of networks }
found }
int n = WiFi.scanNetworks(); Serial.println("");
Serial.println("scan done"); // Wait a bit before scanning again
if (n == 0) { delay(5000);
Serial.println("no networks found"); }
31
12. Programmer ESP32 en utilisant IDE Arduino
Un serveur Web simple
• L'accès se fait avec par exemple http://192.168.1.7/test. Ce script ne marche pas trop bien, il
faut attendre plusieurs secondes avant de pouvoir rafraichir la page ou entrer cette adresse avec
un autre explorateur Internet, comme Chrome qui semble donner plus de difficulté.
#include <WiFi.h> } content=\"width=device-width, initial-scale=1.0,
#include <WebServer.h> void deal_onConnect() { user-scalable=no\">\n";
const char* ssid = "..."; Serial.println("onConnect"); ptr += "<title>ESP32 Web Server</title>\n";
const char* pwd = "..."; server.send(200, "text/html", ptr += "<style>html { font-family: Helvetica;
WebServer server(80); SendHTML("Connect sur root")); display: inline-block; margin: 0px auto; text-
void setup() { } align: center;}\n";
Serial.begin(9600); void deal_aTest() { ptr += "body{margin-top: 50px;} h1 {color:
Serial.print("Connexion à "); Serial.println("aTest"); #444444;margin: 50px auto 30px;} h3 {color:
Serial.println(ssid); server.send(200, "text/html", SendHTML("Juste #4444FF;margin-bottom: 50px;}\n";
WiFi.begin(ssid, pwd); un test")); ptr += "p {font-size: 14px;color: #888;margin-
while (WiFi.status() != WL_CONNECTED) { } bottom: 10px;}\n";
delay(200); void deal_temperatures() { ptr += "</style>\n</head>\n";
Serial.print("."); Serial.println("The temperatures"); ptr += "<body>\n";
} server.send(200, "text/html", "C: 20.6 17.8 ptr += "<h1>ESP32 Web Server</h1>\n";
//Montre l'adresse IP et démarre le serveur Web22.5"); ptr += "<h3>" + content + "</h3>\n";
Serial.println(""); } ptr +="</body>\n";
Serial.println("WiFi connecté!"); void deal_notFound() { ptr +="</html>\n";
Serial.println("Adresse IP: "); Serial.println("notFound"); return ptr;
Serial.println(WiFi.localIP()); server.send(200, "text/html", SendHTML("Not }
server.on("/", deal_onConnect); found")); void loop() {
server.on("/test", deal_aTest); } server.handleClient();
server.on("/temps", deal_temperatures); String SendHTML(String content){ delay(1000);
server.onNotFound(deal_notFound); String ptr = "<!DOCTYPE html> <html>\n"; }
server.begin(); ptr += "<head><meta name=\"viewport\"
32
12. Programmer ESP32 en Python en utilisant MicroPython
• Choisir la carte ESP32, sélectionnez l'option Effacer Flash (pour effacer
complètement la mémoire ESP32) et dans le champ Firmware Choose, entrez le
chemin du micrologiciel MicroPython téléchargé précédemment. Faites attention à
l'adresse d'enregistrement, qui doit être 0x1000. l’écran ressemblera à ceci:
• Cliquez sur OK et attendez le processus d'enregistrement. Il fallait appuyer sur le
bouton BOOT pour démarrer. Après l'enregistrement, n'oubliez pas de redémarrer
NodeMCU pour que le nouveau firmware déjà avec MicroPython soit chargé.
• Pour vérifier si tout va bien, sélectionnez le port COM
de votre ESP32 NodeMCU dans le menu Outils et dans
ce même menu sélectionnez la carte ESP32.
• Pour vous connecter à l'ESP32, cliquez sur l'icône
«chaîne» sur le côté droit de l'IDE. Vous pouvez voir
sur le côté gauche les fichiers qui se trouvent dans le
module (boot.py) et en bas une invite de commande.
33
13. Application IOT-4
MQTT en utilisant Arduino IDE
Le Broker MQTT utilisé est
iot.eclipse.org, qui est gratuit. Il
Subscriber existe également des Brokers
payants sur Internet et on peut
Message
même créer un Broker en
Publisher
interne, en utilisant une carte
Subscriber Raspberry Pi, par exemple.
34
//Programme: module ESP32 Wifi avec MQTT
#include <WiFi.h>
#include <PubSubClient.h>
const char* ssid = "WIFI-FSM";
const char* password = « 12457894";
//Envoyez le message au broker
const char* mqttServer = "mqtt.eclipse.org";
client.publish(« LFI3IOT", message);
const int mqttPort = 1883;
Serial.println("Message envoyé avec succès...");
const char* mqttUser = "abcdefg";
compteur++;
const char* mqttPassword = "123456";
delay(30000);}
WiFiClient espClient;
void reconnectbroker()
PubSubClient client(espClient);
{ // Connexion au broker MQTT
int compteur = 1;
client.setServer(mqttServer, mqttPort);
char message[30];
while (!client.connected())
void setup()
{ Serial.println(" Connexion au broker MQTT...");
{ Serial.begin(115200);
if (client.connect("ESP32Client", mqttUser, mqttPassword ))
WiFi.begin(ssid, password);
{ Serial.println(" Connexion au broker!"); }
while (WiFi.status() != WL_CONNECTED)
else
{ delay(500);
{ Serial.print("Échec de la connexion au Broker- État:");
Serial.println("Démarrage de la connexion WiFi..");}
Serial.print(client.state());
Serial.println("Connecté au réseau WiFi!");}
delay(2000);}
void loop()
}}
{ //Se connecte au Broker MQTT
reconnectbroker();
sprintf(message, "MQTT ESP32-message no. %d", compteur);
Serial.print(« Message envoyé: ");
Serial.println(message);
35
Principaux Brokers MQTT open-source
Les principaux projets de brokers Open Source
• ActiveMQ qui permet d’ajouter MQTT à un serveur Web Apache,
• JoramMQ pour l’intégration de MQTT en Java,
• Mosquitto, le plus utilisé dans les projets DIY soutenu par la fondation
eclipse.org,
• RabbitMQ, disponible également avec un support commercial,
• EMQTT, conçu pour recevoir de nombreuses connexions (jusqu’à 1 million
par serveur). Il est possible de créer un cluster (réseau de serveur) pour
accroitre le nombres de connexions simultanées.
ActiveMQ et JoramMQ sont des brokers assez spécifiques. RabbitMQ est
plus orienté entreprise.
Mosquitto est un très bon choix. Il est disponible sur toutes les plateformes
et s’installe en quelques minutes.
36