本仓库实现了基于 STM32L152 (蓝桥杯物联网竞赛板) 以及 SX1278 LoRa 模块、AHT10 温湿度传感器、SSD1306 OLED 屏的低功耗远距离无线组网通信系统。
E:\projects\c2\
├── Common\
│ ├── Inc\
│ │ ├── sx1278.h ← SX1278 LoRa 驱动头文件(寄存器定义 + 参数配置)
│ │ ├── aht10.h ← AHT10 温湿度传感器驱动头文件
│ │ ├── oled.h ← SSD1306 OLED 驱动头文件
│ │ └── lora_packet.h ← 数据包协议定义(10字节格式)
│ └── Src\
│ ├── sx1278.c ← SX1278 完整驱动(初始化/发送/接收)
│ ├── aht10.c ← AHT10 I2C 驱动(75ms 测量周期)
│ ├── oled.c ← SSD1306 驱动(6×8字模 + 显存刷新)
│ └── lora_packet.c ← 数据包打包/解包(XOR校验)
├── Sender\Src\
│ └── main_sender.c ← 发送端主逻辑
└── Receiver\Src\
└── main_receiver.c ← 接收端主逻辑
| 参数 | 配置值 | 说明 |
|---|---|---|
| 频率 | 433 MHz | 中国免许可 ISM 频段 |
| 扩频因子 SF | 7 | 速率与传输距离的折中平衡(~5.47 kbps) |
| 带宽 BW | 125 kHz | 标准工业级带宽配置 |
| 编码率 CR | 4/5 | 前向纠错码率,提供较强的纠错抗干扰能力 |
| 同步字 | 0x12 |
隔离其他信道,确保局域网络私密性 |
LoRa 使用线性调频(Chirp)扩频技术,扩频因子 SF 决定了每个符号(Chirp)包含的信息位数,范围 SF6 ~ SF12。
| SF | 符号时长 (BW=125kHz) | 比特率 (约) | 接收灵敏度 | 传输距离估算 |
|---|---|---|---|---|
| SF7 | 1.024 ms | ~5.47 kbps | -123 dBm | 1~3 km(视距) |
| SF8 | 2.048 ms | ~3.13 kbps | -126 dBm | 1.5~4 km |
| SF9 | 4.096 ms | ~1.76 kbps | -129 dBm | 2~6 km |
| SF10 | 8.192 ms | ~0.98 kbps | -132 dBm | 3~8 km |
| SF12 | 32.77 ms | ~0.24 kbps | -137 dBm | 5~15 km |
规律(SF 越大):
- 每个符号持续时间 × 2,速率减半
- 接收灵敏度提高约 3 dBm(等效链路预算增加)
- 传输距离显著增加,功耗也随之增大
| BW | 比特率 | 接收灵敏度 | 抗频偏能力 |
|---|---|---|---|
| 500 kHz | 最高 | 最低(弱3dB) | 最强 |
| 250 kHz | 中 | 中 | 中 |
| 125 kHz | 适中(基准) | 基准 | 较弱 |
规律(BW 越小): 灵敏度更高、距离更远,但速率降低,且对晶振频偏更敏感。
根据工信部《微功率短距离无线电设备频率使用规定》:
- 频率范围:433.0 ~ 434.79 MHz
- 最大发射功率:10 mW(10 dBm)
- 带宽限制:≤ 200 kHz
- 许可要求:免许可(微功率设备)
- 使用限制:不得持续占用信道,需限时发射(避免对同频设备造成连续干扰)
- 频率范围:470.0 ~ 510.0 MHz
- 最大发射功率:50 mW(17 dBm)
- 许可要求:免许可
注意:SX1278 PA_BOOST 最大可达 20 dBm,在 433 MHz 下使用时需通过软件进行限制,确保发射功率 ≤ 10 dBm。
| SX1278 引脚 | STM32 引脚 | 功能说明 |
|---|---|---|
| VCC | 3.3V | 电源(勿接 5V) |
| GND | GND | 公共地 |
| NSS/CS | PA4 | SPI 片选(软件) |
| SCK | PA5 | SPI 时钟 |
| MISO | PA6 | 主入从出 |
| MOSI | PA7 | 主出从入 |
| RESET | PB0 | 硬件复位 |
| DIO0 | PB1 | TX/RX Done 中断 |
| ANT | 天线 | 433MHz 1/4λ≈17cm |
| AHT10 | STM32 引脚 | 说明 |
|---|---|---|
| VCC | 3.3V | 电源 |
| GND | GND | 地 |
| SDA | PB7 | I2C 数据 |
| SCL | PB6 | I2C 时钟 |
| LED | GPIO | 触发条件 |
|---|---|---|
| LED1 | PB8 | 温度 ≥ 25°C 时翻转 |
| LED2 | PB9 | 温度 < 25°C 时翻转 |
为了避免传输多余的字符开销、提高无线信道利用率,我们自定义了精简的二进制数据包结构:
┌────────┬─────────────────┬─────────────────┬──────────┐
│ [0] │ [1] ~ [4] │ [5] ~ [8] │ [9] │
│ HEAD │ TEMPERATURE │ HUMIDITY │ CHECKSUM │
│ 0xA5 │ float 小端序 │ float 小端序 │ XOR[0~8] │
│ 1字节 │ 4字节 │ 4字节 │ 1字节 │
└────────┴─────────────────┴─────────────────┴──────────┘
- HEAD:帧头,固定为
0xA5,用于接收端快速过滤杂波和确认包起始。 - TEMPERATURE / HUMIDITY:温湿度值,使用标准的 4 字节 IEEE 754 浮点数以小端字节序(Little-Endian)表示。
- CHECKSUM:前 9 个字节的异或和(XOR Checksum),确保无线信道传输中发生单 bit 或多 bit 翻转时能被丢弃。
【发送端(Sender)】 【接收端(Receiver)】
│ │
AHT10_Init() OLED_Init()
SX1278_Init(433MHz/SF7/BW125k) SX1278_Init(相同参数)
│ SetMode(RX_CONTINUOUS)
│ 每 2 秒循环 │
▼ │ 轮询 IRQ_RX_DONE
AHT10_ReadData() │
│ SX1278_Receive()
LoRaPkt_Pack() │
│ LoRaPkt_Unpack()
SX1278_Send() │
│ UpdateOLED(显示温湿度+RSSI)
Toggle LED2(发送指示) │
┌───────┴────────┐
│ temp < 25°C? │
├── 是 ──────────► ToggleLED2
└── 否 ──────────► ToggleLED1