Leyendo el Sensor de temperatura
Aquí está el código para leer los datos en bruto:
long readTemp() { // Read temperature sensor against 1.1V reference #if defined(__AVR_ATmega32U4__) ADMUX = _BV(REFS1) | _BV(REFS0) | _BV(MUX2) | _BV(MUX1) | _BV(MUX0); ADCSRB = _BV(MUX5); // the MUX5 bit is in the ADCSRB register #elif defined (__AVR_ATtiny24__) || defined(__AVR_ATtiny44__) || defined(__AVR_ATtiny84__) ADMUX = _BV(REFS1) | _BV(MUX5) | _BV(MUX1); #elif defined (__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); // Wait for ADMUX setting to settle ADCSRA |= _BV(ADSC); // Start conversion while (bit_is_set(ADCSRA,ADSC)); // measuring uint8_t low = ADCL; // must read ADCL first - it then locks ADCH uint8_t high = ADCH; // unlocks both long result = (high << 8) | low; // combine the two return result; }
Masaje de los datos en bruto
Una vez tengas los datos en bruto, se puede calibrar midiendo dos temperaturas conocidas y escala según corresponda. Esta es una función poco simple para llevar a cabo esa normalización:
float normalizeTemperature(long rawData) { // replace these constants with your 2 data points // these are sample values that will get you in the ballpark (in degrees C) float temp1 = 0; long data1 = 274; float temp2 = 25.0; long data2 = 304; // calculate the scale factor float scaleFactor = (temp2 - temp1) / (data2 - data1); // now calculate the temperature float temp = scaleFactor * (rawData - data1) + temp1; return temp; }
Calibración de
Para obtener las cuatro constantes necesarias, simplemente ejecute el llamado programa sketch el readTemp()
función a temperatura ambiente. Tenga en cuenta la temperatura y los datos en bruto punto. Introduzca estos valores para cualquier conjunto de puntos de datos. A continuación, ya sea poner tu Arduino en el frigorífico o el horno (en una posición realmente baja) y medir los puntos de dos segundos datos. Reemplace las cuatro constantes con sus datos. No importa que orden que enumerarlos. También puede ingresar sus datos en grados centígrados o Fahrenheit. El cálculo lineal es independiente de las unidades mientras consistente en que sistema utilizas.
He probado este código en el Leonardo, pero también debería funcionar en la ONU, y ATtinyx4 y ATtinyx5 de la serie chips así. Si te gusta este truco, hay un compañero instructableartículo sobre Vcc de medición utilizando la referencia interna 1,1 voltios que pueda ser de interés también.