基于windows系统、RS485型传感器的节能灯控制

本文介绍了在Windows系统中,利用PyCharm和Python的serial库来实现对人体红外RS485传感器和光照传感器的通信,从而控制节能灯的开关。通过CRC校验确保数据传输的准确性,并提供了详细的操作步骤和代码示例。
摘要由CSDN通过智能技术生成

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

提示:这里可以添加本文要记录的大概内容:
本文章是用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")
        # hex16进制)转换为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)    # 读取缓冲数据
            # bytes2进制)转换为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)  # 读取缓冲数据
                    # bytes2进制)转换为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)  # 读取缓冲数据
                    # bytes2进制)转换为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()

运行程序即可

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

水豚Zz

谢谢老板的鼓励,我会再接再厉。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值