ESP8266 WiFi – GPIO pinnen aansturen (NodeMCU)
Op deze pagina vind je een paar stappen om met NodeMCU (0.9.6dev) GPIO pinnen aan te sturen (HOOG/LAAG).
Let op: De voltage op deze pinnen is o of 3.3v (geen 5v zoals arduino)
GPIO pin configureren:
De commando’s om de GPIO pinnen in te stellen zijn als volgt:
Zet een pin als mode “INGANG”:
gpio.mode(pin, gpio.INPUT)
Zet een pin als mode “UITGANG”:
gpio.mode(pin, gpio.OUTPUT)
Zet een pin als mode “INTERRUPT”:
gpio.mode(pin, gpio.INT)
GPIO pin nummering:
Je zou denken pin 2 is GPIO2, maar hhelaas de GPIO pinnnen hebben een IO index, dat is het nummer wat je moet aanspreken om de juiste GPIO poort te benaderen, de tabel:
GPIO pin | IO index |
---|---|
GPIO0 | 3 |
GPIO1 | 10 |
GPIO2 | 4 |
GPIO3 | 9 |
GPIO4 | 2 |
GPIO5 | 1 |
GPIO6 | - |
GPIO7 | - |
GPIO8 | - |
GPIO9 | 11 |
GPIO10 | 12 |
GPIO11 | - |
GPIO12 | 6 |
GPIO13 | 7 |
GPIO14 | 5 |
GPIO15 | 8 |
GPIO16 | 0 |
Aan de slag:
Hier in dit voorbeeld zetten we de GPIO2 poort van een ESP-01 module hoog of laag.
1) Open een seriële verbinding met de module.
2) Zet de GPIO2 pin als uitgang met het commando:
gpio.mode(4, gpio.OUTPUT)
3) Zet de pin “HOOG” met het commando:
gpio.write(4, gpio.HIGH)
4) De status van een GPIO pin kan je opvragen met het commando:
gpio.read(pin) , om bijvoorbeeld de status van de GPIO2 pin naar de console te printen: print(gpio.read(4))
Voorbeeld in een IF loop
1 2 3 4 5 6 7 8 |
gpio.mode(4, gpio.INPUT) local pinWaarde = gpio.read(4) if pinWaarde == gpio.LOW then print 'GPIO2 is laag' else print 'GPIO2 is hoog' end |
Voorbeeld van INTERRUPT mode
Je kan een functie aanmaken en triggeren als een pinwaarde veranderd, je zet de GPIO uitgang dan als INTERRUPT
gpio.trig() , zie hier een voorbeeld code:
1 2 3 4 5 6 7 8 |
local pin = 4 --> GPIO2 function onChange () print('The pin waarde is veranderd naar '..gpio.read(pin)) end gpio.mode(pin, gpio.INT) gpio.trig(pin, 'both', onChange) |
in het 2e argument van de gpio.trig() functie is het “event” op de pin waarnaar geluisterd moet worden, deze kan zijn:
up | Wanneer de pin naar hoog gaat. |
down | Wanneer de pin naar laag gaat. |
both | Wanneer de pin hoog of laag wordt. |
low | Wordt herhaaldelijk herhaald als de pin laag is. |
high | Wordt herhaaldelijk herhaald als de pin hoog is. |
GPIO pin map
Er is ook een makkelijke manier als je de GPIO IO index niet wilt aanhouden, je kan eenvoudig de IO index mappen met het volgende commando:
1 |
for k,v in ipairs{3,10,4,9,2,1,nil,nil,nil,11,12,nil,6,7,5,8,0} do _G['GPIO'..k-1]=v end |
Om nu GPIO2 aan te sturen gebruik je:
1 2 |
gpio.mode(GPIO2, gpio.OUTPUT) gpio.write(GPIO2, gpio.HIGH) |
1 |
gpio=setmetatable({},{__index=gpio}) for k,v in ipairs{3,10,4,9,2,1,nil,nil,nil,11,12,nil,6,7,5,8,0} do gpio['GPIO'..k-1]=v end |
Om nu GPIO2 aan te sturen gebruik je:
1 2 |
gpio.mode(gpio.GPIO2, gpio.OUTPUT) gpio.write(gpio.GPIO2, gpio.HIGH) |
GPIO bedienen via Web interface
Het is ook mogelijk om de ESP als een mini webservertje in te stellen en je online bijvoorbeeld via een browser de GPIO pinnen kan schakelen, gebruik daarvoor het volgende script:
Tip: Download de code sla het op als bestand, en gebruik de “Upload…” knop in ESPlorer.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
wifi.setmode(wifi.STATION) wifi.sta.config("ROUTER_ESSID","WIFI_PASSWORD") print(wifi.sta.getip()) led1 = 3 led2 = 4 gpio.mode(led1, gpio.OUTPUT) gpio.mode(led2, gpio.OUTPUT) 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 end end buf = buf.."<h1> ESP8266 Web Server</h1>"; buf = buf.."<p>GPIO0 <a href=\"?pin=ON1\"><button>ON</button></a> <a href=\"?pin=OFF1\"><button>OFF</button></a></p>"; buf = buf.."<p>GPIO2 <a href=\"?pin=ON2\"><button>ON</button></a> <a href=\"?pin=OFF2\"><button>OFF</button></a></p>"; local _on,_off = "","" if(_GET.pin == "ON1")then gpio.write(led1, gpio.HIGH); elseif(_GET.pin == "OFF1")then gpio.write(led1, gpio.LOW); elseif(_GET.pin == "ON2")then gpio.write(led2, gpio.HIGH); elseif(_GET.pin == "OFF2")then gpio.write(led2, gpio.LOW); end client:send(buf); client:close(); collectgarbage(); end) end) |
Voer het lua script uit, dit is het resultaat:
Je kan nu met de knoppen de GPIO poorten bedienen
Bronnen:
esp8266.co.uk
nodemcu.com
paulcuth * gtihub.com
cnx-software.com