360浏览
查看: 360|回复: 3

[M10教程] 【行空板扩展板】行空板智能家居智能中控系统

[复制链接]
本帖最后由 豆爸 于 2024-10-10 05:15 编辑


1. 项目目标:
通过行空板实现对小米智能晾衣架和小米塔扇的控制。


2. 实现功能:
实现行空板控制小米智能晾衣架的升降和照明。
实现行空板控制小米塔扇的开关、风速调节和摇头。


3. 硬件介绍
(1)DFRobot行空板
【行空板扩展板】行空板智能家居智能中控系统图1

一款国产开源硬件,采用微型计算机架构。集成LCD彩屏、WiFi蓝牙、多种常用传感器和丰富的拓展接口。自带Linux操作系统和Python环境,预装常用Python库 。

(2)行空板双路电机驱动扩展板
【行空板扩展板】行空板智能家居智能中控系统图2

集成了两路直流电机驱动,可单独使用电源供电,同时板载了RGB灯、红外发射、红外接收功能以及扩展10路3Pin口和4路I2C口


(3)树莓派3B
【行空板扩展板】行空板智能家居智能中控系统图3

64位的1.2GHz四核ARM Cortex-A53,1GB内存,10/100自适应网卡,802.11n WiFi无线网卡,低功耗蓝牙4.1 (BLE),HDMI接口,USB 2.0接口 x 4,MicroSD 卡插槽,3.5 mm 音频输出接口,40PIN GPIO接口,CSI摄像头接口,DSI显示接口,用于运行Home Assistant系统。Home Assistant:开源的智能家居自动化平台,基于Python开发。支持多种智能设备,实现设备连接和自动化控制 。


(4)小米智能晾衣架
【行空板扩展板】行空板智能家居智能中控系统图4

支持遥控升降、照明等功能。可通过Home Assistant接入智能控制系统 。


(5)小米塔扇
【行空板扩展板】行空板智能家居智能中控系统图5

支持遥控开关、风速调节、摇头、定时等功能。可通过Home Assistant接入智能控制系统 。


(6)温湿度传感器
用于监测环境温湿度,并发送数据至树莓派。


4. 系统框架
输入设备:温湿度传感器
处理中心:树莓派(运行Home Assistant)
输出设备:小米智能晾衣架、小米塔扇
控制面板:行空板 + 行空板M10双路电机驱动I/O扩展板


5. 制作过程
(1)硬件连接
将温湿度传感器连接至树莓派的GPIO端口。
将行空板金手指插到扩展板金手指插槽中,通过配套HY2.0转USB转接线,将扩展板USB OUT与行空板Type-C口连接,使用扩展板USB IN口供电。

(2)软件配置
在树莓派上安装Home Assistant并配置网络。
在Home Assistant中添加小米智能设备的集成。

(3)界面设计
使用行空板显示系统状态和控制界面。通过扩展板上的RGB灯显示不同的系统状态。
系统采用三屏设计。
第一屏,显示系统时间,如下图所示。
【行空板扩展板】行空板智能家居智能中控系统图6



第二屏为照明灯开启/关闭控制界面。

【行空板扩展板】行空板智能家居智能中控系统图10
开灯控制界面
【行空板扩展板】行空板智能家居智能中控系统图9

关灯控制界面


第三屏为智能晾衣架下降/停止/上升控制界面。

【行空板扩展板】行空板智能家居智能中控系统图8

(4)编程
通过Mind+完成程序编写。
① 导入ha.py库
  1. """
  2. 行空板控制Home Assistant中的设备
  3. 作者:DouDad
  4. Email:1545148519@qq.com
  5. 日期:2024-9-28
  6. """
  7. import requests
  8. class DEVICE:        
  9.     def __init__(self, HASS_URL, ACCESS_TOKEN):      
  10.         self.HASS_URL = HASS_URL
  11.         self.ACCESS_TOKEN = ACCESS_TOKEN
  12.         
  13.     def control(self, entity_id, command, domain='cover'):
  14.         url = f"{self.HASS_URL}/api/services/{domain}/{command}"
  15.         payload = {"entity_id": entity_id}
  16.         headers = {
  17.             'Authorization': f'Bearer {self.ACCESS_TOKEN}',
  18.             'Content-Type': 'application/json'
  19.         }
  20.         response = requests.post(url, json=payload, headers=headers)
  21.         if response.status_code == 200:
  22.             print(f"命令 '{command}' 已发送至设备'{entity_id}'")
  23.         else:
  24.             print(f"错误: {response.status_code} - {response.text}")
  25. class HA:
  26.     class COVER(DEVICE):
  27.         def __init__(self, HASS_URL, ACCESS_TOKEN):
  28.             super().__init__(HASS_URL, ACCESS_TOKEN)
  29.         def up(self):
  30.             super().control('cover.kejia_mzn_6408_airer', 'open_cover')
  31.         
  32.         def down(self):
  33.             super().control('cover.kejia_mzn_6408_airer', 'close_cover')
  34.         
  35.         def stop(self):
  36.             super().control('cover.kejia_mzn_6408_airer', 'stop_cover')
  37.         
  38.         def light_on(self):
  39.             super().control('light.kejia_mzn_6408_light', 'turn_on', domain='light')
  40.         
  41.         def light_off(self):
  42.             super().control('light.kejia_mzn_6408_light', 'turn_off', domain='light')        
  43.         
  44.     class FAN(DEVICE):
  45.         def __init__(self, HASS_URL, ACCESS_TOKEN):
  46.             super().__init__(HASS_URL, ACCESS_TOKEN)
  47.         
  48.         def on(self):
  49.             super().control('fan.dmaker_p9_2068_fan', 'turn_on')
  50.         
  51.         def off(self):
  52.             super().control('fan.dmaker_p9_2068_fan', 'turn_off')        
  53.         
  54.     def __init__(self, HASS_URL='http://192.168.123.253:8123', ACCESS_TOKEN='eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJiOWJhMDM0YjYyODQ0MGQ2YmYxNmMyM2Q2NzkyN2RiYyIsImlhdCI6MTcyNzMzNjE2NCwiZXhwIjoyMDQyNjk2MTY0fQ.umXZPcX7FbPZ6EOIIgBPXh5rtgbbEfOaLbuiQoGdBKM'):
  55.         self.cover = self.COVER(HASS_URL, ACCESS_TOKEN)
  56.         self.fan = self.FAN(HASS_URL, ACCESS_TOKEN)
  57. if __name__ == "__main__":
  58.     ha = HA()
  59.     ha.cover.light_on()
  60.     ha.cover.light_off()
  61.     ha.cover.down()
  62.     ha.cover.stop()
  63.     ha.cover.up()
复制代码


②添加ext-imgbutton扩展库


【行空板扩展板】行空板智能家居智能中控系统图7
【行空板扩展板】行空板智能家居智能中控系统图13



③编写mind+程序

【行空板扩展板】行空板智能家居智能中控系统图11


  1. #  -*- coding: UTF-8 -*-
  2. # MindPlus
  3. # Python
  4. import time
  5. from ha import HA
  6. from unihiker import GUI
  7. from datetime import datetime
  8. # 自定义函数
  9. def XianShiPingMu(index):
  10.     if (index == 1):
  11.         PingMu1()
  12.     elif (index == 2):
  13.         PingMu2()
  14.     elif (index == 3):
  15.         PingMu3()
  16. def PingMu1():
  17.     u_gui.clear()
  18.     u_gui.draw_image(image="images/background_brown.png",x=0,y=0)
  19.     clock=u_gui.draw_digit(text="",x=18,y=150,font_size=30, color="#000000")
  20.     while True:
  21.         now = datetime.now()
  22.         current_time = now.strftime("%H:%M:%S")
  23.         clock.config(text=current_time)
  24.         time.sleep(1)
  25. def PingMu2():
  26.     global img
  27.     u_gui.clear()
  28.     u_gui.draw_image(image="images/background.png",x=0,y=0)
  29.     img = u_gui.draw_image(x=45, y=50, w=150, h=150, image="images/lamp_off.png", onclick=button_click6)
  30.     u_gui.draw_image(x=1, y=240.5, w=78, h=78, image="images/light_on.png", onclick=button_click4)
  31.     u_gui.draw_image(x=160, y=240.5, w=78, h=78, image="images/light_off.png", onclick=button_click5)
  32. def PingMu3():
  33.     u_gui.clear()
  34.     u_gui.draw_image(image="images/background.png",x=0,y=0)
  35.     u_gui.draw_image(x=45, y=50, w=150, h=150, image="images/airer.png", onclick=button_click6)
  36.     u_gui.draw_image(x=1, y=240.5, w=78, h=78, image="images/cover_up.png", onclick=button_click1)
  37.     u_gui.draw_image(x=80.5, y=240.5, w=78, h=78, image="images/cover_stop.png", onclick=button_click2)
  38.     u_gui.draw_image(x=160.5, y=240.5, w=78, h=78, image="images/cover_down.png", onclick=button_click3)
  39. # 事件回调函数
  40. def on_buttona_click_callback():
  41.     global PingMuXuHao
  42.     PingMuXuHao = (PingMuXuHao - 1)
  43.     if (PingMuXuHao <= 1):
  44.         PingMuXuHao = 1
  45.     print(PingMuXuHao)
  46.     XianShiPingMu(PingMuXuHao)
  47. def on_buttonb_click_callback():
  48.     global PingMuXuHao
  49.     PingMuXuHao = (PingMuXuHao + 1)
  50.     if (PingMuXuHao >= 3):
  51.         PingMuXuHao = 3
  52.     print(PingMuXuHao)
  53.     XianShiPingMu(PingMuXuHao)
  54. def button_click6():
  55.     global img
  56.     global light_state
  57.     if (light_state == -1):
  58.         ha.cover.light_on()
  59.         img.config(image="images/lamp_on.png")
  60.     elif (light_state == 1):
  61.         ha.cover.light_off()
  62.         img.config(image="images/lamp_off.png")
  63.     light_state = (light_state * -1)
  64.     print("屏幕3")
  65. def button_click1():
  66.     ha.cover.up()
  67. def button_click2():
  68.     ha.cover.stop()
  69. def button_click3():
  70.     ha.cover.down()
  71. def button_click4():
  72.     ha.cover.light_on()
  73. def button_click5():
  74.     ha.cover.light_off()
  75. u_gui=GUI()
  76. u_gui.on_a_click(on_buttona_click_callback)
  77. u_gui.on_b_click(on_buttonb_click_callback)
  78. ha = HA()
  79. u_gui.draw_image(image="images/background.png",x=0,y=0)
  80. PingMuXuHao = 2
  81. XianShiPingMu(PingMuXuHao)
  82. light_state = -1
  83. print(PingMuXuHao)
  84. while True:
  85.     pass
复制代码


6. 功能演示





7. 附件

下载附件程序.zip






easy猿  初级技师

发表于 2024-10-8 21:03:36

厉害了老师,牛牛牛
回复

使用道具 举报

ASH腻  管理员

发表于 2024-10-9 14:38:19

期待效果演示
回复

使用道具 举报

zoey不种土豆  超级版主

发表于 2024-10-9 14:44:06


同蹲
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail