Temperatuurmeting met een Arduino

blackdog

Golden Member

Hi,

Voor een aantal meetinstrumentjes heb ik temperatuur sensing nodig.
En ik ben aan het worstelen hoe ik dit zal doen met verschillende sensoren.

Display
Om nu ook een aantal zaken te leren door het veel te doen, heb ik diverse sensoren tegelijk weergegeven op een 20x4 display.
Dat was het eerste probleem, daar beeld uit zien te krijgen, naturulijk weer veel tijd verspilt met halfbakken of geen uitleg,
van mensen die zaken op het internet verspreiden...
Maar ik mag niet klagen, het is gratis *grin*
Dan heb ik het over het configureren van de LCD display drivers, met geeft dan geen of "verkeerde" pinnummers op.

Tweede probleem was het aansturen van het display, om aansluitpennen te besparen maak ik gebruik van de handige i2c printjes voor het displays.
Blijkt het driver ICtje er in twee versie te zijn, de Chinesen hebben het er niet over als ze deze verkopen en ze leveren dit rustig door elkaar heen.
Het is iets te moeilijk om er bij te zetten, of het de PCF8574 of de PCF8574A driver IC betreft.
Door deze vele variabelen zoals ook het aantal regels van het display en voor somminge functies moeten zowel de LCD.h als de LiquidCrystal_I2C.h library geladen worden,
gaat het heel veel tijd kosten voor je ook maar iets op het display hebt.
Boeie, ik heb nu deze ervaring en gaat op het mentale lijstje als het dissplay niet wil werken.

Variabelen.
Gebruik je zoals ik nu vier verschillende temp sensoren, dan krijg je als je code van het Internet ript dat er meerdere keren de zelfde variabele wordt gebruikt.
Daar heb ik gelukking direct op gelet en dit is eigenlijk geen groot probeel geweest, meer mijn typefouten bij het aanpassen van de namen.

Dan het Library worstelen.
Dit trad het meest op bij de DS3231 klok IC en de TSIC 506F temp sensor.
Wat betreft het klok IC DS3231, daar zijn vrij veel librarys voor en niet allemaal is het makkelijk de temperatuur er uit te krijgen.
Met de DS3231RTC.h die ik nu gebruik gaat dit goed, deze library is ook goed bruikbaar voor zijn nieuwe zusje de DS3232, deze heeft geen xtal maar een resonator in de chip.
Mijn metingen geven een iets kleinere jitter aan en het lijkt er op dat hij over het temperatuur bereik hier in het LAB, ook iets stabieler is.
Er is ook een voordeel bij de DS3232 dat hij bijna iedere seconde een correctie doet voor de temperatuur invloeden waar het IC aan onderhevig is.
Bij de DS3231 is dit corrigeren 1x per 64 seconden.

TMP37
Dit is een analoge sensor met 20mv/C output.
Om nauwkeurig te kunnen meten voor mijn gekozen temperatuur bereik, heb ik de referentie ingang van de Nano op intern gezet.

c code:

analogReference(INTERNAL);

Voor het berekenen van de code heb ik de referentie spanning van mijn Nano gemeten en dit verrekend met de bitwaarde van de 10bit AD van de Nano

c code:


sensorValue = analogRead(0);
volts = sensorValue * 0.001042;  // convert AD units to volts
// convert volts to celsius
celsius = (sensorValue * 0.001042) // voltsPerDegree;

Dus de 0.001042 is de referentie spanning van de door mij gebruikte Nano gedeeld door 1024.
Ik heb geen middeling gebruikt, een weerstand en een condensator is voldoende om de ruis te beheersen.
Ik ga die middeling nog wel een keer testen, maar dat is voor later.
Door deze manier van gebruik van de TMP37 sensor met de lage referentie spanning van net meer dan 1V,
Krijg ik een hoge resolutie temperatuur meting, de maximale temperatuur is in deze opset gaat maar tot 53,3C.
Daar ik de sensor opset wil gebruiken voor ovens rond de 42C is dit geen enkel probleem.
Voordeel is vrij nauwkeurig, en met een klein beetje inzet zoals ik hier aangaf een hoge resolutie en als je wil zeer snel.

De LM75
Dit IC is weinig speciaal maar wel makkelijk toe te passen via de i2c bus .
De resolutie is niet hoog met zijn 0,5C en verder ook niet heel nauwkeurig met +-2C.
Voordeel is dus de aansluitbus en de redelijk korte conversie tijd van 0,1Sec en de lage kosten, 10 stuks voor dacht rond de twee euro in China.

DS3231 of DS3232
De temp meting van dit IC is bijzaak, de temperatuur nauwkerigheid is -+3C maar kan handig zijn als het voor handen is en je geen sensor wilt toepassen.
Ik kwam met een aantal printjes meeatal uit binnen +-1,5C

Tsic 506F
De fabrikant moet eens goed de oren worden gewassen, mooie producten, slechte documentatie,
onduidelijke Arduino voorbeelden, type nummer op de datasheet heeft geen enkele binding met IC opdruk, dit is geen plaats probleem, enz.
Deze sensor is van de fabriek beter dan de beste PT100 sensor die je kan kopen binnen 5 tot 45C en typical binnen 0,07C.
Nadeel is de prijs voor dit gegarandeerde IC van 0,1C, bij Farnell is hij ex btw net geen 11 Euro...
De resolutie van de TSIC 506F is 0,03C
Voordeel, zeer nauwkeurig, duur t.o.v de andere sensoren, maar betaalbare 0,1C nauwkeurigheid en redelijk snel.

Dit is een plaatje van mijn Nano die vier sensoren uitleest.
De sensoren zitten niet tegen elkaar geplakt en hangen ook niet in een oliebad,
hierdoor zullen ze altijd een andere waarde aangeven ook al zijn ze perfect gelijk, door ondermeer verschillende plekken van het meten van de temperatuur,
Thermische massa enz.
http://www.bramcam.nl/Arduino/Klok/DS3231-13.png

Vooralsnog heel wat ervaring opgedaan met deze testen en misschien voor andederen wat intressante info.

Gegroet,
Blackdog

You have your way. I have my way. As for the right way, the correct way, and the only way, it does not exist.

Ik herken je verhaal met arduino libraries, geeft vaak wel een startpunt waar je mee verder kan. Een sensor die ik zelf regelmatig gebruik is de LM92. Voor het meten van hogere temperaturen (1800°C) is een MAX31855 Module met K Type Thermocouple ook een mooie oplossing

https://www.maximintegrated.com/en/products/analog/sensors-and-sensor-…

[Bericht gewijzigd door Roland van Leusden op donderdag 29 september 2016 23:05:08 (16%)

It's the rule that you live by and die for It's the one thing you can't deny Even though you don't know what the price is. It is justified.

volts = sensorValue * 0.001042;

Blijkbaar is je referentie spanning 1.067 Volt.
Dit kun je ook in je code vastleggen door:

code:


volts = sensorValue * (1.067 / 1024);

Dat heeft hetzelfde effect. Het zijn constanten, dus dan rekent de compiler de waarde uit en gebruikt 0.001042 in de code. Voordeel is dan wel dat je zelf later nog kunt zien waar dat getal vandaan komt.

blackdog

Golden Member

Hi deKees,

Ik heb het juist omgezet, zodat er dan minder gerekend hoeft te worden door de processor en omdat de waarden verder wat dit betreft vast liggen. ?
In deze proefschakeling niet zo van belang, maar pas graag wat ik geleerd heb regelmatig toe om het niet te vergeten.

Als nodig, kan ik het in de opmerkingen boven in de code setten.
Ben verder ook aan het leren de variabelen duidelijk te benoemen.
Daar was ik vandaag mee begonnen omdat ik vier temp sensoren in deze proefschakeling/code heb.
In de voorbeeldcode van sommige sensoren kwam meerdere keren temp en temperature voor, dat werd natuurlijk een chaos ?

Ook het boek waar ik regelmatig in lees, wordt aangegeven dit te doen, zodat je in de code aan de naam van de variabele goed kan afleiden wat de functie/toepassing is.

Het is net als met de analoge electronica, kijken waar de grenzen liggen, soms tijdens het testen het te goed maken en als het werkt, opschonen tot een compact geheel dat nog aan je eisen voldoet.

Roland,
Een leuk IC die LM92, ik zal er wat van bestellen.
Het leuke is dat je altijd de temperatuur op kan vragen ondanks dat hij net met een meting bezig is.
Als nadeel is, dat je maar ongeveer 1 nieuwe meting per seconde krijgt.
Dat maakt hem b.v. ongeschikt voor een aantal oven toepassingen voor mij.
Verder net als de 18D20 0,065C resolutie, wat netjes is.
En geen TO92 behuizing, maar wat natuurlijk ook niet kan met een i2c IC.

Gegroet,
Bram

You have your way. I have my way. As for the right way, the correct way, and the only way, it does not exist.

Op 30 september 2016 01:10:23 schreef blackdog:
Ik heb het juist omgezet, zodat er dan minder gerekend hoeft te worden door de processor en omdat de waarden verder wat dit betreft vast liggen.

Wat dekees probeert te zeggen (en ik ook weer) is dat die (1.067 / 1024) NIET door de arduino maar door jou PC gaat worden uitgerekend. Die 1.067 / 1024 is een constante uitdrukking en wordt uitgerekend tot .0010419 en DIE constante gaat je binary in. Niet de 1.067 en 1024. (Hmm. De optimalisatie: float.exponent -= 10; vind ie niet voor de deling door 1024. :-( )

Bram, als je me je adres mailed, stuur ik je een MCP9700 om te testen (als je dat leuk vind). (je mag SOT23 of TO92 kiezen, maar ik gok dat je voor TO92 kiest).

four NANDS do make a NOR . Kijk ook eens in onze shop: http://www.bitwizard.nl/shop/
blackdog

Golden Member

Hi Rogier, :-)

Hartelijk dank voor je aanbod, dit wordt gewardeerd, maar de MCP9700 is hier ruim voorradig.
Zie het plaatje hieronder, er liggen meerdere typen in een vakje, omdat ik te weinig sorteerdozen had, dit is niet echt efficient...
Deze collectie is anwezig i.v.m. mijn vele frutten met oventjes.
http://www.bramcam.nl/Arduino/TempSensor/Sensor-Doos.png

De eerste opmerking van dKees en nu die van jouw, vind ik eigenlijk nog belangrijker...
Dus de formules die je in de code zet, worden door de compiler al uitgerekend als dit al mogelijk is?
Als dit waar is, dan is mijn actie verspilde moeite en levert minder goed leesbare code op :-)

Gegroet,
Blackdog

You have your way. I have my way. As for the right way, the correct way, and the only way, it does not exist.

Zolang de compiler weet wat de getallen zijn, en de getallen liggen vast, dan rekent de compiler alles uit en komt alleen het eindresultaat in de arduino terecht.

Dus hier moet de arduino gaan rekenen, want de getallen staan in variabelen:

code:


  float  Vref = 1.067;
  int    Resolution = 1024;
  float  Scaling = Vref/Resolution; //< Arduino gaat rekenen.
  Volt = SensorValue * Scaling;     //< Arduino gaat rekenen.

Maar als je de getallen als constant declareert dan rekent de compiler alles uit. Alleen de laatste vermenigvuldiging is voor de Arduino want SensorValue is een variabele.
Bijvoorbeeld:

code:


  const float  Vref = 1.067;      //< Geeft niks in de arduino
  const int    Resolution = 1024; //< Ook niks in Arduino
  const float  Scaling = Vref/Resolution; //< Ook niks in arduino
  Volt = SensorValue * Scaling;   //< Arduino gaat rekenen met Scaling = 0.001042
blackdog

Golden Member

Hi deKees, rew,

Duidelijke uitleg, mijn dank.
Ik heb deze week en vorige week gelezen over de "const" functie,
en met deze uitleg zal ik het nu gaan toepassen.
Ook in de stukjes code die ik gepikt heb :-)

Trouwens, de TSIC 506F en de SMT172 zijn beide de nieuwste generatie temperatuur sensoren die met PWM werken.
Het voordeel is ondermeer een hoge nauwkeurigheid en snelle conversie.

Voor mijn oven projectje heb ik meerdere typen sensoren nodig, afhankelijk van de toepassing in deze oven, zijn andere eigenschappen belangrijk.

Voor de binnenste oven wil ik lange termijn de temperatuur meten, dit is niet gekoppeld aan de sensor die de oven op temperatuur houd.
De sensor die te temperatuur op 42C gaat houden is een PT100 van hoge kwaliteit of een zeer goede NTC.
Bij de duurdere NTC weerstanden die ik hier heb, wordt jammer genoeg de lange termijn stabiliteit slecht gespecificeert.
Wat denken jullie van een NTC die 15 euro kost en dat er dan wordt opgegeven: "lange temijn stabiliteit 1%" je kan en net zo goed "broodje kaas" neer zetten!

Ik weet van b.v. de HP ovens, dat daar ook met NTC weerstanden wordt gewerkt en die zeer stabiel zijn.
Met een Arduino kan ik nog direct een NTC meten maar bij een PT100 kan dit niet zonder extra electronica.
Dit staat er trouwens bij een goede PT100 sensor, en dan zo'n klein keramieke plaatje: Stability: ±0.05% dit lijkt echt beter dan de 1% van hierboven.
Maar als dit niet verder gespecificeert wordt, is het weer een ander soort broodje kaas :-)

Dus, ik heb een sensor nodig die zeer stabiel is en klein, omdat hij in de wand van mijn oven komt voor het op 42C houden van de oven.
En dan heb ik ook een sensor nodig die ik met een microcontroler kan uitlezen en kan loggen om te zien hoe goed de temperatuur regeling is van deze oven.

Dan zijn we er nog niet, er is ook een buiten oven en de schakeling die de oven "snel" naar de gewenste temperatuur moet brengen (pre heath),
met in verhouding veel vermogen (begrenst op 15-Watt per oven) als de buiten oven in balans is verbruikt deze ongeveer 3-Watt, afhankelijk van de isolatie.
Komt de oven vanuit koude start ongeveer 2C beneden de eindtemperatuur, dan wordt de "pre heath" afgeschakeld en gaat de precisie regeling zijn werk doen.

Voor de buiten oven wil ik dan gaan testen om de microcontroler dit helemaal te laten regelen, zowel de "pre heath" als ook de precisie regeling.
Dit steld weer andere eisen aan de sensoren, de 18D20 is in de 12 bit mode nauwkeurig genoeg maar ook te traag.
Ik had al eerder aangegeven dat de snelheid van de sensoren niet bepalend mogen zijn voor de regel loop.
Neem b.v. de sensor die Roland voorstelde dat was de LM92, het is een leuke i2c sensor maar heeft natuurlijk goede en slechte kanten.
Je kan altijd direct de temperatuur opvragen maar de conversie tijd kan tot 1 Seconde oplopen.
Iedere keer dat je de temperatuur hebt opgevraagt start hij opniew de conversie,
binnen 1S weer de temperatuur opvragen, betekend dat je nooit weet wat de echte temperatuur is :-)

Ik denk dus dat ik voor de buitenoven een lineaire sensor ga hebruiken met de ADC van de microcontroler.
Gisteren heb ik nog wat zitten lezen over "oversampling" en middeling voor de Arduino.
Hierdoor kan ik één a twee bitjes meer uit de Arduino persen, als ik mijn sensoren niet te ruisarm maak zoals met de RC comby die voor de analoge ingang van de Arduino zit.
De sensor moet juist ruisen anders werkt de oversampeling niet :-)
Natuurlijk heb ik hier ook AD conversters liggen die meer zijn dan de 10 bit van de meeste microcontrolers,
maar ik wil zo min mogelijk extra electronica.
Nog mooier is gewoon een Teensy te gebruiken, deze zijn ondertussen ook binnen gekomen en de AD converters hiervan zijn een stuk beter dan die van de Arduino.
Voor enkel oventjes is de 20 Euro van deze microcontroler geen probleem t.o.v de 2 Euro van een kloon Arduino.

Zoals het nu misschien wel duidelijk is, gebruik ik meerdere sensoren die aan verschillende kwaliteits eisen moeten woldoen.
Het is knap lastig goede beslissingen te nemen als sommige specificaties van de makers van deze sensoren drijfzand zijn...

Wat komt er in de ovens
Verouderde spannings referenties.
Deze referenties zitten op ongeveer 0,5 tot 1PPM/C gevoeligheid voor de omgevings temperatuur.
Een middelmatige oven is reeds voldoende om dit voor normale LAB temperatuur variaties (15 tot 30C) weg te regelen.
De ruis van de referenties wordt/is hier meestal dominant 0,001 tot 1Hz. of zelfs nog lager in frequentie,
hier is documentatie over maar gaat voor hier te ver.
Maar er zijn nog meer onderdelen die temperatuur gevoelig zijn, zoals de weerstanden en ook de opamp die ik toepas.
De binnen oven moet luchtdicht/vochtdicht worden en dit ook allemaal gemeten met sensoren en dat wil ik ook allemaal loggen.

Gegroet,
Blackdog

You have your way. I have my way. As for the right way, the correct way, and the only way, it does not exist.

Op 1 oktober 2016 12:32:00 schreef blackdog:
De sensor moet juist ruisen anders werkt de oversampeling niet :-)

De ruis in de metingen van een arduino zijn ook als IK m'n best doe om zo min mogelijk ruis te krijgen al voldoende om het oversamplen te laten werken. Anders gezegd: ik heb nog nooit ruis hoeven toevoegen. Ga er van uit dat de ADC zelf al voldoende "ruist".

four NANDS do make a NOR . Kijk ook eens in onze shop: http://www.bitwizard.nl/shop/