← How-Tos
raspberry-pi Mar 29, 2026 ◯ 2 min read

How to Control GPIO Pins on Raspberry Pi with Python

raspberry pigpiopythonledrelayelectronicsgpiozero
# How to Control GPIO Pins on Raspberry Pi with Python The Raspberry Pi GPIO (General Purpose Input/Output) pins let you control LEDs, relays, sensors, motors, and any other electronics directly from Python code. ## Pin Numbering The Pi has two numbering systems โ€” always be clear which you're using: - **BCM (Broadcom)** โ€” uses chip pin numbers (GPIO17, GPIO27 etc.) โ€” recommended - **Board** โ€” uses physical pin position numbers (pin 11, pin 13 etc.) Run `pinout` in the terminal for a visual GPIO map. ## Install gpiozero (Easiest Library) gpiozero is pre-installed on Raspberry Pi OS. If not: ```bash sudo apt install python3-gpiozero -y ``` ## Blink an LED Connect LED โ†’ 330ฮฉ resistor โ†’ GPIO17 โ†’ GND. ```python from gpiozero import LED from time import sleep led = LED(17) # BCM pin 17 while True: led.on() sleep(1) led.off() sleep(1) ``` ## Read a Button Connect button between GPIO2 and GND (gpiozero enables internal pull-up). ```python from gpiozero import Button from signal import pause btn = Button(2) def on_press(): print("Button pressed!") btn.when_pressed = on_press pause() # Keep script running ``` ## Button Controls LED ```python from gpiozero import LED, Button from signal import pause led = LED(17) btn = Button(2) btn.when_pressed = led.on btn.when_released = led.off pause() ``` ## PWM (Dimming an LED) ```python from gpiozero import PWMLED from time import sleep led = PWMLED(17) # Fade in and out while True: for brightness in range(0, 101, 5): led.value = brightness / 100 sleep(0.05) for brightness in range(100, -1, -5): led.value = brightness / 100 sleep(0.05) ``` ## Control a Relay Relays are just LEDs electrically โ€” same wiring logic, higher current switching. ```python from gpiozero import OutputDevice from time import sleep # Most relay modules are active LOW relay = OutputDevice(17, active_high=False) relay.on() # Activate relay sleep(2) relay.off() # Deactivate ``` ## Read a Sensor (DHT22 Temperature) ```bash pip3 install adafruit-circuitpython-dht sudo apt install libgpiod2 -y ``` ```python import adafruit_dht import board import time dht = adafruit_dht.DHT22(board.D4) # GPIO4 while True: try: temp = dht.temperature humidity = dht.humidity print(f"Temp: {temp:.1f}ยฐC Humidity: {humidity:.1f}%") except RuntimeError: pass # DHT22 occasionally misreads โ€” retry time.sleep(2) ``` ## Run Script at Boot ```bash sudo nano /etc/rc.local # Add before 'exit 0': python3 /home/pi/myscript.py & ``` Or use systemd for better control: ```bash sudo nano /etc/systemd/system/myscript.service ``` ```ini [Unit] Description=My GPIO Script After=network.target [Service] ExecStart=/usr/bin/python3 /home/pi/myscript.py Restart=always User=pi [Install] WantedBy=multi-user.target ``` ```bash sudo systemctl enable myscript sudo systemctl start myscript ``` ## Safety Rules - GPIO pins are 3.3V โ€” never connect 5V directly - Max 16mA per pin, 50mA total for all GPIO - Always use a resistor with LEDs - Use a transistor or relay for motors and high-current loads - Never connect inductive loads (motors) directly โ€” use flyback diodes

๐Ÿ”ง Related tool: Pinout Reference