python永久线程:处理神经错乱的小灯

如果该内容与某实验重合,纯属巧合

不想看背景介绍可以直接略过前面文字部分

假设你有一盏小灯,你定义了一个开关,当你打开或者关闭开关时,网页会向服务器发送信息,服务器又会向小灯发送一串json格式的信息,控制小灯的开关。
但你突发奇想,想着诶是不是可以加一个光敏传感器,这样我不仅能在面包板上加个按钮开,也可以手机网页开,还可以等到天黑了自动开,有道理,尤其是加上这个功能以后好像还可以加个分,看起来还特别简单,于是你兴冲冲的接上了光敏传感器,于是小灯开始神经错乱了起来,有时候小灯怎么按开关都不亮,有时候光敏传感器又宕机了,你改了改代码,发现甚至有时候你会发现你的灯闪烁了一下,或者你用的是某RGB灯,他在那儿一直发光闪闪怎么都关不上,然后你会发现你写的很多功能都炸了,紧接着程序停止运行。
这时可以这么干:
1.大部分时候都会选择换掉传感器,比如增加一个呼吸灯或者加点别的传感器凑合凑合。
2.解决掉这个看起来简单但又不大不小的问题。
3.站上讲台的时候硬着头皮上,趁机器没坏赶紧搞完拿分跑路
4.抄代码,或者弄个看起来很高端的东西掩盖掉这个玩意,毕竟只是小灯,没有人会关心一个光敏灯
5.钝角

我选了2

既然灯突然抽抽了,我们就得审视一下到底发生了什么问题,如果足够冷静你就会发现以下几点:
一、你的代码必须要有一个实时温湿度功能,还得发到群里,还得弄一个非常非常漂亮的图放在网页上,这得保证你的代码一直检测温湿度,这需要一个循环
二、如果是个循环你就会发现,你的按钮状态会一直向小灯发送。
三、由一得,小灯也得往服务器里发传感器的信息,还有小灯灯泡的信息
四、如果只是单纯的增加传感器,那么小灯被关闭的时候就会自动切换成光敏状态,但这并不是我们想要的,我们要的是切换光敏模式和开关
五、你发现服务器给的按钮接口也是布尔型,你还没法重写

很多人会选择直接增加一个显示小灯光敏传感的状态,还能发送给服务器,这很好,是最接近正确的答案,但你仍会发现你的代码有一些延迟,这是你的发送循环决定的,因为你的温湿度传感器不怎么好,你必须保证休眠5s,这看起来很不灵,而如果你选择不管不顾直接接上传感器就会发现,你的光敏会和按钮发生冲突,而且你发现你只能在这个while循环里操作。

一般这个情况下很多人都炸了,或者把代码写在while里打算糊弄一下说网速不好,但是他已经找到了问题的本质

这里是正文

问题:制造一个可以切换光敏模式和开关的小灯,要求实时
工具:
两个布尔型的按钮,一个控制光敏,一个控制开关,控制开关会随着小灯的明暗开关(不要问我为什么给不给小灯设置状态,我追求简洁,能少装一个部件就少装一个,而且有时候显示也会骗人)
一个主函数,它的工作为:
与服务器连接的初始化
一段循环上传的,且会休眠5s的上传和获取服务器信息的代码
下面是他的代码

if __name__ == '__main__':#主函数
client = iot.getAliyunIotMqttClient(options['productKey'], options['deviceName'], options['deviceSecret'], secure_mode=3)
client.on_connect = on_connect
client.on_disconnect = on_disconnect
client.on_message = on_message
client.connect(host=host, port=options['port'], keepalive=60)
p = multiprocessing.Process(target=worker, args=(client,))
p.start()
client.loop_forever()
####################################################################################################################
def worker(client):
    topic = '/sys/'+options['productKey']+'/'+options['deviceName']+'/thing/event/property/post'
    while True:
        time.sleep(5)
        T,H = GetDTH()
        print ('T=',T,'H=',H)
                         
        if T!=0 or H!=0:
            payload_json = {
                'id': int(time.time()),
                'params': {
                    'temperature':  T, #random.randint(20, 30),
                    'humidity':  H, #random.randint(40, 50)
                },
                'method': "thing.event.property.post"
                }
            ding = cb.DingtalkChatbot(webhook)
            ding.send_text(msg='物联网10组:温湿度已上传'+'温度:'+str(T)+'湿度'+str(H),is_at_all=True)  
            print('send data to iot server: ' + str(payload_json))      
            client.publish(topic, payload=str(payload_json))

其他代码,比如开关小灯,温湿度感应等

思路:
很多人被困在了循环里,但是循环之前可以大做文章
很多人直接在前面写了个循环,这是不行的……

解决方法:

1.创建一个线程,休眠0.5s,保证前后循环不冲突且足够灵敏,这个时候检查光敏开关信息,并根据开关信息进行操作
2. 没了

完美工作,所以设计和制造都要追求简洁,能少放点按钮屏幕就少放点。

下面是伪代码:

if __name__ == '__main__':#主函数
Thread(target=Start_run).start()#就加了这么一句
client = iot.getAliyunIotMqttClient(options['productKey'], options['deviceName'], options['deviceSecret'], secure_mode=3)
client.on_connect = on_connect
client.on_disconnect = on_disconnect
client.on_message = on_message
client.connect(host=host, port=options['port'], keepalive=60)
p = multiprocessing.Process(target=worker, args=(client,))
p.start()
client.loop_forever()

def Start_run():
led_pin = 4
GPIO.setmode(GPIO.BCM)
GPIO.setup(led_pin, GPIO.OUT)
pin=23
global key

while 1:
    time.sleep(0.5)
    if 光敏按钮开了:
        光敏传感器初始化
        if 光敏传感器周围无光
            while 1:
                小灯初始化
                if 周围有光
                    灯不亮
                    if 周围无光
                        灯亮 
                        break
                if 光敏按钮关闭:
                    break
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值