Control de dispositivo ESP8266 por MQTT

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.

D1-mini

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.

D1-mini-moneda

Dispositivo comparada con una moneda

Crear el firmware

Para poder utilizar el protocolo mqtt en estos dispositivos tenemos que ir a la página:

http://nodemcu-build.com/

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.

D1-mini-branch

Seleccionamos los siguientes módulos: (Siempre depende de lo que quieras hacer con el dispositivo. Recuerda que la memoria es limitada):

D1-mini-select

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:

Abrir-Esplorer

Esta aplicación se puede ejecutar tanto en Linux como en Windows.

Para conectarnos con el dispositivo le damos al botón Open :

Esplorer0

Si no conecta probamos con menor velocidad de transmisión:

Esplorer2

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.

 

Esplorer3

El código

He creando una lengüeta por cada archivo que voy a introducir en el dispositivo.

Esplorer1

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:

Esplorer4

Para ver si están todos los archivos en el dispositivo le damos a la pestaña Commands y luego a List files

Esplorer5

El resultado debe ser parecido al siguiente:

Esplorer6

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"

 

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *