Rappel :
La planche à pain utilisée pour le TP comporte :
- un switch à 2 positions,
- une LED,
- un capteur de température, humidité, pression (type BME280)
- un capteur d'obstacle basé sur les ultrason (type HCSR04)
- un afficheur 4 digits (type TM1637)
Le câblage est le suivant (avec le µC placé à droite de la planche) :
- LED -> pin 5 du µC
- Switch
- pin gauche -> rangée - du haut de la planche
- pin central -> pin 27 du µC
- pin droite -> rangée + du bas de la planche
- TM1637 (du haut vers le bas, quand l'afficheur est à gauche de la planche) :
- pin CLK -> pin 32 du µC
- pin DIO -> pin 33 du µC
- pin VCC -> rangée + du bas de la planche
- pin GND -> rangée - du haut de la planche
- HCSR04 (de la gauche vers la droite, quand le capteur est en haut de la panche)
- pin GND -> rangée - du haut de la planche
- pin ECHO -> pin 19 du µC
- pin TRIGGER -> pin 22 du µC
- pin VCC -> rangée + du bas de la planche
- BME280 (de la gauche vers la droite, quand le capteur est en haut de la planche)
- pin VCC -> rangée + du bas de la planche
- pin GND -> rangée - du haut de la planche
- pin SCL -> pin 23 du µC
- pin SDA -> pin 18 du µC
- pin CSB -> rangée + du bas de la planche
- pin SDO -> rangée - du haut de la planche
Les sources du serveur utilisé pour les exercices suivants sont téléchargeable [ ici ]
NB : l'archive contient un projet IDEA. Il faut donc modifier la configuration d'exécution pour l'adapter à votre configuration machine (par ex, home directory, port utilisé, ...)
Exercice 1 : capteur température/humidité/pression avec chipset bme280
Pour utiliser ce chipset, il faut utiliser une bibliothèque tierce fonctionnant avec l'esp32. Or, si vous tapez bme280 dans le gestionnaire de bibliothèque, la liste est assez longue. Pour avoir une bibliothèque compatible esp, installez celle de Tyler Glenn.
Dans le répertoire des exemples d'utilisation de cette bibliothèque ( .../sketchbook/libraries/BME280/examples), il y a plusieurs démonstrations selon la façon de communiquer avec le chipset. En effet, le BME280 peut communiquer selon 2 protocoles : I2C et SPI (cf. cours pour les explications sur ces 2 protocoles). Pour la planche utilisée dans le TP, le bme280 est branché pour être utilisé en mode I2C, avec comme adresse 0x76
Pour tester le chipset :
- Lancez arduino et créez un nouveau sketch (menu "Fichier" -> "Nouveau") nommé par exemple esp32_bme280
- copier/coller le code d'exemple se trouvant dans BME_280_I2C_Test.ino
- uploader.
Malheureusement, le moniteur affiche en boucle :
Could not find BME280 sensor!
Could not find BME280 sensor!
Visiblement, le µC n'arrive pas à communiquer avec le chipset. C'est tout à fait normal puisque ce dernier est branché sur les GPIO 18 (pour SDA) et 23 (pour SCL), et strictement rien dans le sketch n'indique qu'il faut utiliser ces pins précises. Le sketch doit donc utiliser des valeurs par défaut pour ces pins, qui ne sont pas valides pour la planche à pain du TP.
Il faut donc modifier le script pour pouvoir utiliser ces pins. Pour ce faire, il suffit d'initialiser le protocole I2C grâce à l'objet Wire, en utilisant les pins 18 et 23.
Indice : allez voir la documentation de l'I2C pour esp32 : https://espressif-docs.readthedocs-hosted.com/projects/arduino-esp32/en/latest/api/i2c.html, notamment la partie concernant l'API en mode master : "I2C Master's API" (puisque le µC est bien le maître du bme280). NB: pas besoin d'initialiser la fréquence de transmission.
Exercice 2 : Wifi + TCP
- Lancez arduino et créez un nouveau sketch (menu "Fichier" -> "Nouveau") nommé par exemple esp32_bme280tcp.
- copiez/collez le sketch de l'exercice précédent.
- ajoutez au script des fonctions permettant :
- de se connecter au point d'accès wifi, avec les paramètres ssid = testingiot et mot de passe = testingiot. Cette fonction doit boucler tant que la connexion n'est pas étblie.
- d'établir une connexion TCP vers le serveur qui tourne sur la machine 192.168.0.2 , sur le port 12345. Lorsque la connexion est établie, le serveur envoie immédiatement une chaîne de caractère représentant l'id du µC, qui devra être renvoyé lors des requêtes.
- d'envoyer une requête vers le serveur (cf. ci-dessous) avec comme paramètres les 3 mesures récupérées sur le BME280
- d'attendre une ligne de texte du serveur
NB : pour toutes ces fonctions, partir de celles données dans le cours Les bases de la programmation arduino avec esp8266
- Dans setup(), appeler la fonction de connexion au Wifi
- Dans loop() :
- appeler la fonction de connexion au serveur TCP, sauf si elle est déjà établie.
- sinon faire l'acquisition des mesures du BME280
- envoyer un requête au serveur au format : 1 id_µC température humidité pression
- recevoir la réponse du serveur et l'afficher. Celle-ci devrait être "OK" si la requête est correcte et sinon "ERR description_erreur"
- attendre 1 seconde.
Exercice 3 : HTTP
L'objectif est d'envoyer les données issues du BME280 à un serveur HTTP.
- lancez arduino et créez un nouveau sketch (menu "Fichier" -> "Nouveau") nommé par exemple esp32_bme280http.
- copiez/collez le sketch de l'exercice 2.
- au lieu d'établir une connexion TCP, le sketch doit envoyer une requête vers le serveur HTTP à l'adresse 192.168.0.2 avec une URL du type :
http://192.168.0.2/storedata.php?temperature=xxx&humidity=yyy&pressure=zzz
- Les valeurs de xxx, yyy, zzz sont celles issues du BME280
- Il faut ensuite recevoir la réponse du serveur et l'afficher.
Conseil : cherchez des exemples d'utilisation du client http sur le net.
Exercice 4 : spiffs + micro-sd + deep-sleep
Les objectifs sont :
- de stocker l'adresse ip et le port de connexion du serveur TCP (donc 192.168.0.2/12345) dans une partition spiffs,
- de stocker toutes les valeurs acquises par le BME280 dans la carte micro-sd,
- de se mettre en deep-sleep de 5 secondes entre deux mesures.
Pour cela, créez un nouveau sketch en partant de la solution de l'exercice 2 que vous modifiez.
A noter que dans setup(), la partition spiffs doit être créée si elle n'existe pas, et dans ce cas, on crée un fichier conf.txt dans lequel on écrit la ligne : 192.168.0.2,12345. En revanche, si elle existe on lit le fichier conf.txt afin de récupérer l'ip et le port de connexion du serveur.
ATTENTION :
- l'accès à la carte SD via sd_mmc ne fonctionnera pas directement en utilisant les exemples fournis avec l'esp32. En effet, sur une ttgo T8 seule les pins 2, 13, 14 et 15 sont réellement connectées au µC. On ne peut donc fonctionner qu'en mode 1-line (cf. documentation pour être dans ce mode : https://github.com/espressif/arduino-esp32/tree/master/libraries/SD_MMC)
- de plus, d'après le schéma électronique de la carte de dev. (https://github.com/LilyGO/TTGO-T8-ESP32/blob/master/t8_v1.7.1.pdf), on remarque que la pin reliée à IO2 N'EST PAS munie d'une résistance dite de pull-up. En effet, elle est marqué NC. Or, la documentation nommé ci-dessus indique qu'il faut OBLIGATOIREMENT avoir une résistance de pull-up pour la sortie D0 de la carte SD, c'est-à-dire celle qui est reliée à IO2. Fort heureusement, l'esp32 contient déjà en interne ce type de résistance sur la plupart de ses GPIOs. Il suffit donc d'initialiser la pin 2 avec pinMode(), en précisant qu'elle est une entrée ET qu'elle doit être "tirée vers le haut" (cf. documentation de pinMode : https://www.arduino.cc/reference/en/language/functions/digital-io/pinmode/ )