Sommaire
Développer sur ESP8266 en Lua avec NodeMCU
Développer des applications natives sur ESP peut être assez compliqué pour celui qui ne connait pas le développement bas niveau !
NodeMCU a eu l’idée de créer un firmware ESP8266 embarquant eLua, un interpréteur Lua très minimaliste pour système embarqué. Grace à ce firmware vous pouvez développer des programmes pour votre ESP très facilement en Lua.
Concrètement il faut commencer par flasher votre ESP avec le firmware NodeMCU en utilisant un outil comme ESP Flash Download (voir ici). Vous pouvez télécharger le firmware directement sur le GitHub de NodeMCU ou bien sur http://nodemcu-build.com/ pour compiler son firmware à la demande en personnalisant différentes options (branche à compiler, modules à inclure, support ou non du SSL, activation du mode debug, etc..).
Une fois installé utilisez l’outil Esplorer, une application Java (compatible Linux/Windows et Mac OS) pour éditer les scripts Lua directement depuis le système de fichier de votre ESP.
A gauche vous retrouverez l’éditeur, à droite la sortie de votre ESP. Chaque fichier est enregistré dans le système de fichier de votre ESP avant d’être exécuté.
Par exemple pour se connecter au Wifi :
1 2 3 4 5 6 7 8 9 10 11 12 13 |
print("Démarrage") wifi.setmode(wifi.STATION) print("set mode=STATION (mode="..wifi.getmode()..")") wifi.sta.config{ssid="MON RESEAU WIFI", pwd="Ma clé Wifi"} tmr.alarm(0, 1000, 1, function() if wifi.sta.getip() == nil then print("Connecting to AP...") else print("Connected! IP: ",wifi.sta.getip()) tmr.stop(0) end end) |
On commence par définir le mode Wifi à Station (client) puis on se connecte en spécifiant le SSID et la clé Wifi. Ensuite on lance une tache qu’on exécute sur le timer « 0 » (vous pouvez aller de 0 à 6), à une seconde d’intervalle (1000ms) de façon répétitive afin de récupérer l’IP. Si la connexion n’est pas encore effective on affiche le message « Connecting » sinon on coupe le timer « 0 » et on affiche l’adresse IP de votre ESP.
Pour plus d’information je vous invite à lire ou relire cet article : http://sebastien.warin.fr/2016/07/12/4138-decouverte-des-esp8266-le-microcontroleur-connecte-par-wifi-pour-2-au-potentiel-phenomenal-avec-constellation/
Connexion à Constellation
Commencez tout d’abord par télécharger la librairie “Constellation pour NodeMCU” et transférez les fichiers du fichier ZIP sur votre ESP avec Esplorer.
Créez ensuite un script Lua en incluant cette librairie afin d’initialiser le client Constellation avec l’adresse du serveur, votre Sentinelle & package virtuel ainsi que la clé d’accès :
1 2 |
local constellation = require("constellation") constellation.init("constellation.monserveur.com", 8088, "MyVirtualSentinel", "MyVirtualPackage", "123456789") |
Fonctionnalités de base
Vous pouvez écrire dans les logs Constellation grâce à la méthode “writeLog”. Par exemple :
1 |
constellation.writeLog("Je suis pret avec " .. node.heap()) |
Par défaut les logs sont envoyés comme “Information”, mais vous pouvez spécifier “Warn” ou “Error” dans le 2ème arguments de cette méthode :
1 2 |
constellation.writeLog("Ceci est un warning", "Warn") constellation.writeLog("Ceci est une erreur", "Error") |
Vous pouvez également récupérer les settings de votre package virtuel du serveur Constellation avec la méthode “getSettings” :
1 2 3 4 5 6 |
constellation.getSettings(function(messages) print("Settings received :") for k,v in pairs(messages) do print(" -> " .. k .. " = " .. v) end end) |
Publier des StateObjects
Pour publier un StateObject, vous disposez de la méthode “push” prenant en paramètre le nom et la valeur. Dans la version 1.0 le “lifetime”, “type” ou les “métadatas” ne sont pas supportés.
Vous pouvez publier soit des types simples, par exemple :
1 |
constellation.push("Lux", math.floor(lux)) |
Soit des types complexes, c’est à dire des objets formatés en JSON. Vous pouvez formater vous même vos objets par concaténation :
1 |
constellation.push("Lux", "{ Broadband:" .. broadband .. ", IR:" .. ir .. ", Lux:" .. math.floor(lux) .. "}") |
Ou bien via le module Lua “cjson” :
1 |
constellation.push("Lux", cjson.encode({ Broadband=broadband, IR=ir, Lux= math.floor(lux) })) |
Recevoir des messages
Vous pouvez également recevoir des messages sur votre ESP8266 en enregistrant une fonction “callback” qui sera invoquée à chaque message reçu.
Par exemple :
1 2 3 4 5 6 |
constellation.subscribeToMessage(function(message) print(message["Sender"]["FriendlyName"], message["Key"], message["Data"][2]) if message["Key"] == "Restart" then node.restart() end end) |
Dans cette première version de la librairie la description des messages callback (Package Descriptor) n’est pas supportée.
Démarrez la discussion sur le forum Constellation