Forum Rule: Always post complete source code & details to reproduce any issue!

# Thread: Teensy (ATmega32U4) on-chip temperature sensor

1. ## Teensy (ATmega32U4) on-chip temperature sensor

I'm trying to read temperature data in Celsius and Fahrenheit by using Teensy's 2.0 on chip temperature sensor. I know that since i'm trying to use the on chip temperature sensor, I have to work with ADMUX and MUX to get the voltage value then convert them to Celsius and Fahrenheit but i'm not sure what to do regarding the ADMUX and MUX.

Code:
```int sensorPin = 0; //the analog pin is connected to
//the resolution is 10 mV / degree centigrade with a
//500 mV offset to allow for negative temperatures

/*
* setup() - this function runs once when you turn your Arduino on
* We initialize the serial connection with the computer
*/
void setup()
{
Serial.begin(9600);  //Start the serial connection with the computer
//to view the result open the serial monitor
}

void loop()                     // run over and over again
{

// converts reading to voltage, for 3.3v arduino use 3.3
float voltage = reading * 5.0;
voltage /= 1024.0;

// Print sensor 1
Serial.println("Temperature Sensor 1");

// Print out the voltage
Serial.print(voltage);
Serial.println(" volts");

// converts voltage reading to temperature in degree Celsius
float temperatureC = (voltage - 0.5) * 100 ;  //converting from 10 mv per degree wit 500 mV offset
//to degrees ((voltage - 500mV) times 100)

// Prints out temperature with unit Celcius
Serial.print(temperatureC);
Serial.println(" degrees C");

// converts Celcius to Fahrenheit
float temperatureF = (temperatureC * 9.0 / 5.0) + 32.0;

// Prints out temperature with unit Fahrenheit
Serial.print(temperatureF);
Serial.println(" degrees F");

// Converts Celcius to Kelvin
float temperatureK = temperatureC + 273;

// Prints out temperature with unit Kelvin
Serial.print(temperatureK);
Serial.println(" degrees K");

delay(1000);  //waiting a second
}```

2. Here is a sketch that reads leonardo/teensy2 internal temp sensor
Code:
```// internal temp adc 8 for littlebits/leonardo  teensy 2
// we do raw  ADMUX or patch wiring_analog.c
//  http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1252144888
// calibration http://nyfiken.org/filer/kalibrering.ods

void setup() {
Serial.begin(9600);
ADMUX = _BV(REFS1) | _BV(REFS0) | 7;   // Set internal V reference, temperature reading
ADCSRB = 0x20;    // ref  24.6
delay(100);
}

void loop() {
int raw = chipTempRaw();
float temp = chipTemp(raw);
float ftemp = 1.8f * temp + 32;
Serial.print(temp);
Serial.print("  ");
Serial.print(ftemp);
Serial.print("   ");
Serial.println(raw, DEC);
delay(1000);
}

float chipTemp(float raw) {
const float chipTempOffset = -142.5;
const float chipTempCoeff = .558;
return((raw * chipTempCoeff) + chipTempOffset);
}

int chipTempRaw(void) {
}```
You will probably need to calibrate coefficients in chipTemp(). I usually put the board in freezer for 20 minutes, then record temperature and output from chipTemp as board warms and do a least-squares fit to get coefficients.

3. Originally Posted by manitou
Here is a sketch that reads leonardo/teensy2 internal temp sensor
Code:
```// internal temp adc 8 for littlebits/leonardo  teensy 2
// we do raw  ADMUX or patch wiring_analog.c
//  http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1252144888
// calibration http://nyfiken.org/filer/kalibrering.ods

void setup() {
Serial.begin(9600);
ADMUX = _BV(REFS1) | _BV(REFS0) | 7;   // Set internal V reference, temperature reading
ADCSRB = 0x20;    // ref  24.6
delay(100);
}

void loop() {
int raw = chipTempRaw();
float temp = chipTemp(raw);
float ftemp = 1.8f * temp + 32;
Serial.print(temp);
Serial.print("  ");
Serial.print(ftemp);
Serial.print("   ");
Serial.println(raw, DEC);
delay(1000);
}

float chipTemp(float raw) {
const float chipTempOffset = -142.5;
const float chipTempCoeff = .558;
return((raw * chipTempCoeff) + chipTempOffset);
}

int chipTempRaw(void) {