Comment mener son premier projet IoT ESP-8266 sur Linux
Il existe déjà plusieurs millions d’objets connectés sur le marché, alors pourquoi pas y ajouter le vôtre ? Dans cet tutoriel, nous verrons comment réaliser votre premier objet connecté sous Linux avec un ESP-8266. Nous vous guiderons dans l’achat de vos premiers composants électroniques ainsi que dans la programmation de l’ESP. L’objectif étant de réaliser un petit capteur de température connecté.
Le matériel dont vous aurez besoin
Les différents montages proposés ici se basent sur l’utilisation d’un ESP-8266. C’est un micro-contrôleur, compatible Arduino, qui intègre un module WIFI.
Vous aurez besoin :
- du Starter Kit HUZZAH de chez AdaFruit (environ 37€), qui contient une carte Huzzah ainsi qu’un ensemble de composants électroniques pour réaliser vos premiers montages. Idéal pour commencer.
ou bien
- d’une carte HUZZAH seule (environ 15€), moins chère si vous disposez déjà de quelques composants électroniques.
Vous aurez aussi besoin:
- d’une Breadboard (environ 5€) pour connecter facilement les composants,
- et de quelques fils (environ 5€)
Note: Les guides d’installation/configuration présentés ici ont été testés avec des cartes Huzzah, mais vous pouvez aussi trouver beaucoup d’autres cartes intégrant un ESP8266, avec ou sans programmateur.
Installer l’environnement de travail pour Linux
Installer l’IDE
Platform IO
Lien d’installation : http://platformio.org/platformio-ide#other-platforms
Pour commencer : http://docs.platformio.org/en/stable/ide/atom.html#installation
C-Lang
Utilisez votre gestionnaire de packets préféré pour installer clang. apt-get install clang or yum install clang.
Installation du compilateur pour Huzzah
La dernière étape de l’installation consiste à créer un projet dans platformIO en selectionnant la carte Huzzah d’AdaFruit pour qu’il télécharge automatiquement le compilateur et ses dépendances.
Choisir New project:
Puis choisir Huzzah dans AdaFruit:
Et valider.
Note: Le téléchargement peut prendre plusieurs minutes.
Premiers pas avec l’ESP8266 sous Linux
Connecter le micro contrôleur
Connectez le micro contrôleur (MC) à votre ordinateur
Appliquer les permissions de lecture et d’écriture pour tout le monde sur le MC
- Pour savoir quel est le port USB utilisé, cliquez sur le bouton Serial Monitor, sur le panneau latéral gauche, troisième en partant du bas
- Si vous avez plusieurs périphériques USB connectés, vous pouvez trouver le MC en le branchant/débranchant, et en vérifiant lequel est parti de la liste entre temps
- Allez dans le répertoire /dev et changez les permissions
- Ctrl + Alt + T (Ouvrir le terminal)
- sudo chmod 666 /dev/ttyUSBX (Pour changer les permissions : rw-rw-rw, où X est le numéro de port utilisé)
- N.B. Vous devez effectuer cette commande à chaque fois que vous rebranchez votre MC
Maintenant vous pouvez téléverser (upload) votre projet !
Première application
Sur la page principale de l’IDE platformIO, créer un nouveau projet (New Project
).
Sélectionner le board Adafruit HUZZAH ESP8266
, choisir un emplacement pour le projet et cliquer sur Process
. Cela peut prendre du temps au premier lancement, car l’IDE a besoin de télécharger des drivers pour le board.
Connecter le board
1) Dans le dossier src
, créer une nouvelle application vide dans Main.cpp
:
/*
* Empty project
*/
#include "Arduino.h"
void setup() {}
void loop() {}
2) Connecter le board Adafruit en USB.
3) Compiler le projet:
4) Uploader le projet sur le board:
Le projet est maintenant exécuté sur le board!
Recevoir des données du board
Cette étape est réalisée en recevant les données du port série du board (~ terminal du board).
- Ouvrir le moniteur série:
- Configurer le port série:
Il faut choisir le bon port et le bon baud rate
. Pour cette application, nous pouvons rester sur 9600 baud. Cliquer sur Start
pour vérifier que vous êtes bien connecté au board.
Si aucune erreur n’est apparue, l’installation est fonctionnelle est vous êtes prêt à programmer!
Mon premier montage: Une LED clignotante
Objectifs
- Faire un premier montage sur la breadboard
- Découvrir la programmation d’un arduino
À savoir
L’ESP8266 peut être programmé de la même manière qu’un arduino, c’est ce que nous allons faire ici avec un premier programme basique. La documentation liée à arduino étant très importante sur Internet, il est généralement très facile de trouver des codes d’exemple pour la majorité des montages simple.
Concrètement, un programme arduino est un programme en C/C++ qui importe « Arduino.h » et qui se compose de deux fonctions:
- setup() qui sera exécutée une fois au démarrage du micro-contrôleur. C’est-à-dire, lors de sa mise sous tention ou d’un reset.
- loop() qui sera appelée en boucle une fois la fonction setup() terminée.
L’ESP8266 dispose de plusieurs entrée/sorties (aussi appelées GPIO) numérotées que l’on va pouvoir programmer. Les fonctions utiles:
- pinMode( pin-number, OUTPUT ) permet d’indiquer que l’on souhaite utiliser ce port en sortie. En général on utilise cette fonction dans le setup().
- digitalWrite( pin-number, HIGH/LOW) permet d’indiquer si on souhaite avoir un niveau logique haut (+3V) ou bas (0V) sur la sortie correspondante.
Le montage
Une led et sa résistance, branchées sur la sortie 16.
Le code
#include "Arduino.h"
#define LED_PIN 16
void setup() {
// initialize LED digital pin as an output.
pinMode(LED_PIN, OUTPUT);
}
void loop() {
// turn the LED on (HIGH is the voltage level)
digitalWrite(LED_PIN, HIGH);
// wait for a second
delay(1000);
// turn the LED off by making the voltage LOW
digitalWrite(LED_PIN, LOW);
// wait for a second
delay(1000);
}
Les erreurs à éviter
Erreur de polarité: La LED ne s’allume pas
Une LED a un sens, sa borne + (cathode) est la plus longue des deux pattes. Une LED branchée à l’envers ne s’allume pas (mais n’est pas endommagée), vous pouvez essayer de la retourner.
Debug / Utilisation de la liaison Serie
La liaison série nous permet d’avoir un moyen simple de dialoguer avec le micro-contrôleur: pour recevoir de l’information (par exemple la valeur lue par un capteur), envoyer de l’information ou simplement pour essayer de débugger notre programme.
À savoir
Le module ESP8266 dispose de deux connections TX et RX correspondant à la liaison série et qui peuvent être utilisées pour communiquer avec un autre micro-contrôleur. Mais la liaison série est aussi accessible via le port USB, c’est ce que nous utiliserons ici.
La liaison série est également utilisée pour uploader le programme sur le micro-contrôleur, il est donc parfaitement normal que la console de platformIO se ferme automatiquement pendant l’upload.
Le code
#include "Arduino.h"
int i=0;
setup() {
Serial.begin(115200);
Serial.println("Program start");
}
loop() {
Serial.print("Hello world. Uptime :");
Serial.print(++i);
Serial.println(" seconds.");
delay(1000);
}
La console dans platformIO
Vous pouvez ouvrir la console dans platformIO en utilisant le bouton en forme de cordon électrique dans le menu de gauche. Puis en choisissant le port et le débit dans la popup.
Le débit doit correspondre à la valeur choisie dans l’appel Serial.begin(), tous les exemples de cet atelier seront en 115200 baud.
Les erreurs à éviter
Choisir un mauvais débit
Si la console affiche des caractères étranges, c’est probablement une erreur dans la configuration du débit. Vérifiez le débit configuré lors du Serial.begin() et ajustez la configuration dans platformIO.
Saturation de la liaison série
Lorsqu’on écrit sur la liaison série avec Serial.print(), on écrit dans un buffer qui sera envoyé progressivement vers l’ordinateur. Mais ce buffer n’est pas infini et si vous écrivez trop, ou trop vite, vous risquez d’avoir des comportements bizarres sur votre console. Cela arrive fréquement lorsqu’on oublie de mettre un delay() dans la méthode loop().
Utilisation d’une librairie externe pour un composant évolué
Nous allons maintenant voir comment utiliser une librairie externe pour accéder simplement à des composants évolués, comme une sonde de température et humidité.
À savoir
- À la création d’un projet sous PlatformIO, un dossier
lib
contenant un fichierreadme.txt
est aussi créé!
Ajouter une librairie
Pour le projet de capteur de température, il suffit de récupérer la librairie DHT22 sur github. Le projet doit impérativement être structuré de la façon suivante:
project (temperature_sensor)
|_ lib
|_ <library_name> (DHT)
|_ src
|_ <library_name>.c (DHT.c)
|_ <library_name>.h (DHT.h)
|_ src
|_ ... (Temperature.cpp)
Il suffit ensuite d’inclure le fichier .h dans le code source du projet (Temperature.cpp):
// #include <<library_name>.h>
#include <DHT.h>
Le montage
Le code
// Le type du capteur
#define DHTTYPE DHT22
// Le port dédié à la sonde de température sur le board
#define DHTPIN 5
// Initialisation du capteur
DHT dht(DHTPIN, DHTTYPE);
void setup() {
dht.begin();
}
void loop() {
// Récupérer les valeurs du capteur
float h = dht.readHumidity();
float t = dht.readTemperature();
// Vérifier si les données sont valides
if (isnan(h) || isnan(t)) {
return;
}
// Afficher le résultat
Serial.println(h);
Serial.println(t);
}
L’utilisation
Le code final transmet les données captées par le composant sur le réseau via une page HTTP. Après avoir modifié le SSID et le PASSWORD avec des paramètres wifi valides, il suffit de compiler et d’uploader le code sur le board. Au lancement, le code affiche l’IP du device sur la console série (attention au baudrate!), en tapant cet IP sur un navigateur (ou en utilisant cURL), nous sommes en mesure de récupérer les informations de température et d’humidité.
Publier les information sur ThingSpeak
A savoir
Thingspeak est une plateforme libre de partage de données, qui permet de collecter, afficher, analyser et automatiser des actions. Pour communiquer avec Thingspeak nous allons envoyer des informations grâce à l’API de Thingspeak.
- Créez un compte sur Thingspeak.
- Créez un nouveau
channel
, remplissez le nom et laissez les autres valeurs par défaut.
Vous pourrez alors retrouver votre token d’API et ainsi commencer à utiliser Thingspeak.
Le montage
Un capteur de température et deux LEDs.
Le code
#define SERV "api.thingspeak.com"
#define SSID "<SSID>"
#define PASSWORD "<password>"
void SendHttpGet(WiFiClient client, String url, const char* host)
{
Serial.println("attempting connection to host: "+ String(host));
const int httpPort = 80;
if (!client.connect(host, httpPort)) {
Serial.println("connection failed");
return;
}
client.print(String("GET ") + url + " HTTP/1.1\r\n" +
"Host: " + host + "\r\n" +
"Connection: close\r\n\r\n");
while(client.available()) {
String line = client.readStringUntil('\r');
Serial.print(line);
}
Serial.println();
Serial.println("closing connection");
}
Les erreurs à éviter
Erreur pas de connection wifi: Sur le terminal série je reçois des . (points)
Vérifier votre code lignes 15 et 16, le nom du réseau wifi et sont mot de passe.
Erreur sur l’API: les données ne se mettent pas à jour sur le site
Vérifier votre code ligne 18 (l’API-KEY) qui permet d’être authentifié sur le site.
Ce projet peut aussi être mené en environnement Windows ou Mac :
Pour découvrir d’autres montages : bouton-poussoir, servo-moteur, télécommande…