Programma's en codevoorbeelden uit het boek
De NodeMCU is een kleine computer met allerlei in- en uitgangen die eenvoudig met het internet is te verbinden. Je kunt een NodeMCU herkennen aan de micro-USB aansluiting aan de ene kant en een wifi-antenne op de andere kant. Het printplaatje heeft afmetingen van ongeveer 5 x 2,5 cm. Je programmeert de NodeMCU met instructies in de taal Lua, wat 'maan' betekent in het Portugees.
- Een NodeMCU
- Een micro-USB kabeltje
- Een Windows- of OS X computer (Linux kan ook, maar het gebruik daarvan beschrijven we hier niet)
- Beschikking over een wifi toegangspunt
Verder is een breadboard met minimaal 400 gaatjes handig en draadjes waarmee je gemakkelijk op het breadboard verbindingen kunt maken. Op je Windows- of OS X computer moet een USB-driver voor de NodeMCU worden geïnstalleerd. Ook moet de ESPlorer programmeeromgeving worden gedownload. Om deze te kunnen gebruiken is Java nodig, die meestal al wel op de computer staat. Alle genoemde software is gratis. Onderaan deze pagina vind je links naar software die je kunt downloaden.
Voor de officiële documentatie voor de NodeMCU is een speciale website beschikbaar: NodeMCU Documentation.
Alle genoemde onderdelen en het boek Zelf een IoT toepassing maken, zijn online en in de winkel verkrijgbaar bij Okaphone. Ook voor een keur aan sensoren en tips en adviezen kun je daar terecht.
Een NodeMCU heeft vier belangrijke onderdelen: een spanningsregulator naar 3,3 volt, een USB naar serieel conversiechip, een microcontroller van het type ESP8266 en een 4 MB groot flashgeheugen voor de Lua interpreter, de firmware en jouw eigen programma's. Het geheugen is groot genoeg voor tientallen programma's, die elkaar kunnen aanroepen met resultaat = dofile("luaprogramma")
.
In het midden van het blokschema is de microcontroller getekend. Dit is een klein chipje van 5 x 5 mm dat samen met het flashgeheugen onder het metalen dekseltje op de NodeMCU zit. In het chipje zit wifi, een moderne microprocessor, de aansluitingen voor sensoren en actuatoren, een 'Real Time Clock' en de communicatiepoort die met de USB omzetter is verbonden.
Het flashgeheugen bevat in elk geval een bootloader en de NodeMCU firmware. Met de bootloader is het mogelijk om nieuwe, verbeterde NodeMCU firmware te laden. Ook zit er in het flashgeheugen een 'SPIFFS': een bestandssysteem dat ervoor zorgt dat je je programma's kunt opslaan, maar ook dat je vanuit je programma's eenvoudig gegevens kunt bewaren.
NodeMCU's hebben een kleine USB conversiechip. Het merk en type hiervan bepaalt, welke USB driver je nodig hebt voor je NodeMCU. De benodigde USB drivers kun je van de website van de fabrikant van de USB conversiechip downloaden. De NodeMCU's van Amica en LoLin maken gebruik van de Silicon Labs CP210. De NodeMCU's van GeekCreit DOIT maken gebruik van de WCH CH340. Het merk van de NodeMCU staat op de achterkant.
Een veelgebruikte programmeeromgeving voor de NodeMCU heet ESPlorer. Deze programmeeromgeving kun je van de website van de auteur downloaden. De download komt als .zip
bestand, die uitgepakt een enkele esplorer.jar
bevat. Het kan nodig zijn om Java op je computer te installeren. Met deze link kun je controleren of je de juiste Java versie geïnstalleerd hebt. Onder bepaalde omstandigheden is het nodig om een aanwezige Java Developmentkit te de-installeren.
Een andere programmeeromgeving, speciaal voor het Windows besturingssysteem, heet LuaLoader. Je kunt dit hier downloaden.
Je NodeMCU wordt op een stukje schuim geleverd. Het schuim zorgt ervoor dat de aansluitpennen van de NodeMCU niet buigen en niet per ongeluk kortsluiting maken. Als je iets op je NodeMCU wilt aansluiten dan is het nodig een breadboard te gebruiken. Hieronder zie je een NodeMCU die op een breadboard is gedrukt. Je ziet dat er boven en onder de NodeMCU een gaatjesrij is vrijgehouden. Hier kun je een draadje inprikken om verbindingen te maken met bijvoorbeeld een sensor.
Met een micro-USB kabeltje voorzie je de NodeMCU (en alles wat er op is aangesloten) van stroom. Ook kun je zo de NodeMCU programmeren. In de volgende paragraaf wordt uitgelegd hoe je met de programmeeromgeving werkt.
- Verbindingsinstellingen: hier kies je de USB poort waarop je NodeMCU is aangesloten. De verbindingssnelheid moet op 115200 zijn ingesteld. Klik op de grote knop om met je NodeMCU te verbinden.
- Terminalvenster: hier wordt de uitvoer van de NodeMCU getoond.
- Bestandsbeheer: met deze knoppen kun je de bestanden op je NodeMCU beheren. Met Refresh ververs je de lijst.
- Programmabeheer: met deze knoppen maak je een nieuw programma aan, bewaar je het programma dat je aan het schrijven bent en open je programma's die je op je computer hebt opgeslagen.
- Editor: dit is het venster waarin je je programma's kunt maken en aanpassen.
- Directe instructies: hier kun je een enkele instructie naar de NodeMCU sturen, die direct wordt uitgevoerd.
Nadat je de NodeMCU op je computer hebt aangesloten en de programmeeromgeving hebt geopend, kies je de juiste USB poort en stel je de verbindingssnelheid in op 115.200 bits per seconde. Je kunt nu de verbinding openen met de grote knop waar de tekst Open op staat. Als je niet direct iets in het terminalvenster ziet verschijnen dan kun je op de Reset knop van je NodeMCU drukken. In het terminalvenster verschijnt de tekst die de NodeMCU verstuurt.
Met het programma blink.lua
laat je een ingebouwde led op de NodeMCU knipperen. Je controleert met dit programma of je alles goed op je computer hebt geïnstalleerd en ziet gelijk je NodeMCU werken.
Je maakt op de hierboven beschreven wijze verbinding met de NodeMCU en kopieert de code van blink.lua
in het programmavenster. Sla het programma op door op het icoon van de diskette te klikken. Er wordt om de naam van het programma gevraagt: voer hier blink.lua in. Na het opslaan wordt het programma naar de NodeMCU verzonden; je ziet de voortgang hiervan in het terminalvenster. Na enkele seconden zie je hoe de led van je NodeMCU gaat knipperen.
Een NodeMCU onthoudt automatisch het laatstgebruikte wifi toegangspunt. Dat betekent dat als je eenmaal je NodeMCU hebt ingesteld om gebruik te maken van een bepaald wifi toegangspunt, de NodeMCU die verbinding dan steeds opnieuw zelf maakt. Om de wifi instellingen goed te zetten kun je gebruik maken van het wifi.lua
script. Je moet in dit script de gegevens van je eigen wifi toegangspunt zetten. Als je het script uitvoert dan zie je op het scherm van je computer of de verbinding is gemaakt.
Je kunt op verschillende manieren sensoren inlezen met je NodeMCU:
- Analoge waarden, zoals die van een LDR of vochtsensor aangesloten op
A0
, inlezen metsensorwaarde = adc.read(0)
- Aan-uit schakelaars inlezen met
sensorwaarde = gpio.read(poortnummer)
. Poortnummer kan hier 0 tot 8 zijn, voor sensoren die zijn aangesloten opD0
..D8
- Speciale sensoren, zoals de DS18B20 temperatuursensor en de DHT22 vochtsensor, hebben eigen manieren om te verbinden met de NodeMCU. In Lua zijn hiervoor speciale instructies opgenomen.
variabele = waarde
local a = 10
b = true
c = false
d = nil
e, f, g = 5, "hallo", 6.1
or
and
< > <= >= ~= == ..
+ -
* / %
not # -
^
if i == 0 then
print("op nul")
else
print("niet op nul")
end
while i <= 5 do
end
repeat
break
until i > 10
for i = 1, 10, 2 do
end
function doedit()
local x, y = doedat(4, 5)
return x^y
end
function doedat(a1, a2)
return a1*2, a2*3
end
x = 5
a = {}
b = {sl1 = x, sl2 = 3}
a[1] = 20
print(a[1])
s = "Hallo wereld"
print(#s) -- 15
t = "123" .. 4 .. "56"
a = 3.1415926
b = a * 2
c = node.random() -- 0..1
d = node.random(10) -- 1..10
file.open("waarden.txt")
file.write(1)
file.write(2)
file.writeln(3)
file.close
file.open("anderewaarden")
a = {}
a = file.readline()
file.close()
resultaat = dofile("luaprogramma")
gpio.mode(1, gpio.INPUT, gpio.PULLUP)
if gpio.read(1) then
print("hoog signaal")
else
print("laag signaal")
end
print(adc.read(0))
tmr.delay(1000)
start = tmr.now()
tmr.alarm(0, 1000,
tmr.ALARM_AUTO,
function()
print("hallo")
end)
Je NodeMCU kan heel eenvoudig een webpagina opvragen met de instructie http.get("http://adres-van-de-webpagina")
. Sommige webpagina's voeren taken voor je uit, voordat ze de pagina tonen. Ze kunnen bijvoorbeeld een twitterbericht voor je versturen, of namens jou een email verzenden.
Zo'n taak-uitvoerende-website is het gratis IFTTT.com, wat voor IF This Then That staat ("als dit, dan dat"). Je kunt met IFTTT instellen dat als je er een speciale pagina (je noemt dat een websocket) opvraagt, IFTTT voor jou een activiteit uitvoert. Je maakt, zoals IFTTT het noemt, een applet. Het adres van die speciale pagina kopieer je in je NodeMCU. Nu kan je NodeMCU op ieder moment die applet aanroepen, bijvoorbeeld als er een nieuwe sensorwaarde beschikbaar is. Je kunt die sensorwaarde zelfs meegeven bij het aanroepen van de speciale pagina. Zo kun je bijvoorbeeld een Google spreadsheet met sensorwaarden laten vullen, of IFTTT een slimme thermostaat laten aansturen.
Een andere gratis taak-uitvoerende-website is ThingSpeak.com. ThingSpeak bewaart sensorgegevens voor je en maakt er mooie grafieken van. Je kunt nieuwe sensorwaarden ook weer met de http.get
instructie verzenden, waarbij de verschillende sensorwaarden in de URL worden meegegeven.
Het meten van de vochtigheid van grond is een interessante IoT toepassing, bijvoorbeeld om gesignaleerd te worden als een kamerplant moet worden bewaterd. Je gebruikt hiervoor een bodemsensor, die bestaat uit twee elektrodes waartussen de weerstand wordt gemeten. De weerstand van grond is evenredig met de vochtigheid ervan: hoe vochtiger de grond, hoe lager de weerstand. Op de grondsensor is een transistor opgenomen die de gemeten weerstand omzet in een spanning. De spanning is laag als er weinig vocht in de grond zit en hoog als er veel vocht in de grond zit.
Je doet een vochtmeting met meetwaarde = adc.read(0)
. Met het voorbeeldprogramma testanalog.lua
laat je de vochtmeting iedere 2 seconden op het scherm zien. Als je wilt, kunt je de gemeten waarde op het internet publiceren, bijvoorbeeld door het met een webhook naar ThingSpeak te versturen. Je kunt daar het voorbeeldprogramma resistancetothingspeak.lua
voor gebruiken. De gemeten weerstand wordt dan iedere 5 seconden naar ThingSpeak gestuurd.
Beweging kun je detecteren met een Passief Infra Rood (PIR) sensor. Deze heeft een schakeluitgang die sluit als er beweging wordt gedetecteerd. Je kunt instellen hoe gevoelig de sensor moet zijn en hoe lang de schakeluitgang na de gedetecteerde beweging nog gesloten moet blijven. Het continue uitlezen van de status van de PIR sensor noemen we ook wel polling, wat niet zo'n efficiente manier is om schakelaars en andere schakelende sensoren uit te lezen. Beter is, om gebruik te maken van events.
Met het voorbeeldprogramma testpir.lua
controleer je of je de PIR sensor goed hebt aangesloten. En als je wilt kun je met IFTTT een actie, zoals een Tweet of email versturen, laten uitvoeren zodra er beweging wordt gedetecteerd. Je gebruikt daarvoor pirtoifttt.lua
.
Je kunt je NodeMCU prima met een USB powerbank (een 5 volt lithiumaccu met een USB aansluiting) voeden. Je zult echter zien dat je programma's dan nog niet zelf opstarten. Om een Lua programma bij het aanzetten van de NodeMCU automatisch te laten draaien, gebruik je een opstartprogramma genaamd init.lua
. Dit programma maak je op de gebruikelijke manier aan, en voorziet het van de instructie resultaat = dofile("luaprogramma")
. Om pirtoifttt.lua
automatisch op te starten kun je het volgende in je init.lua
zetten:
print("5 seconden wachten alvorens te starten")
tmr.delay(5 * 1000000)
dofile("pirtoifttt.lua")
De pauze voor het opstarten is handig voor het geval er een fout in je op te starten Lua programma zit; je kunt dan nog op tijd het opstarten ervan afbreken. Een nog elegantere manier is misschien wel de volgende routine, die het automatisch opstarten afbreekt als er binnen 5 seconden op de FLASH knop wordt gedrukt:
print("Druk binnen 5 seconden op FLASH om de automatische start af te breken..")
tmr.alarm(0, 5000, tmr.ALARM_SINGLE, function() dofile("pirtoifttt.lua") end)
function stopAutoRun()
tmr.stop(0)
print("Automatische start is afgebroken.")
end
gpio.mode(3, gpio.INT, gpio.PULLUP)
gpio.trig(3, "down", stopAutoRun)
Werken met microcontrollers zoals de NodeMCU is heel plezierig en meestal krijg je snel resultaten. Soms zit er echter wat tegen. Hieronder volgt een lijstje aandachtspunten voor als het allemaal niet werkt zoals je dat wilt:
- Je ziet niet de USB poort in de programmeeromgeving verschijnen
Controleer of je NodeMCU is aangesloten. Druk op de Refresh knop gelijk rechts naast de lijst met USB poorten. Staat je USB poort er niet tussen? Dan moet je waarschijnlijk de USB driver nog installeren - Kan geen verbinding maken met de NodeMCU
Controleer dat je de micro-USB kabel hebt aangesloten, de juiste USB poort hebt gekozen, 115200 als verbindingssnelheid heb gekozen en op de Open knop hebt gedrukt. Als je niet nog steeds niets in het terminalscherm ziet, druk dan op de Reset-knop van de NodeMCU - Je NodeMCU lijkt niet te willen werken met drijvende-komma-getallen, of enkele Lua instructies die hier genoemd worden lijken niet op je NodeMCU te werken
Het kan nodig zijn om nieuwe, verbeterde NodeMCU firmware op je NodeMCU te zetten. Volg hiervoor het update firmware stappenplan. - ESPlorer breekt af zodra op de knop Open wordt gedrukt
In heel sporadische gevallen kan het voorkomen dat de Java versie die op je computer is geïnstalleerd niet overweg kan met de USB poorten. Je moet dan een nieuwere versie van Java installeren. Maak hiervoor gebruik van de officiële versie van Java van Oracle.
De NodeMCU firmware bestaat uit een Lua interpreter, SPIFFS en verschillende Lua uitbreidingen, modules genaamd. Er zijn tientallen verschillende modules voor Lua beschikbaar. Allemaal in de firmware opnemen is niet zo handig, omdat de modules ten koste gaan van het beschikbare werkgeheugen van de ESP8266. Voor verschillende doeleinden kan het daarom nodig zijn om een andere NodeMCU firmware te laden. Nieuwe firmware kun je maken met de cloud buildservice NodeMCU Custom Builds. Na een paar minuten ontvang je via email een link naar jouw op maat gegenereerde firmware. Voor het gebruik van de voorbeelden in het boek zijn de volgende modules nodig: bit
, file
, gpio
, http
, net
, node
, rtctime
, sjson
, sntp
, tmr
, uart
, wifi
, ws2812
. Het kan handig zijn om ook enduser_setup
toe te voegen.
Je laadt de firmware in de NodeMCU met een tooltje, esptool.py
, dat geschreven is in Python. Je zult Python moeten installeren om van het tooltje gebruik te maken. Bij de aanroep van esptool.py
dien je ondermeer de naam van de firmware, de USB poort en enkele geheugenlocaties op te geven:
python ./esptool.py --port=/dev/cu.SLAB_USBtoUART write_flash -fm=dio -fs=4MB 0x00000 ./nodemcu-master-22-modules-float.bin
Afhankelijk van de manier waarop je eigen computer is ingericht zal de aanroep er iets anders uitzien. In dit OS X shellscript zie je een uitgebreider voorbeeld.
Alle genoemde onderdelen en het boek Zelf een IoT toepassing maken, zijn online en in de winkel verkrijgbaar bij Okaphone. Ook voor een keur aan sensoren en tips en adviezen kun je daar terecht.
- Programmabeschrijvingen
Beschrijving van de werking van de Lua programma's in deze repository.