This guide shows how to read analog values with the Raspberry Pi Pico using Arduino IDE. As an example, we’ll read the values from a potentiometer, but what you’ll learn can be applied to any analog sensor/peripheral.
We have a similar guide using MicroPython firmware: Raspberry Pi Pico: Read Analog Inputs (MicroPython).
If you’re used to programming the Arduino, ESP32 and/or the ESP8266 using Arduino IDE, you’ll find that it’s pretty similar to programming the Raspberry Pi Pico.
Prerequisites
You need to install the Raspberry Pi Pico boards on Arduino IDE and you must know how to upload code to the board. Check out the following tutorial first if you haven’t already:
Analog Readings – Raspberry Pi Pico
In this tutorial, you’ll learn how to read an analog input with the Raspberry Pi Pico. This is useful to read values from variable resistors like potentiometers or analog sensors.
The Raspberry Pi Pico has a 12-bit ADC with four channels on a fixed set of pins (plus an extra internal temperature sensor). This means it can transform an analog signal into a digital signal as a number ranging from 0 to 4095.
It has five ADC channels, but only four are accessible on the GPIOs: GPIO26, GPIO27, GPIO28, and GPIO29.
The first three GPIOs (26, 27, and 28) can be used to read voltage from peripherals, while GPIO29 can be utilized to measure the voltage level of the VSYS supply on the Raspberry Pi Pico board (VSYS is the input voltage that powers the board).
The fifth ADC channel is connected to a built-in temperature sensor.
In summary, here are the key features of the analog pins of the Raspberry Pi Pico board:
- 12-bit resolution – transforms an analog signal into a value between 0 and 4095;
- 4 ADC channels on external GPIOs;
- GPIOs 26, 27, and 28 can be used to read output voltage from peripherals;
- GPIO29 can measure the input voltage that powers the board (VSYS);
- There’s a fifth ADC channel that is connected to an internal temperature sensor.
Identify the ADC pins on your Raspberry Pi Pico board. They are highlighted in dark green color.
To learn more about the Pico Pinout, read the following guide: Raspberry Pi Pico and Pico W Pinout Guide: GPIOs Explained.
analogRead()
Reading an analog input in the Raspberry Pi Pico using the Arduino IDE is as simple as using the analogRead() function, which accepts as an argument the GPIO you want to read, as follows:
analogRead(GPIO);
By default, your code will set a 10-bit resolution. To set 12-bit resolution, you can use the analogReadResolution() function as follows:
analogReadResolution(12);
Schematic
Before proceeding, wire a potentiometer to your Raspberry Pi Pico board. You can connect the data pin to any ADC pin. We’ll use ADC0 on GPIO 26.
New to potentiometers? Learn how potentiometers work.
Parts Required
Here’s a list of the parts you need to build the circuit:
You can use the preceding links or go directly to MakerAdvisor.com/tools to find all the parts for your projects at the best price!
Schematic Diagram – Raspberry Pi Pico
You can use the following diagram as a reference to connect the potentiometer to the Raspberry Pi Pico board.
In this example, we’re using GPIO26 to read analog values from the potentiometer, but you can choose any other GPIO that supports ADC.
Code – Raspberry Pi Pico Read Analog Inputs
The following code for the Raspberry Pi Pico reads analog values from GPIO 26 and prints the results on the Serial Monitor.
/*********
Rui Santos
Complete project details at https://RandomNerdTutorials.com/raspberry-pi-pico-analog-inputs-arduino/
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files.
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
*********/
// Potentiometer is connected to GPIO 26 (Analog ADC0)
const int potPin = 26;
// variable for storing the potentiometer value
int potValue = 0;
void setup() {
Serial.begin(115200);
analogReadResolution(12);
delay(1000);
}
void loop() {
// Reading potentiometer value
potValue = analogRead(potPin);
Serial.println(potValue);
delay(500);
}
How the code works
This code simply reads the values from the potentiometer and prints those values in the Serial Monitor.
In the code, you start by defining the GPIO the potentiometer is connected to. In this example, it’s GPIO 26.
const int potPin = 26;
In the setup(), we initialize serial communication at a baud rate of 115200.
Serial.begin(115200);
Set 12-bit resolution using the analogReadResolution() function.
analogReadResolution(12);
If you prefer to use the default 10-bit resolution, you just need to remove this previous line.
In the loop(), you use the analogRead() function to read the analog input from the potPin.
potValue = analogRead(potPin);
Finally, you print the values read from the potentiometer in the serial monitor.
Serial.println(potValue);
Uploading the Code to the Raspberry Pi Pico
For you to be able to upload code to the Raspberry Pi Pico, it needs to be in bootloader mode.
If the Raspberry Pi is currently running MicroPython firmware, you need to manually put it into bootloader mode. For that, connect the Raspberry Pi Pico to your computer while holding the BOOTSEL button at the same time.
For future uploads using Arduino IDE, the board should go automatically into bootloader mode without the need to press the BOOTSEL button.
Now, select your COM port in Tools > Port. It may be the case that the COM port is grayed out. If that’s the case, don’t worry it will automatically find the port once you hit the upload button.
Upload the code.
You should get a success message.
Demonstration
After uploading the code to the board, open the Serial Monitor at a baud rate of 115200.
Rotate the potentiometer and see the values changing.
The maximum value you can get is 4095, and the minimum value is 0.
Wrapping Up
In this tutorial, you learned about analog reading with the Raspberry Pi Pico. It has five 12-bit ADC channels, four of which are accessible on its GPIOs, and the fifth channel is connected to an internal temperature sensor.
Reading the voltage on a GPIO is as simple as using the analogRead() function and passing the corresponding GPIO as an argument. This will give you a value between 0 and 4095, in which 0 corresponds to 0V and 4095 to 3.3V
We hope you’ve found this tutorial useful. If you’re just getting started with the Raspberry Pi Pico, you may like to read the following tutorials:
- Programming Raspberry Pi Pico with Arduino IDE (Pico W compatible)
- Raspberry Pi Pico and Pico W Pinout Guide: GPIOs Explained
- Raspberry Pi Pico: Control Digital Outputs and Read Digital Inputs (Arduino IDE)
- Raspberry Pi Pico: Fading an LED using PWM (Arduino IDE)
Check out all our Raspberry Pi Pico Guides »
Thanks for reading.
Very clear ! As usual ! Thanks for this valuable source of knowledge !
Best
Thanks.
Regards,
Sara
Thanks for interesting read. I wonder about the GPIO29, is it just ment for reading VSYS, or can it be used like the other ADC inputs.
Is the only difference that it measures from 0 to 5V instead of 3.3?
Hi ,
I’m searching for code on howto read the internal temperature sensor on the rp2040 , in the arduino IDE.
Do you know how to do this ? The sensor seems not to be connected to a gpio pin.
I can find examples in micropython , but I don’t like micrropython 🙁
Kind regards,
Ronny
This may be a first time only error, but if you are trying to get your Pico to work with Arduino IDE and your sketch compiles fine and uploads nicely, but when run you see:
no monitor available for port protocol uf2conv could not connect to uf2_board uf2conv port
The solution is to click on the tools menu and select the port again and your output will appear on the serial monitor.
Also keep in mind the update/install bug on Arduino IDE – if you see and update installation that is stuck or are trying to install a new library that gets stuck, close the serial monitor tab on all copies of the Arduino IDE that you have open.
Hi.
Yes. That’s right. Thanks for your comment.
I need to update the Guide for the Pico with Arduino IDE.
Regards.
Sara