BLOG / TUTORIALS / Raspberry Pi Pico Projects for Beginners…
Blog Post

Raspberry Pi Pico Projects for Beginners: 5 Easy Builds to Get Started

Viktor Build ~9 min read

Get started with Raspberry Pi Pico using 5 easy MicroPython projects. Includes wiring diagrams, parts lists, and full code for LED blink, potentiometer, buttons, DHT11 sensor, and OLED display.

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

  1. Download the latest MicroPython UF2 file for Pico from raspberrypi.com.
  2. Press and hold the BOOTSEL button on the Pico while plugging it into your computer.
  3. Drag-and-drop the UF2 file onto the “RPI-RP2” drive that appears.
  4. Use Thonny IDE (free, recommended) or mpremote via 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.Pin class and output mode
  • time.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 dht library (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.

Join the Community on Discord

Ask questions, share your builds, and hang out with fellow makers.

Join Discord — it's free

Enjoying this tutorial?

Support the channel on Patreon and get early access to projects, build logs, and more.

Support on Patreon →