当前位置: 首页 >  资讯 > 资讯 > 正文

闲来无事-控制树莓派风扇启停

时间:2023-06-24 17:26:55 编辑:admin


【资料图】

扯淡时间

端午放假,本想注册个美团众包骑自行车送外卖体验一下生活,奈何这几天北京热的要死,只能作罢,还是苟在屋里空调续命吧。无事干的时候,想着给我花盆监控升个级,换个电容的土壤检测(之前的腐蚀了gg了)但是电容的是3v的,esp8266只能检测1v的,所以买了一个新的esp32-cam,正好带个摄像头,间隔5分钟拍个照片,一天下来还能拼接一个延时摄影的效果,奈何这个板子有点毛病,跑不起来,如下图(商家也无法解决)无奈退货,想着下雨天打孩子,闲着也是闲着,这条路走不通了,换个其他的玩玩了。我的树莓派有个风扇,成天在转,给他加一个控制,超出设定的温度再启动,最好在给个页面去控制一下,开搞还有就是这个树莓派我买的时候400,我靠这玩意还涨价了,无语了,当时400我都觉得贵,还不如买个单片机30块就能玩

思路
设备控制-远程控制启停后台定时任务-定时记录温度,根据设定的温度控制风扇启停服务处理请求-展示温度曲线
思路有了就开干设备控制

设备控制主要就是:1. 展示数据 2. 发送设备控制指令

写个vue的页面,用脑子设计一下:开关按钮得有,温度设定得有,还得有个图表,还得加个筛选时间,根据时间来筛选数据。就酱式的吧

代码如下(太多了给个链接吧)

https://github.com/dadademo/piFan/blob/main/fanUi/src/components/home.vue

后台定时任务

后台定时任务:1. 定时读取任务,根据设定的温度决定是否开/关风扇 2. 定时记录信息,将信息存在数据里面

这些服务本来想用node写,奈何node操作gpio的库一直不能下载,只能用python来搞了注意这个代码我是直接复制的,依赖一些我写的其他的python脚本,如果想跑起来的话还直接拉全部代码去看吧

代码如下
# 使用内建的signal库捕获Ctrl+Cimport signal# 风扇模块import controlFan# 退出程序import sys# 引用db模块import dbimport time# 开始时间beginTimeHour = 7# 结束时间endTimeHour = 20# 每隔5分钟判断一次温度timeOut = 60*5# 程序停止def stop():    # 停止gpio操作    controlFan.quit()    # 退出程序    sys.exit()controlFan.init_gpio()# 监听Ctr+Csignal.signal(signal.SIGINT, stop)while True:    # 0/1 当前风扇状态    fanStatus = 0    # 设定状态,默认40度    setTemp = 0    # 获取状态    lastData = db.getLastData()    fanStatus =  lastData.get("fanStatus")    setTemp = lastData.get("setTemp")    # 获取当前温度    currentTemp = controlFan.read_cpu_temperature()    # 时间    currentTime = time.localtime()    dt = time.strftime("%Y:%m:%d %H:%M:%S", currentTime)    print(dt)    # 当前温度大于设定温度    ctrlVal = currentTemp > setTemp    # 判断逻辑    if ctrlVal:        fanStatus = 1    else:        fanStatus = 0    # 初始化后追加状态    db.addInfo(fanStatus, currentTemp, setTemp)    if ctrlVal:        # 夜间模式        if currentTime.tm_hour < beginTimeHour and currentTime.tm_hour > endTimeHour:            controlFan.set_fan(False)        else:            controlFan.set_fan(True)    else:        controlFan.set_fan(False)    time.sleep(timeOut)
服务处理请求

这里就是用python启动一个服务,接收网页发送的请求,例如设定温度,还有启停的制冷

代码如下
# 导入http.server模块import http.serverimport socketserver# json对象import json# 参数解析from urllib.parse import urlparse, parse_qs, parse_qslimport dbimport controlFan# 定义端口号HTTP_PORT = 3001# 获取query信息并转为objdef getQureyData(url):    retObj = {}    currentQuery = parse_qs(urlparse(url).query)    for key in currentQuery:        if len(currentQuery[key]) == 1:            retObj[key] = currentQuery[key][0]        else:            retObj[key] = currentQuery[key]    return retObj# 处理相应class httpResponse(http.server.SimpleHTTPRequestHandler):    # 处理get请求    def do_GET(self):        # 当前访问的链接决定        currentUrl = urlparse(self.path).path        print(currentUrl)        if currentUrl == "/getFan":            self.send_response(200)            self.send_header("Content-type", "application/json")            self.end_headers()            # 读取信息            query = getQureyData(self.path)            jsonInfo = db.getInfo(                query.get("startTimestamp"), query.get("endTimestamp"), query.get("pageIndex"), query.get("pageSize"), query.get("all"))            retStr = json.dumps(jsonInfo)            self.wfile.write(bytes(retStr, "utf8"))        if currentUrl == "/getLast":            self.send_response(200)            self.send_header("Content-type", "application/json")            self.end_headers()            jsonInfo = db.getLastData()            retStr = json.dumps(jsonInfo)            self.wfile.write(bytes(retStr, "utf8"))        return    # 处理post请求    def do_POST(self):        # 获取POST请求的数据        currentUrl = urlparse(self.path).path        if currentUrl == "/setFan":            self.send_response(200)            self.send_header("Content-type", "application/json")            self.end_headers()            # 当前信息            query = getQureyData(self.path)            # 获取最后的信息            lastData = db.getLastData()            fanStatus = int(query.get("fanStatus")                            or lastData.get("fanStatus"))            setTemp = int(query.get("setTemp") or lastData.get("setTemp"))            print(fanStatus, fanStatus == 1)            # 写入状态            db.addInfo(fanStatus, controlFan.read_cpu_temperature(), setTemp)            if fanStatus == 1:                controlFan.set_fan(True)            else:                controlFan.set_fan(False)            self.wfile.write(bytes("{status:200}", "utf8"))        return# 启动http服务def beginServer():    with socketserver.TCPServer(("", HTTP_PORT), httpResponse) as httpd:        print("serving at port", HTTP_PORT)        httpd.serve_forever()controlFan.init_gpio()# 开启服务beginServer()
代码地址:https://github.com/dadademo/piFan最后放一张效果图

标签:

标签: 面包 主食

猜你喜欢

网站简介 | 合作推广 | 法律声明 | 友情链接 | 联系我们 | 意见反馈

Copyright ? 2012 - 2015 www.shunvfan.com All Rights Reserved 淑女范 版权所有

豫ICP备19008436号-1 联系我们:317 493 128@qq.com

提示:本站信息仅供参考,不能作为诊断及医疗的依据;请谨慎参阅,本站不承担由此引起的法律责任。本网站敬告网民:身体若有不适,请及时到医院就诊。所有文章来自互联网 如有异议 请与本站联系 本站为非赢利性网站不接受任何赞助和广告