Hi,
Voor de Reisreferentie wil ik een hoge resolutie temperatuur meting hebbem.
Dit heb ik uiteindelijk voor elkaar door een TMP37 sensor welke 20mV/C als output geeft en een bepaalde instelling van mijn microcontroler.
Deze microcontroler welke een Adafruit Adalogger M0 en deze bevat een SAM21 chip.
De 1V interne referentie maakt wel dat ik niet verder dan 50C kan meten, wat verder niet van belang is omdat de oven rond de 42C staat ingesteld.
Eert even mijn vraag en de code waar het nu over gaat.
Om voldoende ruisonderdrukking te krijgen wordt hier een waarde van 1024 gebruikt.
Dit werkt verder goed.
Als de Referentie in werking is en dus de processor uit de slaapstand is gehaald, dan is middelen over 1000 metingen geen enkel probleem.
Maar wat gebeurd er als de processor in de slaapstand gaat en zeg 1x per 10 minuten een batterij meting doen en een temperatuur meting dit naar de micro SD gecopieerd wordt.
Blijft de waarde van de "filteraccumulator" behouden?
Als deze opnieuw moet worden opgebouwd kan dit 15 a 20 seconde duren voor hij weer stabiel is.
En dat is wat lang en kost daardoor te veel energie uit de batterijen.
c code:
// https://www.felixdonkers.nl/2012/07/smart-sensor-filtering/
//
// Code voor het uitlezen van een TMP37 temperatuur sensor met een hoge resolutie en lage ruis
const int N = 1024; // aantal te middelen meetwaardes
int meetwaardes[N]; // opslag van individuele meetwaardes
int filteraccumulator = 0; // optelsom van alle individuele meetwaardes
int i = 0; // meetwaardeteller
int filterwaarde = 0;
unsigned long tempReading;
float adcTemp;
float uref = 1;
float tempA;
float temp;
void setup() {
Serial.begin(9600); // open a serial connection
analogReference(AR_INTERNAL1V0); // Gebruik de interne 1V ADC referentie
analogReadResolution(16); // Gebruik de 16 Bit resolutie
}
void loop(){
filteraccumulator -= meetwaardes[i]; // vergeet oudste meetwaarde
meetwaardes[i] = analogRead(7); // Bewaar nieuwe meetwaarde
filteraccumulator += meetwaardes[i]; // Accumuleer nieuwste meetwaarde
i++; i %= N; // Teller loopt van 0 tot N-1
filterwaarde = filteraccumulator/N; // bereken de gemmiddelde waarde
tempA = filterwaarde * (uref/65534.0); // Tussenwaarde berekening met Uref en de 16 bit waarde
temp = tempA / 0.02; // Laatste stap berekening, 0.02 is het aantal mV/C van de TMP37 sensor
Serial.println(filterwaarde);
Serial.println(temp, 3);
delay(10);
}
Dit is een stukje output van de serial monitor.
De loop code wordt naturulijk een stuk complexer en daardoor slomer wat resulteerd in een nog lagere tijd om een stabiel waarde te krijgen.
Maar ik kan ook alleen de omgevings temperatuur loggen en de oventemperatuur niet wegschrijven tijdens het reizen.
Dan nog dit om wat duidelijker te maken.
Ik ben niet in precies de temperatuur te weten van de oven.
Deze wordt ondermeer bepaald door deze onderdelen.
De nauwkeurigheid van de gebruikte TMP37.
De drift van de gebruikte TMP sensor.
De stabiliteit van de Interne referentie van de SAM21 controler.
De drift van de interne referentie of externe referentie.
De stabiliteit en lineairietijd van de SAM21 ADC.
Ik wil dus een mogelijkheid hebben eventueel de drift van de oven kunnen zien met een resolutie die hoog genoeg is.
Op het ogenblik ben ik bezig uit te zoeken hoe goed de SAM21 controler is bij temperatuur variaties.
Een andere optie is een ADS1115 te gebruiken dan heb ik zeker een 15 Bit ADC met al een lage ruis.
Maar goed de vraag is dus blijft dit dus behouden als er naar de slaapstand wordt gegaan en weer wakker wordt => Blijft de waarde van de "filteraccumulator" behouden?
Dank en groet,
Bram