树莓派 3 Model B+ (Raspberry Pi 3B+)

元器件
开发板
库存 75

介绍

经典型号,BCM2837B0四核Cortex-A53 1.4GHz、1GB LPDDR2、单路HDMI、千兆以太网(USB 2.0通道限速300Mbps)、双频WiFi 5/BT 4.2、USB 2.0×4、40Pin GPIO

规格参数

参数
CPUBCM2837B0 四核 Cortex-A53 @ 1.4GHz
GPUVideoCore IV @ 400MHz
RAM1GB LPDDR2
USB4×USB 2.0
GPIO40Pin标准排针(含PoE引脚)
存储MicroSD卡槽
尺寸85×56mm
特色PoE支持(需HAT)、P5触点
电源5V/2.5A (Micro-USB)
网络千兆以太网(USB2.0限速300Mbps) + 双频802.11ac WiFi 5 + BT 4.2
视频输出单路HDMI 1080p

代码例程

树莓派 3B+ GPIO 编程 — Python + Node-RED + C.md
# 树莓派 3B+ GPIO 编程例程

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

---

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

```python
#!/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

```python
#!/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 控制

```json
[
  {
    "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+)

```bash
#!/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 库(轻量级)

```c
/*
 * 树莓派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 线压降大,易触发欠压警告(闪电图标)。

参考资料

暂无参考文献