ESP8266 lua script przykład
init.lua
+ server.lua
.init.lua
– uruchamiany automatycznie po restarcie; odpowiada za:server.lua
– prosty, nieblokujący serwer HTTP TCP na porcie 80;GET /
(strona kontrolna) oraz /led?state=on|off
,init.lua
print("Start systemu…")
-- 1. Konfiguracja Wi-Fi (STATION)
wifi.setmode(wifi.STATION)
wifi.sta.config({ssid="TwojaSiecWiFi", pwd="TwojeHaslo"})
wifi.sta.connect()
-- 2. Oczekiwanie na IP i uruchomienie serwera
tmr.create():alarm(1000, tmr.ALARM_AUTO, function(t)
local ip = wifi.sta.getip()
if ip == nil then
print("Łączenie z Wi-Fi…")
else
print("Połączono! IP: " .. ip)
t:unregister()
dofile("server.lua")
end
end)
server.lua
local ledPin = 4 -- D4 (GPIO2) na NodeMCU
gpio.mode(ledPin, gpio.OUTPUT)
gpio.write(ledPin, gpio.HIGH) -- LED zgaszona (aktywny stan niski)
local srv = net.createServer(net.TCP)
srv:listen(80, function(conn)
conn:on("receive", function(c, req)
-- Prosta analiza żądania HTTP
local _, _, method, path, vars = string.find(req, "([A-Z]+) (.+)?(.*) HTTP")
if method == nil then _,_,method,path = string.find(req,"([A-Z]+) (.+) HTTP") end
local _GET = {}
if vars then
for k,v in string.gmatch(vars, "(%w+)=([^&]*)&*") do _GET[k]=v end
end
if path=="/led" and _GET.state then
if _GET.state=="on" then gpio.write(ledPin, gpio.LOW) end
if _GET.state=="off" then gpio.write(ledPin, gpio.HIGH) end
end
-- Strona HTML
local html = ""
html = html .. "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n"
html = html .. "<!DOCTYPE html><html><head><meta charset='utf-8'/>"
html = html .. "<title>ESP8266 LED</title></head><body>"
html = html .. "<h1>Sterowanie LED – ESP8266</h1>"
html = html .. "<p>Adres IP: "..wifi.sta.getip().."</p>"
html = html .. "<p><a href='/led?state=on'><button>LED ON</button></a>"
html = html .. "<a href='/led?state=off'><button>LED OFF</button></a></p>"
html = html .. "<p>Heap: "..node.heap().." B</p></body></html>"
c:send(html, function() c:close() collectgarbage() end)
end)
end)
print("Serwer HTTP gotowy na porcie 80")
• NodeMCU firmware implementuje interpreter Lua, pracując w modelu zdarzeniowym (nie ma klasycznych pętli while(1)
); obsługa odbywa się głównie przez callbacki (Wi-Fi, TCP, timery).
• tmr.create():alarm()
– rejestruje cykliczny timer sprzętowy (maks. 7 równoległych).
• net.createServer()
– inicjuje stos TCP/UDP sprzętowy wbudowany w ESP8266; zdarzenie "receive"
uruchamia się przy nadejściu danych.
• Zdalne sterowanie (przekaźniki, LED-y, serwomechanizmy).
• Przesyłanie danych sensorycznych (DHT22/BME280) poprzez HTTP/MQTT.
• Integracja z aplikacjami desktop (np. Delphi) lub chmurą (AWS IoT, Azure).
• Firmware NodeMCU 3.0 (lipiec 2022) przeniósł się na SDK ESP8266 RTOS 3.4, z lepszym wsparciem TLS v1.2 i FatFs.
• Rosnące wykorzystanie protokołów MQTT i WebSocket do komunikacji w czasie rzeczywistym (EMQX, Mosquitto).
• Coraz częstsze migracje na ESP32, jednak ESP8266 pozostaje popularny w projektach niskokosztowych.
• Numeracja pinów: w Lua stosuje się tzw. „D-mapping” (D0-D8) – warto skorzystać z tabeli mapowania dostępnej w dokumentacji NodeMCU.
• LED on-board (DevKit v1.0) ma logikę odwrotną: stan niski = świeci, stan wysoki = zgaszona.
• collectgarbage()
w callbacku "sent"
uwalnia pamięć z bufferów TCP (heap w ESP8266 to ok. 40–50 kB).
• Upewnij się, że moduł pracuje w zakresie mocy i częstotliwości zgodnym z lokalnymi przepisami radiowymi (np. ETSI EN 300 328 w UE).
• Przy projektach IoT zalecane jest szyfrowanie (HTTPS/TLS lub MQTT-TLS), by nie przesyłać haseł w postaci jawnej.
• Gdy plik init.lua
zawiesi ESP (np. błąd w pętli), przytrzymaj przycisk FLASH podczas restartu – zatrzyma się wykonywanie i umożliwi poprawki.
• Minimalizuj użycie tmr.delay()
– blokuje CPU i watchdoga. Zamiast tego używaj timerów lub coroutine.
• Do większych projektów warto skonfigurować własny build NodeMCU z niezbędnymi modułami (https://nodemcu-build.com).
• ESP8266 ma tylko jeden rdzeń i brak ochrony pamięci – błędy w Lua mogą prowadzić do restartów (watchdog).
• Bufor TCP jest ograniczony (1440 B) – przy dużych plikach WWW lepiej korzystać z chunkowania lub trybu file.open()
+ file.seek()
.
• Wykorzystanie WebSocket (moduł websocket
) do sterowania w czasie rzeczywistym.
• Implementacja OTA (Over-The-Air) dla aktualizacji skryptów Lua (patrz projekt ESP8266-OTA-Lua-WEB-UI).
• Migracja kodu do ESP32 (NodeMCU dla ESP32 lub język MicroPython).
Zaprezentowany dwuczęściowy skrypt (init.lua
+ server.lua
) ilustruje typowy workflow NodeMCU: łączenie z Wi-Fi, nieblokujący serwer HTTP i zdalne sterowanie GPIO. Dzięki modelowi zdarzeniowemu ESP8266 może stabilnie działać jako tani węzeł IoT. Rozszerzenia – takie jak MQTT, WebSocket czy OTA – pozwalają łatwo skalować projekt do bardziej zaawansowanych zastosowań.