Raspberry Pi Pico Projects for Beginners: 5 Easy Builds to Get Started
So you just got a Raspberry Pi Pico — maybe it’s the classic RP2040 board, perhaps the newer Pico W with Wi-Fi. You’ve heard it’s cheap ($4!) and powerful for microcontroller projects, but now you’re wondering: what do I actually build with it? The answer is simpler than you think. I’ve curated five raspberry pi pico projects that require only a handful of components, use beginner-friendly MicroPython, and include full wiring guides. These aren’t abstract tutorials — each project teaches you a core skill (GPIO, PWM, ADC, I²C, interrupts) that you’ll reuse in almost every build afterward. By the end of this post, you’ll have a solid foundation and a blinking, beeping, reading, and dancing Pico on your desk.
What You’ll Need (Tools & Software)
Before we get into the builds, let’s set up your environment. All projects here use MicroPython — it’s the easiest way to get started because you can test code instantly in a REPL.
Shopping List (Basic Starter Kit)
- Raspberry Pi Pico (any variant) with a Micro-USB or USB-C cable
- Breadboard and jumper wires (male-to-female and male-to-male)
- 5 mm LEDs (red, green, yellow)
- 330 Ω resistors (4–5 pieces)
- 10 kΩ potentiometer
- Push button (momentary, 4-pin)
- DHT11 or DHT22 temperature/humidity sensor
- Active buzzer (3.3V or 5V tolerant)
- (Optional) SSD1306 OLED display for Project #5
Installing MicroPython
- Download the latest MicroPython UF2 file for Pico from raspberrypi.com.
- Press and hold the BOOTSEL button on the Pico while plugging it into your computer.
- Drag-and-drop the UF2 file onto the “RPI-RP2” drive that appears.
- Use Thonny IDE (free, recommended) or
mpremotevia command line. Set the interpreter to “MicroPython (Raspberry Pi Pico)” in Thonny.
Now you’re ready to blink, buzz, and measure.
1. Blink an LED (Hello World of Microcontrollers)
Every maker’s first rite of passage. This project teaches GPIO output — the digital pins that can turn things on and off. It’s the foundation of every raspberry pi pico projects guide.
Parts List
| Component | Quantity |
|---|---|
| Raspberry Pi Pico | 1 |
| LED (any color) | 1 |
| 330 Ω resistor | 1 |
| Breadboard & jumper wires | - |
Wiring Diagram
Pico GP15 → resistor → LED anode (long leg)
LED cathode (short leg) → GND (Pin 38)
Always use a resistor in series with an LED to limit current to ~10 mA.
MicroPython Code
from machine import Pin
import time
led = Pin(15, Pin.OUT) # GP15 as output
while True:
led.on() # Turn LED on
time.sleep(0.5) # Wait 500ms
led.off() # Turn LED off
time.sleep(0.5) # Wait 500ms
What You Learn
machine.Pinclass and output modetime.sleep()for delays- Understanding current-limiting resistors
Once this works, try changing the delay to create a fading effect using two nested loops — you’ll have your first custom pattern.
2. Read a Potentiometer (Analog Input with ADC)
The Pico’s three analog-to-digital converter (ADC) pins let you read variable voltages from sensors, joysticks, and potentiometers. This project shows exactly how to read a potentiometer and use its value to control an LED’s brightness.
Parts List
| Component | Quantity |
|---|---|
| 10 kΩ potentiometer | 1 |
| LED (e.g., red) | 1 |
| 330 Ω resistor | 1 |
| Jumper wires | - |
Wiring Diagram
Potentiometer:
Left pin → 3.3V (Pin 36)
Center pin → GP26 (ADC0)
Right pin → GND
LED circuit:
GP15 → resistor → LED anode → GND
MicroPython Code
from machine import Pin, ADC, PWM
import time
pot = ADC(26) # ADC0 on GP26
led = PWM(Pin(15)) # Use PWM for brightness control
led.freq(1000) # 1 kHz PWM frequency
while True:
reading = pot.read_u16() # 0–65535
led.duty_u16(reading) # Map directly to PWM duty
print("Pot value:", reading)
time.sleep(0.1)
What You Learn
ADC.read_u16()for raw 16-bit values- PWM output on GPIO pins
- Mapping sensor input to output without math
Turn the knob — the LED brightness changes smoothly. You’ve just built a DIY dimmer switch.
3. Push Button with Interrupt (No Polling)
Polling a button in a loop wastes CPU cycles and makes code messy. Instead, use a hardware interrupt — the Pico calls a function automatically when the button is pressed. This is crucial for responsive projects.
Parts List
| Component | Quantity |
|---|---|
| Push button (momentary) | 1 |
| 10 kΩ resistor (pull-down) | 1 |
| LED & 330 Ω resistor (optional feedback) | 1 each |
Wiring Diagram
Button:
One terminal → 3.3V
Other terminal → GP14 (with 10kΩ to GND)
LED:
GP15 → resistor → LED → GND
MicroPython Code
from machine import Pin
import time
led = Pin(15, Pin.OUT)
button = Pin(14, Pin.IN, Pin.PULL_DOWN) # External pull-down
press_count = 0
def button_handler(pin):
global press_count
press_count += 1
print("Pressed! Count:", press_count)
led.toggle() # Toggle LED on each press
button.irq(trigger=Pin.IRQ_RISING, handler=button_handler)
# Main loop can do anything — interrupts work in background
while True:
time.sleep(1)
print("Main loop running...")
What You Learn
- Interrupt Service Routine (ISR) — no polling
- Pull-down resistor configuration
- Debouncing (add a 50ms
time.sleep_ms(50)inside the handler if needed)
Pro tip: For a production-grade button, add a 100 nF capacitor across the button pins to filter contact bounce.
4. Temperature & Humidity with DHT11/DHT22
Sensors make projects useful. The DHT11 is cheap and widely available — perfect for learning how to read digital sensor data and handle timing-sensitive protocols. This is a common raspberry pi pico projects puzzle because the sensor uses a custom single-wire protocol.
Parts List
| Component | Quantity |
|---|---|
| DHT11 or DHT22 sensor | 1 |
| 4.7 kΩ resistor (pull-up) | 1 |
| Active buzzer | 1 (optional alert) |
Wiring Diagram
DHT11:
Pin 1 (left) → 3.3V
Pin 2 (data) → GP16 (with 4.7kΩ to 3.3V)
Pin 4 (right) → GND
Active buzzer:
Positive → GP17
Negative → GND
MicroPython Code
from machine import Pin
import time
import dht
sensor = dht.DHT11(Pin(16)) # or dht.DHT22 for better accuracy
buzzer = Pin(17, Pin.OUT)
ALERT_TEMP = 30 # °C
while True:
try:
sensor.measure()
temp = sensor.temperature()
hum = sensor.humidity()
print(f"Temp: {temp}°C, Humidity: {hum}%")
if temp > ALERT_TEMP:
buzzer.on()
time.sleep(0.5)
buzzer.off()
except OSError as e:
print("Sensor error:", e)
time.sleep(2) # DHT11 max rate is 1 Hz
What You Learn
- Using the
dhtlibrary (pre-installed in MicroPython) - Reading temperature and humidity
- Adding basic alert logic with a buzzer
Try replacing the DHT11 with a DHT22 — the code stays the same, but you get ±0.5°C accuracy instead of ±2°C.
5. I²C OLED Display (Show Sensor Data)
Now let’s make data readable without a laptop. The SSD1306 OLED display (128x64 pixels) uses the I²C protocol — only two wires (SDA, SCL) for communication. Adding this to your raspberry pi pico projects turns them into portable gadgets.
Parts List
| Component | Quantity |
|---|---|
| SSD1306 OLED (128x64, I²C) | 1 |
| 4.7 kΩ pull-up resistors (if not on module) | 2 |
| DHT11 sensor (from Project #4) | 1 |
Wiring Diagram
OLED:
VCC → 3.3V
GND → GND
SDA → GP0 (I2C0 SDA)
SCL → GP1 (I2C0 SCL)
DHT11 (same as Project #4)
MicroPython Code (Requires ssd1306.py library)
Download ssd1306.py from GitHub - openMV/micropython-framebuf and upload it to the Pico.
from machine import Pin, I2C
import dht
import ssd1306
import time
# Initialize I2C
i2c = I2C(0, scl=Pin(1), sda=Pin(0), freq=400000)
oled = ssd1306.SSD1306_I2C(128, 64, i2c)
# Sensor on GP16
sensor = dht.DHT11(Pin(16))
while True:
try:
sensor.measure()
temp = sensor.temperature()
hum = sensor.humidity()
oled.fill(0) # Clear display
oled.text("Temp:", 0, 0)
oled.text(f"{temp} C", 0, 16)
oled.text("Hum:", 0, 32)
oled.text(f"{hum} %", 0, 48)
oled.show()
except:
pass
time.sleep(2)
What You Learn
- I²C protocol and device scanning
- Displaying text and numbers on OLED
- Combining sensor and display in one circuit
For extra credit, add a small battery pack (3.7V LiPo + TP4056 charger) — you now have a wireless temperature monitor.
Where to Go Next
These five raspberry pi pico projects cover the most important skills in embedded development: GPIO, PWM, ADC, interrupts, digital sensors, and I²C. Each project is a building block you can mix and match. Want a smart plant monitor? Combine Project #4 (DHT11) with a soil moisture sensor. Build a reaction game? Marry Project #3 (button) with Project #1 (LEDs) and add a timer.
All code from this guide is available on my GitHub. If you get stuck or want to share your build, join the Viktor Build Discord — I answer questions there every week.
The Pico is one of the most capable $4 boards on the planet. Now go make something that blinks, reads, and talks back. Happy building.