Een sensornetwerk met MQTT

Schema netwerk Vandaag weer wat (lees: eigenlijk teveel) tijd gehad om verder te werken aan mijn sensornetwerk op basis van MQTT. Ik had een vorige keer al beschreven dat ik op dit moment helaas alleen digitale vochtmeters voor in de grond huis heb (de analoge exemplaren zijn nog onderweg vanuit China). Maar ik had, naast de drie digitale vochtmeters voor in de grond, ook nog een gecombineerde temperatuur/luchtvochtigheid meter (een DHT11) en een lichtgevoelige weerstand beschikbaar, dus in totaal 6 meeteenheden.

Mosquitto
Op de Raspberry Pi had ik Mosquitto draaien, een open source MQTT “broker”, een plek waar de Arduino de gegevens naar toe kan sturen en waar anderen kunnen aangeven dat ze die info dan ook willen hebben. Het betrouwbaar aan de praat krijgen van de koppeling tussen de Arduino en de Raspberry Pi was niet gemakkelijk. Eigenlijk een bekend probleem: ik wilde het te mooi/ingewikkeld doen en was met JSON aan de slag gegaan om in plaats van via 6 MQTT calls, het geheel in één JSON via MQTT call te doen. Om een lang verhaal kort te maken: slecht idee.
Op een gegeven moment liep de Arduino bij het opstarten meteen vast en wel op een manier dat de seriële poort ook niet meer werkte en ik er dus geen gewijzigde scripts op kon zetten.
De oplossing bleek het goed getimed uploaden van het “blink” script waarbij ik de Arduino net op het juiste moment moest aansluiten zodat het uploaden plaats zou vinden voordat het bestaande script de Arduino weer zou doen vastlopen.

Node.js
De volgende uitdaging was het maken van een webpagina waarmee ik op een laptop/iPad etc. de meetwaarden zou kunnen bekijken. Hier duurde het even voordat ik door had waarom de voorbeelden niet op mijn server werkten: ze maakten allemaal gebruik van “sockets” en Mosquitto heeft standaard geen ondersteuning voor sockets.

Het zoeken was daarom naar een oplossing die die ondersteuning kon leveren. Er zijn MQTT brokers die wél ondersteuning hebben voor sockets, maar het bleek met Node.js en een paar gratis libraries (mqttwebserversocket.io) ook op te lossen.

In de afbeelding hierboven zie je één script dat via MQTT verbinding maakt met Mosquitto en ondersteuning voor socket-verbindingen heeft. Het tweede script is een “gewone”/eenvoudige webserver (geschreven voor Node.js). Die doet niet veel, hij levert op verzoek alleen een HTML-pagina aan de browser. In de HTML-pagina zit dan een socket-verbinding met het eerste script. Zodra de sensor een update naar Mosquitto stuurt, dan krijgt de webpagina meteen ook daar een seintje van en kan de pagina bijgewerkt worden. Nice.

mqtt_senser_1_v1

Nou ja, bijna nice dan. Want de eerste versie van de pagina zag er uit als hierboven en dat was natuurlijk nog verre van mooi.
Via deze blogpost kwam ik bij een mooi ontwerp van een pagina met sensordata. De grafieken die er bij zaten vond ik niet zo mooi, die heb ik vervangen door dit script en het resultaat ziet er nu zo uit:

mqtt_senser_1_v2

De woorden OK geven aan dat de grond bij de sensor vochtig genoeg is (we hebben ze op basis van grond met verschillende vochtigheid ongeveer gekalibreerd) , komt hij onder het drempelniveau dan verschijnt het woord DROOG! in het rood.

Ook de luchttemperatuur verandert van kleur afhankelijk van de hoogte: blauw < 10 graden, groen tot 30 graden en rood daarboven. Omdat de planten in de serre staan, ging het daar gisteren omhoog tot 40 graden!

In het plaatje boven bij dit bericht staat ook een tweede Arduino waar een LCD schermpje aan hangt. Die gebruikt wél MQTT om verbinding te maken met de Mosquitto server om de waarden die de eerste Arduino doorstuurt op te halen waarna ze weergegeven worden op het LCD scherm.
Die constructie werkt op zich, maar is lang niet zo mooi als de webpagina. Op de TODO lijst daar staat nog het koppelen van een bewegingsdetector zodat het scherm alleen (automatisch) aan gaat als er iemand in de buurt is.

Meer sensoren
De volgende uitdaging is het koppelen van andere sensoren via 433 Mhz. Ik heb een aantal thermometer/luchtvochtigheid meters die zelfstandig (op batterij) werken. Zo kun je bijvoorbeeld de buitentemperatuur ook meenemen/meten.

Opslaan in database
De Mosquitto server onthoudt alleen de laatste waarde die hij ontvangt. Je kunt dus geen geschiedenis opbouwen/bijhouden. Een optie is om een script te gebruiken dat ook luistert naar de updates en die dan opslaat in een MySQL database. Staat ook op de TODO lijst.

Kortom, nog voldoende werk aan de winkel. 😉

 

0 0 stemmen
Bericht waardering
3 Reacties
Inline Feedback
Bekijk alle reacties
trackback

Een sensornetwerk met MQTT http://t.co/hwMJztvtym

cDR
cDR
10 jaren geleden

Hoi Pierre,

Ik ben hier zelf ook al een ruime tijd mee bezig en heb mijn Arduino inmiddels redelijk vol zitten met sensoren etc, leuk om te zien wat er allemaal mogelijk is.

Ik had het idee om een mqtt2433 tranceiver te maken, maar dit lijkt net teveel voor de Arduino, met name de interrupt voor inkomende 433 Mhz berichten lijkt te locken. Toch is het redelijk functioneel, met onderstaande code kan je via mqtt 433Mhz versturen en soms ontvangen 🙂

Kijk er eens na, misschien scheelt het je tijd; https://github.com/githubcdr/Arduino/blob/master/arduino_mqtt_gateway.ino

Betreft MySQL, hier had ik snel een te grote database voor, ik heb wat geprobeerd met Redis, LevelDB maar ben er mee gestopt, net te zwaar voor een raspi.


cDR

ps.

Ook ik liep tegen de JSON wens aan 🙂