Live metingen, heldere Dashboards en directe alerts – IoT met Arduino & Pi

27 Augustus 2025 –

Voorbereiding op de training
In voorbereiding voor een opkomende HBO-minor training maak ik vandaag een opzet waarbij data van verschillende sensoren door een Arduino opgepikt worden. De verzamelde data wordt via een seriële connectie doorgegeven aan een Raspberry Pi. Op deze Raspberry Pi draait een combinatie van Node-RED, InfluxDB2, Grafana en Mosquitto. Hiermee is een complete set aanwezig voor het meten van sensorwaarden, het opslaan van data over een langere meetperiode, het creëren van actiegerichte inzichten en notificaties bij alert-waarden en data-integratie met Mosquitto MQTT.

Benodigdheden en tools
Voor de opzet van deze live sensor processing en dashboarding omgeving gebruik ik:
– Raspberry Pi 5 8Gb
– Raspberry Pi 15.6″ Monitor
– Arduino Uno met USB stekker
– Arduino IDE programmeeromgeving
– DHT11 module
– 10K Potmeter
– Breadboard – 30 pins
– 6 Dupont stekkertjes male – male
– Open source software Node-RED, InfluxDB2, Grafana en Mosquitto MQTT
– VNC Remote Desktop Access

Start met Arduino Uno
Op de Arduino Uno begin ik met een random nummer generator, welke iedere 3 seconde een nieuw random nummer genereert tussen 0–1023. Hiermee simuleer ik een variabele waarde die constant kan veranderen. Via de seriële poort van de Arduino zie ik direct dat er iedere 3 seconde een nieuw nummer verschijnt. Dit wordt mijn basis voor de proof-of-concept van het overdragen van deze data naar de Raspberry Pi. Ik koppel de Arduino los van de Arduino programmeeromgeving en verbind deze aan één van de seriële ingangen van de Raspberry Pi.

// Random number generator test for Arduino Uno
// Every 3 seconds: generate number 0-1023 and send via Serial

void setup() {
  Serial.begin(9600);

  // Een random seed initialiseren met ongebruikte analoge pin
  randomSeed(analogRead(A0));
}

void loop() {
  // Getal tussen 0 en 1023
  int value = random(0, 1024);

  // Versturen via seriële poort
  Serial.println(value);

  // Wacht 3 seconden
  delay(3000);
}

COM-poort identificeren
In de Raspberry Pi omgeving is het niet direct duidelijk op welke COM-poort apparaten aangesloten zijn. Omdat ik exact moet weten naar welke COM-poort geluisterd moet worden, ga ik naar de command prompt en typ: ls /dev/ttyUSB* /dev/ttyACM* Als response krijg ik terug dat mijn poort /dev/ttyACM0 is. Dit is de herkenning van de ATmega16U2 USB-serial chip op Linux of Raspberry Pi. De volgende stap wordt het uitlezen van de seriële poort, en dat ga ik doen met Node-RED.

Node-RED als glue-tool
Node-RED is een visuele programmeeromgeving waarin je met zogenaamde nodes (bouwblokjes), logica en datastromen kan bouwen door ze te verbinden. Deze logica wordt vastgelegd in een flow, die bestaat uit input (seriële poort, MQTT of HTTP), processing (function nodes en filters) en output (dashboard views, datastorage in bijvoorbeeld InfluxDB, maar ook conditionele notificaties als email). De interface verloopt via de webbrowser en is te benaderen via poort 1880: http://<ip>:1880

Node-RED is efficiënt en effectief in het lezen van sensordata, uitvoeren van bewerkingen en berekeningen en het maken van visualisaties met minimale code. Door de integratie met MQTT, HTTP, websockets, databases en dashboards is dit een handige duizendpoot waarmee je geautomatiseerde taken kan verwerken. Eigenlijk kun je Node-RED zien als een grafische ‘glue-tool’ voor IoT en automatisering. Je kunt hardware, software en online diensten aan elkaar knopen zonder veel te programmeren.

Eerste flow opzetten
In Node-RED start ik met een flow en selecteer ik binnen de networkopties de bouwblok ‘serial in’. Ik hernoem deze naar “ArduinoUno” en sleep ook een ‘debug’-blok op mijn flow. Ik verbind beide blokken en kijk of ik connectie kan maken. Dat lukt, nadat ik de baudrate bij beide op 9600 heb ingesteld.

Uitbreiding met sensoren
Vervolgens ga ik opnieuw aan de slag met de Arduino Uno. Ik sluit een potmeter aan op A0, waarmee ik een variabele waarde kan instellen tussen 0–1023. Hiermee simuleer ik een willekeurige sensor. Daarnaast sluit ik ook een DHT11 sensor aan op pin 2. De DHT11 is een thermometer/hygrometer waarvan de waarden continu uitgelezen kunnen worden. Binnen de Arduino-omgeving is een bibliotheek beschikbaar die de gemeten waarden automatisch omzet naar temperatuur in °C en luchtvochtigheid in %.

JSON als dataformaat
Om de dataoverdracht makkelijker te maken, besluit ik het JSON-format te gebruiken. JSON (JavaScript Object Notation) is een lichtgewicht formaat om gegevens op te slaan en uit te wisselen, opgebouwd uit sleutelparen en lijsten. Het is leesbaar voor mensen en eenvoudig te verwerken in scripts. Er is een diepgaande integratie van JSON binnen Node-RED en dat biedt een stabiele integratie. Voorbeeld van het JSON format wat ik toepas:

{"temperature":24.1,"humidity":55.0,"analog":512}

Debug en visualisatie
Terug in Node-RED open ik de debugger van de ruwe data. Ik voeg een JSON-node toe die de inkomende data omzet naar objecten, en controleer met een debug-blok of dit goed gaat. De data blijkt netjes gestructureerd te worden naar de drie variabelen: temperature, humidity en analog. Omdat Node-RED al over interne dashboarding beschikt, voeg ik meteen dashboard-blokken toe om de waarden live te visualiseren en te bekijken via: http://<ip>:1880/ui

Naar langdurige opslag
Node-RED is handig om data te lezen en te bewerken, maar niet ideaal om informatie over langere perioden te bewaren. Daarvoor gebruik ik InfluxDB2. Daarmee kan ik alle data inclusief timestamp wegschrijven, zodat ik later analyses en selecties kan maken.

Installatie van InfluxDB2
InfluxDB2 installeer ik op de Raspberry Pi. Ik update de repositories en zet de InfluxDB2 database op. Binnen deze omgeving moet ik een organisatie en een bucket definiëren om projecten en datasources logisch te structureren. Aan het eind krijg ik een API key die ik veilig moet opslaan, omdat deze bij elke koppeling in Node-RED opnieuw nodig is. De InfluxDB2 omgeving is benaderbaar via http://<ip>:8086/

Waarom InfluxDB2
InfluxDB2 is geoptimaliseerd voor time-series analysis. Het kan hoge schrijfsnelheden aan, voegt automatisch timestamps toe en ondersteunt analyses over tijdsintervallen. Dit verschilt van MySQL, dat beter is voor tabellen met relaties en transacties. InfluxDB gebruikt Flux (de querytaal) voor aggregaties zoals gemiddelden of maxima per tijdsvenster. Dat maakt het zeer geschikt voor sensordata.

Grafana voor dashboards
Voor de visualisatie gebruik ik Grafana. Dit open-source platform ondersteunt InfluxDB2, maar ook MySQL en MQTT. In dashboards kun je interactieve panels maken met grafieken, meters en tabellen, en zelfs geografische visualisaties via map-panels of heatmaps. Een eenvoudig dashboard staat binnen een uur, maar complexe dashboards met meerdere variabelen, alarms en filters kosten meer tijd en ervaring.

MQTT met Mosquitto
Om de omgeving flexibel te maken voeg ik MQTT toe met Mosquitto. MQTT (Message Queuing Telemetry Transport) is een lichtgewicht protocol voor communicatie tussen apparaten, ideaal voor IoT en sensornetwerken. Het werkt via het publish/subscribe-model: sensoren publiceren data naar een topic, en clients abonneren zich om deze te ontvangen. Mosquitto fungeert als broker die dit proces coördineert. Met een MQTT-client op de telefoon, zoals MQTT Dash voor Android, kan ik live meekijken naar nieuwe data. Ook is het mogelijk signalen terug te sturen en daarmee processen aan te sturen.

Conclusie en toepassingen
Het opzetten en inrichten van deze omgeving is boeiend en uitdagend. De combinatie van sensormetingen, dataverwerking, opslag, dashboards en notificaties maakt het een complete IoT-omgeving die in veel situaties toepasbaar is. Met de MQTT implementatie is ook een integratie met domotica mogelijk – deze oplossing kan zo plug & play geïntegreerd worden in bijvoorbeeld Home Assistant. Voor mij zit de waarde vooral in kennisoverdracht, training en het creëren van oplossingen waarin data en inzicht samenkomen.