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:

Select New Project

Puis choisir Huzzah dans AdaFruit:

Select Huzzah

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.

start project

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:

compile project

4) Uploader le projet sur le board:

send project
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:

open_serial

  • Configurer le port série:

configure_serial

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.

Board

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.

Screenshot1

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 fichier readme.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

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.

Circuit

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 : 

Installation Windows

Installation MacOs

Pour découvrir d’autres montages : bouton-poussoir, servo-moteur, télécommande…

Commentaires :

A lire également sur le sujet :