Arduino-temperatuurrecorder
Met de kleine Arduino Uno kunt u met weinig kosten een eindeloze hoeveelheid alleraardigste projectjes bouwen. Hier gaat het om een temperatuurlogger die op een display de gemeten waarden van de afgelopen 24 uur toont. De software is bijzonder – omdat alle functies en bewerkingen zonder de hulp van externe bibliotheken worden gerealiseerd.
De temperatuurrecorder meet de temperatuur in de loop van een dag en toont de gemeten waarden op een grafisch display. Wanneer een nieuwe meetwaarde wordt toegevoegd, wordt de curve op het display één pixel naar links verschoven, zodat de oudste waarde verdwijnt en de nieuwe waarde wordt toegevoegd. Het meetinterval kan eenvoudig worden gewijzigd om snellere temperatuurveranderingen te registreren, bijvoorbeeld tijdens regelprocessen.
De schakeling van figuur 1 toont de (niet meer dan) drie componenten (plus een beetje passieve periferie) van onze mini-temperatuurrecorder.
Programmeerbare temperatuursensor
De DS1631-temperatuursensor meet temperaturen tussen –55 °C en +125 °C, in het bereik van 0...70 °C met een fout van ±0,5 °C. Het meetresultaat wordt opgeslagen in een register met een resolutie van 9...12 bit (door de gebruiker in te stellen) en kan daar worden gelezen. Met een voedingsspanning van 3,0...5,5 V is de sensor geschikt voor gebruik met een grote verscheidenheid aan microcontrollers. En wat tegenwoordig niet meer vanzelfsprekend is: de DS1631 is niet alleen als SMD-component leverbaar, maar ook in een DIP-behuizing.
De DS1631, waarvan het adres programmeerbaar is via de pinnen A0...A2, communiceert met de besturing via een I2C-bus. In het (interne) blokschema van de sensor (figuur 2) zien we de configuratieregisters die door de controller worden beschreven, en een read-only temperatuurregister waar de controller de gemeten temperatuur uit leest. De sensor wordt door de Arduino-temperatuurrecorder in continu-modus met een resolutie van 12 bit gebruikt.
Met de beide registers TH en TL kan een hysteresis worden gespecificeerd, waardoor de DS1631 als thermostaat (met schakeluitgang TOUT) kan worden gebruikt. Van deze functie wordt hier echter geen gebruik gemaakt.
Een geschikt display
Het is tegenwoordig gebruikelijk om grafische displays met een seriële bus (I2C of SPI) te gebruiken. Maar omdat de temperatuursensor al is voorzien van een I2C-bus en slechts drie I/O-pinnen van de Arduino in beslag neemt, zijn er voldoende pinnen beschikbaar voor een parallelle aansturing van het display. Dat heeft geen speciale voor- of nadelen maar spaart een paar cent kosten uit.
Bruikbare displays met 128x64 pixels zijn in overvloed leverbaar (Visay, Lumex, Winstar...) en worden voor minder dan € 10 aangeboden op ebay en consorten. Grootte en kleur zijn geheel naar uw smaak, u moet er alleen maar op letten dat de pinning (zie kader) klopt – er bestaan namelijk verschillende aansluitvarianten.
Het grafische display (figuur 3) toont een plot van 108 temperatuurmeetwaarden in een coördinatensysteem. Als de 108 waarden moeten corresponderen met 24 uur, is de resolutie van het display in de tijd gelijk aan 800 s, iets minder dan een kwartier. De momentele temperatuur wordt in de rechterbovenhoek van het display weergegeven. Het coördinatensysteem is overigens niet rigode, de vertical as kan worden verschoven als dat nodig is.
Het rekencentrum
De derde component, de Arduino Nano, start de temperatuurmetingen, registreert de gemeten temperatuurwaarden en rekent deze om naar correct op het display geplaatste pixels.
Sketch zonder bibliotheken
Al meteen valt bij het goed becommentarieerde sketch [1] op dat er helemaal geen externe bibliotheken zijn ingesloten. Alle schrijf- en leesbewerkingen met de sensor en met het display worden uitgevoerd met de middelen die de Arduino IDE ter beschikking stelt.
De belangrijkste functies staan aan het eind van de sketch. Het initialiseren van de controller, de temperatuursensor en het display gebeurt in de setup-functie. In de hoofdroutine loop worden de gegevens van de temperatuursensor uitgelezen (read_temp) na aanroep door de timingklok zijn opgeroepen (meas_flag==1); hieruit wordt de gemeten temperatuurwaarde berekend (cal_temp). De variabele wordt op nul gezet bij over- of onderschrijden van de maximaal weer te geven grenswaarden van –23 °C en +40 °C. Hieruit wordt de waarde van de verticale as berekend (cal_measval), de corresponderende data voor het laden van het display bepaald (set_measure(measval)) en ten slotte wordt het display daarmee bijgewerkt. Als voorbereiding op de uitvoer van de volgende meting worden de pixelgegevens van de temperatuurwaarden één pixel naar links verschoven, zodat de oudste meetwaarde verdwijnt.
De timingroutine is de Interrupt Service Routine die helemaal aan het einde van de sketch staat. Hier wordt het meetinterval ingesteld op 800 s, zodat de in totaal 108 weer te geven meetintervallen één keer per 108*800 s = 24 uur wordt doorlopen. Om de sketch te testen, kunt u het interval verkorten tot bijvoorbeeld 2 s.
De aansturing van de sensor staat ook vrij ver onder in de schets. Daarbij wordt de 2-Wire hardware-interface van de controller (A4 voor SDA en A5 voor SCL) gebruikt. In de functie write_to_config het configuratieregister geschreven. Met TWDR=0xAC wordt het configuratieregister benaderd en met TWDR=0x0x0C de 12-bit continu-modus geselecteerd. Vervolgens worden met de functie start_convert de metingen gestart (TWDR=0x51).
De functie read_temp zorgt ervoor dat de twee bytes van het register met de actuele temperatuurwaarde na elkaar (TWCR=0x84) worden gelezen en worden opgeslagen in de variabelen temph en templ. De functie cal_temp zet dan de beide binaire waarden om in de signed float-variabele temp.
De 64 horizontale rijen van de 128x64 dot matrix van het display zijn verdeeld over een temperatuurbereik van –23...+40 °C, de 128 verticale kolommen in 19 pixels voor de weergave van de temperatuurschaal en 109 pixels voor de temperatuurcurve. Het display zelf wordt aangestuurd door een segmentdriver voor de linkerhelft (CS1) en een voor de rechterhelft (CS2), opgesplitst in acht over elkaar liggende pagina’s met elk 64x8 bits.
Het programma in vogelvlucht
In het array num[11][5] is vastgelegd hoe de cijfers van de actuele temperatuur in de rechterbovenhoek van het display – dus welke pixels zwart moeten zijn. In het array dmask[8][128] wordt de volledige inhoud van het display opgeslagen om de meetwaarden na elke nieuwe meting één pixel naar links verschoven te kunnen weergeven.
De daaropvolgende functies worden gebruikt om het display aan te sturen: set_ytics en set_ylabels tekenen de assen met de bijbehorende temperatuurschaal, shift_left verschuift de vorige temperatuurcurve één pixel naar links, set_meas bepaalt met welke waarde en op welk punt de nieuwe meetwaarde in dmask wordt geladen en load_gdisp laadt het display met de in dit array opgeslagen gegevens. Tenslotte wordt met load_num de laatste meetwaarde getalmatig in de rechterbovenhoek weergegeven, als er geen meetwaarden in dit gebied zijn (anders wordt de getalwaarde verder naar onder verschoven).
De software met Duits- en Engelstalig commentaar worden gedowload van de projectpagina bij dit artikel.
----------------------------------------------------------------------------------------------------------------------------------------------------
Wilt u meer van die fantastische Elektor-artikelen?
--> Neem vandaag nog een abonnement op Elektorlabs - u mist nooit meer een artikel, project of handleiding!
----------------------------------------------------------------------------------------------------------------------------------------------------