TempCTRL v2 nodemcu lua

Aus Open Source Ecology - Germany
Zur Navigation springen Zur Suche springen

Hier die aktuelle Firmware-Version für das ESP8266-Modul von TempCTRL V.2 (Stand 30.01.2016)

ESP8266-Module sind normalerweise werksseitig mit einer Firmware ausgestattet, welche sogenannte "AT-Befehle" interpretiert. Dies ist aus verschiedenen Gründen eher unkomfortabel, weshalb man sie heutzutage oft und gern durch eine andere Firmware namens "NodeMCU" ersetzt, und dann mit LUA-Scripten arbeiten kann. Siehe auch http://nodemcu.com/index_en.html

Als NodeMCU-Firmware ist hier die Version "nodemcu_float_0.9.6-dev_20150704.bin" verwendet worden und somit erprobt und getestet. Neuere Versionen sollten aber ebensogut funktionieren und können downgeloadet werden von https://github.com/nodemcu/nodemcu-firmware


Ansonsten werden für TempCTRL V.2 noch zwei LUA-Scripte benötigt, namens "init-lua" und "main.lua".

In init.lua wird die WLAN Verbindung zum lokalen Router aufgebaut, deshalb müssen hier noch die eigenen Zugangsdaten eingesetzt werden. Der Verbindungsaufbau und die Vergabe einer IP-Adresse kann theoretisch auch per DHCP erfolgen, weshalb hier noch ein entsprechender Code-Abschnitt in auskommentierter Form vorhanden ist. Es ist aber empfehlenswert, stattdessen lieber eine statische IP-Adresse zuzuweisen. In dem entsprechenden Code-Abschnitt muss eine IP-Adresse nach Wahl, aber innerhalb des lokalen Netzwerks (also z.B.: "192.168.178.209") eingesetzt werden, sowie die Gateway-Adresse des Routers angepasst werden.

init.lua:

-- Global Variables (Modify for your network)

-- Achtung: An dieser Stelle müssen die Zugangsdaten für das eigene WLAN eingesetzt werden !!!
ssid = "oseg"
pass = "2390189794927415"


-- Configure Wireless Internet
wifi.setmode(wifi.STATION)
--print('\n set mode=STATION (mode='..wifi.getmode()..')\n')
wifi.sta.config(ssid,pass)
-- wifi.sta.connect()

-- For IP from DHCP uncomment the following block
--tmr.alarm(0, 1000, 1, function()
--   if wifi.sta.getip() == nil then
--      print("Connecting to AP...\n")
--   else
--      ip, nm, gw=wifi.sta.getip()
--      print("IP Info: \nIP Address: ",ip)
--      print("Netmask: ",nm)
--      print("Gateway Addr: ",gw,'\n')
--      print('MAC Address: ',wifi.sta.getmac())
--      print('Chip ID: ',node.chipid())
--      print('Heap Size: ',node.heap(),'\n')
--      tmr.stop(0)
--   end
--end)


-- Achtung: An dieser Stelle muss eine statische IP-Adresse im lokalen Netzwerk eingesetzt werden !!!
wifi.sta.setip({ip="192.168.178.209",netmask="255.255.255.0",gateway="192.168.178.1"})


srv=net.createServer(net.TCP)
-- wifi config end


-- serial config
-- uart.setup(0,9600,8,0,1)
uart.setup(0,9600,8,0,1)
-- serial config end

-- Run the main file
dofile("main.lua")


Die main.lua lauscht einfach nur auf Daten aus dem seriellen Port. Dabei handelt es sich genau um die Logging-Datensamples vom Arduino, also Temperatur usw., welcher dieser periodisch an das ESP-Modul seriell überträgt. Dieses wartet wiederum auf HTTP-Requests aus dem WLAN und antwortet dann mit Ausgabe einer minimalen WEB-Seite, welche lediglich die besagten Logging-Daten enthält.

An der main.lua braucht/sollte eigentlich nichts verändert werden. Falls aber doch, muss man auf Folgendes achten: Da sämtliche seriell einkommenden Daten sozusagen direkt ins WLAN "geschaufelt" werden, ist der NodeMCU-interne Interpreter, dem man normalerweise seriell und interaktiv auch Befehle mitgeben kann, quasi ausgehebelt, was widerum bedeutet, das sobald das lua-script einmal draufgeflasht wurde, die ESPlorer-IDE nicht mehr funktioniert. Solange man nichts ändern will ist das auch ok, aber falls doch befindet man sich in einer Dead-Lock-Situation. In diesem Fall hilft nur noch, die NodeMCU-Firmware nochmal neu auf das ESP-Modul zu brennen. Das ist zwar etwas unkomfortabel, aber zumindest ein gangbarer Weg. Und normalerweise muss man ja auch nicht hier ran.

main.lua:

-- main.lua --

print('\n main.lua serial2wifi OpenEcoLab Rahden 2015\n')
t="No data in buffer"

    uart.on("data", 0, 
      function(data)
        --print("receive from uart:", data)
        t = data
      end,
    1)

    srv=net.createServer(net.TCP) 
      srv:listen(80,function(conn)
        conn:on("receive",function(conn,payload) 
          print(payload)
          conn:send("HTTP/1.1 200 OK\n\n")
          conn:send("<html><body>")
          -- conn:send(tmr.now() .. ":") -- system-uptime
          conn:send(t)
          conn:send("</html></body>")
          conn:on("sent",function(conn) conn:close() end)
        end)
    end)