ESP8266 LDR anturi
Tässä artikkelissa kerron, miten ESP8266:sta voidaan tehdä HTTP pyynnöillä LDR -anturin statuksen raportoiva laite käyttäen NodeMCU firmwarea ja Lua -scriptikieltä. Samalla koodillahan voi toki käyttää monia muitakin laitteita joiden tilatietoa halutaan kertoa HTTP -rajapinnan yli serverille.
ESP8266 moduulille on saatavilla NodeMCU (nodemcu.com / GitHub) firmware, jossa on Lua -tulkki. Mukana tulee muutamia hyödyllisiä moduuleja, joilla voidaan luoda ja liittyä WLAN -verkkoihin, lukea ja kirjoittaa I/O -pinnejä, tehdä TCP -pyyntöjä ja luoda vaikkapa HTTP -serverin jne. Lua -tulkki on käytettävissä suoraan UARTin kautta. NodeMCU:lla moduulia voidaan helposti käyttää ilman erillistä Arduinoa tms. ja jokaista ohjelmamuutosta varten ei koodia tarvitse kääntää ja flashätä erikseen.
ESP8266:lle on myös tehty uusi SDK, ESPlorer, joka helpottaa kehitystä. Lua -koodit voi kyllä uploadata suoraan terminaaliohjelmallakin moduuliin talteen tiedostoiksi.
Kannattaa myös lukea aiempi ESP8266 -artikkeli, jossa tehtiin AT -komennoilla HTTP -pyyntö. Artikkelissa kerrotaan mm. USB-TTL -adapterin käytöstä, josta ei tässä artikkelissa erikseen kerrota.
Osalista
- ESP8266 -moduuli. Esim. tämä 5kpl setti
- LDR -moduuli Valoisuuden tunnistamiseen
- USB-TTL -adapteri Flashäystä ja koodien uploadausta varten
NodeMCU firmwaren flashäys ESP8266 -moduuliin
Firmware flashätään esimerkiksi nodemcu-flasherilla (win32 exe / win64 exe) tai jollain muulla flasherilla.
Nodemcu-flasherin mukana tulee firmwaresta vanha 0.9.2 versio. Kannattanee kuitenkin ladata tuorein firmware ja käyttää sitä.
Tuorein firmware löytyy täältä: https://github.com/nodemcu/nodemcu-firmware/tree/master/pre_build
Kirjoitushetkellä tuorein versio oli tämä: nodemcu_512k_20141222.bin
Ennen flashaystä ESP8266 moduulista pitää CH_PD kytkeä VCC:hen ja GPIO0 kytketään GND:hen. CH_PD pitää olla aina kytkettynä VCC:lle kun ESP -moduulia aiotaan käyttää. GPIO0 pitää kytkeä maahan vain flashäyksen ajaksi.
LDR moduulin kytkentä ESP8266:een
LDR -moduulin D0 kytketään GPIO0:aan (GPIO0 on koodissa numero 3), VCC:lle annetaan 3.3V ja GND kytketään maahan.
Ohjelmakoodit
Pilkoin ohjelman kahteen osaan. ldr_reporter.lua -tiedostossa on funktioina kaikki toiminnallisuudet. init.lua -tiedosto ladataan NodeMCU:n toimesta bootin yhteydessä. Sinne olen laittanut conffit ja kutsut funktioihin.
ldr_reporter.lua
last_status = 0
gpio.mode(io_pin, gpio.INPUT)
function join_wifi()
wifi.setmode(wifi.STATION)
wifi.sta.config(wifi_name,wifi_password)
end
function do_http_request(status)
print("reporting new status "..status)
conn=net.createConnection(net.TCP, 0)
conn:connect(server_port,server_ip)
conn:send("GET "..server_path.."?status="..status.." HTTP/1.1\r\nHost: "..server_host.."\r\n"
.."Connection: close\r\nAccept: */*\r\n\r\n")
end
function start_poller()
tmr.alarm(0, refresh_interval, 1,
function()
now_status= gpio.read(io_pin)
if last_status ~= now_status then
print("status is now "..now_status)
do_http_request(now_status)
last_status = now_status
end
end
)
end
init.lua
io_pin = 3
server_ip = ”xx.xx.xx.xx”
server_port = 80
server_host = ”example.com”
server_path = ”/path/to/server”
refresh_interval = 1000
wifi_name = ”WLAN AP NAME”
wifi_password = ”WLAN PASSWORD”
dofile('ldr_reporter.lua')
join_wifi()
start_poller()
Lua koodien uploadaus
Koodin uploadaukseen voi käyttää ESPloreria tai ihan mitä vain terminaaliohjelmaa.
Terminaaliohjelmalla esimerkiksi init.lua -tiedoston uploadaus tapahtuu tähän tyyliin.
file.remove(’init.lua’); file.open(’init.lua’,’w’); file.writeline([[io_pin = 3]]); file.writeline([[server_ip = ”xx.xx.xx.xx”]]); file.writeline([[server_port = 80]]); file.writeline([[server_host = ”example.com”]]); file.writeline([[server_path = ”/path/to/server”]]); file.writeline([[refresh_interval = 1000]]); file.writeline([[]]); file.writeline([[wifi_name = ”WLAN AP NAME”]]); file.writeline([[wifi_password = ”WLAN PASSWORD”]]); file.writeline([[]]); file.writeline([[dofile('ldr_reporter.lua')]]); file.writeline([[]]); file.writeline([[join_wifi()]]); file.writeline([[start_poller()]]);

