You are on page 1of 31
Laboratoires loT de base Mise en oeuvre des architectures loT a la base de loT-DevKit de SmartComputerLab Table des contenus 0. Introduction. 0.1 ESP32 Soc - une unité avancée pour les architectures IoT. 0.2 Carte Heltec WiFi LoRa... 0.3 loT DevKit une plate-forme de développement loT 0.8.1 Cartes d'extension - quelques exemples. enum 04 Liinstallation de Arduino IDE sur un OS Ubuntu (0.4.1 Installation des nouvelles cartes ESP32 et ESP8266. 0.4.2 Préparation d'un code Arduino pour la compilation et chargement..... Laboratoire 1... 1.1 Premier exemple - afichage des données. Alar... ‘Compléter, campicer, et charger ce programme. 1.2 Deuxiéme oxomplo ~ capture ot afchage dos valour. vol 4.2.1 Capture de la température/huricité par SHT21... att 1.2.2 Capture de la luminosité par BH1750. nl 4.2.3 Capture de la luminosité par MAX44009... 13 12.4 Capture de la pression'température avec captour SiNP180. sta 2 co 1.2.5 Capture de la température/hurridité avec capteur DHT22... A LAH Casares 1. Compiétez les programmes ci-dessus afin daficher les données de la Luminosité sur 'cran OLED..15 2. Développer une application avec la capture et lafichage de l'ensemble de trois données Température/Humicite et Luminosité, 15 4.2.6 Détection de mouvement avec capteur PIR (snece).. 16 ALTE en 16 1. Compl prog afin d ie 16 Laboratoire 2 - communication on WiFi et sorvour ThingSpoak fr... 2.4 Introduction. . 2.1.1 Un programme de test scrutation du réseau WiFt. 2.2 Mode WiFi ~ STA. client WEB et serveur ThingSpeak... 12.2.1 Acces WiFi - votre Phone ou un routeur WiFI-AG... Alten 1. Créer un canal ThingSpeak puis récupérer les paraméves du canal: numberet waite key. 2 Intégrer utilisation des capteurs de Temperature/Humidité et de la Luminostté... Envoyer ces données cyciquement (par exemple toutes les 30 seconde) vers le serveur ThingSpeak. 20 2.3 Mode WiFi - STA, avec une connexion & eduroam. a Afate... Pee. 1. Gréer un canal ThingSpeak puis récupérer les parametres du canal’: number et write key. 2 Intéorer [utilisation des capteurs de Temperature/Humidité et de la Luminosté... : Envoyer ces données cyciquement (par exemple toules les 30 seconde) vers le serveur ThingSpea 22 2.4 Le programme de réception des données a partir d'un serveur ThingSpeak. i Alaie... 1. Modifier (simpiir) ce programme pour une utilisation avec un Pont d par exemple)... 2 2. Appliquer le code & votre canal du serveur Thingspeak 108s airect (votre SmartComputerLab loT Devkit Laboratoires 1 Lahoratotre 3 - communication longue distance avec LoRa (Long Range 3.4 Invoduction, 3.1.1 Modulation Lor: 3.1.2 Paquets LoRa... 3.2 Premier exemple - dmeiteur et récoptour ‘des paquats Lora. Afaire... 4. Tester le code 2 hedier les paramétres LoRa par Seen fre transmission. 8, Affches les données regues sur écran OLED. 3.3 onRecaive() - récepteur des paquets LoRa ave re 1. Tester le code ci-dessus. 2. Afficher les données recues sur écran OLED. 3. Transférer les données regues dans les variabies externes (probléme?). Laboratoire 4 - Développement d'une simple passerelle Io. 4.41 Passerelie LoRa-ThingSpeak. 4.4.1 Le principe de fonctionnement.. Afate..... 1. Ecrire le code complet et le tester avec un puis aves 2 termnaux..... 2. Chaque terminal génére les donnes sur difisrents champs (fields); par exempia terminal 0x01 utilise les fieldt ot fele2, tandis que le terminal 0x02 exploit fiald3 ot fold 31 ‘SmartComputerLab loT Devkit Laboratoires 2 0. Introduction Dans les laboratoires loT nous alons mettre en ceuvre plusieurs architectures IoT intégrant les terminaux (T). les passerelles (gateways - G), et les serveurs (S) loT type ThingSpeak ou Thinger.io. Le développement sera réalisé sur les cartes loTDevkit de SmartComputerLab. Le kitde développement contient une carte de base “basecard” pour y accueillr une unite centrale et un ensemble de cartes d'extension pour les capteurs, les actuateurs et les modems supplémentaires. units centrale est une carte équipée d'un SoC ESP32 ot dun madem LoRa (Long Range). Le premier laboratoire peimet de préparer environnement de travail et de tester 'utlisation des capteurs, cconneciés sur le bus I2C (temperature/numicite/luminosité/pression) et dun aticheur. Pour nos dBvelonpements et nos expérimentations nous uflisons le IDE Arduino comme outils de programmation et de chargement des programmes dans la mémoire flash de I'unité centrale. Le deuxiéme laboratoire est consacré a la pris en main du modem WiFi intégré dans la carte principale (Heltec ESP32-WiF-LoRa). La communication WiFi en mode station et un client permet d'envoyer les données des capteurs vers un serveur WEB. Dans notre cas nous utlisons le serveur de type ThingSpeak; (thingSpeak .fz/com).Ces serveurs sont accessibles gratuitement, mais leur utilisation peut étre limitée un temps (lecasde ThingSpeak.con). Le troisiéme laboratoire permet dexpérimenter avac les liens a longue distance (1Km). II s'agit de la technologie (et modulation) Loa. Le modem LoRa est intégré sur la carte centrale. Nous allons envoyer les données d'un capteur géré par un terminal sur un lien LoRa vers une passerelle LoRa-WiFi. La passerelle retransmetira ces données vers le serveur ThingSpeak'Thinger.io. Le quatriéme laboratoire permettra dintégrer l'ensemble de lions WiFi et LoRa pour créer une application compléte avec les terminaux, le gateway LoRe-WiFi et les serveurs ThingSpeak. Apres ces laboratoires préparatits nous vous proposons plusieurs laboratoires thematiques qui permettrans de concevoir et développer différentes sortes d applications loT sous la forme de mini-projets. On ‘vous présentera quelques exemples des architectures loT dans les domaines d'application différents tals que la messagerie, le sécurité, environnement, le commerce,etc. Vous pouvez vous Inspirer de ces laboraloires ou de proposer dautres de complexité comparable, Nous vous fournirons (selon les disponibilites) des cartes d'exiension et de capteurs/actionneurs nécessaires pour la réalisation de ces projets. SmartComputerLab loT Devkit Laboratoires 3 0.1 ESP32 Soc - une unité avancée pour les architectures loT ESP32 est une unité de microcontrOleur avancée congue pour le développement d'architectures lo. Un ESP32 int8gre deux processeurs RISC 82-bit fonctionnant 4 240 MHz et plusieurs unités de traitement et de communication supplémentaires, notamment un processeur ULP (Ultra Low Power), des modems WiFi / Eluotooth /BLE ot un ensomble de contrélours E/S pour bus sério (UART, I2C, SPI). ,.) Ces blocs fonctionnols sont décrits ci-dessous dans la figure suivante. srl luetoot | i | tooth | cove in controner || Dassband |) | EE Cok | 8) )5 135 a | generator) 3 8 3010 1a wea | ———_| WHFIMAC | tasetara |, | ART guaran) a) _—— CAN | Core and mem pa) rere Tenge | CoM*eeraic hardware x Xtensa@) 32-bit acceleration ey Microprocessors 7 SHA) RSA kom SRAM = aan AES) RNG. ee Temperature sensor = Touch sensor ue Recovery PM bac ie coprocessor memay anc Figure 0.1 ESP32 SoC ~ architecture interne 0.2 Carte Heltec WiFi LoRa De nes jours, les S00 ESP22 sont intégrés dans un certain nombre de cartes de développement qui incluent des crcults supplementaires ei des modems de communication. Notre chox est la carte ESP32-Heltec WIFI- LoRa qui integra le modem LoRa Semtech $127 /78 et (eventuelement) un écran OLED. La figure suivante montie la carte ESP32-Heltec WiFi-LoRa grees erage a a es F epee le Eoay rate _ Fe ist ay Yeres Boos Tee COMETS So oe ks peretesscen Hate Wi lafalS2.V2" SSERAHE Ep sltoe Wii Los 22 V2 S68MHz bottorn Figure 0.2 Carte MCU ESP32-Heltec WiFi-LoRa SmartComputerLab loT Devkit Laboratoires 4 sp linhoearnssrai siete a Figure 0.3. Carte ESP32-Heltec WIFI-LORa et son pin-out ‘Comme nous pouvons le voir sur la figure ci-dessus, la carte Hellec expose des broches 2x18. Certalnes de ces broches sont utilisées pour connecter le modem LoRa SX1276/8 (SP!) et laficheur OLED (I2C), @autres broches peuvent étre utilisées pour connecter des composants extemes te's que des capteurs au des actionneurs, 0.3 loT DevKit une plate-forme de développement loT Une integration effcace de la carte Heltec sélectionnée dans les architectures loT nécessite l'utiisation d'une plate-forme de développement telle que loT Devkit proposée par SmartComputerLab. LlloTDevKit est composé dune carte de base et dun grand nombre de cartes dextension congues pour utlisation efficace des bus de connexion el de tous les lypes de capteurs et dactionneurs. Figure 0.4. loT DevKit: carte de base (type bridge) avec 'unité principale et les emplacements pour les cartes extension SmartComputerLab loT Devkit Laboratoires 5 0.3.1 Cartes d'extension — quelques exemples Figure 0.5. loT DevKit: cartos ¢'extonsion, exemple d'implantation sur los doxtension 12C avor captours: BH1750 et HTU21D et une carte Gextension UART avec module GPS NEO-M6 Cartos ertonsion pour lo bus UART (dou oxomgioe) neon 0.4 L'installation de I'Arduino IDE sur un OS Ubuntu Pour nes développements et nos expérimentations ncus utilisons !IDE Arduino comme outils de programmation et de chargement des programmes dans la mémoire flash de lunité centrale. ‘Ain de pouvoir développer le code pour las application nous avans besoin d'un environnement de travail ‘comprenant; un PC, un OS type Ubuntu 16,04LTS, l'environnement Arduino IDE, les outils de SmartComputerLab loT Devkit Laboratoires 6 ‘compilation/chargoment pour los cartes ESP32 ot les bibliothéque de contréle pour les captours, actuatours, (par exemple relais), et les modems de communication Pour commencer mettez le systéme a jour par : eudo apt-upgrade et cudo apt update sudo apt-get install python-serial python3-serial Ensuite il faut installer le dernier Arduino IDE a partic de https: //www.arduino. ce 0.4.1 Installation des nouvelles cartes ESP32 et ESP8266 Aprés son insiallation allez dans les Preferences et ajoutez deux Boards Manager URLs (séparées par une virgula) : https: //d)_espressif con/dl/packaga esp32_index json, http: //arduino esp8266, com/stable/package esp8266com_index. json ‘Comme sur la figure ci-dessous : Preferences rz setengs Hewrk Shatthkode esto (C\sess\utentos\Docamen's\rduio| Browse Fate lnauane: Sysien Default | eaures restartofAruino) Eater font se 7 Interface see Mitutonate (100 $)9% (requires restart of Arduino) Stow vertos: cuyutcurny: [J eomplewen C] upload Compile warnings fore Doin nerumbore enable Code Fone Fa\venty codeaterupoat Dluse external ettor \ooressvay ache conpiedcore [ai check fr uodates n statu plate seth fits 10 new extenson on save (pd -> i) lve wher eifing of uploading Atdtovalsoarés Manager Uris: [fips //d-espessif con /pad.aze_ op Mor cr be elited drecly h Bee (CA ne isnios\AepData Vocal Arduino preferences it (eitory SmartComputerLab loT Devkit Laboratoires z © cose tet] sethaino 185 a Auto Format omer Fic incoding &Reoss Sev Monitor Cat schitan Serial Proter catsshtek inOATR Board \WiF101 Frac Updater Arduino Vin Arduino! Genuine Uno on ‘rduina DuetnitanoveoeDiecnvla Get Board info arguino Nano FincIude #include Burn Bootlooder Programmer "AVFIS? ra ArduineGenvinn Mega or Maya 2580 Arduino Maga ADK Arduino Leonardo Hincluse Include Library> Manage Libraries ot rocherchez, puis installez U8g2. Notez que I'écran OLED est connecté sur un bus I2C avec trois broches : SCL - clock, SDA - data/address ot RESET. #include // bibliothéque 4 charger a partir de Ux8_SSD1306_128X64_NONAME_sW_T2C uax8(15,4,16); // clock, data, reset Ant di=0,d2=0, 43-0; void diepData() t char dbuf [16]; nSe8 clear (); Serial printin("titre); u8x8 .drawString(0,1,"titre"); // 0 - colonne (max 15), 1 - ligne (max 7) sprintf (dbuf, "Datal:%d",d1); u8x8 drawString(0,2,dbuf) ; sprints (dbuf, "Data? :4d",d2); u@x8 drawString(0,3,douf) ; sprintf (abuf, "Data3:4", d3) ju8x8. drawstring (0,4, dbuf) ; delay (6000) ; , void setup() { Serial..begin (9600) ; UuBx8.begin(); // initialize OLED u8x8.setFont (u8x8_font_chroma48medium8_r) ; > void loop () { al +4;a24=2;a3+=4 ; // ici appeler 1a fonction d'affichage > A faire Compléter, compiler, et charger ce programme. SmartComputerLab loT Devkit Laboratoires 10 1.2 Deuxiéme exemple - capture et affichage des valeurs 1.2.1 Capture de la température/humidité par SHT21 Dans cet exercice nous allons ire les valeurs fournies par le cepteur Température/Humidté SHT21 et aficher les 2 valeurs sur 'Scran OLED intégré dans la carte ESP32. Le capteur SHT21 doit étre connecté sur le bus I2C, donc il nous faut une carte d’extension 12C avec la configuration des braches identique a cele du capteur, nous prenens done la carte 12C2. présentée c- dessous, 2 ra Paes Rs) Figure 1.5. loT DevKit : cartes diextension I2C1 et un capteur de température/numidité SHT21 Code Arduino 11 betps : //qithub.con/chaveiro/SHT2x~Arduino-Library. #include Wire h> include "SHT2x.h" SHT2x SHT2«; void setup() 4 Wire begin (21,22); SHT2x. begin () ; Serial. begin (9600) ; > void loop () « wint32_t start = micros(); Serial print ("Humidity (8RH): "); Serial .print (SHT2x.GetHunidity (), 1); Serial.print ("\tremperature (C): "); Serial .print (SHT2x.GetTemperature(), 1); uint32_t stop = micros(); Serial.print ("\tRead Time: "); Serial printIn(stop - start); delay (1000) ; SmartComputerLab loT Devkit Laboratoires " 1.2.2 Capture de la luminosité par BH1750 Dans cet exercice utilisez la carte 12C1 pour le capteur de la luminosité BH1750 Figure 1.3. loT Devkit : cartes diextension 12C1 (longue et courte) pour le capteur Luminosité BH1750 Code Arduino Attention : Avant la compilation il faut installer la biblioth@que BH1750.h hetps: //githubcon/claws/BH1750 include finclude BH1750 lightMeter; void setup() { Wire.begin(21,22); // carte d'extension 12C1 ou petite carte 12¢ Serial. begin (9600) ; LightMeter begin (); Serial. print1n(*Running. delay (1000); > void loop() { wint16_t lux = lightMeter.readLightLevel () ; delay (1000) ; Serial.print ("Light: "); Serial. print (lux); Serial.printin(* 1x"); delay (1000); SmartComputerLab loT Devkit Laboratoires 12 1.2.3 Capture de la luminosité par MAX44009 Dans cet exemple nous utlisons un capteur de \uminosité type MAX44009 (GY-49). Ce capteur est connectée. ‘comme lo captour BH1750 eur le bus I2C. Nous comrruniquons avec ce capteurs directement par les trames 12C ce qui permet de mieux comprendre le fonctionnement de ce bus. 1@s00_Gy-43@ Figure 1.4. loT DeviKit : cartes dextension I2C1 et un capteur de luminosité MAX44009 Code Arduino : #include fidefine Addr Ox4n void setup() « Wire. begin (21,22) ; Serial.begin (9600) ; Wire. heginTransmission (Addr) ; Wire. write (0x02); Wire. write (0x40); Wire. endTansmission () ; delay (300) ; > void loop () ( unsigned int data(2]; Wire. beginTransmi ssion (Addr) ; Wire. write (0x03); Wire. endTzansmission () ; Wire. requestFrom(Addr, 2); // Request 2 bytes of data // Read 2 bytes of data luninance mab, luminance 1sb if (Wire available() == 2) t data{0] = Wire.read(); data[1] ~ Wire. read() ; > // Convert. the data to lux int exponent = (data[0] © OxF0) >> 4; ant mantissa = ((data[0] & Ox0E) << 4) | (data[1] & Ox0F); float luminance = pow(2, exponent) * mantissa * 0.045; Serial.print ("Ambient Light luminance :"); Serial. print (luminance); Serial.printin(" lux"); delay (500) ; > SmartComputerLab loT Devkit Laboratoires 13 1.2.4 Capture de la pressior/température avec capteur BMP180 Le capteur BMP180 permet de capter la pression aimosphérique et la température. Sa précision est seulement do +/- 100 Pa ot +/-1.06. Figure 1.5. loT DevKit : cartes diextension 121 et un capteur de pression/température BMP180 La valeur standard de la pression atmosphérique est 101 325 Pa = 1,013 25 bar =1 atm Code Arduino - BMP180 nety ithub , com/adafruit /Adafruit-BMP08! include #include Adafruit_BMPO85 bnp; void setup() { Serial. begin (9600) ; Wire begin (21,22); ag (!bmp.begin()) { Serial.printin("Could not find a valid BMP085 sensor, check wiring!"); while (1) ) » void loop () { Serial. print ("Temperature = "); Serial. print (bmp. readTemperature ());Serial.printin(" #C"); Serial. print ("Pressure = *); Serial. print (bmp. readPressure ());Serial.print1n(" Pa"); // Caleulate altitude assuming ‘standard! barometric 7/ pressure of 1013.25 millibar = 101325 Pascal Serial. print ("Altitude = "); Serial. print (bmp. readaltitude()); Serial.printin(" meters"); Serial.print ("Pressure at sealevel (calculated) = "); Serial. print (bmp. readSealevalPressure()) ;Serial printIn(" Pa"); // 1015 millibars is equal to 101500 Pascals. Serial.print ("Real altitude Serial, print (bmp readhititude (101500) ): Serial.println(" meters") ;Serial.printla(); delay (500) ; SmartComputerLab loT Devkit Laboratoires 14 1.2.5 Capture de la température/humidité avec capteur DHT22 Figur e 1.6 Carte pebspec et capteur DHT22 Le capteur DHT22 fonctionne sur une simple ligne par avec un protocole série spécifique dédié a son circuit. Code Arduino https: //github com/bertnelic; #include #include Ticker ticker; DHT22 censor; // vaT11 sensor; // DHT11 also works! void readDHT() { sensor..read() ; d void setup() Serial .begin (9600) ; tup (17); // pin 17 is DATA sensor .onData({] (float humidity, float temperature) { Serial.printf("Temp: %g°C\nHumid: $gii\n", temperature, humidity) ; De ticker.attach(10, readDHT) ; y void loop() { » A faire 1. Complétez les programmes cli-dessus afin d'afficher les données de la Luminosité sur 'écran OLED 2, Développer une application avec la capture et 'affichage de l'ensemble de trois données : Température/Humidité et Luminosité. 3. Développer une application avec la capture et l'affichage de l'ensemble de trois données : Température/Humidité et Pression (BMP180/BMP280). SmartComputerLab loT Devkit Laboratoires 15 1.2.6 Détection de mouvement avec capteur PIR (SR602) Figure 1.7 Carte pebspec et capteur PIR (SR602) Code Arduino define PIR 17 bool NOTION DETECTED = false; void pinChanged() { MOTION_DETECTED = true; > void setup() { Serial. begin (9600); attachInterrupt (PIR, pinChanged, RISING) ; > int counter=0; void loop () ‘ int 4-0; L£ (MOTION_DETECTED) Sariai printin *Motion detected. * delay (1000) ;counter++; MOTION DETECTED = false; Serial print In (counter) > A faire Complétez le programme ci-dessus afin d'afficher le compteur d’interruptions sur l'écran OLED SmartComputerLab loT Devkit Laboratoires 16 Laboratoire 2— communication en WiFi et serveur ThingSpeak. fr 2.1 Introduction Dans ce laboratoire nous allons nous intéresser aux moyens de la communication et dela présentation (stockage) des résultats. Etant donné que le SoC ESPS2 intégre les modems de WiFiet de Bluetooth nous allons étudier la communication par WIFI Princjpalement nous avons deux modes de fonctionnement WiFi - mode siation STA, et mode point d'accas Sof tar. Dans le mode STA nous pouvons également tester I'état de fonctionnement : connecté ou de-conrecté. Dans le mode AP nous pouvons déterminer I'adresse IP, le masque du réseau. et le canal de communication WiFi (1 13) Un troisiéme mode appelé ESP-NOW permet de cammuriquer entre les cartes directement (sans un point facoas), done plus rapidement et a plus grande distance, par le biais de trames physiques MAC. Une fois la communication WiFi es! opérationnelle nous pouvons choisir un des multiples protocoles pour transmettre nos données : UDP, TCP, HTTPITCP, ..Par exemple la carte peut fonctionner comme client ou serveur WEB. Dans une application forctionant comme un client WEB nous allons contacter un serveur externe type ThingSpeak pour y envoyer et stacker nos données. Bien sur nous aurons bescin de bibliothéques relatives ces protocoles. 2.1.1 Un programme de test - scrutation du réseau WiFi Pour commencer notre étude de la communication WiFi essayors un exemple permettant de seruter notre environnement dans le recherche de point d'accés visibles par note modem. #include "WiFi.h" include UBX8_SSD1306_126K64_NONAME_SW_I2C uOx8(15, 4, 16); void eetup() 4 WiFi mode (WIFI_STA) ; WiFi disconnect (); delay (100) ; u8x8 .begin(); 8x8. setFont (u8x8_font_chroma48nediun8_r); > void loop () 4 int n = WiFi. scanNetworks (); 4f(n==0) u8x8.drawString(0,0, "Searching !"); else ¢ u8x8.drawString(0, 0, "Networks found: "); u€x8.clear(); for(int i=0;icnj++i) { char currentSS1D(16]; meneet (current SSID, 0x00, 16) ; WiFi. SSID (4) .toCharArray (currentSSID,16) ; 8x8. drawSt ring (0, i+1, currentSSID) ; ) y > SmartComputerLab loT Devkit Laboratoires 17 2.2 Mode WiFi — STA, client WEB et serveur ThingSpeak Une connexion WiFi permet de créer une application avec un client WEB. Ce client WEB peut envoyer les requétes HTTP vers un serveur WEB. Dans nos laboratcires nous allons utiliser un serveur loT externe type ThingSpeak. ThingSpeak est un ‘serveur «open source> qui peut étre installé sur un PG Nous pouvons donc envoyar les requétes HTTP (par exemple en format GET o! les données attachées & URL) surle serveur ThingSpeak. con de Matlab ou ThingSpeak. fr de SmartComputerLab, La préparation de ces requétes peut étre laborieuse, heureusement il existe une bibliothéque ThingSpeak.h qui pormet do simolifer cotte tiche. lifaut done installer la bibliotheque ThangSpeak. h. On peut la trouver & adresse suivante : https: //github.con/mathworks/thingspeak-arduino Attention Si vous voulez travailer avec un serveur ThingSpeak autre que ThingSpeak. com |e fichier ThingSpeak.h doit étre modifié pour y mottro'adresse IP ot lo numéro de port corrospondant. Exemple de modification du fichier ThingSpeak .h pour ThingSpeak .tr //¥define THINGSPEAK_URL "api..thingspeak. com" //4de£ine THINGSPEAK_PORT_NUMBER 80 define THINGSPEAK URL "90.49.254.215" define THINGSPEAK_PORT_NUMBER 442 Apres linscription sur le serveur ThingSpeak vous créez un channel composé de max 8 fields. Ensuite vous pouvez envoyer et lire vos données dans ce fields a condition de fournir la clé d'écriture associée au channel Une écriture/envoi do plusiours valours on virgule flottante est offactué comme suit ThingSpeak. setField(1, sensor[0]); // préparation du field ThingSpeak. setField(2, sensor[11); // préparation du field2 puis ‘ThingSpeak.writeFields(myChannellumber [1], myWriteaPrKey[1]); // envoi Voici le début d'un tel programme ( déctarations et setup }): #include #include "Thingspeak.h" WiFiClient client; char ssid[] = 'PhoneaP’ /J your network SSID (name) char pass[] = "amartcomputerlab" ; // your network pasew unsigned long myChannelNumber = 1; // IoTDevKit1 const char * myWriteAPIKey = "HEUG4K3PGNAG36C4"; TPAddress ip; void setup() { Serial. begin (9600); WiFi.disconnect (true); // effacer de 1/ EEPROM WiFi credentials delay (1000) ; WiFi.begin(seid, pase); delay (1000) ; while (WiFi.status() != WL_CONNECTED) { delay (500); Serial-print("."); > SmartComputerLab loT Devkit Laboratoires 18 IPAddress ip = WiFi.lecalIP(); Serial.print ("IP address: "); Serial.printin(ip) ; Serial printIn("WiFi setup ok" delay (1000); ‘ThingSpeak begin (client); // connexion (TCP) du client au serveur delay (1000); Serial.print1n("ThingSpeak begin"); > Pour simplifer 'exemple dans la fonction de la boucle principale leop() nous allons envoyer les données d'un ccompteur. int tout=20000; // en millisecondes float luminosity=100.0, temperature=10.0; void leop() { ‘ThingSpeak. setField(1, luminosity) ; ThingSpeak. sotField(2, temperature); // préparation du fieldl while (WiFi.status() != WL_CONNECTED) { delay (500) ;Serial.print(".") ; , ‘ThingSpeak. writerields (myChannelNunber, myWriteaPIKey) ; luninosity++; temperatures delay (tout) ; , Attention : pour le serveur ThingSpeak.. com la valeur minimale de tout est 20 secondes. SmartComputerLab loT Devkit Laboratoires 19 2.2.1 Accés WiFi -— votre Phone (PhoneAP) ou un routeur WiFi-4G La connexion WiFi nécessite la cisponibilté d'un point d'acces. Un tel point acces peut étre cr8é par votre ‘smartphone avec uno application Hot Spct mabile ou un routour dédié type B315 de Huawol loT Devkitt yt etDevktet lorpevkes Figure 2.1. ThingSpeak : 'afichage des données onvoyées sur lo sorveur typo ThingSpeak A faire 1. Créer un canal ThingSpeak puis récupérer les paramétres du canal : number et write key. 2. Intégrer l'utilisation des capteurs de Température/Humidité et de la Luminosité. Envoyer ces données cycliquement (par exemple toutes les 30 seconde) vers le serveur ThingSpeak. ‘SmartComputerLab loT Devkit Laboratoires 20 2.3 Mode WiFi — STA, avec une connexion a eduroam La carte ESP32 permet également d’établir un lien de communication WiFi avec un point d'acoés type ‘eduroam (enterprise AP). Ci-dessous le code Arduino permettant d effectuer une telle connexion. Comme dans I'exempla précédent le programme communique avec un serveur ThingSpeak. #include "ThingSpeak.h" #include "esp_vpa?-h" #include #define EAP_IDENTITY "bakowski-p(univ-nantes.fr" //eduroam login --> ident ity@youruniversity domain fdefine EAP_PASSWORD "..." //your password String line; //variable for response const char* ssid = "eduroam"; // Eduroam SSID WiFiclient client; unsigned long myChanneltumber = 1234; // no de votre canal ThingSpeak const char * myWriteAPIKey = "9KLCLDSXJUGKHROG"; // code d’ ecriture float temperature=0.0,humidity=0 .0, tem, hum; void setup() { Serial .begin (9600) ; delay (10) ;Serial.printia(); Serial .print ("Connecting to network: ") Serial .printin(ssid) ; WiFi disconnect (true); //disconnect form wifi to set new wifi connection WiFi mode (WIFI_STA) ; esp_wifi_sta_wpa2_ent_set_identity((wint8_t *)EAP_IDENTITY, strlen (EAP_IDENTITY)); //provide identity esp_wifi_sta_wpa2_ent_set_username((uint8_t *)EAP_IDENTITY, strlen(EAP_IDENTITY)); //provide username eop_wifi_sta_wpa2_ont_set_pasavord((uint@_t *)EAP_PASSWORD, strlen (EAP_PASSWORD)); //provide password esp_wpa2_config_t config = WPA2_CONFIG_INIT_DEFAULT(); eop_wifi_sta_wpa2_ent_enable (config) ; WiFi.begin (ssid); //connect to Eduroam function WiFi setHostnane ("ESP32Nama"); //set Hostname for your device - not neccesary while (WiFi. status() != WL_CONNECTED) ( delay (500) ; Sorial.print ("2"); > Serial.printin("") ; Serial. printin("WiFi connected"); Serial.printin(*I address set: "); Serial.printin(WiFi.localIP()); //print LAN IP ‘ThingSpeak begin (client) ; » void loop() { delay (5000) ; if (WiFi. status () WiFi. begin (ssid) ; delay (500) ; WE_conmEcTED) { //if we lost connection, retry SmartComputerLab loT Devkit Laboratoires at Serial printIn("Connecting to ThingSpeak.fr or ThingSpeak com"); // modity the ThingSpeak.h file to provide correct URL/IP/port. WiFiClient client; dalay (1000) ; ‘ThingSpeak begin (client) ; delay (1000) ; Serial printIn(*Fields update"); ‘ThingSpeak.setField(1, temperature); ‘ThingSpeak.setField(2, humidity); ‘ThingSpeak.writeFields (myChannelNumber, myWriteAPTKey) ; delay (6000) ; temperature+=0.1; humidity+=0.2; tem =ThingSpeak. readFloatField (myChannelNunber, 1); Serial.print ("Last temperature:") ; Serial. print In(tem) ; delay (6000) ; hum =ThingSpeak . readFloatField (myChanne1Nunber, 2) ; Serial.print ("Last humidity:") ; Serial. print In (hum) ; delay (6000) ; A faire 1. Créer un canal ThingSpeak puis récupérer les paramétres du canal write key. 2. Intégrer l'utilisation des capteurs de Température/Humidité et de la Luminosite. Envoyer ces données cycliquement (par exemple toutes les 30 seconde) vers le serveur ThingSpeak. number et SmartComputerLab loT Devkit Laboratoires 22 2.4 Le programme de réception des données a partir d’un serveur ThingSpeak Le programme ci-dessous permet de récupérer les données envoyées par notre programme précédent (emetteur) Les données sont lues sur le serveur ThingSpeak . fr, dans le canal pré-configuré puis elle sont affichées sur lécran OLED. Le temps réel est lu par le biais du orotocole NTP, dontles données sont portées ppar le proocole UDP. Malheureusement le port numéro 123 de UDP n’est pas (normalement) ouvert sur un lien edur oam. L’afichage donnée simplement la durée de fonctionnement du récepteur. include #include “esp_paz.n* #include "ThingSpeak.h" include include "ouED.h” #include include et_identity((uint@_t *)EAP_ID, strlen (£AP_ID)); et_ueername((uint@_t *)AP_USERNAME, SmartComputerLab loT Devkit Laboratoires 23 > IPAddress ip = WiFi.lecalIP(); Serial.print ("IP Address: ");Serial.printin(ip); Serial.printin("setup ok"); ‘ThingSpeak begin (client) ; display -begin(); timeClient .update() ; string date; char disp[24]; void 100p() ¢ delay (1000) ; Serial.printin("in the loop") ;timeClient .update () ; date=tineClient. getFornattedTime () ;date. toCharArray (disp, 24); mydispstring(1,0,"Channel 2"); temp =ThingSpeak. readFloatField (myChannelNunber, 1) ; Serial.print ("Last temperature: "); Serial.print1n (temp) ; mydispstring(0,1,"Last temperature") ;mydispfloat (0,2, temp) ; delay (5000) ; humi =ThingSpeak. xeadFloatField (myChannelNunber, 2) ; Serial. print ("Last humidity:"); Serial.printin(humi); mydispstring(0,3,"Last humidity") ; mydispfloat (0,4, huni); delay (5000) ; inter =ThingSpeak.readFloatField (myChannelNumber, 3) ; Serial. print ("Last interrupt :"); Serial.printin(humi); mydiepetring(0,5,"Last interrupt"); mydi spf loat (0,6, inter) ;mydispstring (0,7, disp); delay (15000) ; A faire 1. Modifier (simplifier) ce programme pour une utilisation avec un Point d’Accés direct (votre PhoneaP par exemple) 2. Appliquer le code a votre canal du serveur TI speak SmartComputerLab loT Devkit Laboratoires 24 Laboratoire 3 - communication longue distance avec LoRa (Long Range) 3.1 Introduction Dans ce laboratoire nous ellons nous intéresser a la technologie de modulation Long Range essentielle pour la Communication entre les objets. Long Range ou LoRa permet de transmettre les données a la distance d'un Kilometre ou plus avec les débits allant de quolques containes de bits par seconde aux quelques dizaines de kilobits (100bit - 100Kbit, 3.1.1 Modulation LoRa Modulation LoRa a trois paramétres + freq- frequency ou tréquence de la porteuse de 868 4 870 MHz, + s€- spreading factor ou étalement du spectre ou le nombre de madulations par un bit envoyé (64-4096 ‘exprimé en puissances de 2-7 4 12) + sb signal bandwicth ou bande passante du signal (81250 Hz a S00KHz) Par défaut on utlise: freq=868MHz, sf=7, ct sb=125KHz Notre carte Heltec Wifi Lora 32 intégre un modem LoRa. Ilest connecté avec le SoC ESP32 parle biais d'un bus SPI. La paramétrisation du modem LoRa est facilté oar la bibliothéque LoRa.h a inclure dans vos programmes, #include 3.1.1.1 Fréquence LoRa en France LoRa. setPrequency (86886) ; fini la fréquence du modem sur 868 MHz 3.1.1.2 Facteur d’étalement en puissance de 2 Le facteur d’étalement (s) pour la modulation LoRa varie de 27 4212 Il indique combien de chirps sont utils pour transporter un bit d'information. LoRa. eet SpreadingPactor (8) ; fini le facteur d’talement a 10 ou 1024 signaux par bit. 3.1.1.3 Bande passante La largeur de bande de signal (sb) pourla moduiation LoRa varie de 31,25 kHz A 500 kHz (31,25, 62,5, 125,0, 250,0, 500.0}. Plus la bande passante du signal est élevée, plus le débit est lave. ToRa.setSignalRandwidth (12583); éfinit la largeur de bande du signal a 125 KHz. SmartComputerLab loT Devkit Laboratoires 25 3.1.2 Paquets LoRa La classe tora est activée avec le constructeur begin () qui prend éventuellement un argument, la fréquence. int begin (longue freq) ; Pour oréer un paquet LoRa, nous commengons par: int beginPacket () ; pour terminer la construction du paquet que nous utlisons ant endpacket (); Los données cont envoyées par los fonctions: virtual size_t write (uint&_t byte); virtual size_t write (const uinté_t * buffer, taille taille! Dans notre cas, nous utlisons fréquernment la deuxiéme fonction avec le tampon contenant 4 données en virgule flottante. La réception en continue des paquets LoRa paut étre effactuse via la méthode pareePacket () Ant parsePacket (); Si le paquet est présent dans le tampon de réception du modem LoRa, cette méthode renvoie une valeur entidro égale & la taille du paquet (charge utile do tramo). Pour re efficacement le paquet du tampon, nous utlisons les methodes oRa.available() ét LoRa.read() Les paquets LoRa sont envoyés comme chaines des octets. Ces chaines doivent porter différents types de données. ‘Afin d'accommoder ces différents formats nous utlisons les union. Par exemple pour formater un paquet avec 4 valeurs un virgule fottante nous définissons une union type union pack « uint®@_t frame[16]; // trames avec octets float data[4}; // 4 valeurs en virgule flottante } sdp ; // paquet d’émission Pour les paquet plus évolués nous avons besoin d'ajouter les en-tétes . Voici un exemple d'une union avec les paquets structurés, union tspack 4 wint ®t frame [48]; struct packet ‘ wint®_t head[4]; wint16_¢ num; wintlé_t tout; float sensor[4]; > pack; } sdf, sbf,rdf,rbf; // data frame and beacon frane SmartComputerLab loT Devkit Laboratoires 26 3.2 Premier exemple — émetteur et récepteur des paquets LoRa Figure 3.1 Un lien LoRa avec un émetteur et un récepteur La partie initiale du code est la méme pour 'émetteur et pour le récepteur. Dans cette partie nous insérons les bibliothéque de connexion parle bus SPI (sPz..) ot de communication avec lo modom LoRa (LoRa.h). Nous proposons les paraméires par défaut pour le lien radio Loa. finclude // include libraries finclude fidefine scK 5 // GPIO5 =~ Sxiz7x's scK define MISO 19 // GPIO19 define MOSI. 27 // GP1027 SX127x's MISO SX127x' 2 MOST define ss 18 // GeI018 -- sxiz7x's cs fdefine RST 14 // GP IOLA ~~ SX127x's RESET define DIO 26 -—// GP1026 =~ SX127x's TRQ(Interrupt Request) define freq 86856 define sf 8 fidefine sb 12523 Nous definissons également le format d'un paquet dans trame LoRa avec 4 champs float pour les données des captaurs. union pack « uint®@_t frame[16]; // trames avec octets float data[4]; // 4 valeurs en virgule flottante } sdp ; // paquet a’ émission Dans la fonction setup () nous initialisons les connexions avec le modem LoRa et les parametres radio. void setup() { Serial .begin (9600) ; PinNode(DI0, INPUT); // signal interrupt SPI. begin (SCK, MISO, MOST, $8) ; LoRa.setPins (SS, RS7,D10) ; af (!LoRa.begin(freq)) { Serial.printin("Starting LoRa failed! while (1); ) ToRa. set SpreadingFactor (sf) ; IoRa. eet SignalBandwidth (sb); » Enfin dans la fonction Loop() nous préparons les données & envoyer dans le paquet LoRa de fagon cyclique , une fois toutes les 2 secondes. float di=12.0, d2=321.54 ; void loop() // 1a boucle de 1’ emetteur ‘SmartComputerLab loT Devkit Laboratoires 27 ‘ Serial.printin ("New Packet") ; LoRa.beginPacket () ; // start packet sdp.data[0]=d1; sdp data[i]=42; LoRa write (sdp. frane, 16) ; LoRaendPacket () ; abet; 24-2; delay (2000) ; > Le programme du récepteur contient les mémes déclarations et la fonction de setup() que le programme de Vémetteur. Le code ci dessous illustre seulement la partie différente. float di, a2; int i=0; void leop() // 1a boucie de 1’ enetteur ‘ int packetLen; joRa .parsePacket (); while (LoRa.available()) { rdp. frame[i]=LoRa read (); i++; > ‘dp .data[0];d2=rdp .data[1]; Ra packatRssi(); // force du signal en réception en dB Serial.printin(d1); Serial.print1n(d2) ; Serial.printIn(rssi) ; 3 A faire 1. Tester le code ci-dessus et analyser la force du signal en réception. Par exemple -60 dB signifie que le signal recu est 10° plus faible que le signal d’émission. 2. Modifier les parametres LoRa par exemple freq=869E6, sf=10, sb=250E3 et tester le résultats de transmission. 3. Afficher les données recues sur l’écran OLED SmartComputerLab loT Devkit Laboratoires 28 3.3 onReceive () — récepteur des paquets LoRa avec une interruption Les interruptions permettent de ne pas exéculer en boucle l'opération d'altente d'une nouvelle trame dans le tampon du récepteur. Une fonction-tache séparée est réveillée automatiquement aprés l'arrivée d'une nouvelle trame. Cette fonction, souvent appelée onReceive() doit étre marquée dans le setup () par: void setup() « PinMode (D10, INPUT) ; J/ pour activer le pin d!interruption oka. onReceive (onkeceive); // pour indiquer 1a fonction ISK LoRa.receive(); // pour activer l'interruption (une fois) > La fonetion ISR (interruption Service Routine) ci-dessous permet de capter une nouvelle trame. void onReceive (int packetSize) ‘ int i=0,rssi=0; wint8_t rdbuf# (24), rbbuf£(8]; Af (packetsize==24) ‘ while (LoRa-available()) { rdbuff[1]=toRa.read() j++; > LoRa .packetReei (); // affichage des données récues y > void loop () 4 Serial.printIn("in the loop") delay (5000) ; > A faire 1. Tester le code ci-dessus. 2. Afficher les données recues sur I'écran OLED 3. Transtérer les données recues dans les variables externes (probleme?). SmartComputerLab loT Devkit Laboratoires 29 Laboratoire 4 - Développement d'une simple passerelle loT Dans ce laboratoire nous allons développer une architecture intégrant plusieurs dispositifs essentials pour la création d'un systeme loT complet. Le dispositifs central sera la passerelle (gateway) entre les liens LoRa et la ‘communication par WiFI. 4.1 Passerelle LoRa-ThingSpeak La passerelle permettra de retransmettre les données recues sur un lien LoRa et da les envoyer par sur une connexion WiFi vers le serveur ThingSpeak.com ou ThingSpeak. fr. To ey LoRaTs Thing Speak S$mi-- me" Figure 4.1 Une simple architecture IoT avec un terminal & 2 capteurs et une passerelle LoRa-WiFi 4.1.1 Le principe de fonctionnement La passerelie attend les messages LoRa envoyés dans le format LoRaTS sur une interruption /O redirigée vers la fonction (ISR) onReceive () Elle les stocke dans une file de messages (queue) en garcant seulement le demier massage. La tache principale, dans la boucle leap() récupare ce message dans la fle par la fonction non destructive xQueuePeek () puis 'envoie sur le serveur Thingspeak com. Le message en format LoRaTS est transformé en un ou plusieurs fonctions ‘ThingSpeak. setField(fn, value) ; et la fonction ‘ThingSpeak.writeFields (myChannelNumber, myWriteAPIKey); Code Arduino Gi-dessous nous présentons les éléments du code de la passerelle. Les messages LoRa sont envoyés dans un format simpiine de LoRaTS. union tspack q uint8_t frame[40]; // ou [72] struct pack ‘ uint8_t head[4]; wint16_t num; uint1é_t tout; float sensor[4]; > rp; ) ef; Dans 'en-téte head[ 4] nous indiquons : head[0] - adresse de destination, 0x00 - passorelie, Ox ££ -difusion head[1] ~ adresse de source head[2] -type cu message - par exemple le masque 0xC0 signifie #ie1dt ot field? hhead[3] ~ longueur de la donnée - par exemple 0x10 ou 0x20 Queuetiandle_t dqueue; // queues for data frames ‘SmartComputerLab loT Devkit Laboratoires 30 déclaror au début du code dqueue = xQueuecreate(4, 24); // queue for 4 Lokars data frames Ainitiaiser dane lo eotup() void onkeceive (int packetSize) ‘ int 0; uinte_e rdbutt (24); if (packetSize==24) 4 while (LORa.available()) { xdbuf f [i]=LoRa.read() ;i++; + xQueueReset (dqueue); // to keep only the last element: xQueueSend(dqueue, rdbuff, portMAX_DELAY) ; , detay (200) ; > La fonction de la tache en 1o0p() loop () ¢ xQueueReceive(dqueue, rdf. frame, 6000); // timeout-6s, default :portMAX_DELAY Af (xd£.pack.head[1]==0x01 || xdf.pack.head[1]==0x02) // terminal number « ThingSpeak.setField(1,

You might also like