ESP8266 NodeMCU – przykładowy skrypt Lua: serwer HTTP, sterowanie LED, Wi-Fi

Pytanie

ESP8266 lua script przykład

Odpowiedź Sztucznej Inteligencji


Bezpośrednia odpowiedź na pytanie

  • Przykładowy, kompletny skrypt Lua dla ESP8266 (NodeMCU) zawiera:
    • konfigurację Wi-Fi (tryb STATION),
    • prosty serwer HTTP prezentujący stronę WWW,
    • możliwość sterowania diodą LED na GPIO (D4) z poziomu przeglądarki.
  • Kod jest gotowy do wgrania jako pliki init.lua + server.lua.

Szczegółowa analiza problemu

1. Struktura projektu

  1. init.lua – uruchamiany automatycznie po restarcie; odpowiada za:
    • połączenie z siecią Wi-Fi,
    • sprawdzanie uzyskania adresu IP,
    • start właściwego serwera HTTP.
  2. server.lua – prosty, nieblokujący serwer HTTP TCP na porcie 80;
    • obsługuje żądania GET / (strona kontrolna) oraz /led?state=on|off,
    • aktualizuje GPIO oraz zwraca stronę HTML.

2. Kod źródłowy

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")

3. Teoretyczne podstawy

• 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.

4. Praktyczne zastosowania

• 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).

Aktualne informacje i trendy

• 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.

Wspierające wyjaśnienia i detale

• 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).

Aspekty etyczne i prawne

• 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.

Praktyczne wskazówki

• 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).

Ewentualne zastrzeżenia lub uwagi dodatkowe

• 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().

Sugestie dalszych badań

• 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).

Krótkie podsumowanie

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ń.

Oceń odpowiedź:

Zadaj dodatkowe pytanie Sztucznej Inteligencji

Czekaj (1min)...
Zastrzeżenie: Odpowiedzi udzielone przez sztuczną inteligencję (model językowy) mogą być niedokładne i wprowadzające w błąd. Elektroda nie ponosi odpowiedzialności za dokładność, rzetelność ani kompletność prezentowanych informacji. Wszystkie odpowiedzi powinny być zweryfikowane przez użytkownika.