Light Plotter with Intel Edison (10 / 16 steg)
Steg 10: Programmera kontrollen ESP8266 till RGB-lysdioder
Nu när vi har NodeMCU installerad på ESP8266 och en krets för att styra 3 färg lysdioder, är det dags att skriva några LUA programvara att styra lamporna över WiFi.
Jag bestämde mig för att det enklaste sättet vore att genomföra en webbserver på ESP8266 med 3 reglagen, en för varje färg ljusstyrka.
Denna metod har några fördelar och nackdelar
Proffsen
- Snabbt och enkelt, finns det gott om tutorials om hur du installerar grundläggande webbservrar samt hur du hanterar PWM.
- LED-färger kan styras programatically via Python på Edison eller via webbsidan (på din dator eller telefon). Detta är bra för felsökning.
Nackdelar
- Långsam. Ställa in färg via HTTP tar en märkbar bråkdelen av en sekund. Jag bestämde mig för att detta inte var en fråga för mig.
GPIO index
Du behöver veta vilket stift är vilket och denna NodeMCU GPIO index kommer att berätta: länk
PWM
Denna sida har en en grundläggande PWM funktion exempel: länk
Webbserver
Denna sida beskriver hur du ställer in en webbserver på ESP8266: länk
Konfigurera som en Station
ESP8266 konfigureras vanligtvis som en peka som standard, men jag ville ha mig att ansluta till min Edison som åtkomstpunkten, så jag använder "wifi.setmode"
Reglagen
Reglagen är standard HTML-"range" element, konfigurerad har värden från 0-1023, vilket är vad PWM funktionen förväntar sig.
Lagra värden
Du kommer att se att jag inkluderat variabler "currentR", "currentG" och "currentB" som lagrar senaste konfigurerade LED värde, så att webbsidan kan visa det korrekt efter uppfriskande.
ledR = 5--GPIO14
resk.trans.buff = 7--
ledB = 6
funktion led(r,g,b)
PWM.setduty(ledR,r)
PWM.setduty(ledG,g)
PWM.setduty(ledB,b)
slutet
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 (resk.trans.buff, 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)--röd
SRV=net.createServer (net. TCP)
SRV:listen(80,function(Conn)
Conn: on("receive", function(client,request)
lokala buf = "";
lokala _ _, metod, sökväg, vars = string.find (begäran "([A-Z] +) (. +)? (. +) HTTP");
IF(Method == Nil) sedan
_ _, metod, path = string.find (begäran "([A-Z] +) (. +) HTTP");
slutet
lokala _GET = {}
om (vars ~ = noll) sedan
för k, v i string.gmatch (vars, "(%w+)=(%w+) & *") gör
_GET [k] = v
om (k == "RED") sedan
currentR = v
slutet
om (k == "Grön") sedan
currentG = v
slutet
om (k == "Blå") sedan
currentB = v
slutet
slutet
slutet
LED(currentR,currentG,currentB);
BUF = buf.. " < html > ";
BUF = buf.. " < H1 > ESP8266 Web Server RGB LED < / h1 > ";
BUF = buf.. " < bildar metod = \ "get\" > ";
BUF = buf.. " < p > röda < input type = \ "range\" namn = \ "RED\" min = \ "0\" max = \ "1023\" värde = \ ""... currentR.." \ ">< /p >";
BUF = buf.. " < p > GREEN < input type = \ "range\" namn = \ "GREEN\" min = \ "0\" max = \ "1023\" värde = \ ""... currentG.." \ ">< /p >";
BUF = buf.. " < p > blå < input type = \ "range\" namn = \ "BLUE\" min = \ "0\" max = \ "1023\" värde = \ ""... currentB.." \ ">< /p >";
BUF = buf.. " < p >< ingång typ = \ "submit\" >< /p > ";
BUF = buf.. " < / form > ";
BUF = buf.. " < / html > ";
client:send(BUF);
client:Close();
collectgarbage();
avsluta)
avsluta)