Electronica
Temperatuur dataloggero
TechTalk
Root server » TechTalk » Electronica » Temperatuur datalogger
Een eenvoudige temperatuur datalogger met arduino en een seriele printer. Het is ook mogelijk apparaten te sturen (bijvoorbeeld via solid state relais) als de temperatuur buiten bepaalde grenzen komt.
-

-

Als temperatuursensor heb ik besloten een LM35 te gebruiken. Het voordeel is dat de sensor een gecalibreerde en lineaire signaal afgeeft over een breed bereik (10mV per °C). Een Pt100 of Pt1000; da's goed, maar de weerstand moet omgezet worden in een spanning en het verloop is niet lineair. De LM35 is lineair binnen 1%, wat ruim voldoende is voor deze metingen.

De gebruikte op-amp LM10 beschikt over een programmeerbare spanningsbron, hier ingesteld op 2V. De uitgang kan zowel stroom leveren als stroom opnemen. Dit wordt de referentie (massa) van onze LM35.

De voeding van 12V komt van een voedingsblok of een batterij, de spanning hoeft niet egstabiliseerd te zijn. Alle onderdelen worden op 12V gevoed, de arduino via een externe 7805 (om de ingebouwde regelaar niet over te belasten). De massa van de LM35 is niet 0V maar 2V.

De spanning van 2V is nodig om negatieve temperaturen te kunnen aangeven, waarbij de negatieve spanning gereferenceerd wordt ten opzichte van de 2V. Om dit te bereiken wordt de uitgang van de temperatuurvoeler verbonden met de min via een weerstand van 36kΩ. Om een optimale meting te hebben moet de meetstroom 50µA bedragen.

De op amp dient om de spanningszwaai te vergroetn om het volledig bereik van de omzetter van de arduino te kunnen benutten.

We hebben een uitgangsspanning op de LM35 die van -0.2 tot +0.3V gaat voor een temepratuur van -20 tot +30°C. Met de massa als referentie hebben we een spanning van 1.8 tot 2.3V. Dit is een bereik die te klein is om correct gedigitaliseerd te worden. De spanning moet gaan van 0C (-20°C) tot 5V (+30°C).

Het volstaat nu de numerieke waarde om te zetten in een temperatuurwaarde. De arduino levert een resultaat van 0 tot 1023. Een stap komt dus overeen met 0.049°, een graad is ongeveer 20.48 stappen.

We voeren een temperatuurmeting om de seconde. Indien de temperatuur significant gewijzigd is ten opzichte van de vorige temperatuur drukken we de nieuwe temperatuur af en slaan die op. Een significante temperatuurswijziging is er één van meer dan 9 stappen, dus ongeveer een halve graad.

Indien de temperatuur niet significant wijzigt, dan printen we die toch af om de 10 minuten, en slaan die op als nieuwe waarde.

Ik doe een kleine digitale filtering op de inputwaarde. Bij het inschakelen en na een afdruk doe ik geen meting om meetfouten te vermijden (stroomopname van de printer).

Dit is de afdruk op de serieële printer:

hh:mm:ss ±tt.tt

Het uur wordt aangegeven vanaf het moment van inschakeling, er is geen real time clock.

De arduino beschikt over voldoende digitale uitgangen om verschillende apparaten te sturen indien de temperatuur bepaalde waarden bereikt. Dit stukje moet je zelf programmeren!

#include <SoftwareSerial.h> #define TEMP 1 // Temperatuuringang SoftwareSerial Prn(1,13, 1); int c = -10; void setup() { Prn.begin(9600); Serial.begin(9600); } void loop() { static long mils, mil; static byte ss, mm, hh, i, tt[4]; static int tempi, tempo, tempp; static float tempf; static bool pos, be = true; mil = millis(); if (mil - mils > 1000) { mils = mil; ss++; if (ss > 59) { mm++; ss= 0; if (mm > 59) { hh++; mm = 0; } } c++; if (c > 0) { tempi = analogRead(TEMP); Serial.print(tempi); if (be) { be = false; tempf = tempi; } tempf = 0.8 * tempf + 0.2 * tempi; if ((c > 10 && abs(tempi - tempo) > 9) || c > 600) { c = -5; tempo = tempi; tempp = (tempf * 4.95) - 1850; Serial.print(" "); Serial.print(tempp); pos = tempp < 0; tempp = abs(tempp); for (i = 0; i < 4; i++) { tt[i] = tempp % 10; tempp = tempp / 10; } if (hh < 10) Prn.print("0"); Prn.print(hh); Prn.print(":"); if (mm < 10) Prn.print("0"); Prn.print(mm); Prn.print(":"); if (ss < 10) Prn.print("0"); Prn.print(ss); Prn.print(" "); if (pos) Prn.print("-"); else Prn.print("+"); if (tt[3] == 0) Prn.print(" "); else Prn.print(tt[3]); Prn.print(tt[2]); Prn.print("."); Prn.print(tt[1]); Prn.print(tt[0]); Prn.print(" ("); Prn.print(tempo); Prn.println(")"); } Serial.println(); } } } Er is ook een output via de standard seriele poort om de werking van de software te controleren in de IDE. Zo zie je ook of de datalogger correct werkt, de transmit-led licht kortstondig op iedere seconde.

Rechts de bijna complete datalogger met een arduino en een printer. Er ontbreekt enkel een printje met op-amp (LM10) om de signalen van de LM35 te versterken en van een referentieniveau te voorzien. Op de print zit ook een zware 7805 die de 5V levert aan de printer en arduino.

Binnen enkele dagen voeg ik er een module met SD-kaart om de gegevens ook weg te schrijven.

Publicités - Reklame

-