Comment utiliser l’API Openweather map avec l’ESP8266

La semaine dernière je vous ai montré comment utilisé le service IFTTT sur un ESP8266. Nous avons vue dans cet article les bases pour utiliser un API, mais qui ne retourne pas de réponse. Si tu ne l’a pas encore vue, je t’invite à jeter un coup d’œil ça pourrais t’aider à mieux appréhender les concepts que je vais développer dans celui-ci.

INTRODUCTION

Cette semaine nous allons donc voir comment utilisé une API météo sur notre carte ESP8266. Contrairement au service IFTTT, Openweathermap (le service que nous allons utiliser) n’agit pas seulement comme un serveur ou l’on envoie des données qui ne reviennent jamais, mais aussi comme un client.

Le principe est le suivant : nous interrogeons la base de données d’Open par le biais de l’API sur tel ou tel sujet. Celle-ci nous retourne par la suite les données que nous lui avons demandées.

Mais où se trouve la difficulté ?

Il faut savoir que le serveur d’Open comme la grande majorité des API fournit une réponse en JSON (un dérivé du JavaScript pour simplifier). Cette réponse devra être modifiée pour être compatible avec le C (langage de l’arduino) et traitée selon les données que l’on souhaite récupérer. Et à vrai dire, le C n’est pas un langage qui simplifie la conversion de donnée, au contraire…

Le but final de cet article va être de réaliser un indicateur LED qui les allumera indépendamment selon la météo extérieure. C’est un gadget certes, mais il démontre bien le panel de possibilités qu’offre l’ESP8266 combinées avec l’API d’Openweathermap.

Cet indicateur allumera une LED verte s’il fait beau, une LED orange s’il y a des nuages, une LED rouge s’il pleut et deux LED rouges s’il y a des orages.

Conception du circuit 

Le système à concevoir est relativement simple. En effet cet article n’est pas un projet, mais une démonstration ayant pour but le test des possibilités qu’offre l’API d’Openweathermap.

Il te faudra un jeu de 5 LED, 1 verte, 1 orange, 3 rouges pour ma part. Il te faudra bien évidemment un ESP8266. J’ai décidé de prendre une Wemos D1 mini (elle a beaucoup de sorties disponibles pour le jeu de LED).

J’allais oublier ! Si tu en as, tu peux aussi mettre des résistances, c’est mieux. Un jeu de 5 résistances de 1OkΩ par exemple.

J’ai réalisé ce montage sur une plaque d’essai selon le schéma suivant :

Pour vérifier si le montage fonctionne correctement j’ai rapidement chargé un programme Blink dans l’ESP !

Et voilà ! C’est tout pour la partie circuit, plutôt rapide il faut l’avouer.

Conception du programme – Initialisation

Passons à la partie plus compliquée de ce tutoriel, à savoir le programme.

Pour se connecter à l’API, il faudra. Dans un premier temps, que ton ESP8266 soit connecté au WIFI ! Puis afin de pouvoir communiquer avec Openweathermap, il faudra que tu puisses envoyer une requête HTTP. Pour cela il faudra aussi définir des paramètres de connexion à Open.

Ce programme devra traiter à un moment donné du code JSON (comme j’ai expliqué ci-dessus). Pour ce faire, une librairie existe ! Voici le lien pour la télécharger.

Voici aussi le lien de sa documentation. Elle m’a beaucoup servi pour pouvoir utiliser correctement les objets JSON que je vais t’apprendre à manipuler par-là suite.

Ensuite il faut définir les paramètres de connexion du WIFI et d’Open. Comme pour IFTTT n’oublie pas renseigner ta clé d’API que tu retrouveras dans la section https://home.openweathermap.org/api_keys une fois ton inscription faite.

Il y a différents moyens d’utiliser Openweathermap. Dans mon cas je l’utiliserai en tant que ‘current weather data’ en renseignant seulement le nom de la ville dans laquelle je souhaite recevoir les données.

Voilà pour la première partie. Pour résumer, il faut déterminer les paramètres de connexion au WIFI et à l’API. Sans oublier les broches des LEDs (que j’ai personnellement mis dans un tableau).

Pour la fonction setup(), je passe les deux blocs de code concernant la connexion au WIFI ainsi que la connexion à l’hôte (on l’a vue dans l’article précédent).

Si le client est connecté au service, c’est là que les choses sérieuses commencent.

Conception du programme – Gestion des données

Dans un premier temps il faut envoyer la requête HTTP au service d’Openweathermap. La méthode est très similaire à celle sur le service IFTTT, avec la notion d’entête notamment.

A noter

Cette fois-ci on construit notre URL en renseignant la ville et l’API. Il faut bien penser à retirer l’hôte (étant donné qu’on y est déjà connecté).

Une fois la requête envoyée il faut s’occuper de la réponse à traiter ! Et là on rentre vraiment dans la partie compliquée.

Comme d’habitude on vérifie dans un premier temps si la réponse reçue est belle et bien valide. On passe ensuite à la mise en forme de celle-ci.

En effet la réponse que l’on reçoit est en JSON… Il faut donc transcrire se code JSON en code compréhensible par le langage C. Afin de réaliser cet exploit la librairie ArduinoJSON offre quelques fonctions bien pratiques.

Sans rentrer dans les détails, la philosophie est la suivante : on définit une taille de buffer adéquat pour pouvoir transformer cette réponse en simple tableau utilisable en C.

Pour définir la taille du buffer, le site de la libraire dispose d’une section d’assistance permettant de faire la traduction (voici le lien )

On créer ensuite le buffer qu’on applique enfin à l’objet pour créer le tableau en C et le tour est joué:

Maintenant il ne te reste plus qu’à récupérer les données qui t’intéressent ! N’hésite pas à t’aider avec la structure des données JSON retrouvable en allant sur le lien de ta requête ! Moi je décide de récupérer la température, la météo extérieure ainsi que l’ID météo (j’en reparle juste après).

J’affiche ces données sur le port série. Voici ce que ça me donne quand le paramètre ‘city’ c’est la ville Paris par exemple :

Pour finir, on va utiliser les LED afin d’indiquer à l’utilisateur la météo extérieure. C’est dans cette ultime partie que nous utiliserons l’ID précédemment récupéré.

En effet, l’ID permet de définir le type de météo en temps réel. Le site d’Open répertorie tous ces états possibles en fonction des IDs allant de 200 à 8xx.

EX : s’il fait beau l’ID sera de 800, si l’ID est entre 200 et 300 alors il y a de l’orage, ect…

A noter

Il existe un bon nombre d’ID différent qui correspond tout à un état météorologique. Mais pour simplifier l’affichage LED, j’ai simplement pris les états de bases.

J’ai juste comparé l’ID avec ces valeurs remarquables pour allumer telle ou telle LED en fonction de la météo. J’ai pris 3 exemples de cas pour illustrer mes propos.

À Gap: Le temps est nuageux -> sur le port COM on à la température, la description précise de la météo et l’ID qui correspond. En adéquation avec ces informations, c’est la LED orange qui s’allume.

Au burkina à Ouagadougou : Il fait beau -> sur le port COM on à la température, la description précise de la météo et l’ID qui correspond.  En adéquation avec ces informations, c’est la LED verte qui s’allume.

Dans la ville de Les pieux (ville en Normandie) : Il pleut -> sur le port COM on à la température, la description précise de la météo et l’ID qui correspond.  C’est donc la LED rouge qui s’allume.

Voilà qui est fait ! J’ai maintenant une station météo fonctionnelle et mondiale, et ça, sans même dépenser un seul euro dans des capteurs ! Elle n’est pas belle la vie ?

C’est tout pour cette introduction à l’utilisation d’API sur l’ESP8266. Ce qu’il faut bien comprendre c’est la mise en forme du JSON qui n’est pas évident ! Ensuite c’est du gâteau !

Voici le code source du tuto : CODE

Reçois 1 un petit guide de réalisation DIY par semaine!

+

Du contenu bonus offert à chaque nouvel article!