介绍
经典型号,BCM2837B0四核Cortex-A53 1.4GHz、1GB LPDDR2、单路HDMI、千兆以太网(USB 2.0通道限速300Mbps)、双频WiFi 5/BT 4.2、USB 2.0×4、40Pin GPIO
经典型号,BCM2837B0四核Cortex-A53 1.4GHz、1GB LPDDR2、单路HDMI、千兆以太网(USB 2.0通道限速300Mbps)、双频WiFi 5/BT 4.2、USB 2.0×4、40Pin GPIO
| 参数 | 值 |
|---|---|
| CPU | BCM2837B0 四核 Cortex-A53 @ 1.4GHz |
| GPU | VideoCore IV @ 400MHz |
| RAM | 1GB LPDDR2 |
| USB | 4×USB 2.0 |
| GPIO | 40Pin标准排针(含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 编程例程
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 线压降大,易触发欠压警告(闪电图标)。
暂无参考文献