翼度科技»论坛 云主机 LINUX 查看内容

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

9

主题

9

帖子

27

积分

新手上路

Rank: 1

积分
27
扯淡时间

端午放假,本想注册个美团众包骑自行车送外卖体验一下生活,奈何这几天北京热的要死,只能作罢,还是苟在屋里空调续命吧。
无事干的时候,想着给我花盆监控升个级,换个电容的土壤检测(之前的腐蚀了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脚本,如果想跑起来的话还直接拉全部代码去看吧
代码如下
  1. # 使用内建的signal库捕获Ctrl+C
  2. import signal
  3. # 风扇模块
  4. import controlFan
  5. # 退出程序
  6. import sys
  7. # 引用db模块
  8. import db
  9. import time
  10. # 开始时间
  11. beginTimeHour = 7
  12. # 结束时间
  13. endTimeHour = 20
  14. # 每隔5分钟判断一次温度
  15. timeOut = 60*5
  16. # 程序停止
  17. def stop():
  18.     # 停止gpio操作
  19.     controlFan.quit()
  20.     # 退出程序
  21.     sys.exit()
  22. controlFan.init_gpio()
  23. # 监听Ctr+C
  24. signal.signal(signal.SIGINT, stop)
  25. while True:
  26.     # 0/1 当前风扇状态
  27.     fanStatus = 0
  28.     # 设定状态,默认40度
  29.     setTemp = 0
  30.     # 获取状态
  31.     lastData = db.getLastData()
  32.     fanStatus =  lastData.get('fanStatus')
  33.     setTemp = lastData.get('setTemp')
  34.     # 获取当前温度
  35.     currentTemp = controlFan.read_cpu_temperature()
  36.     # 时间
  37.     currentTime = time.localtime()
  38.     dt = time.strftime('%Y:%m:%d %H:%M:%S', currentTime)
  39.     print(dt)
  40.     # 当前温度大于设定温度
  41.     ctrlVal = currentTemp > setTemp
  42.     # 判断逻辑
  43.     if ctrlVal:
  44.         fanStatus = 1
  45.     else:
  46.         fanStatus = 0
  47.     # 初始化后追加状态
  48.     db.addInfo(fanStatus, currentTemp, setTemp)
  49.     if ctrlVal:
  50.         # 夜间模式
  51.         if currentTime.tm_hour < beginTimeHour and currentTime.tm_hour > endTimeHour:
  52.             controlFan.set_fan(False)
  53.         else:
  54.             controlFan.set_fan(True)
  55.     else:
  56.         controlFan.set_fan(False)
  57.     time.sleep(timeOut)
复制代码
服务处理请求

这里就是用python启动一个服务,接收网页发送的请求,例如设定温度,还有启停的制冷
代码如下
  1. # 导入http.server模块
  2. import http.server
  3. import socketserver
  4. # json对象
  5. import json
  6. # 参数解析
  7. from urllib.parse import urlparse, parse_qs, parse_qsl
  8. import db
  9. import controlFan
  10. # 定义端口号
  11. HTTP_PORT = 3001
  12. # 获取query信息并转为obj
  13. def getQureyData(url):
  14.     retObj = {}
  15.     currentQuery = parse_qs(urlparse(url).query)
  16.     for key in currentQuery:
  17.         if len(currentQuery[key]) == 1:
  18.             retObj[key] = currentQuery[key][0]
  19.         else:
  20.             retObj[key] = currentQuery[key]
  21.     return retObj
  22. # 处理相应
  23. class httpResponse(http.server.SimpleHTTPRequestHandler):
  24.     # 处理get请求
  25.     def do_GET(self):
  26.         # 当前访问的链接决定
  27.         currentUrl = urlparse(self.path).path
  28.         print(currentUrl)
  29.         if currentUrl == '/getFan':
  30.             self.send_response(200)
  31.             self.send_header('Content-type', 'application/json')
  32.             self.end_headers()
  33.             # 读取信息
  34.             query = getQureyData(self.path)
  35.             jsonInfo = db.getInfo(
  36.                 query.get('startTimestamp'), query.get('endTimestamp'), query.get('pageIndex'), query.get('pageSize'), query.get('all'))
  37.             retStr = json.dumps(jsonInfo)
  38.             self.wfile.write(bytes(retStr, "utf8"))
  39.         if currentUrl == '/getLast':
  40.             self.send_response(200)
  41.             self.send_header('Content-type', 'application/json')
  42.             self.end_headers()
  43.             jsonInfo = db.getLastData()
  44.             retStr = json.dumps(jsonInfo)
  45.             self.wfile.write(bytes(retStr, "utf8"))
  46.         return
  47.     # 处理post请求
  48.     def do_POST(self):
  49.         # 获取POST请求的数据
  50.         currentUrl = urlparse(self.path).path
  51.         if currentUrl == '/setFan':
  52.             self.send_response(200)
  53.             self.send_header('Content-type', 'application/json')
  54.             self.end_headers()
  55.             # 当前信息
  56.             query = getQureyData(self.path)
  57.             # 获取最后的信息
  58.             lastData = db.getLastData()
  59.             fanStatus = int(query.get('fanStatus')
  60.                             or lastData.get('fanStatus'))
  61.             setTemp = int(query.get('setTemp') or lastData.get('setTemp'))
  62.             print(fanStatus, fanStatus == 1)
  63.             # 写入状态
  64.             db.addInfo(fanStatus, controlFan.read_cpu_temperature(), setTemp)
  65.             if fanStatus == 1:
  66.                 controlFan.set_fan(True)
  67.             else:
  68.                 controlFan.set_fan(False)
  69.             self.wfile.write(bytes("{status:200}", "utf8"))
  70.         return
  71. # 启动http服务
  72. def beginServer():
  73.     with socketserver.TCPServer(("", HTTP_PORT), httpResponse) as httpd:
  74.         print("serving at port", HTTP_PORT)
  75.         httpd.serve_forever()
  76. controlFan.init_gpio()
  77. # 开启服务
  78. beginServer()
复制代码
代码地址:https://github.com/dadademo/piFan

最后放一张效果图




来源:https://www.cnblogs.com/niexianda/p/17501269.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具