Vamos a hacer que este dispositivo pueda recibir mensajes a través de mqtt.
Objetivo: Recibir mensajes a través de MQTT con un dispositivo con el microcontrolador ESP8266. El que usaremos es un clon del Wemos D1 mini y lo programaremos en un lenguaje de programación llamado lua.
Seguiremos el siguiente tutorial: http://www.foobarflies.io/a-simple-connected-object-with-nodemcu-and-mqtt/
Para documentación de comandos Lua usaremos: http://nodemcu.readthedocs.io/en/master/
El dispositivo en cuestión es este:
NodeMCU Lua ESP8266 ESP-12 WeMos D1 Mini WIFI 4M Bytes Development Board Module. Comprado por Ebay.
Este cacharrito además de ser muy pequeño lo podemos poner en modo punto de acceso para que otros se conecten a él, o en modo cliente para que se conecte a un router.
Dispositivo comparada con una moneda
Crear el firmware
Para poder utilizar el protocolo mqtt en estos dispositivos tenemos que ir a la página:
En ella rellenaremos los campos para que nos envíen el firmware creado por email. En unos minutos lo tenemos ya en nuestro buzón de correo. Nos generará 2 ficheros. uno es si solo queremos trabajar con números enteros en nuestro dispositivo y otro firmware de mayor tamaño para trabajar con números decimales.
Seleccionamos la rama master ya que la de desarrollo puede darnos problemas.
Seleccionamos los siguientes módulos: (Siempre depende de lo que quieras hacer con el dispositivo. Recuerda que la memoria es limitada):
A continuación le damos a start your build y nos encolará la petición.
Reemplazar el firmware
Ahora tenemos que meter el nuevo firmware dentro del dispositivo.
Debemos tener python instalado en nuestro Linux.
sudo apt-get update; sudo apt-get install python
Nos bajamos un script de python que realiza el flasheo:
wget https://raw.githubusercontent.com/themadinventor/esptool/master/esptool.py
Lo hace,os ejecutable:
chmod +x ./esptool.py
Conectamos el dispositivo al ordenador mediante un cable microusb. Al hacerlo en linux se me creará un archivo de dispositivo nuevo en /dev/
En mi caso es /dev/ttyUSB0
Lo flasheamos con el siguiente comando:
./esptool.py --port /dev/ttyUSB0 write_flash 0x00000 /home/mipc/nodemcu-master-9-modules-float.bin
En mi caso he puesto la ruta y nombre del archivo a flashear completa en verde. Tú debes poner la tuya y el nombre del dispositivo.
Ejecutando ESPlorer
Para descargar ESPlorer lo haremos desde aquí: http://esp8266.ru/esplorer-latest/?f=ESPlorer.zip
Para ejecutar ESPlorer debemos tener instalado Java en nuestro equipo. En mi Linux Mint lo ejecuto así con el botón derecho:
Esta aplicación se puede ejecutar tanto en Linux como en Windows.
Para conectarnos con el dispositivo le damos al botón Open :
Si no conecta probamos con menor velocidad de transmisión:
A mi a veces me tarda en conectar. A veces lo hace a la primera y otras tengo que intentarlo más. Desconectando el dispositivo y volviendo a conectarlo suele funcionar.
El código
He creando una lengüeta por cada archivo que voy a introducir en el dispositivo.
Archivo config.lua
Aquí cambiaremos el nombre de mi router WiFi y la contraseña por la de nuestro router.
-- file : config.lua local module = {} module.SSID = {} module.SSID["WLAN-ROUTER"] = "supercontrasenarouter" module.HOST = "test.mosquitto.org" module.PORT = 1883 module.ID = node.chipid() module.ENDPOINT = "nodemcu/" return module
Archivo setup.lua
-- file: setup.lua local module = {} local function wifi_wait_ip() if wifi.sta.getip()== nil then print("IP unavailable, Waiting...") else tmr.stop(1) print("\n====================================") print("ESP8266 mode is: " .. wifi.getmode()) print("MAC address is: " .. wifi.ap.getmac()) print("IP is "..wifi.sta.getip()) print("====================================") app.start() end end local function wifi_start(list_aps) if list_aps then for key,value in pairs(list_aps) do if config.SSID and config.SSID[key] then wifi.setmode(wifi.STATION); wifi.sta.config(key,config.SSID[key]) wifi.sta.connect() print("Connecting to " .. key .. " ...") --config.SSID = nil -- can save memory tmr.alarm(1, 2500, 1, wifi_wait_ip) end end else print("Error getting AP list") end end function module.start() print("Configuring Wifi ...") wifi.setmode(wifi.STATION); wifi.sta.getap(wifi_start) end return module
Archivo application.lua
-- file : application.lua local module = {} m = nil -- Sends a simple ping to the broker local function send_ping() m:publish(config.ENDPOINT .. "ping","id=" .. config.ID,0,0) end -- Sends my id to the broker for registration local function register_myself() m:subscribe(config.ENDPOINT .. config.ID,0,function(conn) print("Successfully subscribed to data endpoint") end) end local function mqtt_start() m = mqtt.Client(config.ID, 120) -- register message callback beforehand m:on("message", function(conn, topic, data) if data ~= nil then print(topic .. ": " .. data) -- do something, we have received a message end end) -- Connect to broker m:connect(config.HOST, config.PORT, 0, 1, function(con) register_myself() -- And then pings each 1000 milliseconds tmr.stop(6) tmr.alarm(6, 4000, 1, send_ping) end) end function module.start() mqtt_start() end return module
Archivo init.lua
-- file : init.lua app = require("application") config = require("config") setup = require("setup") setup.start()
Paso uno a uno al dispositivo y en orden cada archivo mediante el siguiente botón:
Para ver si están todos los archivos en el dispositivo le damos a la pestaña Commands y luego a List files
El resultado debe ser parecido al siguiente:
En caso de que haya un error y se te quede colgado el dispositivo repitiendo el mismo error una y otra vez, puedes eliminar el archivo init.lua del dispositivo. Lo harás con el siguiente comando que introducirás en un cuadro de texto en la parte inferior del ESPlorer:
=file.remove("init.lua")Una vez arreglado el error vuelve a subir los archivos que modificaste y el init.lua.
Para borrar todos los archivos del dispositivo usa el siguiente comando:
=file.format()
Probando el sistema
mosquitto_pub -h test.mosquitto.org -t "nodemcu/13716620" -p 1883 -m Hello mosquitto_pub -h test.mosquitto.org -t "nodemcu/13716620" -p 1883 -m "Esto es una prueba" mosquitto_pub -h test.mosquitto.org -t "nodemcu/13716620" -p 1883 -m "Abrir-Puerta" mosquitto_pub -h test.mosquitto.org -t "nodemcu/13716620" -p 1883 -m "Enciende-Luz"
Recibiremos en el ESPlorer:
nodemcu/13716620: Hello nodemcu/13716620: Esto es una prueba nodemcu/13716620: Abrir-Puerta nodemcu/13716620: Enciende-Luz
Hay que recordar que cada segundo, el dispositivo está enviando una señal que en el ejemplo lo llama “ping” en el servidor mqtt. Para verificar si el dispositivo está conectado al servidor usamos lo siguiente:
mosquitto_sub -h test.mosquitto.org -t "nodemcu/ping"