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()]]);