本帖最后由 豆爸 于 2024-10-10 05:15 编辑  
 
 
1. 项目目标: 
通过行空板实现对小米智能晾衣架和小米塔扇的控制。 
 
 
2. 实现功能: 
实现行空板控制小米智能晾衣架的升降和照明。 
实现行空板控制小米塔扇的开关、风速调节和摇头。 
 
 
3. 硬件介绍 
(1)DFRobot行空板 
一款国产开源硬件,采用微型计算机架构。集成LCD彩屏、WiFi蓝牙、多种常用传感器和丰富的拓展接口。自带Linux操作系统和Python环境,预装常用Python库 。 
 
(2)行空板双路电机驱动扩展板 
 
集成了两路直流电机驱动,可单独使用电源供电,同时板载了RGB灯、红外发射、红外接收功能以及扩展10路3Pin口和4路I2C口。 
 
 
(3)树莓派3B 
 
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)小米智能晾衣架 
 
支持遥控升降、照明等功能。可通过Home Assistant接入智能控制系统 。 
 
 
(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灯显示不同的系统状态。 
系统采用三屏设计。第一屏,显示系统时间,如下图所示。 
 
 
  
第二屏为照明灯开启/关闭控制界面。  
开灯控制界面  
关灯控制界面  
 
第三屏为智能晾衣架下降/停止/上升控制界面。  
 
(4)编程 
通过Mind+完成程序编写。 
① 导入ha.py库
			
			
			- """
 - 
 - 行空板控制Home Assistant中的设备
 - 
 - 作者:DouDad
 - Email:1545148519@qq.com
 - 日期:2024-9-28
 - 
 - """
 - 
 - import requests
 - 
 - 
 - class DEVICE:        
 -     def __init__(self, HASS_URL, ACCESS_TOKEN):       
 -         self.HASS_URL = HASS_URL
 -         self.ACCESS_TOKEN = ACCESS_TOKEN
 -         
 -     def control(self, entity_id, command, domain='cover'):
 -         url = f"{self.HASS_URL}/api/services/{domain}/{command}"
 -         payload = {"entity_id": entity_id}
 -         headers = {
 -             'Authorization': f'Bearer {self.ACCESS_TOKEN}',
 -             'Content-Type': 'application/json'
 -         }
 -         response = requests.post(url, json=payload, headers=headers)
 -         if response.status_code == 200:
 -             print(f"命令 '{command}' 已发送至设备'{entity_id}'")
 -         else:
 -             print(f"错误: {response.status_code} - {response.text}")
 - 
 - class HA:
 -     class COVER(DEVICE):
 -         def __init__(self, HASS_URL, ACCESS_TOKEN):
 -             super().__init__(HASS_URL, ACCESS_TOKEN)
 - 
 -         def up(self):
 -             super().control('cover.kejia_mzn_6408_airer', 'open_cover')
 -         
 -         def down(self):
 -             super().control('cover.kejia_mzn_6408_airer', 'close_cover')
 -         
 -         def stop(self):
 -             super().control('cover.kejia_mzn_6408_airer', 'stop_cover')
 -         
 -         def light_on(self):
 -             super().control('light.kejia_mzn_6408_light', 'turn_on', domain='light')
 -         
 -         def light_off(self):
 -             super().control('light.kejia_mzn_6408_light', 'turn_off', domain='light')        
 -         
 -     class FAN(DEVICE):
 -         def __init__(self, HASS_URL, ACCESS_TOKEN):
 -             super().__init__(HASS_URL, ACCESS_TOKEN)
 -         
 -         def on(self):
 -             super().control('fan.dmaker_p9_2068_fan', 'turn_on')
 -         
 -         def off(self):
 -             super().control('fan.dmaker_p9_2068_fan', 'turn_off')        
 -         
 -     def __init__(self, HASS_URL='http://192.168.123.253:8123', ACCESS_TOKEN='eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJiOWJhMDM0YjYyODQ0MGQ2YmYxNmMyM2Q2NzkyN2RiYyIsImlhdCI6MTcyNzMzNjE2NCwiZXhwIjoyMDQyNjk2MTY0fQ.umXZPcX7FbPZ6EOIIgBPXh5rtgbbEfOaLbuiQoGdBKM'):
 -         self.cover = self.COVER(HASS_URL, ACCESS_TOKEN)
 -         self.fan = self.FAN(HASS_URL, ACCESS_TOKEN)
 - 
 - if __name__ == "__main__":
 -     ha = HA()
 -     ha.cover.light_on()
 -     ha.cover.light_off()
 -     ha.cover.down()
 -     ha.cover.stop()
 -     ha.cover.up()
 
  复制代码
  
 
②添加ext-imgbutton扩展库 
 
 
 
 
 
③编写mind+程序 
 
  
 
- #  -*- coding: UTF-8 -*-
 - 
 - # MindPlus
 - # Python
 - import time
 - from ha import HA
 - from unihiker import GUI
 - from datetime import datetime
 - 
 - # 自定义函数
 - def XianShiPingMu(index):
 -     if (index == 1):
 -         PingMu1()
 -     elif (index == 2):
 -         PingMu2()
 -     elif (index == 3):
 -         PingMu3()
 - def PingMu1():
 -     u_gui.clear()
 -     u_gui.draw_image(image="images/background_brown.png",x=0,y=0)
 -     clock=u_gui.draw_digit(text="",x=18,y=150,font_size=30, color="#000000")
 -     while True:
 -         now = datetime.now()
 -         current_time = now.strftime("%H:%M:%S")
 -         clock.config(text=current_time)
 -         time.sleep(1)
 - def PingMu2():
 -     global img
 -     u_gui.clear()
 -     u_gui.draw_image(image="images/background.png",x=0,y=0)
 -     img = u_gui.draw_image(x=45, y=50, w=150, h=150, image="images/lamp_off.png", onclick=button_click6)
 -     u_gui.draw_image(x=1, y=240.5, w=78, h=78, image="images/light_on.png", onclick=button_click4)
 -     u_gui.draw_image(x=160, y=240.5, w=78, h=78, image="images/light_off.png", onclick=button_click5)
 - def PingMu3():
 -     u_gui.clear()
 -     u_gui.draw_image(image="images/background.png",x=0,y=0)
 -     u_gui.draw_image(x=45, y=50, w=150, h=150, image="images/airer.png", onclick=button_click6)
 -     u_gui.draw_image(x=1, y=240.5, w=78, h=78, image="images/cover_up.png", onclick=button_click1)
 -     u_gui.draw_image(x=80.5, y=240.5, w=78, h=78, image="images/cover_stop.png", onclick=button_click2)
 -     u_gui.draw_image(x=160.5, y=240.5, w=78, h=78, image="images/cover_down.png", onclick=button_click3)
 - 
 - # 事件回调函数
 - def on_buttona_click_callback():
 -     global PingMuXuHao
 -     PingMuXuHao = (PingMuXuHao - 1)
 -     if (PingMuXuHao <= 1):
 -         PingMuXuHao = 1
 -     print(PingMuXuHao)
 -     XianShiPingMu(PingMuXuHao)
 - def on_buttonb_click_callback():
 -     global PingMuXuHao
 -     PingMuXuHao = (PingMuXuHao + 1)
 -     if (PingMuXuHao >= 3):
 -         PingMuXuHao = 3
 -     print(PingMuXuHao)
 -     XianShiPingMu(PingMuXuHao)
 - def button_click6():
 -     global img
 -     global light_state
 -     if (light_state == -1):
 -         ha.cover.light_on()
 -         img.config(image="images/lamp_on.png")
 -     elif (light_state == 1):
 -         ha.cover.light_off()
 -         img.config(image="images/lamp_off.png")
 -     light_state = (light_state * -1)
 -     print("屏幕3")
 - def button_click1():
 -     ha.cover.up()
 - def button_click2():
 -     ha.cover.stop()
 - def button_click3():
 -     ha.cover.down()
 - def button_click4():
 -     ha.cover.light_on()
 - def button_click5():
 -     ha.cover.light_off()
 - 
 - 
 - u_gui=GUI()
 - u_gui.on_a_click(on_buttona_click_callback)
 - u_gui.on_b_click(on_buttonb_click_callback)
 - ha = HA()
 - u_gui.draw_image(image="images/background.png",x=0,y=0)
 - PingMuXuHao = 2
 - XianShiPingMu(PingMuXuHao)
 - light_state = -1
 - print(PingMuXuHao)
 - 
 - while True:
 -     pass
 
  复制代码 
 
6. 功能演示 
 
 
 
 
 
7. 附件 
 程序.zip 
 
 
 
 
 
 
 |