Dolda Arduino termometer
Läst temperaturgivare
Här är koden för att läsa raw-data:
lång readTemp() {
Läs temperaturgivare mot 1.1v referens
#if defined(__AVR_ATmega32U4__)
ADMUX = _BV(REFS1) | _BV(REFS0) | _BV(MUX2) | _BV(MUX1) | _BV(MUX0);
ADCSRB = _BV(MUX5); den MUX5 biten är i registret ADCSRB
#elif definieras (__AVR_ATtiny24__) || defined(__AVR_ATtiny44__) || defined(__AVR_ATtiny84__)
ADMUX = _BV(REFS1) | _BV(MUX5) | _BV(MUX1);
#elif definieras (__AVR_ATtiny25__) || defined(__AVR_ATtiny45__) || defined(__AVR_ATtiny85__)
ADMUX = _BV(REFS1) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1) | _BV(MUX0);
#else
ADMUX = _BV(REFS1) | _BV(REFS0) | _BV(MUX3);
#endif
Delay(2); Vänta på ADMUX inställning att bosätta sig
ADCSRA | = _BV(ADSC); Starta konvertering
samtidigt (bit_is_set(ADCSRA,ADSC)); mäta
uint8_t låg = ADCL; måste läsa ADCL första - det sedan Lås ADCH
uint8_t hög = ADCH; låser upp både
långa leda = (hög << 8) | låg; kombinera två
returnera resultat;
}
Massera rådata
När du har raw-data, kan du kalibrera den genom att mäta två kända temperaturer och skalning så är lämpligt. Här är en enkel liten funktion att utföra den normaliseringen:
flyta normalizeTemperature(long rawData) {
ersätta dessa konstanter med dina 2 datapunkter
Detta är prov värden som kommer att få dig i Division (i grader C)
flyta temp1 = 0;
långa data1 = 274;
flyta temp2 = 25,0;
långa data2 = 304;
beräkna skalfaktorn
flyta scaleFactor = (temp2 - temp1) / (data2 - data1);
nu beräkna temperaturen
float temp = scaleFactor * (\Data - data1) + temp1;
returnera härda;
}
Kalibrera
För att få fyra konstanterna behövs, enkelt springa skiss/program kallelse den funktion vid rumstemperatur. Notera temperaturen och rådata punkt. Ange dessa värden för antingen uppsättning datapunkter. Därefter antingen sätta din Arduino i kylen eller i ugnen (på en riktigt låg nivå) och mäta dina andra två datapunkter. Ersätta de fyra konstanterna med dina data. Det spelar ingen roll som beställer du lista dem. Du kan också ange data i Celsius eller Fahrenheit. Linjär beräkning är oberoende av enheter som du är konsekvent i vilket system du använder.
Jag har testat denna kod på Leonardo, men det bör också arbeta på Uno och ATtinyx4 & ATtinyx5-serien chips också. Om du gillar detta trick, det finns en kamrat instructable /artikel på att mäta Vcc använda den interna 1,1 volt referens som kan vara av intresse också.