8.6
【写在前面】
在上一帖子中,记录了小智MCP控制外接led灯的学习,当时心中就想,把灯改成继电器,就可以控制外部电器的开关了,这里进行的是简单的测试,2个继电器控制彩灯串和玩具小风扇。继电器就是一个简单的高低电平控制,一个ESP32 S3可以接多个继电器的,所以可以完成更多电器开关控制。

好啦,马上行动。
材料清单
- K10小智AI X1
- ESP32 S3-DevKitC-1开发板(N16R8) X1
- 继电器 X2
- 小风扇 X1
- 小电灯 X1
步骤1 测试设备电路组装
编程环境准备:
让小智语音控制ESP32 S3点灯|极简MCP插件教程- Makelog(造物记)
两个继电器,分别接在IO4和IO5。IO4引脚的继电器控制小风扇的开关,小风扇名叫小风。IO5引脚的继电器控制黄色灯串的开关,灯串的名字叫金豆。


步骤2 代码编写
继电器控制的代码挺简单的,它由基础示例改写,复制板载灯的控制代码,修改就好。
定义风扇和灯的引脚。

小风扇控制

灯串控制

硬件初始化

下面是完整代码
代码
#include <WiFi.h>
#include <WebSocketMCP.h>
#define FAN_PIN 4 // 引脚 (GPIO4)风扇控制引脚
#define LED_PIN 5 // 引脚 (GPIO5)彩灯控制引脚
// WiFi配置
const char* ssid = "********";
const char* password = "********";
// MCP服务器配置
const char* mcpEndpoint = "ws://api.xiaozhi.me/mcp/?token=********";
// 创建WebSocketMCP实例
WebSocketMCP mcpClient;
// 连接状态回调函数
void onConnectionStatus(bool connected) {
if (connected) {
Serial.println("[MCP] 已连接到服务器");
// 连接成功后注册工具
registerMcpTools();
} else {
Serial.println("[MCP] 与服务器断开连接");
}
}
// 注册MCP工具
void registerMcpTools() {
// 注册风扇控制工具
mcpClient.registerTool(
"fan_control",
"控制IO4引脚继电器控制风扇小风开关",
"{\"type\":\"object\",\"properties\":{\"state\":{\"type\":\"string\",\"enum\":[\"on\",\"off\"]}},\"required\":[\"state\"]}",
[](const String& args) {
DynamicJsonDocument doc(256);
deserializeJson(doc, args);
String state = doc["state"].as<String>();
if (state == "on") {
//开启风扇-继电器闭合//高电平触发
digitalWrite(FAN_PIN, HIGH);
Serial.println("[FAN]风扇开启-继电器闭合(高电平)");
} else if (state == "off") {
//关闭风扇-继电器断开//低电平触发
digitalWrite(FAN_PIN, LOW);
Serial.println("[FAN]风扇关闭-继电器断开(低电平)");
}
return WebSocketMCP::ToolResponse("{\"success\":true,\"state\":\"" + state + "\"}");
}
);
Serial.println("[MCP] 风扇控制工具已注册");
// 注册彩灯控制工具
mcpClient.registerTool(
"led_control",
"控制IO5引脚继电器控制彩灯金豆开关",
"{\"type\":\"object\",\"properties\":{\"state\":{\"type\":\"string\",\"enum\":[\"on\",\"off\"]}},\"required\":[\"state\"]}",
[](const String& args) {
DynamicJsonDocument doc(256);
deserializeJson(doc, args);
String state = doc["state"].as<String>();
if (state == "on") {
//点亮彩灯-继电器闭合//高电平触发
digitalWrite(LED_PIN, HIGH);
Serial.println("[LED]彩灯-继电器闭合(高电平)");
} else if (state == "off") {
//关闭彩灯-继电器断开//低电平触发
digitalWrite(LED_PIN, LOW);
Serial.println("[LED]彩灯关闭-继电器断开(低电平)");
}
return WebSocketMCP::ToolResponse("{\"success\":true,\"state\":\"" + state + "\"}");
}
);
Serial.println("[MCP] 彩灯控制工具已注册");
}
void setup() {
Serial.begin(115200);
//初始化风扇控制引脚
pinMode(FAN_PIN, OUTPUT);
digitalWrite(FAN_PIN, LOW);//风扇初始化关闭-继电器低电平
Serial.println("[FAN]风扇控制引脚初始化完成");
//初始化彩灯控制引脚
pinMode(LED_PIN, OUTPUT);
digitalWrite(LED_PIN, LOW);//彩灯初始化关闭-继电器低电平
Serial.println("[LED]彩灯控制引脚初始化完成");
// 连接WiFi
Serial.print("连接到WiFi: ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("WiFi已连接");
Serial.println("IP地址: " + WiFi.localIP().toString());
// 初始化MCP客户端
mcpClient.begin(mcpEndpoint, onConnectionStatus);
}
void loop() {
// 处理MCP客户端事件
mcpClient.loop();
// 其他代码...
delay(10);
}
评论