本帖最后由 云天 于 2025-6-1 20:15 编辑
- 在当今科技飞速发展的时代,智能家居已经逐渐走进了我们的生活。通过各种智能设备的互联互通,我们能够更加便捷地控制家中的电器、获取环境信息,甚至实现自动化场景。今天,就让我们一起走进一个由行空板M10和ESP32-S3 AI摄像头组成的智能家居小助手项目,感受科技的魅力。
- 小智AI最新功能:驱动摄像头功能通过语音命令或图形界面控制,可实现摄像头的开启、关闭及画面的智能识别分析。用户发出“打开摄像头”等语音指令后,系统会激活摄像头并显示视频流,随后可通过“识别画面”等命令,让系统截取当前帧并调用智普视觉大模型API进行分析,最终以语音或文字形式反馈结果
【项目背景】
- 随着生活节奏的加快,人们对于生活品质的要求也越来越高。智能家居系统能够根据环境变化和用户的指令自动调整设备状态,为人们提供更加舒适、便捷的生活体验。例如,在光线较暗时自动开灯,在室内温度过高时自动开启风扇等。而实现这些功能的关键,就在于设备之间的智能联动。行空板M10以其强大的扩展性和编程能力,结合ESP32-S3 AI摄像头的智能识别功能,为我们搭建这样一个智能家居小助手提供了可能。
【硬件选择与搭配行空板M10及其扩展板】
- 行空板M10是一款功能强大的开发板,专为便携类项目制作而设计。它搭配了电机IO扩展板和金手指扩展板,能够实现多种功能扩展。电机IO扩展板集成了两路直流电机驱动,同时板载了RGB灯、红外发射、红外接收功能,以及扩展了多路接口,包括3路3Pin口、2路I2C口和2路舵机接口。这些丰富的接口为连接各种传感器和执行器提供了便利。金手指扩展板则将空余IO全引出,进一步增强了扩展性。此外,行空板M10还可以通过背夹电池实现独立供电,配合800mAh电池扩展板,能够满足长时间的移动使用需求。
【ESP32-S3 AI摄像头】
- ESP32-S3 AI摄像头是一款基于ESP32-S3芯片设计的智能摄像头模组,专为视频图像处理和语音交互打造。它内置高性能神经网络运算能力,能够进行智能图像识别和边缘计算任务。摄像头具有160°的广角视野和红外补光功能,即使在弱光或完全黑暗的环境中,也能保持清晰的图像输出。此外,板载的麦克风和扬声器使其支持语音识别和对话功能,能够实现远程指令控制和实时互动。通过Wi-Fi联网,该摄像头还可以与云端AI平台对接,调用在线的大规模语言模型和视觉模型,进一步扩展其智能功能。
【硬件整体图】
- 整个智能家居小助手系统由ESP32-S3 AI摄像头、行空板M10及其扩展板组成。ESP32-S3 AI摄像头安装了小智AI固件,通过Mcp服务与行空板M10上的物联网平台Siot进行通信。行空板M10连接了温湿度传感器、LED灯环和小风扇(通过3.3V电磁继电器控制)。如下图所示:
【工作原理】- 环境感知与指令触发:ESP32-S3 AI摄像头通过语音识别或图像识别功能,感知环境变化或接收用户指令。例如,当用户说“天黑了,我有点看不清楚了”,摄像头会识别出这一指令,并通过Mcp服务(电脑运行Mcp服务程序)向行空板M10发送开灯指令。
- 指令接收与设备控制:行空板M10通过Siot平台(行空板M10内置的Siot平台)接收到来自摄像头的指令后,根据指令内容控制相应的设备。例如,接收到开灯指令后,行空板M10会点亮连接的LED灯环;接收到开风扇指令后,会通过电磁继电器控制小风扇开启。
- 环境数据采集与反馈:行空板M10连接的温湿度传感器会定期采集室内温度和湿度数据,并通过Siot平台发送给ESP32-S3 AI摄像头。摄像头可以通过语音的方式将这些环境数据反馈给用户,例如,当用户询问“室内温度是多少”时,ESP32-S3 AI摄像头会语音回答当前的温度值。
【软件设计与实现笔记本上的Mcp服务程序】
- Mcp服务程序运行在笔记本电脑上,作为ESP32-S3 AI摄像头和行空板M10之间的通信桥梁。程序使用Python编写,通过FastMCP框架创建服务,并定义了多个工具函数,用于控制行空板M10上的设备。例如,Open_light函数用于开灯,close_fan函数用于关闭风扇。这些函数通过Siot平台向行空板M10发送指令,并在成功执行后返回相应的结果。
【行空板M10上的程序】
- 行空板M10上的程序使用Mind+ Python模式编写。程序初始化了Siot平台、温湿度传感器、LED灯环和电磁继电器等设备。通过定义事件回调函数on_message_callback,行空板M10能够接收来自Mcp服务的指令,并根据指令内容控制相应的设备。例如,当接收到“O”指令时,点亮LED灯环;当接收到“Y”指令时,开启小风扇。同时,程序还会定期采集温湿度数据,并通过Siot平台发送给ESP32-S3 AI摄像头。
【项目实现与测试硬件组装】- 将行空板M10与电机IO扩展板和金手指扩展板组合,安装好800mAh电池扩展板。
2.连接温湿度传感器、LED灯环和小风扇(通过电磁继电器)到行空板M10的对应接口。
3.安装好小智AI固件的ESP32-S3 AI摄像头,装好电池、配上腕带,确保其能够正常工作。
【软件部署】- 在笔记本电脑上运行Mcp服务程序,确保其能够正常启动并连接到Siot平台。可参考之前本人的项目文章:https://mc.dfrobot.com.cn/thread-332416-1-1.html
from mcp.server.fastmcp import FastMCP
import sys
import logging
import siot
#修复Windows控制台的UTF-8编码
if sys.platform == 'win32':
sys.stderr.reconfigure(encoding='utf-8')
sys.stdout.reconfigure(encoding='utf-8')
#配置日志
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',datefmt='%Y-%m-%d %H:%M:%S')
logger = logging.getLogger('Operating_computer')
Temp=""
humidity=""
# 事件回调函数
def on_message_callback(client, userdata, msg):
global Temp,humidity
tem=msg.payload.decode().split(":")
Temp=tem[0]
humidity=tem[1]
#初始化MQTT
try:
siot.init(client_id="6634597909977196", server="192.168.31.138", port=1883, user="siot", password="dfrobot")
siot.connect()
siot.loop()
siot.set_callback(on_message_callback)
siot.getsubscribe(topic="df/Temp")
except Exception as e:
logger.error(f"Failed to initialize or connect to MQTT server: {e}")
exit(1)
#创建 MCP 服务
mcp = FastMCP("Operating_unihiker")
#======================= 设备控制工具 =======================
#添加一个工具
@mcp.tool()
def Open_light() -> dict:
"""当接收到需开灯相关的情景,此工具会通过物联网向行空板发送指令,让行空板点亮LED灯"""
try:
siot.publish(topic="df/pic", data="O")
logger.info("已开灯")
return {"success": True, "result": "已为您开灯"}
except Exception as e:
logger.error(f"Failed to open light: {e}")
return {"success": False, "result": "开灯失败"}
#添加一个工具
@mcp.tool()
def close_light() -> dict:
"""当接收到需关灯相关的情景,此工具会通过物联网向行空板发送指令,让行空板熄灭LED灯"""
try:
siot.publish(topic="df/pic", data="C")
logger.info("已关灯")
return {"success": True, "result": "已为您关灯"}
except Exception as e:
logger.error(f"Failed to close light: {e}")
return {"success": False, "result": "关灯失败"}
#添加一个工具
@mcp.tool()
def open_fan() -> dict:
"""当接收到需打开风扇相关的情景,此工具会通过物联网向行空板发送指令,让行空板打开风扇"""
try:
siot.publish(topic="df/pic", data="Y")
logger.info("已打开风扇")
return {"success": True, "result": "已为您打开风扇"}
except Exception as e:
logger.error(f"Failed to open fan: {e}")
return {"success": False, "result": "打开风扇失败"}
#添加一个工具
@mcp.tool()
def close_fan() -> dict:
"""当接收到需关闭风扇相关的情景,此工具会通过物联网向行空板发送指令,让行空板关闭风扇"""
try:
siot.publish(topic="df/pic", data="N")
logger.info("已关闭风扇")
return {"success": True, "result": "已为您关闭风扇"}
except Exception as e:
logger.error(f"Failed to close fan: {e}")
return {"success": False, "result": "关闭风扇失败"}
#添加一个工具
@mcp.tool()
def get_temp() -> dict:
"""此工具可得到,当前室内的温度"""
try:
logger.info(f"已获取室内温度:{Temp}")
return {"success": True, "result": Temp}
except Exception as e:
logger.error(f"Failed to get Temp: {e}")
return {"success": False, "result": "获取室内温度失败"}
#添加一个工具
@mcp.tool()
def get_humidity() -> dict:
"""此工具可得到,当前室内的湿度"""
try:
logger.info(f"已获取室内湿度:{humidity}")
return {"success": True, "result": humidity}
except Exception as e:
logger.error(f"Failed to get humidity: {e}")
return {"success": False, "result": "获取室内湿度失败"}
if __name__ == "__main__":
try:
#主循环运行MCP服务器
mcp.run(transport="stdio")
except Exception as e:
logger.error(f"Failed to run MCP server: {e}")
2.将编写好的程序上传到行空板M10中,并确保其能够正常运行。
# -*- coding: UTF-8 -*-
# MindPlus
# Python
import siot
from pinpong.board import Board,Pin
from pinpong.extension.unihiker import *
from pinpong.board import NeoPixel
from pinpong.libs.dfrobot_dht20 import DHT20
from unihiker import GUI
u_gui=GUI()
u_gui.draw_text(text="行空板智能体",x=18,y=100,font_size=25, color="#0000FF")
# 事件回调函数
def on_message_callback(client, userdata, msg):
if (msg.payload.decode() == "O"):
print("开灯")
np1.range_color(0,23,0xFF0000)
if (msg.payload.decode() == "C"):
print("关灯")
np1.clear()
if (msg.payload.decode() == "Y"):
print("开风扇")
p_p21_out.write_digital(1)
time.sleep(0.2)
p_p21_out.write_digital(0)
if (msg.payload.decode() == "N"):
print("关风扇")
p_p21_out.write_digital(1)
time.sleep(0.2)
p_p21_out.write_digital(0)
time.sleep(0.2)
p_p21_out.write_digital(1)
time.sleep(0.2)
p_p21_out.write_digital(0)
time.sleep(0.2)
p_p21_out.write_digital(1)
time.sleep(0.2)
p_p21_out.write_digital(0)
time.sleep(0.2)
siot.init(client_id="9989246551376638",server="192.168.31.138",port=1883,user="siot",password="dfrobot")
Board().begin()
siot.connect()
siot.loop()
siot.set_callback(on_message_callback)
p_dht20 = DHT20()
p_p21_out=Pin(Pin.P21, Pin.OUT)
p_p22_out=Pin(Pin.P22, Pin.OUT)
np1 = NeoPixel(p_p22_out,24)
np1.brightness(50)
siot.getsubscribe(topic="df/pic")
while True:
siot.publish(topic="df/Temp", data=str(round(p_dht20.temp_c(),1))+":"+str(round(p_dht20.humidity(),1)))
time.sleep(10)
3.配置ESP32-S3 AI摄像头的网络连接,使其能够通过Mcp服务与行空板M10进行通信。小智AI固件(df-s3-ai-cam): v1.6.6_df-s3-ai-cam.zip
【功能测试】- 语音控制测试:通过与ESP32-S3 AI摄像头对话,测试其语音识别和指令触发功能。例如,说“天黑了,我有点看不清楚了”,观察行空板M10是否能够成功点亮LED灯环。
- 环境数据采集与反馈测试:询问ESP32-S3 AI摄像头室内温度和湿度,观察其是否能够准确回答,并检查行空板M10是否能够正常采集和发送温湿度数据。
- 设备控制测试:通过语音指令或摄像头的图像识别功能,测试行空板M10对小台灯、小风扇的控制功能,观察台灯、风扇是否能够正常开启和关闭。
【演示视频】
【项目成果与展望】
- 经过一系列的硬件组装、软件部署和功能测试,我们的智能家居小助手项目成功实现了预期的功能。通过语音或图像指令,用户可以轻松地控制家中的灯光和风扇,同时还能随时获取室内环境的温度和湿度信息。这个项目不仅展示了行空板M10和ESP32-S3 AI摄像头的强大功能,也为智能家居的应用提供了一个有趣的实践案例。
- 在未来,我们可以进一步扩展这个项目的功能。例如,增加更多的传感器和执行器,实现更多的自动化场景;或者通过接入更多的AI模型,提升设备的智能识别能力。此外,我们还可以将这个项目与现有的智能家居系统进行整合,实现更广泛的设备互联和场景联动,为人们的生活带来更多便利和乐趣。
- 总之,这个智能家居小助手项目为我们提供了一个探索智能家居世界的绝佳机会。通过动手实践,我们不仅能够学习到硬件组装和软件编程的知识,还能够感受到科技为生活带来的改变。希望这个项目能够激发更多人的创造力,共同推动智能家居的发展。
|
|
|
|
|
|