Het lezen van de temperatuursensor
Hier is de code voor het lezen van de ruwe gegevens:
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; }
Masseren van de ruwe gegevens
Als u eenmaal de ruwe gegevens, kunt u het kalibreren door twee bekende temperaturen te meten en schaling zo nodig. Hier is een eenvoudige kleine functie wilt uitvoeren dat normalisatie:
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; }
Kalibreren
Als u de vier constanten nodig, gewoon lopen de roeping van de schets/programma de readTemp()
functie bij kamertemperatuur. Opmerking de temperatuur en de ruwe gegevens punt. Deze waarden invoeren voor een verzameling van gegevenspunten. Vervolgens, hetzij je Arduino zet in de koelkast of de oven (op een echt lage instelling) en meten van uw tweede twee gegevenspunten. De vier constanten vervangen door uw gegevens. Het maakt niet uit welke bestellen dat u ze opneemt. U kunt ook uw gegevens invoeren in Celsius of Fahrenheit. De lineaire berekening is onafhankelijk van de eenheden, zolang u stroken in welk systeem u gebruikt.
Ik heb getest deze code op de Leonardo, maar het zou ook moeten werken op de Uno, en ATtinyx4 & ATtinyx5-serie chips ook. Als je deze truc, er is een metgezel instructable /artikel over het meten van de Vcc met behulp van de interne 1,1 volt-verwijzing die van belang kan zijn.