Zelf een temperatuur- en luchtvochtigheids-sensor in elkaar knutselen

Een NodeMCU, een AM2320 en een beetje knutselwerk

Ongeveer een half jaar geleden had ik bij Tante Ali wat sensoren en microcontrollers besteld. Eigenlijk zou ik onder andere - geïnspireerd door een howto van Franck - mijn deurbel "slim" gaan maken, maar dat liep even iets anders. Een pasgeborene doet dat met je plannen.

Een half jaar verder heb ik een deel van de plannen wel voltooid: ik weet nu wanneer de wasdroger op zolder aan staat, en ik kan niet wachten om te vertellen hoe dat werkt. Dit wordt er eentje met kneiterveel informatie, een boel links, en een stukje solderen.

Dat begon eigenlijk met het plan om een soort van weersensor te brouwen: temperatuur, luchtvochtigheid, licht. Dat laatste is er even afgevallen, maar het stukje temperatuur en luchtvochtigheid is aardig gelukt. En eigenlijk is het niet eens moeilijk.

Men neme:

  • Een microcontroller - ik heb een "D1 mini" met - als ik het goed heb - een ESP12 erop gebruikt, deze, maar er zijn genoeg varianten van op de markt die allemaal redelijk compatible zijn met de Wemos D1 mini. Beetje shoppen, meer dan een euro of 3 moet je er niet aan kwijt zijn. Belangrijkste is dat het wel in de ESP8266-familie zit, en dat er (voor dit doeleinde) tenminste één GPIO-pin vrij is. Uiteindelijk had het met een ESP01 ook nog wel gekund.
  • Een sensor - ik heb voor de AM2320 gekozen. Die zou iets preciezer moeten zijn dan de goedkopere DHT11 en DHT22. Deze sensor meet zowel de temperatuur als de relatieve luchtvochtigheid. Even een datasheet erbij snorren die je vertelt welk pinnetje wat doet is wel handig.
  • Een breadboard (om te ontwikkelen), wat dupont-draadjes, een kek doosje om het ding in op te bergen, en een USB-kabel om de microcontroller te programmeren en van stroom te voorzien.

Assemblage, of "hoe sluit ik zo'n sensor aan"

Een kwestie van instructies volgen. In de datasheet worden de pinnen van de sensor benoemd als VDD, SDA, GND en SCL.

  • VDD kom je op de meeste sensoren wel tegen en kun je beschouwen als de "plus"-pool. Meestal gaat daar 3,3V of 5V op, of het kan allebei, of misschien nog wel hogere voltages, ook. De datasheet is je vriend, en zolang je binnen de grenzen blijft is het goed.
  • GND is de Ground-pin, en ook die kom je altijd wel tegen. Je kunt die als de "min"-pool zien. In je installatie knoop je meestal alle GND-pinnen bij elkaar. Vandaar die plus- en min-rijen op een breadboard.
  • SDA en SCL zijn bedoeld voor de data-overdracht. Deze sensor gebruikt een I2C-interface, waar een hele bak technisch jargon achter schuiltgaat dat we verder negeren. In ieder geval komen we diezelfde poortjes ook tegen in de pinout van de controller, waar ze op D2 en D1 zitten.

We sluiten, en daar is zo'n breadboard wel even handig voor als je nog aan het uitproberen bent, de boel aan. VDD en GDD gaan naar respectievelijk de 5V- en G-pin van de controller, en SDA en SCL gaan naar de twee GPIO-poortjes. Dat ziet er dan ongeveer als volgt uit:

Microcontroller en sensor aangesloten op een breadboard

Prachtig, niks meer aan doen, volgende patiïent.

Software

De microcontroller moet nog wel even verteld worden hoe de sensor moet worden uitgelezen en wat er met die data moet gebeuren. Daarvoor moeten we een stukje firmware in elkaar fabrieken, iets dat verdacht veel als systeemprogrammeren klinkt, maar dat tegenwoordig redelijk versimpeld is tot een configuratiebestand maken. Ik gebruik daarvoor ESPHome, maar er zijn ook andere platforms. ESPHome is een schil om een hele sloot andere pakketten en libraries heen, waaronder PlatformIO (specifiek voor de D1 mini), libraries voor diverse sensoren (waaronderde AM2320) en tooling om firmware samen te stellen en naar je microcontroller te uploaden.

Het idee is om een configuratie aan te maken die zorgt dat de controller verbinding maakt met het wifi-netwerk, eens in de zoveel tijd de sensor uitleest, en de waardes dan naar Home Assistant toe blaft. Zo'n configuratie kan er als volgt uitzien:

esphome:
  name: temp_sensor
  platform: ESP8266
  board: d1_mini

wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password

captive_portal:

ota:

logger:

api:

i2c:

sensor:
  - platform: am2320
    setup_priority: -100
    update_interval: 20s
    temperature:
      name: "Temperature"
      filters:
        - offset: -2.0
        - sliding_window_moving_average:
            window_size: 3
            send_every: 3
    humidity:
      name: "Humidity"

Niet heel spannend, we definieren de controller, zorgen voor een netwerk, vertellen dat we de Home Assitant API willen gebruiken, en voegen de sensor toe. Daarbij is de offset-filter onder temperature wel even interessant - mijn sensor wijkt ongeveer 2°C af volgens mijn niet al te wetenschappelijke doe-het-zelf-ijking, dus daar moet ik voor compenseren. En omdat er ook wat jitter in de gemeten waardes kan zitten, pak ik telkens een lopend gemiddelde van de laatste drie metingen.

Die configuratie laat je compilen (duurt een paar minuten) en uploaden naar je board (duurt een paar seconden), en dan komt het grote moment waarop je je boardje boot en hoopt dat alles werkt. Als het goed is, zie je dan een nieuw device in Home Assistant verschijnen en komen de waardes binnen. Op dit moment mag je jezelf een schouderklopje geven, je hebt het moeilijkste eigenlijk wel gehad!

Verpakken

Dan komt nog de laatste stap: het ding een beetje leuk aankleden zodat het er niet al te ghetto meer uitziet en je je bread board weer voor iets anders kunt gebruiken.

Jammergenoeg heeft de AM2320 hele dunne pootjes, die wel in een breadboard blijven zitten, maar niet in een dupont-kabeltje. Dat heb ik opgelost door een paar dupont-kabeltjes aan één kant te strippen, de draadjes te vertinnen en direct aan het sensortje vast te solderen. Niet het mooiste soldeerwerk ooit, maar het werkt wel:

Ik ben een soldeer-god!

Een paar plakbandjes doen hier net alsof ze krimpkous zijn, en dan kunnen de dupont-connectortjes op de controller worden geprikt:

Creatief met plakband

Tenslotte heb ik in het plastic doosje een paar gaatjes geboord zodat de sensor ook daadwerkelijk wat lucht krijgt om te meten, en de USB-kabel naar buiten kan, en dat is dan dat.

Nu is ons stukje huisvlijt helemaal af en hoeven we ons alleen nog maar druk te maken over de weergave - en eventuele automatiseringen - in Home Assistant, maar dat is voor een volgende post.

Oh, en dat van die wasdroger? Iedere keer als die een ronde wasgoed draait, schieten de temperatuur en vooral de luchtvochtigheid op zolder enorm omhoog. Je kunt dus in de grafiekjes prachtig terugzien wanneer het ding aanstaat, en wanneer-ie ongeveer klaar is...