Temperatuur logger

Om, uit nieuwsgierigheid, te onderzoeken hoe mijn koelkast regelt en reageert op zijn omgevingstemperatuur bouwde ik een simpele temperatuur logger op basis van een Arduino Uno en ingegoten Dallas 1-Wire temperatuursensoren uit China.

De data logger en de omgevingstemperatuur sensor.

Het gebruikte shield is een merkloos “Arduino data logger shield” met daarop een ds1307 I2C real time klok en een SD-kaart slot. Hierop bouwde ik de 1-Wire interface voor ds18b20 sensoren, feitelijk een header en een enkele pull-up weerstand op pin 8. Verder zijn er een kleine groene led om de cpu belasting te tonen en een grotere rode om een waarschuwing te geven dat er geschreven wordt naar de sd kaart, en het te melden als dat onverhoopt mislukt.

Het geheel is op een plaatje aluminium met daar onder een harddisk magneet met plakfluweel geschroeft, zodat het zonder schade als een koelkastmagneet op de deur geplakt kan worden. De verbindingen naar de sensoren in de koelkast en het vriesvak gebruijken flatcables voor een zo goed mogelijke afsluiting van de deuren.

Voordat de datalogger code geladen wordt moet de klok gestart en gelijk gezet worden door middel van bijvoorbeeld het ds1307-voorbeeld dat met de Adafruit RTClib bibliotheek mee komt. Dit programma neemt de tijd van compileren mee als tijd om de klok gelijk te zetten, wat in de Arduino omgeving goed werkt omdat er weinig tijd zit tussen het compileren en de daaropvolgende eerste start van de firmware. De klokt loopt overigens keurig, hij blijft binnen een minuut afwijking per maand.

Ook moeten de unieke 64-bit OneWire adressen van de individuele temperatuursensoren bekend zijn. Deze zijn eenvoudig uit te lezen met het DS18x20_Temperature-voorbeeld van de OneWire bibliotheek. Hierbij worden ze één voor één aan de logger hardware aangesloten en wordt het adres gekopieerd naar de code van de logger.

1-Wire adressen in de code. Deze zijn voor mijn sensoren, en met zekerheid anders dan die van alle andere 1-Wire sensoren.

Als een sensor door de logger vanwegen slecht contact of interferentie een periode niet uitgelezen kan worden is zijn waarde in de log “nan”, van “Not A Number”. Om de sensoren eenvoudig uit elkaar te kunnen houden zijn ze gemerkt met gekleurd PVC tape.

De logging firmware, te vinden op mijn Github, kent systeemtikken van 100 ms. De sensoren worden door een non-blocking routine in twee stappen uitgelezen omdat hier een conversie-wachttijd van 800 ms bij inbegrepen zit. Deze routine heb ik ooit geschreven voor gebruik op de ESP8266. Efficient gebruik van de CPU tijd is hier niet meer dan elegant, het is echter van levensbelang als er nog meer moet gebeuren dan het lezen van de sensoren, zoals het onderhouden van de Wifi verbinding op de ESP.

De gekozen instellingen zijn: 1x per 2s uitlezen, 1x per minuut een gemiddelde temperatuur berekenen en loggen en tot slot deze log 1x per tien minuten naar de kaart schrijven. Er is op de Atmega 328 microcontroller 2 kB RAM, waarvan zo een paar honderd bytes in gebruik zullen zijn voor de verzamelde data voordat deze op de kaart opgeslagen wordt. Dat lijkt nog veilig gezien er bij het compileren 606 bytes voor lokale variabelen over blijven, en werkt in de praktijk goed.

In zowel het vriesvak als de koelkast zijn twee sensoren geplaatst, ´één in een blikje met water en één gewoon los. Dit om tegelijk eens te kijken hoe deze bekende methode voor een betere meting van de temperatuur van een koelkast uitpakt.

Het eerste resultaat is een fraaie grafiek:

Temperatuur in koelkast gemeten met Arduino datalogger.
De temperatuur in de koelkast en het vriesvak over twee dagen.

Hier is te zien dat de duty cycle van het koelen vrij sterk afhankelijk lijkt van de temperatuur. Om een uur of vijf de tweede dag werd de instelling van de mechanische thermostaat omlaag aangepast. Het bevriezen van het water in het vriesvak is in de gele lijn fraai te zien. Later bleek dat hierbij het blik is geknapt door de druk van het ijs! Ook is te zien dat de temperatuur in het blikje met water altijd onder die in de koelkast lijkt te liggen. Komt dit door verdamping? Of wijkt deze sensor af? In het viesvak is de amplitude in het blikje met ijs nog aanzienlijk. Zat de sensor te veel aan de buitenkant in het blik?

Hier is duidelijk ruimte voor nader onderzoek. De logger werkt prima, hij logt weken lang zonder problemen. Ik had nog geen ervaring met loggers. De eenvoud van het gebruik van een SD kaartje in vergelijking met het direct loggen naar de cloud of een eigen server bevalt goed.

Geknapt blikje door het ijs in het vriesvak. Het lijkt er op dat de sensor te zien is, en dus helemaal aan de buitenkant zat.