Reading the Internal Temperature of a Raspberry Pi Pico
There is an internal temperature sensor hiding in the RP2040 processor. It is just ever so slightly tricky to read. I notice that a lot of the help on the web skips an important step where you enable the temperature sensor, and glosses over the ADC reference voltage.
It isn't a high precision sensor, about ½ degree Celsius is as good as you are going to read, but it will let you know if your enclosure is cooking your project.
Enable the temperature sensor
In addition to adc_init()
you will need to adc_set_temp_sensor_enabled(true)
. I kind of think there is a period of time before you would not trust the reading. It seems like it creeps up for a second or two. So if you are using this, just turn it on and leave it on.
Understand the ADC reference voltage
The ADC system is all relative to a reference voltage. If you haven't connected anything to the ADC_VREF pin of a Pi Pico, then it is nominally 3.3v, and that constant is present in everyone's sample code. It is worth noting that it is probably lower than that, so if you want to calibrate, check the pin with a multimeter.
If you are interested in accuracy with other analog inputs, you will probably put a 'real' voltage reference on ADC_VREF, then you need to change the constants in the code to match your chosen hardware.
My Example
In any event, my example looks like this.
/*
** NOTE THEE WELL:
**
** You must do these before using this function...
**
** adc_init();
** adc_set_temp_sensor_enabled(true);
**
** You will get ridiculous temperature values if you don't enable
** the temperature sensor. It also might take a little bit to converge
** on something close to right, so don't be tricky and snap it on and
** off to save power.
**
*/
#define REFERENCE_VOLTAGE 3.3
void print_info(void) {
adc_select_input(4);
uint16_t bits = adc_read();
float voltage = bits * REFERENCE_VOLTAGE / 4095;
float temperature = 27.0 - ( voltage - 0.706) / 0.001721;
printf("Internal temperature: %4.1fC\n", temperature);
}