Just want to say thank you tot the TS and all! This post helped me a lot with my first steps in LUA on the ESP, I like it
Cheers,
Kees
The issue with the duplicate page appeared to be caused by the browser making two separate posts (one without the form data and one with data) or a single posts which was split on the ESP8266, I'm not sure. So the code handling the requests was executed twice and therefore the page was sent twice as well.
I have updated the code (and split the functions a bit) to solve this:
wifi.setmode(wifi.STATION)
wifi.sta.config("<SSID>","<code>")
outpin=4 -- Select right IO index !! Here is settings for GPIO2 (Lua build 20141219)
gpio.mode(outpin,gpio.OUTPUT)
gpio.write(outpin,gpio.LOW)
status = 'OFF'
function ctrlpower(kdesi,payload)
pwm.close(outpin)
gpio.mode(outpin,gpio.OUTPUT)
dotaz=string.sub(payload,kdesi[2]+1,#payload)
status = dotaz
if dotaz=="ON" then gpio.write(outpin,gpio.HIGH) return end
if dotaz=="OFF" then gpio.write(outpin,gpio.LOW) return end
if dotaz=="FLC" then pwm.setup(outpin,2,512)pwm.start(outpin) return end
pwm.setup(outpin,1000,dotaz*10)
pwm.start(outpin)
end
function sendPage(conn)
conn:send('HTTP/1.1 200 OK\n\n')
conn:send('<!DOCTYPE HTML>')
conn:send('<html>')
conn:send('<head><meta content="text/html; charset=utf-8"><style>input{width: 100px; height: 100px;}</style>')
conn:send('<title>ESP8266</title></head>')
conn:send('<body><h1>LED Controller</h1>')
conn:send('Status: <b>')
if (status == "ON") then conn:send('ON')
elseif (status == "OFF") then conn:send('OFF')
elseif (status == "FLC") then conn:send('Flickering')
else
conn:send(status)
conn:send('%')
end
conn:send('</b><br /><br />')
conn:send('<form action="/" method="POST">')
conn:send('<input type="submit" name="pwmi" value="OFF"/>')
conn:send('<input type="submit" name="pwmi" value="ON"/><br /><br />')
conn:send('<input type="submit" name="pwmi" value="10"/>')
conn:send('<input type="submit" name="pwmi" value="20"/>')
conn:send('<input type="submit" name="pwmi" value="30"/>')
conn:send('<input type="submit" name="pwmi" value="40"/>')
conn:send('<input type="submit" name="pwmi" value="50"/>')
conn:send('<input type="submit" name="pwmi" value="60"/>')
conn:send('<input type="submit" name="pwmi" value="70"/>')
conn:send('<input type="submit" name="pwmi" value="80"/>')
conn:send('<input type="submit" name="pwmi" value="90"/> % of power<br /><br />')
conn:send('<input type="submit" name="pwmi" value="FLC"/> HW blinker</form>')
conn:send('</body></html>')
end
srv=net.createServer(net.TCP)
srv:listen(80,function(conn)
conn:on("receive", function(conn,payload)
--next row is for debugging output only
--print(payload)
if (string.find(payload, "GET / HTTP/1.1") ~= nil) then
print("GET received")
sendPage(conn)
else
kdesi={string.find(payload,"pwmi=")}
--If POST value exist, set LED power
if kdesi[2]~=nil then
print("Command received: " .. payload)
ctrlpower(kdesi,payload)
sendPage(conn)
end
end
end)
conn:on("sent", function(conn)
conn:close()
print("Connection closed")
end)
end)
This code works fine now and also shows the current status.
kdesi={string.find(payload,"pwmi=")} --find the location of "pwmi= in the payload
This parts makes sense. Two lines down from that, we have this:
if kdesi[2]~=nil then --??
Why is this needed? I see that it is checking to see something is in kdesi, but why the second element?
Also, if I print "kdesi" in the function "ctrlpower", I get something printed like "table: 3fff7280" why?
BTW, this thread has been a huge help.