2401_87602309 2024-10-21 23:11 采纳率: 55.6%
浏览 85
已结题

ESP32使用MicroPyhon开发,怎么获取485温湿度的值,温湿度计使用的鞋子是Modbus RTU

波特率是9600
针脚是16发17收
获取温度代码020300000002C438

  • 写回答

24条回答 默认 最新

  • 杨同学* 2024-10-22 08:47
    关注

    该回答引用ChatGPT4o及杨同学*共同作答, 如有帮助,还请采纳。
    要在ESP32上使用MicroPython开发并通过Modbus RTU协议获取485温湿度计的值,可以使用 machinemodbus 模块或者手动构建Modbus协议的帧来发送和接收数据。下面是一种通过RS485接口读取温湿度值的步骤和代码实现。

    硬件连接

    • 将ESP32的针脚 16 设置为发送引脚 (TX),针脚 17 设置为接收引脚 (RX)。
    • 确保硬件连接正确,RS485模块连接ESP32的TX、RX引脚,并与温湿度传感器正确连接。
    • 温湿度传感器的波特率为 9600,数据格式为 8N1

    软件实现

    1. 导入所需模块:

      from machine import UART, Pin
      import time
      
    2. 初始化UART:

      • UART2配置为RS485的传输接口,波特率为 9600
        uart = UART(2, baudrate=9600, tx=16, rx=17, bits=8, parity=None, stop=1)
        
    3. 构建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])
      
    4. 发送数据并读取响应:

      • 发送构建好的Modbus请求帧并接收返回的数据:
        uart.write(modbus_request)  # 发送Modbus请求
        time.sleep(1)  # 等待设备响应
        response = uart.read(9)  # 读取9字节响应数据
        
    5. 解析响应数据:
      假设返回的数据格式为:

      • 第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)
    

    注意事项

    1. CRC校验:如果你需要动态生成请求帧,需要计算CRC校验。如果你有固定的帧,就可以使用你提供的固定帧。
    2. 硬件控制:有些RS485模块需要手动控制方向(发送/接收模式),这通常通过GPIO引脚来控制。如果需要,你可以配置一个GPIO引脚来切换发送和接收模式。
    3. 调试:如果接收不到数据,请确认波特率、引脚连接、传感器地址等配置是否正确。

    这个代码框架应该可以让你在ESP32上通过Modbus RTU读取温湿度计的数据。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(23条)

报告相同问题?

问题事件

  • 系统已结题 11月1日
  • 已采纳回答 10月24日
  • 创建了问题 10月21日