树莓派 4B GPIO 编程例程 — Python + C + WiringPi

知识库
知识库文档
/firmware/开发板/树莓派 4 Model B (Raspberry Pi 4B)/树莓派 4B GPIO 编程例程 — Python + C + WiringPi.md

文档

树莓派 4B GPIO 编程例程

Pi 4B 使用 BCM2711,GPIO 寄存器与 Pi 3B+ 基本一致,兼容 RPi.GPIO、wiringPi、pigpio 等库。


示例 1:Python RPi.GPIO — 按键控制 LED

#!/usr/bin/env python3
"""树莓派4B 按键控制LED — RPi.GPIO"""
import RPi.GPIO as GPIO
import time

LED_PIN = 17   # BCM 17 (Pin 11)
BTN_PIN = 27   # BCM 27 (Pin 13)

GPIO.setmode(GPIO.BCM)
GPIO.setup(LED_PIN, GPIO.OUT)
GPIO.setup(BTN_PIN, GPIO.IN, pull_up_down=GPIO.PUD_UP)

led_state = False

try:
    print("按下按键切换LED状态 (Ctrl+C 退出)")
    while True:
        if GPIO.input(BTN_PIN) == GPIO.LOW:  # 按下(上拉,低有效)
            led_state = not led_state
            GPIO.output(LED_PIN, led_state)
            print(f"LED → {'ON' if led_state else 'OFF'}")
            time.sleep(0.3)  # 消抖
        time.sleep(0.01)
except KeyboardInterrupt:
    print("\n退出")
finally:
    GPIO.cleanup()

示例 2:Python pigpio — 硬件 PWM + 高精度波形

#!/usr/bin/env python3
"""树莓派4B PWM — pigpio(高精度,支持任意GPIO)"""
import pigpio
import time

LED = 18  # BCM 18 (Pin 12) 硬件PWM

pi = pigpio.pi()
if not pi.connected:
    print("❌ pigpiod 守护进程未运行!请执行: sudo pigpiod")
    exit(1)

try:
    print("PWM 0~255 范围呼吸灯")
    while True:
        for duty in range(0, 256, 2):
            pi.set_PWM_dutycycle(LED, duty)
            time.sleep(0.01)
        for duty in range(255, -1, -2):
            pi.set_PWM_dutycycle(LED, duty)
            time.sleep(0.01)
except KeyboardInterrupt:
    print("\n退出")
finally:
    pi.set_PWM_dutycycle(LED, 0)
    pi.stop()

示例 3:C + wiringPi — GPIO 控制

/*
 * 树莓派4B wiringPi GPIO 控制
 * 安装: sudo apt install wiringpi
 * 编译: gcc -o blink blink.c -lwiringPi
 * 运行: ./blink
 */
#include <wiringPi.h>
#include <stdio.h>

#define LED_PIN  0   // wiringPi 0 = BCM 17 (Pin 11)
#define BTN_PIN  2   // wiringPi 2 = BCM 27 (Pin 13)

int main() {
    wiringPiSetup();  // 使用 wiringPi 编号

    pinMode(LED_PIN, OUTPUT);
    pinMode(BTN_PIN, INPUT);
    pullUpDnControl(BTN_PIN, PUD_UP);

    printf("按下按键切换 LED (Ctrl+C 退出)\n");

    int led_state = 0;
    while (1) {
        if (digitalRead(BTN_PIN) == LOW) {
            led_state = !led_state;
            digitalWrite(LED_PIN, led_state);
            printf("LED → %s\n", led_state ? "ON" : "OFF");
            delay(300);  // 消抖
        }
        delay(10);
    }
    return 0;
}

示例 4:Python — UART 串口通信

#!/usr/bin/env python3
"""树莓派4B UART 收发 — /dev/serial0 (GPIO14=TXD, GPIO15=RXD)"""
import serial
import time

# 启用串口: sudo raspi-config → Interface → Serial → No(login shell) → Yes(enable)
ser = serial.Serial(
    port='/dev/serial0',
    baudrate=115200,
    timeout=1
)

print("串口已打开:", ser.name)

# 发送
ser.write(b'Hello from Pi 4B!\r\n')
print("发送: Hello from Pi 4B!")

# 接收
time.sleep(0.1)
if ser.in_waiting:
    rx = ser.readline()
    print("接收:", rx.decode().strip())

ser.close()

示例 5:Python — DHT11 温湿度传感器

#!/usr/bin/env python3
"""树莓派4B DHT11 温湿度读取"""
import Adafruit_DHT

SENSOR = Adafruit_DHT.DHT11
PIN = 4  # BCM GPIO4 (Pin 7)

humidity, temperature = Adafruit_DHT.read_retry(SENSOR, PIN)

if humidity is not None and temperature is not None:
    print(f"温度: {temperature:.1f}°C  湿度: {humidity:.1f}%")
else:
    print("❌ 读取失败,请检查接线或重试")

示例 6:Python — I²C OLED 显示屏 (SSD1306)

#!/usr/bin/env python3
"""树莓派4B SSD1306 OLED 128x64 I2C显示"""
import board
import busio
import adafruit_ssd1306

# I2C 初始化 (GPIO2=SDA, GPIO3=SCL)
i2c = busio.I2C(board.SCL, board.SDA)
oled = adafruit_ssd1306.SSD1306_I2C(128, 64, i2c, addr=0x3C)

# 清屏并显示文字
oled.fill(0)
oled.text("Raspberry Pi", 0, 0, 1)
oled.text("Model 4B", 0, 16, 1)
oled.text("Hello World!", 0, 32, 1)
oled.show()
print("OLED 显示成功")

⚠️ 编程注意事项

  1. RPi.GPIO 已停止维护:建议迁移到 gpiozeropigpio
  2. wiringPi 已弃用:原作者 Gordon 不再维护,Pi 4B 建议使用预编译 2.52+ 版本或换用 libgpiod。
  3. pigpio 精度最高:支持任意 GPIO 的软件 PWM(DMA 驱动),精度达 1μs,适合 WS2812 等时序严格的协议。
  4. 串口配置/dev/ttyAMA0 为硬件串口(蓝牙默认占用),/dev/serial0 是符号链接指向当前可用串口。
  5. 需要 root 权限时:GPIO 操作通常需要 sudo,或把用户加入 gpio 组。

信息

路径
/firmware/开发板/树莓派 4 Model B (Raspberry Pi 4B)/树莓派 4B GPIO 编程例程 — Python + C + WiringPi.md
更新时间
2026/5/26