提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
提示:这里可以添加本文要记录的大概内容:
本文章是用windows系统基于pycharm软件、RS485型传感器的节能灯开发。以下有具体工具和实现代码,仅作参考。如硬件设备一致,则可使用。
提示:以下是本篇文章正文内容,下面案例可供参考
一、准备操作
一、准备操作
1.硬件:需要准备电脑一台,人体红外RS485型传感器,灯(我使用的是24V直流灯),RS485型继电器模块,传感器供电设备一个(与传感器供电电压一致),USB转RS485线一根
2.软件: 电脑安装python3.X版本,需要安装serial库,或者使用pycharm,Anoconda,Mu等软件都可以。RS485驱动,CRC(循环冗余校验)。
二、测试
1.通过卖家给的传感器测试软件测试传感器是否有问题。
2.通过传感器资料查看传感器问询码。
3.通过串口调试助手测试能否传感器通讯成功
4.如果重新设置传感器参数,需要重新计算校验码。
在线计算CRC链接:https://editor.csdn.net/md?not_checkout=1&articleId=122897495
参数模型详见传感器资料
二、软硬件设置
1.硬件连接
此图片涉及传感器校多,因此只需看相对应的传感器部分就行,此图片仅作参考,因RS485传感器不唯一,所以使用方式不固定。
2.程序编辑
代码如下(示例):
import serial
import time
list_hw = "02 03 00 03 00 01 74 39" # 人体红外传感器问询帧
list_gz = "05 03 00 06 00 01 65 8F" # 光照传感器问询帧
ser = serial.Serial("COM6", 9600) # 选择串口,设置波特率
temp_jc_hw = 0
temp_jc_gz = 0
def read_data(temp) :
global temp_jc_hw
global temp_jc_gz
if ser.is_open:
# print("port open success")
# hex(16进制)转换为bytes(2进制),应注意python3.7与python2.7此处转换不同
if temp:
send_data = bytes.fromhex(list_hw) # 发送数据转换为b'\xff\x01\x00U\x00\x00V'
else:
send_data = bytes.fromhex(list_gz)
ser.write(send_data) # 发送数据
time.sleep(0.1) # 延时,否则len_return_data将返回0,此处易忽视!!!
len_return_data = ser.inWaiting() # 将获取缓冲数据(接收数据)长度
# print(len_return_data)
if len_return_data:
return_data = ser.read(len_return_data) # 读取缓冲数据
# bytes(2进制)转换为hex(16进制),应注意python3.7与python2.7此处转换不同
str_return_data = str(return_data.hex())
# print(str_return_data)
if temp:
print("当前人体红外感应状态:", end="")
if int(str_return_data[6:10]): # 16进制转为整形 湿度
print("有人")
temp_jc_hw = 1
else:
print("无人")
temp_jc_hw = 0
else:
print("当前光照度为:", end="")
print(int(str_return_data[6:10], 16), end="") # 16进制转为整形 光照
print("Lux")
temp_jc_gz = int(str_return_data[6:10],16)
print(temp_jc_gz)
def w_data() :
if ser.is_open:
if temp_jc_hw == 1:
if temp_jc_gz < 500:
send_data = bytes.fromhex("06 05 00 00 FF 00 8D 8D") # 发送数据转换为b'\xff\x01\x00U\x00\x00V'
ser.write(send_data) # 发送数据
time.sleep(0.1)
len_return_data = ser.inWaiting() # 将获取缓冲数据(接收数据)长度
# print(len_return_data)
if len_return_data:
return_data = ser.read(len_return_data) # 读取缓冲数据
# bytes(2进制)转换为hex(16进制),应注意python3.7与python2.7此处转换不同
str_return_data = str(return_data.hex())
print(int(str_return_data, 16))
print("开灯")
else:
send_data = bytes.fromhex("06 05 00 00 00 FF 8C 3D") # 发送数据转换为b'\xff\x01\x00U\x00\x00V'
ser.write(send_data) # 发送数据
time.sleep(0.1)
len_return_data = ser.inWaiting() # 将获取缓冲数据(接收数据)长度
# print(len_return_data)
if len_return_data:
return_data = ser.read(len_return_data) # 读取缓冲数据
# bytes(2进制)转换为hex(16进制),应注意python3.7与python2.7此处转换不同
str_return_data = str(return_data.hex())
print(int(str_return_data, 16))
print("关灯")
else:
print("port open failed")
def main():
read_data(1)
time.sleep(0.5)
read_data(0)
time.sleep(0.5)
if __name__ == "__main__" :
while True:
w_data()
main()