树莓派 3B+ GPIO 编程 — Python + Node-RED + C

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

文档

树莓派 3B+ GPIO 编程例程

Pi 3B+ 使用 BCM2837B0,兼容所有主流的 RPi GPIO 库。


示例 1:Python gpiozero — 温湿度采集 (DHT22)

#!/usr/bin/env python3
"""树莓派3B+ DHT22 温湿度传感器"""
from gpiozero import DigitalInputDevice
import time

class DHT22:
    def __init__(self, pin):
        self.sensor = DigitalInputDevice(pin, pull_up=True)

    def read(self):
        """读取DHT22,返回 (温度°C, 湿度%) 或 (None, None)"""
        # DHT22 需要精确时序,推荐用 pigpio 或 Adafruit_DHT
        pass

# 简化版:使用 Adafruit_DHT
import Adafruit_DHT

sensor = Adafruit_DHT.DHT22
pin = 4  # BCM 4 (Pin 7)

for i in range(3):
    h, t = Adafruit_DHT.read_retry(sensor, pin)
    if h is not None and t is not None:
        print(f"温度: {t:.1f}°C  湿度: {h:.1f}%")
        break
    time.sleep(2)
else:
    print("❌ 3次读取失败")

示例 2:Python — 超声波测距 HC-SR04

#!/usr/bin/env python3
"""树莓派3B+ HC-SR04 超声波测距"""
import RPi.GPIO as GPIO
import time

TRIG = 23  # BCM 23 (Pin 16)
ECHO = 24  # BCM 24 (Pin 18)

GPIO.setmode(GPIO.BCM)
GPIO.setup(TRIG, GPIO.OUT)
GPIO.setup(ECHO, GPIO.IN)

def get_distance():
    """返回距离 (cm)"""
    GPIO.output(TRIG, True)
    time.sleep(0.00001)  # 10μs
    GPIO.output(TRIG, False)

    timeout = time.time() + 0.04  # 40ms超时 (~6.8m)
    while GPIO.input(ECHO) == 0:
        if time.time() > timeout:
            return -1
        pulse_start = time.time()

    while GPIO.input(ECHO) == 1:
        if time.time() > timeout:
            return -1
        pulse_end = time.time()

    duration = pulse_end - pulse_start
    distance = duration * 17150  # 声速 343m/s ÷ 2
    return round(distance, 2)

try:
    print("超声波测距 (Ctrl+C 退出)")
    while True:
        d = get_distance()
        print(f"距离: {d} cm" if d > 0 else "测量超时")
        time.sleep(0.5)
except KeyboardInterrupt:
    print("\n退出")
finally:
    GPIO.cleanup()

示例 3:Node-RED — 低代码 GPIO 控制

[
  {
    "id": "gpio-in",
    "type": "rpi-gpio in",
    "name": "按键",
    "pin": "13",
    "intype": "up",
    "debounce": "25",
    "read": true
  },
  {
    "id": "gpio-out",
    "type": "rpi-gpio out",
    "name": "LED",
    "pin": "11"
  },
  {
    "id": "function",
    "type": "function",
    "name": "翻转LED",
    "func": "var state = context.get('state') || 0;\nstate = state ? 0 : 1;\ncontext.set('state', state);\nmsg.payload = state;\nreturn msg;"
  }
]

安装 Node-RED GPIO 节点: sudo apt install nodered -y,然后在 Node-RED 面板中添加 node-red-node-pi-gpio

示例 4:Shell — GPIO sysfs 控制(适合 3B+)

#!/bin/bash
# 树莓派3B+ sysfs GPIO 控制(传统方法)

PIN=17  # BCM 17 (Pin 11)

# 导出 GPIO
echo $PIN >; /sys/class/gpio/export
echo "out" >; /sys/class/gpio/gpio$PIN/direction

# 闪烁 5 次
for i in {1..5}; do
    echo 1 >; /sys/class/gpio/gpio$PIN/value
    sleep 0.5
    echo 0 >; /sys/class/gpio/gpio$PIN/value
    sleep 0.5
    echo "闪烁 $i/5"
done

# 释放
echo $PIN >; /sys/class/gpio/unexport
echo "完成"

⚠️ sysfs GPIO 接口已弃用(Linux 4.8+),新系统建议用 libgpiod 或 gpiozero。

示例 5:C 语言 — bcm2835 库(轻量级)

/*
 * 树莓派3B+ bcm2835 库示例
 * 安装: wget http://www.airspayce.com/mikem/bcm2835/bcm2835-1.71.tar.gz
 * 编译: gcc -o spi_test spi_test.c -lbcm2835
 */
#include <bcm2835.h>
#include <stdio.h>
#include <unistd.h>

#define LED_PIN RPI_GPIO_P1_11  // BCM 17

int main() {
    if (!bcm2835_init()) {
        printf("❌ bcm2835 初始化失败,需要 sudo 权限\n");
        return 1;
    }

    bcm2835_gpio_fsel(LED_PIN, BCM2835_GPIO_FSEL_OUTP);

    printf("LED 闪烁 10 次\n");
    for (int i = 0; i < 10; i++) {
        bcm2835_gpio_write(LED_PIN, HIGH);
        bcm2835_delay(250);
        bcm2835_gpio_write(LED_PIN, LOW);
        bcm2835_delay(250);
    }

    bcm2835_close();
    return 0;
}

⚠️ 3B+ 特别注意

  1. ARMv8 64位:Pi 3B+ 支持 64 位内核,但默认 Raspberry Pi OS 仍为 32 位。64 位可提升 ~15% 性能。
  2. 蓝牙与串口冲突/dev/ttyAMA0 默认给蓝牙,GPIO14/15 用 /dev/ttyS0(mini-UART,波特率随 GPU 时钟变化)。
  3. WiFi 5GHz:虽支持 802.11ac,但仅 1×1 SISO,实际速度 ~60-90Mbps。
  4. Micro-USB 供电:劣质 Micro-USB 线压降大,易触发欠压警告(闪电图标)。

信息

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