通信工程毕业设计选题参考:基于LoRa的低功耗广域网环境监测系统实战
一、先吐槽:毕业设计里那些“一眼假”的痛点
做毕设最怕老师一句“你的数据哪来的?”——仿真图再漂亮,也挡不住这句灵魂拷问。通信专业常见的坑我踩过三个:
- 仿真当实测:NS3或MATLAB跑满屏曲线,却说不清真实空口速率。
- 协议浅尝辄止:只把LoRaWAN说明书念一遍,连Class A的RX1/RX2窗口都没调过。
- 功耗闭口不谈:板子一上电就“千年不断电”,电池寿命全靠“理论估算”。
想从“PPT工程”升级到“能跑的硬件”,最直接的办法就是:真刀真枪做一套端到端系统,把传感器、射频、协议栈、云,全部串起来。下面这套LoRa环境监测方案,是我当年在实验室熬了两个月跑通的路子,成本两百块出头,拿来做本科毕设足够“硬核”。
二、技术选型:NB-IoT、ZigBee还是LoRa?
先放对比表,再讲结论。
| 维度 | NB-IoT | ZigBee 3.0 | LoRa(Sub-1GHz) |
|---|---|---|---|
| 典型功耗 | 50mA@23dBm | 30mA@0dBm | 120mA@20dBm |
| 休眠电流 | 1mA(eDRX) | 1μA | 1.5μA |
| 单跳距离 | 1~10km(城网) | 50m(室内) | 3~5km(城网) |
| 频段 | 运营商授权 | 2.4GHz ISM | 470MHz ISM |
| 硬件成本 | 60~80元(模组) | 15元(SoC) | 25元(SX1278) |
| 入网复杂度 | SIM卡/运营商 | 自组网 | 简单星型 |
教学场景最看重“能自己掌控”:NB-IoT需要SIM卡、基站许可,ZigBee一多跳就“网络风暴”,而LoRa只要买对合法频段就能点对点先跑通,再慢慢扩展到星型。对本科生来说,LoRa“看得见摸得着”,调试门槛最低。
三、系统架构:从传感器到云端的一条龙
终端节点:STM32L071 + SHT31(温湿度) + PMS7003(PM2.5) + SX1278
网关:树莓派Zero 2W + SX1301/8通道集中器,跑poly_pkt_fwd,把UDP包推到云
云平台:用ThingsBoard社区版,MQTT接入,规则链自动落库+可视化
通信协议:自己定义12字节轻量帧,兼顾“教学易懂”和“后期扩展”
四、核心实现细节
4.1 硬件连接
- SX1278 SPI五线制:SCK/PB3、MISO/PA6、MOSI/PA7、NSS/PA4、DIO0/PA1
- SHT31 I²C:地址0x44,时钟100kHz,两上拉电阻4.7k
- PMS7003 UART1:9600bps,每1s主动输出32字节数据帧,只取PM2.5高八位
4.2 帧结构(12 Byte)
| 字节偏移 | 字段 | 长度 | 说明 |
|---|---|---|---|
| 0 | Header | 1 | 0xAA |
| 1 | DevID | 2 | 节点编号,BCD编码 |
| 3 | TempH | 1 | 温度整数位 |
| 4 | TempL | 1 | 温度小数位 |
| 5 | HumiH | 1 | 湿度整数位 |
| 6 | HumiL | 1 | 湿度小数位 |
| 7 | PM25 | 1 | 0~255μg/m³ |
| 8 | BatH | 1 | 电池电压高八位,mV |
| 9 | BatL | 1 | 电池电压低八位 |
| 10 | Fcnt | 1 | 包序号,防重放 |
| 11 | CRC8 | 1 | 前面11字节CRC8 |
4.3 关键代码片段(STM32CubeMX生成HAL,GCC 10.3)
以下代码把“采集+打包+发送+休眠”写在一个函数里,方便毕设报告里截屏贴图。保持Clean Code三原则:短函数、明确命名、注释说“为什么”。
/* main.c -- LoRa Sensor Node 470MHz */ static void SystemCollectAndSend(void) { uint8_t payload[12]; int16_t temp_x10, humi_x10; uint16_t pm25, vbat; /* 1. 采集传感器 */ SHT31_Read(&temp_x10, &humi_x10); /* 驱动返回放大10倍 */ pm25 = PMS7003_GetPM25(); /* 0-255 */ vbat = ADC_GetBattery_mV(); /* 分压后12位ADC */ /* 2. 打包 */ payload[0] = 0xAA; payload[1] = (uint8_t)(devId >> 8); payload[2] = (uint8_t)(devId); payload[3] = (uint8_t)(temp_x10 / 10); payload[4] = (uint8_t)(temp_x10 % 10); payload[5] = (uint8_t)(humi_x10 / 10); payload[6] = (uint8_t)(humi_x10 % 10); payload[7] = (uint8_t)pm25; payload[8] = (uint8_t)(vbat >> 8); payload[9] = (uint8_t)(vbat); payload[10] = (frameCnt++) & 0xFF; payload[11] = CRC8(payload, 11); /* 3. 发送 */ SX1278_Send(payload, sizeof(payload), 20); /* 20dBm */ /* 4. 进入STOP模式,RTC定时30s后唤醒 */ RTC_SetWakeTime(30); HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREG_ON, PWR_STOPENTRY_WFI); /* 重启后从这儿继续 */ SystemClock_ReConfig(); }低功耗思路一句话:能用硬件定时就绝不用软件轮询;唤醒后第一时间开外设,做完立即关。
五、性能与安全:别让“能跑”变成“能趴”
- 延迟测算:SF9/BW125kHz,12字节空中时间≈370ms;加上网关解调+云写入,端到端平均1.1s,对环境监测绰绰有余。
- 电池寿命:2500mAh锂亚,休眠1.5μA,唤醒段累计平均35mA·370ms,每30s一次包,理论续航≈(2500×3.6)/(35×0.37)×30s≈2.1年。论文里写“>18个月”老师基本不挑刺。
- 防重放:帧计数器Fcnt 8位,网关侧缓存最后128个Fcnt,差值<0或>128都丢弃;同时CRC8兜底,误帧率实测<0.5%。
- 合规:中国微功率短距离设备可用470–510MHz,但发射功率限50mW(17dBm)。我们选20dBm要报备,教学实验可在屏蔽室/校内暗室进行,正式产品需降功率或申请SRRC。
六、生产环境避坑指南
- 天线匹配:SX1278输出阻抗约50Ω,但模块引脚到SMA之间微带线容易做成75Ω,拿网络仪一测反射−6dB,直接掉通信距离30%。改板时把微带线宽调到1.1mm(FR4双层板1.6mm),基本能回−12dB。
- 频段规划:470MHz刚好处在广电频段边缘,城市楼顶测试先扫频,看有没有20dBm以上的广播阻塞;如有,把中心频点上移2MHz。
- 信号穿透:混凝土剪力墙实测损耗18–22dB,一堵墙SF12还能解调,两堵墙就悬。毕设演示放走廊拐角最保险,别选地下室。
- 温漂:LoRa晶振±10ppm,温度从−20到60°C频偏约±4.7kHz,BW125kHz足够盖掉;但网关若用TCXO,节点-side建议选±5ppm的TCXO,频率偏移导致的丢包率能从2%降到0.3%。
七、可拓展方向(把答辩老师问倒)
- 多节点轮询:网关发Beacon,节点随机时隙ALOHA,捎带TDM,可写“自研轻量级MAC”一章。
- 边缘AI:STM32CUBE.AI把TensorFlow Lite移植到STM32L4,跑PM2.5预测模型,秒变“AIoT”。
- 双通道备份:LoRa丢包>10%自动切换NB-IoT(模组共用UART),写“异构链路热备”。
八、结尾:先跑通一个点,再扩散成一张网
整套材料BOM成本<¥90,代码不到700行,却能把“需求→硬件→协议→云→功耗”全链条踩一遍。毕设最忌讳铺大摊子,先把单节点跑到18个月续航,再谈网状网、边缘智能。今天把PCB投出去,两周后你就能在手机上看实验室温湿度;等数据跑顺了,再思考“如果一百个节点同时上报,我的网关会不会炸?”——那时候,你已经从“仿真选手”进化成“系统工程师”了。祝焊接不炸锡,天线不偏频,毕业顺利。