波特率是9600
针脚是16发17收
获取温度代码020300000002C438
ESP32使用MicroPyhon开发,怎么获取485温湿度的值,温湿度计使用的鞋子是Modbus RTU
- 写回答
- 好问题 0 提建议
- 关注问题
- 邀请回答
-
24条回答 默认 最新
杨同学* 2024-10-22 08:47关注该回答引用ChatGPT4o及杨同学*共同作答, 如有帮助,还请采纳。
要在ESP32上使用MicroPython开发并通过Modbus RTU协议获取485温湿度计的值,可以使用machine和modbus模块或者手动构建Modbus协议的帧来发送和接收数据。下面是一种通过RS485接口读取温湿度值的步骤和代码实现。硬件连接
- 将ESP32的针脚
16设置为发送引脚 (TX),针脚17设置为接收引脚 (RX)。 - 确保硬件连接正确,RS485模块连接ESP32的TX、RX引脚,并与温湿度传感器正确连接。
- 温湿度传感器的波特率为
9600,数据格式为8N1。
软件实现
导入所需模块:
from machine import UART, Pin import time初始化UART:
- UART2配置为RS485的传输接口,波特率为
9600。uart = UART(2, baudrate=9600, tx=16, rx=17, bits=8, parity=None, stop=1)
- UART2配置为RS485的传输接口,波特率为
构建Modbus RTU命令帧:
- 根据你提供的命令帧
02 03 00 00 00 02 C4 38,解析如下:02:从站地址(设备地址)。03:功能码(读取保持寄存器)。00 00:寄存器起始地址。00 02:读取两个寄存器(一个寄存器16位,两个寄存器32位,可以分别表示温度和湿度)。C4 38:CRC校验码。
构建发送帧:
modbus_request = bytes([0x02, 0x03, 0x00, 0x00, 0x00, 0x02, 0xC4, 0x38])- 根据你提供的命令帧
发送数据并读取响应:
- 发送构建好的Modbus请求帧并接收返回的数据:
uart.write(modbus_request) # 发送Modbus请求 time.sleep(1) # 等待设备响应 response = uart.read(9) # 读取9字节响应数据
- 发送构建好的Modbus请求帧并接收返回的数据:
解析响应数据:
假设返回的数据格式为:- 第1字节:设备地址
- 第2字节:功能码
- 第3字节:返回字节数
- 第4-5字节:温度数据(高字节+低字节)
- 第6-7字节:湿度数据(高字节+低字节)
- 第8-9字节:CRC校验
解析温湿度数据:
if response: temperature = (response[3] << 8) + response[4] # 温度高字节+低字节 humidity = (response[5] << 8) + response[6] # 湿度高字节+低字节 print("Temperature:", temperature / 10.0, "°C") print("Humidity:", humidity / 10.0, "%") else: print("No response from the sensor")
完整代码
from machine import UART, Pin import time # 初始化UART uart = UART(2, baudrate=9600, tx=16, rx=17, bits=8, parity=None, stop=1) # Modbus RTU 请求帧 modbus_request = bytes([0x02, 0x03, 0x00, 0x00, 0x00, 0x02, 0xC4, 0x38]) while True: # 发送Modbus请求帧 uart.write(modbus_request) # 等待响应 time.sleep(1) # 读取响应数据,通常为9字节 response = uart.read(9) # 解析响应 if response: # 解析温度和湿度数据 temperature = (response[3] << 8) + response[4] # 温度高字节+低字节 humidity = (response[5] << 8) + response[6] # 湿度高字节+低字节 # 打印结果 print("Temperature:", temperature / 10.0, "°C") print("Humidity:", humidity / 10.0, "%") else: print("No response from the sensor") # 延迟一段时间 time.sleep(5)注意事项
- CRC校验:如果你需要动态生成请求帧,需要计算CRC校验。如果你有固定的帧,就可以使用你提供的固定帧。
- 硬件控制:有些RS485模块需要手动控制方向(发送/接收模式),这通常通过GPIO引脚来控制。如果需要,你可以配置一个GPIO引脚来切换发送和接收模式。
- 调试:如果接收不到数据,请确认波特率、引脚连接、传感器地址等配置是否正确。
这个代码框架应该可以让你在ESP32上通过Modbus RTU读取温湿度计的数据。
本回答被题主选为最佳回答 , 对您是否有帮助呢?评论 打赏 举报解决 2无用- 将ESP32的针脚