type
Post
status
Published
date
Jan 27, 2025
slug
summary
tags
category
IT技术
icon
password
last_edited_time
Mar 23, 2026 10:32 AM
Created time
Jan 27, 2025 07:56 AM
排序
可见性
家里的气象传感器总在发生故障,我想着重新做一个算了,大概有这样的需求:
- 高精度测量气温、空气湿度、大气压力
- 能够记录现有的翻斗式雨量筒的计数脉冲
- 能够不依赖市电运行,停电时也可靠
- 通过一定手段将数据从8楼天台传回5楼的网关
目前家里的气象相关设备大致是这样的
- 7楼是架空隔热层,目前主要作为杂物间,这里有一根从5楼拉上来的网线,同时放了一台路由器作为AP以提供WIFI信号给7楼和8楼天台的设备
- 设备连接到WIFI后将采样数据以MQTT消息的形式发送到5楼的主路由器,五楼的小服务器有一个专门的脚本会订阅MQTT报文并解析,处理,存储这些数据到数据库;同时还有另一个脚本对这些数据解析之后发送到一块很小的显示屏幕上
- 有一个闲鱼淘来的专业自动气象站成品,这个设备最关键的是具有光学雨量传感器和超声风速传感器。设备使用12V供电,对供电稳定性要求较高且做不到超低功耗,使用485总线通信,内容为ASCII文本。我把这个设备架设在顶楼天台的最高处,7楼放置一个12V电源、485转串口模块、ESP32C3模块,通过长度大概十米的网线进行供电和接收数据,ESP32接收到数据后会原封不动地将数据以MQTT报文形式发送出去。
- 目前已知故障:温湿度传感器读数异常,气压传感器损坏,从去年下半年起再未接收到设备发来的485报文过。
- 顶楼天台
头有些痛,有空再补充。。。
后面是一些零零散散的测试日志
通信测试:
在五楼和八楼天台启动两个搭载PINGPONG测试例程的Lora模块,统一设置频宽125kHz,扩频因子SF=9,编码率4/6,频率433Mhz,发射功率22dbm,前导码长度8;测得五楼接收到的数据平均Rssi约为-98.2dbm;Snr约为-6.2dbm,基本可用;
后续部署工作中,统一将参数调整为频宽125kHz,扩频因子SF=9,编码率4/8,频率470Mhz,发射功率22dbm,前导码长度4
设备间Lora通信协议规范
数据说明
一份lora报文包含 1字节报文前缀+n字节报文实际内容
报文前缀
- 报文前缀的高四位代表设备地址,低四位代表数据类型
- 设备地址
- 传感设备发送数据时,设备地址要求填写为自身的;
- 主控发送数据时,设备地址要求填写为准备下发到的传感设备的;
- 一般来说,主控的地址不会出现在实际运行的交互中报文中,该地址将考虑用作后续协议扩展
设备地址 | 对应设备 | 设备启用状态 |
0x0 | ESP32+Lora主控 | 启用 |
0x1 | 翻斗式机械雨量桶 | 暂无 |
0x2 | SHT BMP温湿度气压传感器集成(目前还有雨量) | 启用 |
0x3 | MULTI-5P 自动气象站 | 暂无 |
0xf | 广播地址,暂时不使用 | ㅤ |
- 数据类型
数据类型 | 发送方 | 类型名称 | 内容长度 |
0x0 | ㅤ | ㅤ | ㅤ |
0x1 | 主控 | 校时报文 | 4 |
0x2 | 传感设备 | 青空数据报文 | 10 |
0x3 | 主控 | OTA升级报文 | 127 |
0x4 | 传感设备 | OTA响应报文 | ㅤ |
0x5 | 主控 | 功能控制报文 | ㅤ |
报文实际内容
报文实际内容按照小端法存储
0x1 校时报文
含义 | 数组序号 | 占用字节数 | ㅤ |
报文前缀 | 0 | 1 | (0x2<<4 ) | 0x1 |
时间戳 | 1 | 4 | now >> 24, now >> 16, now >> 8, |
rtc_calp校准参数 | 5 | 1 | 1或0 |
rtc_calm校准参数 | 6 | 1 | ㅤ |
next_sync_hour | 7 | 1 | ㅤ |
共计 | ㅤ | 8 | ㅤ |
0x2 青空数据报文
含义 | 数组序号 | 占用字节数 | ㅤ |
报文前缀 | 0 | 1 | (0x2<<4 ) | 0x2 |
时间戳 | 1 | 4 | ㅤ |
状态与请求 | 5 | 1 | xx0zzzyy,xx=00代表普通数据报文;xx=01代表需要校时;yy=00代表上一分钟内HDC3022没有开启加热器;yy=01代表上一分钟内HDC3022开启加热器持续加热;yy=10代表上一分钟内HDC3022开启加热器脉冲加热;zzz三位分别代表tmp119,bmp581,hdc3022的I2C通信状态,1代表正常;0代表这一分钟内出现过异常 |
STM32温度 | 6 | 1 | ㅤ |
STM32电压 | 7 | 2 | ㅤ |
TMP119温度 最大值 | 9 | 2 | ㅤ |
TMP119温度 最小值 | 11 | 2 | ㅤ |
TMP119温度 平均值 | 13 | 2 | ㅤ |
BMP581温度 最大值 | 15 | 2 | ㅤ |
BMP581温度 最小值 | 17 | 2 | ㅤ |
BMP581温度 平均值 | 19 | 2 | ㅤ |
BMP581气压 最大值 | 21 | 3 | ㅤ |
BMP581气压 最小值 | 24 | 3 | ㅤ |
BMP581气压 平均值 | 27 | 3 | ㅤ |
HDC3022温度 最大值 | 30 | 2 | ㅤ |
HDC3022温度 最小值 | 32 | 2 | ㅤ |
HDC3022温度 平均值 | 34 | 2 | ㅤ |
HDC3022湿度 最大值 | 36 | 2 | ㅤ |
HDC3022湿度 最小值 | 38 | 2 | ㅤ |
HDC3022湿度 平均值 | 40 | 2 | ㅤ |
雨量筒计数 | 42 | 2 | ㅤ |
共计 | ㅤ | 44 | ㅤ |
0x3 OTA升级报文
含义 | 数组序号 | 占用字节数 | ㅤ |
报文前缀 | 0 | 1 | (0x2<<4 ) | 0x3 |
PAGE编号 | 1 | 1 | ㅤ |
PAGE页面内编号 | 2 | 1 | 0代表这是起始数据;大于200表示这是最后一页,个位和十位0~15表示数据在页内的编号 |
差分固件数据 | 3 | 128 | ㅤ |
差分固件数据CRC | 131 | 2 | ㅤ |
共计 | ㅤ | 133 | ㅤ |
0x4 OTA响应报文
含义 | 数组序号 | 占用字节数 | ㅤ |
报文前缀 | 0 | 1 | (0x2<<4 ) | 0x4 |
读写状态 | 1 | 1 | -1代表数据校验失败,本次传输被抛弃;0~15代表本次写入2K内存中的页内分片编号;-15代表写入到flash成功;-16代表写入到flash失败 |
PAGE编号 | 2 | 1 | ECHO |
PAGE页面内编号 | 3 | 1 | ECHO |
差分数据CRC | 4 | 2 | 本地算出的CRC结果 |
共计 | ㅤ | 6 | ㅤ |
0x5 功能控制报文
含义 | 数组序号 | 占用字节数 | ㅤ |
报文前缀 | 0 | 1 | (0x2<<4 ) | 0x5 |
传感器开关 | 1 | 1 | 00000111后三位分别代表TMP119,BMP581,HDC3022的开启状态 |
持续接收模式开关 | 2 | 1 | 0代表只在校时消息发送后等待接收数据;1代表每次消息发送后都等待接收数据;2代表接收数据持续开启 |
OTA功能 | 3 | 1 | 0代表正常运行;1代表进入更新模式,关闭所有中断,RTC定时器,持续接收数据;2代表进入boot并进行差分升级 |
复位命令 | 4 | 1 | 1代表手动触发软复位 |
共计 | ㅤ | 5 | ㅤ |
0x6 功能控制响应报文
含义 | 数组序号 | 占用字节数 | ㅤ |
报文前缀 | 0 | 1 | (0x2<<4 ) | 0x6 |
传感器开关 | 1 | 1 | ECHO |
持续接收模式开关 | 2 | 1 | ECHO |
OTA功能 | 3 | 1 | ECHO |
复位命令 | 4 | 1 | ECHO |
共计 | ㅤ | 5 | ㅤ |
主控与上位机的串口交互协议
主控与上位机通过串口交互,波特率115200
0x2 LORA报文接收结果打印
- 发起方:主控
- 发送消息:
- 响应消息:无
0x1 主控请求自身校时
- 发起方:主控
- 发送消息:
- 响应消息:见上位机下发校时消息格式
0x1 上位机下发给主控校时
- 发起方:上位机
- 发送消息:
- 响应消息:
0x2 修改主控收到Lora消息后的响应策略
- 发起方:上位机
- 发送消息:
- 响应消息:
0x3 修改主控将来要给青空下发的功能配置
- 发起方:上位机
- 发送消息:
- 响应消息:
0x4 透传串口数据到Lora发送
- 发起方:上位机
- 发送消息:
- 响应消息:

0x9 复位主控
- 发起方:上位机
- 发送消息:
- 响应消息:
0x10 挂载SD卡
- 发起方:上位机
- 发送消息:
- 响应消息:
0x11 获取SD卡上的剩余空间大小
- 发起方:上位机
- 发送消息:
- 响应消息:
0x12 获取SD卡上某一目录下的文件信息
- 发起方:上位机
- 发送消息:
- 响应消息:
0x13 读取文件内容
- 发起方:上位机
- 发送消息:
- 响应消息:
0x14 删除文件
- 发起方:上位机
- 发送消息:
- 响应消息:
气象站设备布局调整:
- 雨量筒内放置一个Lora模块+6000mAh磷酸铁锂;每天校时1次+有降水时候发送数据(只允许在每分钟内的第20s发送数据,只允许在每小时内的0,10,20,30,40,50分发送数据),需要考虑天线信号屏蔽问题
- 湿度传感器因为会不定期加热校准,考虑可能会影响其他传感器,所以独立放在一个百叶箱中,温度传感器和气压传感器放在另一个百叶箱;两个百叶箱内都使用 传感器 <板内I2C> 单片机 <网线传输485> 顶层中控 实现数据传递;要求必须实现基于485的OTA升级
- 多普勒测雨雷达试验型,通过485连接到顶层中控?(前期实验必须要有高速大量数据传输的手段)
- 顶楼中控是一个lora模块,通过485连接两个百叶箱,并直接连接UPS功能块,每分钟发送一次温湿度数据和太阳能充放电数据给主控;要求必须实现基于LORA的OTA升级
- 5楼主控是一个lora模块,接收和控制雨量筒以及中控的消息在断电时能够使用电池维持运行,并保存数据到SD卡;连接RK3566,用于实现数据入库,固件直接通过STLINK更新
感觉还是不好,春节再想想吧








首次访问加载时间较长,如果超过半分钟还未自动刷新页面,请尝试手动刷新。
也有可能自动刷新之后提示404并跳转回首页,这时可以再次尝试访问原页面,若页面确实存在,则此次应能访问。