Questo dispositivo e' un microcontrollore con abbinato capacita' WiFi a basso costo simile ad Arduino, che si puo' programmare con Arduino....ma non e' Arduino (ha piu' o meno le dimensioni di una Arduino Nano)
Il costo di ogni kit e' di circa 7 Euro (sui vari ecommerce cinesi per esempio
Banggood)
Per la programmazione su Windows Xp e' necessario prima scaricare il driver della porta CP210x da
questo link
In seguito e' conveniente flashare il modulo mediante il programma (senza questa operazione non riuscivo a comunicare con la scheda) che puo' essere reperito a
questo link (cartella WIN32/Realease/ESP8266Flasher.exe) .
La scheda mi e' arrivata con questo firmware
NodeMcu 0.9.2 build 20141207 powered by Lua 5.1.4
ed e' stata aggiornata a
NodeMCU 0.9.5 build 20150318 powered by Lua 5.1.4
(i
firmware di sviluppo si scaricano da questo indirizzo)
Con il primo firmware c'era sempre un errore sul comando tmr, con il secondo firmware tutti gli script che si trovano su internet funzionano correttamente
L'uso e' molto semplice, basta selezionare la porta COM e lanciare l'operazione che dura un paio di minuti
Come dice il nome il metodo di programmazione della scheda e' in
LUA e si puo' utilizzare il programma
LuaLoader
Per connettersi con la scheda si deve andare nel menu Settings/COMM Port Settings e selezionare la porta virtuale (nel mio caso la Comm37) e poi effettuare il Connect. In caso di connessione diventa verde il box in alto a sinistra.
Esiste anche un'altro ambiente di sviluppo
ESPlorer (non e' stato impiegato durante la scrittura di questo post)
Per caricare i programmi questi si scrivono in un editor di testo ed poi effettuato l'upload con il comando
Upload File. Per mandare in esecuzione il programma si seleziona dal menu a tendina lo script desiderato e si lancia
dofile
Attenzione : tutti i file di cui si fa l'upload rimangono in memoria. Per rimuoverli si devono selezionare dal menu a tendina e poi eseguire
remove. Per visualizzare la memoria libera si puo' cliccare sul pulsante
Heap
Per mandare in esecuzione automatica un programma all'accensione si deve nominare come
init.lua. Questo espone ad un rischio ovvero che se il programma va in loop inifinito non c'e' modo di riprendere il controllo della scheda (i file sopravvivono ad un flash della scheda) . Conviene scrivere un init.lua che comprenda righe del tipo
-----------------------------------------
tmr.alarm(0, 1000000, 0, function()
dofile("mioprogramma.lua")
end)--------------------------------------------------
in modo da ritardare la partenza di mioprogramma.lua di 10 secondi e poter nel frattempo premere il comando tmr.stop per interrompere l'esecuzione automatica
Il pinout della scheda e' il seguente
Per modificare lo stato dei pin digitali si puo' eseguire le seguenti chiamate
In questo caso si setta a 1 il pin GPIO 1 ovvero D10
pin=1
gpio.mode(pin, gpio.OUTPUT)
gpio.write(pin, gpio.HIGH)
e per invece settare 0 sul pin 1
gpio.write(pin, gpio.LOW)
La scheda ha una tensione di lavoro di 3.3 V per cui lo stato 1 vale 3.3 V
Ovviamente avendo una scheda WiFi e' interessante sfruttare la connessione di rete
Con questo script la scheda diventa un web server
-------------------------------------------------------------
-- Simple NodeMCU web server (done is a not so nodeie fashion :-)
--
-- Written by Scott Beasley 2015
-- Open and free to change and use. Enjoy.
--
-- Your Wifi connection data
local SSID = "XT1032 3365"
local SSID_PASSWORD = "XXXXXXXX"
local function connect (conn, data)
local query_data
conn:on ("receive",
function (cn, req_data)
query_data = get_http_req (req_data)
print (query_data["METHOD"] .. " " .. " " .. query_data["User-Agent"])
cn:send ("Hello World from ESP8266 and NodeMCU!!")
-- Close the connection for the request
cn:close ( )
end)
end
function wait_for_wifi_conn ( )
tmr.alarm (1, 1000, 1, function ( )
if wifi.sta.getip ( ) == nil then
print ("Waiting for Wifi connection")
else
tmr.stop (1)
print ("ESP8266 mode is: " .. wifi.getmode ( ))
print ("The module MAC address is: " .. wifi.ap.getmac ( ))
print ("Config done, IP is " .. wifi.sta.getip ( ))
end
end)
end
-- Build and return a table of the http request data
function get_http_req (instr)
local t = {}
local first = nil
local key, v, strt_ndx, end_ndx
for str in string.gmatch (instr, "([^\n]+)") do
-- First line in the method and path
if (first == nil) then
first = 1
strt_ndx, end_ndx = string.find (str, "([^ ]+)")
v = trim (string.sub (str, end_ndx + 2))
key = trim (string.sub (str, strt_ndx, end_ndx))
t["METHOD"] = key
t["REQUEST"] = v
else -- Process and reamaining ":" fields
strt_ndx, end_ndx = string.find (str, "([^:]+)")
if (end_ndx ~= nil) then
v = trim (string.sub (str, end_ndx + 2))
key = trim (string.sub (str, strt_ndx, end_ndx))
t[key] = v
end
end
end
return t
end
-- String trim left and right
function trim (s)
return (s:gsub ("^%s*(.-)%s*$", "%1"))
end
-- Configure the ESP as a station (client)
wifi.setmode (wifi.STATION)
wifi.sta.config (SSID, SSID_PASSWORD)
wifi.sta.autoconnect (1)
-- Hang out until we get a wifi connection before the httpd server is started.
wait_for_wifi_conn ( )
-- Create the httpd server
svr = net.createServer (net.TCP, 30)
-- Server listening on port 80, call connect function if a request is received
svr:listen (80, connect)
-------------------------------------------------------------
Un altro aspetto e' quello di settare l'ESP8266 come un Access Point con i comandi
-------------------------------------------------------------
cfg={}
cfg.ssid="LucaInno"
cfg.pwd="
xxxxxxxxxxxxxi"
wifi.ap.config(cfg)
wifi.setmode(wifi.SOFTAP)
-------------------------------------------------------------