Stap 10: Program de ESP8266 aan controle RGB LED 's
Nu dat we NodeMCU op de ESP8266 en een circuit hebben te besturen van de 3 kleuren LED's zijn geïnstalleerd, is het tijd om te schrijven sommige LUA-software als u wilt toestaan van ons om te controleren de LEDs via WiFi.
Heb ik besloten dat zou de gemakkelijkste manier om een webserver op de ESP8266 met 3 schuiven, één voor elke kleur de helderheid.
Deze methode heeft enkele voor- en nadelen
Profs
- Snel en gemakkelijk, zijn er veel tutorials over het opzetten van fundamentele webservers , alsmede voor het omgaan met PWM.
- De LED kleuren kunnen via programmacode worden aangestuurd via Python op de Edison, of via de webpagina (op uw PC of telefoon). Dit is geweldig voor foutopsporing.
Cons
- Vertragen. Instellen van de kleur via HTTP neemt een merkbaar Fractie van een seconde. Ik heb besloten dat dit geen probleem voor mij was.
GPIO indexen
U wilt weten welke pinnen zijn welke en deze NodeMCU GPIO index zal u vertellen: link
PWM
Deze pagina heeft een een fundamenteel voorbeeld van de functie van de PWM: link
Webserver
Deze pagina beschrijft hoe een webserver op de ESP8266 instellen: link
Als een Station configureren
De ESP8266 wordt gewoonlijk geconfigureerd als een toegang wijs standaard, maar ik wilde mijn ertoe om te verbinden met mijn Edison die het toegangspunt, zodat ik gebruik maken van de "wifi.setmode"
Schuifregelaars
De schuifregelaars zijn standaard HTML "bereik" elementen, geconfigureerd met waarden van 0-1023, dat is wat de PWM-functie verwacht.
Tijdwaarden op te slaan
U ziet dat ik opgenomen variabelen "currentR", "currentG" en "currentB", waarin de laatste opgeslagen geconfigureerde LED waarde, zodat de webpagina het correct na vernieuwen weergeven kunt.
ledR = 5--GPIO14 ledG = 7--ledB = 6 functie led(r,g,b) pwm.setduty(ledR,r) pwm.setduty(ledG,g) pwm.setduty(ledB,b) einde wifi.setmode (wifi. STATION) ledR = 5 --GPIO14 ledG = 7 -- ledB = 6 function led(r,g,b) pwm.setduty(ledR,r) pwm.setduty(ledG,g) pwm.setduty(ledB,b) end wifi.setmode(wifi.STATION) wifi.sta.config("lightplot","lightplot") wifi.sta.setip({ip="192.168.42.2",netmask="255.255.255.0",gateway="192.168.42.1"}) gpio.mode(ledR, gpio.OUTPUT) gpio.mode(ledG, gpio.OUTPUT) gpio.mode(ledB, gpio.OUTPUT) pwm.setup(ledR,500,0) pwm.setup(ledG,500,0) pwm.setup(ledB,500,0) pwm.start(ledR) pwm.start(ledG) pwm.start(ledB) currentR = 0 currentG = 0 currentB = 0 led(currentR,currentG,currentB) -- red srv=net.createServer(net.TCP) srv:listen(80,function(conn) conn:on("receive", function(client,request) local buf = ""; local _, _, method, path, vars = string.find(request, "([A-Z]+) (.+)?(.+) HTTP"); if(method == nil)then _, _, method, path = string.find(request, "([A-Z]+) (.+) HTTP"); end local _GET = {} if (vars ~= nil)then for k, v in string.gmatch(vars, "(%w+)=(%w+)&*") do _GET[k] = v if (k == "RED")then currentR = v end if (k == "GREEN")then currentG = v end if (k == "BLUE")then currentB = v end end end led(currentR,currentG,currentB); buf = buf.."<html>"; buf = buf.."<h1> ESP8266 Web Server RGB LED</h1>"; buf = buf.."<form method=\"get\">"; buf = buf.."<p> RED <input type=\"range\" name=\"RED\" min=\"0\" max=\"1023\" value=\""..currentR.."\"> </p>"; buf = buf.."<p> GREEN <input type=\"range\" name=\"GREEN\" min=\"0\" max=\"1023\" value=\""..currentG.."\"> </p>"; buf = buf.."<p> BLUE <input type=\"range\" name=\"BLUE\" min=\"0\" max=\"1023\" value=\""..currentB.."\"> </p>"; buf = buf.."<p> <input type=\"submit\"> </p>"; buf = buf.."</form>"; buf = buf.."</html>"; client:send(buf); client:close(); collectgarbage(); end) end)