综合案例-RTU-Part1
- 1.简介
- 2.测试代码
- 3.测试结果
- 4.参考资料
1.简介
本案例通过光照温湿度变送器获取光照、温度和湿度数据。
- 建大仁科-光照温湿度变送器参数
- 设备购买链接
链接: Hass506.
链接: 建大仁科-光照温湿度变送器.
- 硬件接线
通过RS485接口将Haas506 和传感器连接起来。其中传感器中的4根线作用如下图所示:
2.测试代码
- main.py
import utime as time
import modbus as mb
from app_htb485 import HTB485
def test_htb485():
ret = mb.init('modbus_485_4800')
if ret < 0:
raise ValueError("init modbus failed.")
htb485Obj = HTB485(mb, 1)
while True:
humidity = htb485Obj.getHumidity()
temperature = htb485Obj.getTemperature()
brightness = htb485Obj.getBrightness()
htb = htb485Obj.getHTB()
print("temperature:", temperature/10,"℃")
print("humidity:", humidity/10,"%RH")
print("brightness:",brightness,"lx")
print("htb:",htb)
time.sleep(1)
print("----------------------")
if __name__=="__main__":
test_htb485()
- app_htb485.py
import ustruct
class HTB485(object):
def __init__(self, mbObj, devAddr):
self.mbObj = mbObj
self.devAddr = devAddr
def getHumidity(self):
if self.mbObj is None:
raise ValueError("invalid modbus object.")
value = bytearray(4)
#modbus.readHoldingRegisters(slave_addr, start_addr, reg_quantity, data, timeout)
# (请求的从机地址;待读寄存器的起始地址;待读寄存器的数量,表示操作多少个寄存器;
# 读寄存器获得的数据,每个寄存器包含高低两个字节,高位在前,低位在后;请求超时时间,单位是毫秒(ms))
ret = self.mbObj.readHoldingRegisters(self.devAddr, 0, 2, value, 200)
if ret[0] < 0:
raise ValueError("readHoldingRegisters failed. errno:", ret[0])
humidity = ustruct.unpack('hh',value)
return humidity[0]
def getTemperature(self):
if self.mbObj is None:
raise ValueError("invalid modbus object.")
value = bytearray(4)
ret = self.mbObj.readHoldingRegisters(self.devAddr, 0, 2, value, 200)
if ret[0] < 0:
raise ValueError("readHoldingRegisters failed. errno:", ret[0])
temperature = ustruct.unpack('hh',value)
return temperature[1]
def getBrightness(self):
if self.mbObj is None:
raise ValueError("invalid modbus object.")
value = bytearray(4)
ret = self.mbObj.readHoldingRegisters(self.devAddr, 2, 2, value, 200)
if ret[0] < 0:
raise ValueError("readHoldingRegisters failed. errno:", ret[0])
brightness = ustruct.unpack('hh',value)
return brightness[1]
def getHTB(self):
if self.mbObj is None:
raise ValueError("invalid modbus object.")
value = bytearray(10)
ret = self.mbObj.readHoldingRegisters(self.devAddr, 0, 5, value, 200)
if ret[0] < 0:
raise ValueError("readHoldingRegisters failed. errno:", ret[0])
htb = ustruct.unpack('hhhhh',value)
return htb
- board.json
{
"version": "1.0.0",
"io": {
"LED11": {
"type": "GPIO",
"port": 36,
"dir": "output",
"pull": "pullup"
},
"modbus_485_4800":{
"type": "MODBUS",
"mode": 0,
"port": 2,
"baudrate": 4800,
"priority": 0,
"timeout": 200
},
"modbus_485_9600": {
"type": "MODBUS",
"mode": 0,
"port": 2,
"baudrate": 9600,
"priority": 0,
"timeout": 200
},
"serial1":{
"type":"UART",
"port":0,
"dataWidth":8,
"baudRate":9600,
"stopBits":1,
"flowControl":"disable",
"parity":"none"
},
"serial2":{
"type":"UART",
"port":1,
"dataWidth":8,
"baudRate":4800,
"stopBits":1,
"flowControl":"disable",
"parity":"none"
},
"serial3":{
"type":"UART",
"port":2,
"dataWidth":8,
"baudRate":9600,
"stopBits":1,
"flowControl":"disable",
"parity":"none"
}
},
"debugLevel": "ERROR"
}
3.测试结果
4.参考资料
链接: 建大仁科-光照温湿度变送器手册.