|
楼主 |
发表于 2025-1-3 22:13
|
显示全部楼层
本帖最后由 cnloong 于 2025-2-3 14:22 编辑
第二部分 各类传感器的介绍和使用
一、RS485型设备
概述:
RS485总线是一种电气标准,主要用于远距离及高速的串行通信。一条总线上可以连接多个设备。RS485总线为半双工工作方式,即在通信过程中,同一时刻只能有一个设备发送数据。其网络拓扑一般采用终端匹配的总线型结构,不支持环形或星型网络。 RS485总线的工作原理主要基于差分信号传输技术。在发送端,数据信号被转换为差分信号,通过两根差分线(A线和B线)进行传输。
RS485总线的通讯距离可以达到1200米,但在实际应用中,通常实际的稳定通讯距离往往达不到1200米(怎么想都不会拉条一公里长的电线连接仪器吧,都够绕标准观测场10圈了)。
RS485总线采用两线制接线方式,这种接线方式为总线式拓扑结构,在同一总线上一般最多可以挂接32个结点。
ESP32不能与RS485设备直接通信,二者要通信需要将RS485信号转换为TTL,两种信号的电气特性和通信协议均不同,如果直接把RS485的线连在单片机上是无法获取数据的,甚至可能导致单片机损毁,这是因为RS485高电平表示为两线压差+2~+6V,低电平表示为-2~-6V。信号转换可以利用TTL转RS485模块完成。(参考电路及模块实体图如下)
自建站使用RS485的设备为:风速计、360°风向计、翻斗式雨量筒。
如果想在电脑上调试设备或者修改RS485设备参数(如地址、波特率),需要购买USB转RS485的模块(如下图)。
附测试用软件:
RS485线路连接:
在上面的概述中,提到了RS485的特性,即可以同时连接多个设备,下面的示意图即为ESP32与多个RS485设备的接线图。
如果想要在电脑上调试,接线也是大同小异,A接A,B接B就好。
1.风速计
(1)基本参数:高160mm,三风杯转动半径91mm,量程0-70m/s,精度0.1m/s,启动风速0.1m/s,10-30V直流供电,误差0.2+0.03V(V=风速),塑料外壳。实际外观参数以实物为准。
(2)数据读取:
步骤:发送问询帧→等待设备返回数据→接收数据→读取处理数据
①发送问询帧
问询帧结构如上。
其中CRC校验码计算可以访问(外链)CRC计算网站。
此处使用上面图中参数为例,算出0A 84,由于低位在前,故先发送84,再发送0A。
②接收应答帧
③处理数据
上述步骤可以使用如下代码实现:
- from machine import UART
- import time
- # UART初始化,选择UART2,因为UART0和UART1通常用于系统调试或与其他功能冲突
- uart= UART(2, baudrate=4800, bits=8, parity=None, rx=22,tx=23, stop=1, timeout=100)
- # 配置了波特率为4800,数据位数为8位,无校验位,接收引脚22,发送引脚23,停止位1位,超时时间100ms。
- # 引脚号根据自己所连接的实际线路更改,GPIO12不建议使用,否则可能出现单片机无法启动
- barray = bytearray([0x01,0x03,0x00,0x00,0x00,0x01,0x84,0x0A]) # 问询帧
- while True:
- uart.write(barray)
- time.sleep(1)
- if(uart.any()):
- u2by=uart.read() # 返回的是应答帧的内容
- data_fs=u2by
- print(data_fs)
- fs10 = int.from_bytes(data_fs[3:5],'big') # 风速数据位于第4-5字节处
- fs=fs10/10 # 实际值的10倍,要除以10
- print(fs,"m/s")
复制代码 如果成功运行,可以在Shell看到相关数据,同时485转TTL模块的TX\RX对应LED灯都会闪烁。
此时风速计的数据就读取成功了。
2.风向仪
风向仪的数据读取与风速计相似,假设其地址为02,问询帧结构相同,即为0x02, 0x03, 0x00, 0x00, 0x00, 0x02, 0xC4, 0x38。注意此处数据长度应取2,否则可能出现错误数据。
可使用如下代码调试。
- from machine import UART
- import time
- uart= UART(2, baudrate=9600, bits=8, parity=None, rx=22,tx=23, stop=1, timeout=100)
- barray = bytearray([0x02, 0x03, 0x00, 0x00, 0x00, 0x02, 0xC4, 0x38])
- uart.write(barray)
- time.sleep(0.2)
- if(uart.any()):
- dat=uart.read() # 答应帧
- print(dat.hex())
复制代码 打印结果为:0203040cc001464a3d
其中第6-7字节为风向数据,146(HEX)=326(DEC),即风向为326°.
- #转换为十进制度数
- dat = uart.read()
- windd = int.from_bytes(dat[5:7], 'big')
复制代码 此时风向仪的数据就读取成功了。
其他类型的RS485风向仪(如8方向、16方向)的数据读取大同小异,具体参考仪器手册或说明书。
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
×
|