回到首页 返回首页
回到顶部 回到顶部
返回上一页 返回上一页

小智语音控制ESP32 S3 外接2继电器(控制彩灯和小风扇)|极简MCP插件教程 简单

头像 rzyzzxw 2025.08.06 25 0

8.6

【写在前面】

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

89ab99c93206e66519fbfa8b30fbecd.jpg

好啦,马上行动。

材料清单

  • K10小智AI X1
  • ESP32 S3-DevKitC-1开发板(N16R8) X1
  • 继电器 X2
  • 小风扇 X1
  • 小电灯 X1

步骤1 测试设备电路组装

编程环境准备:

让小智语音控制ESP32 S3点灯|极简MCP插件教程- Makelog(造物记)

 

两个继电器,分别接在IO4和IO5。IO4引脚的继电器控制小风扇的开关,小风扇名叫小风。IO5引脚的继电器控制黄色灯串的开关,灯串的名字叫金豆。

94fd364108fa56d7cb246854d7d7485.jpg
c9012c7b66accf28135c7b7034b724f.jpg

 

步骤2 代码编写

继电器控制的代码挺简单的,它由基础示例改写,复制板载灯的控制代码,修改就好。

定义风扇和灯的引脚。

image.png

小风扇控制

image.png

灯串控制

image.png

硬件初始化

image.png

下面是完整代码

代码
#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);
}

评论

user-avatar