ESP8266+SG90+点灯科技+小爱同学实现关灯

ESP8266+SG90+点灯科技+小爱同学实现关灯

材料:

  • ESP8266
  • SG90
  • 点灯科技app
  • 米家(小爱同学)

一、整体思路

  1. 硬件功能:
    • ESP8266 提供 Wi-Fi 功能和网络通信能力;
    • SG90 舵机负责执行物理动作(拨动/按压家中的实体灯开关);
    • 可以加一个 LED 用作状态指示(比如当前装置是否已经连上网络,或者是否执行过关灯操作等);
    • 通过若干个杜邦线(公母头)完成电路连接。
  2. 软件功能:
    • ESP8266 运行 Arduino 或其他类似固件,内置 Wi-Fi 驱动与网络通信;
    • 以开发者身份将 ESP8266 设备接入小米 IoT 开发者平台
    • 当对“小爱同学”说“关灯”或“开灯”时,云端触发设备上的指令,ESP8266 收到指令后执行舵机拨动动作;
    • 接入点灯科技app,支持点按和滑动舵机的转动,再决定舵机动作。

三、电路连接

  1. 舵机接线:

    • SG90 棕色 ——接入 GND(G) 引脚
    • SG90 红色 —— 接入 VU 引脚
    • SG90 橙色 —— 数字端口(D4)
    • 注意: ESP8266 工作电压是 3.3V,但一般舵机需要 5V 供电,信号线用 3.3V PWM 通常也能驱动,但要确认舵机在这个电压下能够稳定工作。

    image-20250106125745121

  2. ESP8266MOD供电:

    • 用 USB 线连接电脑或 USB 适配器,为 ESP8266MOD提供电源;
    • 如果电脑 USB 供电不足(如只有 500mA),舵机可能会动作无力或复位,可以使用额外的 5V/2A(3A) 适配器供电。这一点非常重要,使用笔记本电脑USB供电会导致频繁复位,信号灯一致闪烁。

四、开发环境准备

  1. 安装 Arduino IDE

    image-20250106102511581

  2. 添加 ESP8266 开发板支持

    • 打开 Arduino IDE,进入 “文件(File) -> 首选项(Preferences)”;
    • 在“额外开发板管理器网址(Additional Boards Manager URLs)”处填入:
    • https://arduino.esp8266.com/stable/package_esp8266com_index.json

    image-20250106102718435

    • 然后在 “工具(Tools) -> 开发板(Boards) -> Boards Manager” 中搜索“ESP8266”,安装最新版本即可。如果无法加载可能需要开启代理下载,当然也可以直接导入安装包

    image-20250106102914161

  3. 配置Blink的库

    项目 -> 加载库 -> 添加.zip 库 ->blinker-library-0.3.80210803.zip

    通过网盘分享的文件:远程关灯Blinker
    链接: https://pan.baidu.com/s/1IMRatTjzLpmqUCs-qEAw-g?pwd=2024 提取码: 2024

  4. 选择 ESP8266 开发板

    • 在 “工具(Tools) -> 开发板(Boards)” 中选择 ESP8266 的Generic ESP8266 Module

    image-20250106103252701

五、示例代码

以下示例代码基于 Blinker 库实现了与米家(小爱同学)、Blinker APP 的对接,并使用 Servo 库驱动舵机。代码包含了三个功能模块:两个按钮控制舵机分别转到最小值和最大值;一个滑块用来任意控制舵机角度;并支持小爱同学语音指令(“打开”、“关闭”)去控制舵机位置。

#include <Servo.h>
#define BLINKER_WIFI
#define BLINKER_MIOT_LIGHT
#include <Blinker.h>

// 认证信息和WiFi配置
char auth[] = "3b37d4bafe1";       // 点灯Key
char ssid[] = "OPPO Find X8 18C6"; // WiFi名称
char pswd[] = "12345678";          // WiFi密码

// 新建组件对象
BlinkerButton Button1("btn-nik");  // 第一个开关组件键名
BlinkerButton Button2("btn-827");  // 第二个开关组件键名
BlinkerSlider Slider3("ran-4qp");  // 滑块组件键名

Servo myservo;

// 舵机相关变量
const int servo_init = 90;   // 舵机的初始位置
const int servo_max = 180;   // 舵机最大角度
const int servo_min = 0;     // 舵机最小角度

// “复位”函数:延迟 1 秒,然后把舵机转回初始位置
void servoReset() {
    delay(1000);                   // 等待 1 秒
    myservo.write(servo_init);     // 回到初始位置 (90°)
    BLINKER_LOG("Servo reset to initial position: ", servo_init);
}

// 按钮1回调:让舵机转到最大值,结束后复位
void button1_callback(const String & state) {
    BLINKER_LOG("Button1 pressed, moving servo to: ", servo_max);
    myservo.write(servo_max);
    Blinker.vibrate();
    // 执行完毕后,延时 1 秒再回到初始位置
    servoReset();
}

// 按钮2回调:让舵机转到最小值,结束后复位
void button2_callback(const String & state) {
    BLINKER_LOG("Button2 pressed, moving servo to: ", servo_min);
    myservo.write(servo_min);
    Blinker.vibrate();
    // 执行完毕后,延时 1 秒再回到初始位置
    servoReset();
}

// 滑块回调:设置舵机到指定位置,不自动复位
void slider3_callback(int32_t value) {
    // 限制滑块值在0到180之间,以防超出舵机物理范围
    value = constrain(value, servo_min, servo_max);
    BLINKER_LOG("Slider value received: ", value);
    myservo.write(value);
    Blinker.delay(100);
    // 如果需要在滑块操作后复位,可以取消下面的注释
    // servoReset();
}

// 小爱同学的回调:开时转到最大值,关时转到最小值,执行后自动复位
void miotPowerState(const String & state) {
    BLINKER_LOG("Received power state command: ", state);

    if (state == BLINKER_CMD_ON) {
        BLINKER_LOG("Moving servo to: ", servo_max);
        myservo.write(servo_max);
        Blinker.vibrate();
        // 回传给米家:已打开
        BlinkerMIOT.powerState(BLINKER_CMD_ON);
        BlinkerMIOT.print();
        
        // 执行完毕后复位
        servoReset();
    }
    else if (state == BLINKER_CMD_OFF) {
        BLINKER_LOG("Moving servo to: ", servo_min);
        myservo.write(servo_min);
        Blinker.vibrate();
        // 回传给米家:已关闭
        BlinkerMIOT.powerState(BLINKER_CMD_OFF);
        BlinkerMIOT.print();

        // 执行完毕后复位
        servoReset();
    }
}

void setup() {
    Serial.begin(115200);
    BLINKER_DEBUG.stream(Serial);
    Blinker.begin(auth, ssid, pswd);

    // 绑定回调
    Button1.attach(button1_callback);
    Button2.attach(button2_callback);
    Slider3.attach(slider3_callback);

    // 绑定小爱回调
    BlinkerMIOT.attachPowerState(miotPowerState);

    // 舵机初始化
    myservo.attach(2); // D4
    myservo.write(servo_init);  // 设置初始位置为90°
    BLINKER_LOG("Servo initialized to: ", servo_init);
}

void loop() {
    Blinker.run();
}

六、与Blinker APP 的对接

char auth[] = "3b37d4bafe1";       // 点灯Key
char ssid[] = "OPPO Find X8 18C6"; // WiFi名称
char pswd[] = "12345678";          // WiFi密码

点灯Key需要通过 右上角+ 独立设备 网络接入 复制Key获取

点击刚刚创建的设备,可以手动添加按钮或滑块

也可直接点击 设备管理 -> 新的设备 -> 界面配置 ->复制下述内容 -> 更新配置

{¨version¨¨2.0.0¨¨config¨{¨headerColor¨¨transparent¨¨headerStyle¨¨dark¨¨background¨{¨img¨¨assets/img/headerbg.jpg¨¨isFull¨«}}¨dashboard¨|{¨type¨¨btn¨¨ico¨¨fal fa-power-off¨¨mode¨É¨t0¨¨文本1¨¨t1¨¨文本2¨¨bg¨É¨cols¨Í¨rows¨Í¨key¨¨btn-nik¨´x´Ë´y´Ì¨lstyle¨Ë}{ßCßDßEßFßGÉßHßIßJßKßLÉßMÍßNÍßO¨btn-827¨´x´Ë´y´ÑßQË}{ßC¨ran¨ßH¨滑动条¨¨clr¨¨#389BEE¨¨max¨¢2u¨min¨ÊßLÉßMÑßNËßO¨ran-4qp¨´x´É´y´¤D}÷¨actions¨|÷¨triggers¨|÷¨rt¨|÷}

需要注意这里的键名是否与代码中的组件名保持一致

// 新建组件对象
BlinkerButton Button1("btn-nik");  // 第一个开关组件键名
BlinkerButton Button2("btn-827");  // 第二个开关组件键名
BlinkerSlider Slider3("ran-4qp");  // 滑块组件键名

image-20250106130224017

六、与小爱同学的对接

  1. Blinker 与小爱对接原理
    • 通过在代码中定义 #define BLINKER_MIOT_LIGHT,并在初始化时调用 BlinkerMIOT.attachPowerState(miotPowerState),可以将设备作为“灯”接入米家生态。
    • 在回调函数 miotPowerState() 中,根据小爱同学收到的指令(开/关),控制舵机动作,同时上报设备状态给米家(BlinkerMIOT.powerState(BLINKER_CMD_ON/OFF); BlinkerMIOT.print();)。
  2. 小爱控制体验
    • 在“米家”App 中添加设备后,使用语音对小爱同学说“打开/关闭灯”(灯为你在米家中命名的设备),即可触发舵机最大角度/最小角度动作。
  3. 开关状态反馈
    • 当设备接收到开或关的指令时,会执行舵机动作,并把执行结果通过 BlinkerMIOT.print() 回传给米家,从而保证米家后台展示状态的实时更新。

注意

  • 要保证手机和设备处于同一个网络(或设备能够连接外网)才可以完成小爱同学的云端控制。
  • 如果使用的不是米家智能家居生态,而是其他生态,需要选择对应的对接方式

image-20250106124025445

image-20250106124101435

image-20250106124426110

image-20250106124630679

七、舵机物理安装与校准

舵机硬件连接

  • 供电:将舵机的红色电源线接到 5V(若使用 3.3V 供电,需要确保舵机兼容),棕色或黑色接到 GND。
  • 信号:舵机的橙色/黄色线(信号线)接到 Arduino 或 ESP8266等主控的数字口(如本示例使用 D4 号引脚,特别注意不是D2)。
  • 注意舵机一般工作电流较大,如果在带载荷时出现断电复位等情况,需要额外为舵机提供稳定的电源(比如独立电源,注意共地)。

初始位置校准

  • 在示例代码中,将 servo_init 设置为 90 度,意味着舵机初始化后会停留在中位。
  • 如果发现舵机在 90° 时不是你所需的真正“中位”,可以通过:
    • 重新安装舵机舵盘(horn)时让舵机转到代码里设定的 90° 后再插舵盘,以此实现硬件上的大致中位对齐。
    • 根据需求修改 servo_init 的值,将其调整到一个合适的数值。

角度限位

  • 如果舵机在 0° 或 180° 时出现抖动或卡顿,说明物理空间里达到极限,可以适当修改 servo_minservo_max,来避免超出实际行程范围。

八、测试流程

上电自检

  • 烧录代码后,上电或按下复位键 (115200 波特率)
  • 如果初始化成功,按下复位键(RST)日志会输出 Servo initialized to: 90 以及 WiFi 连接信息,这些日志会在串口监视器(Serial Monitor)里输出。

image-20250106111632859

按钮测试

  • 通过 Blinker App(“数据大屏”或“控制面板”)上的 Button1和 Button2 测试:
    • 点击 Button1,舵机应转至 servo_max,再经过 1 秒延时后转回 servo_init
    • 点击 Button2,舵机应转至 servo_min,再经过 1 秒延时后转回 servo_init

滑块测试

  • 在 Blinker App 中拖动滑块 Slider3,观察舵机转动角度是否随滑块数值变化。
  • 如果舵机能随之转动,说明滑块功能正常。
  • 根据需要可选择是否在滑块操作后自动复位(在 slider3_callback 函数里有注释说明)。

小爱同学语音测试

  • 在米家 App 中添加设备(按 Blinker 官方指南),并将其命名为可语音识别的名称(例如“舵机”或“阀门”)。
  • 对小爱同学说“打开舵机”或“关闭舵机”,观察舵机动作是否正常。
  • 设备收到开/关指令后,会分别转至 servo_maxservo_min,并在 1 秒后回到 servo_init

最终运行监控

  • 确保在多次操作舵机后,系统不会出现断电、复位或者超时的问题。若出现供电不稳定情况,需要单独给舵机供电并与主控共地。

image-20250106124742546

九、问题和建议

  1. 舵机抖动或复位问题
    • 原因:供电不足、电流不稳、或者舵机在信号初始时没有有效 PWM;
    • 解决:使用足够大电流的电源,或者给舵机单独供电(注意必须共地),在开机时先 myServo.attach(servoPin, minPulse, maxPulse) 并让舵机停在一个合适的角度。
  2. Wi-Fi 不稳定
    • 原因:ESP8266 对电源稳定性比较敏感,或者路由器信号不好;
    • 解决:使用靠谱的电源适配器。
  3. 接入D4引脚无反应
    • 原因:ESP8266 包含多种类型
    • 解决:可以更换其他信号引脚

十、总结

本项目使用 ESP8266 模块与 SG90 舵机相结合,借助 Blinker(点灯科技)和 米家(小爱同学)实现对实体灯开关的远程及语音控制。其核心思路是:ESP8266 通过 Wi-Fi 连接到互联网,与 Blinker 及米家云端进行数据交换,小爱同学(或 Blinker App)发送“开灯/关灯”的命令后,ESP8266 收到指令并驱动舵机拨动实体开关。

在硬件层面,需充分考虑舵机供电问题(可使用单独的 5V/2A 或更大功率电源,并与 ESP8266 共地)以保证稳定。通过 Arduino IDE 配置 ESP8266 环境后,加载示例代码并将舵机的信号线连接到合适的 GPIO(如 D4 引脚)。软件层面,Blinker 提供了便捷的控制面板(按钮、滑块)以及与米家的直连接口;在米家 App 中完成设备添加后即可通过“小爱同学”进行语音指令。测试过程中,通过观察串口日志与 Blinker App 的输出,可以快速了解舵机的工作状态、网络连接情况以及指令执行结果,进而进行进一步的调试或校正。整个项目成本低、改造轻量,可以为普通家居场景提供简易的物理按键远程/语音控制方案。

十一、参考文献

### 关于ESP8266的使用指南和教程 #### ESP8266-Demos 示例工程项目 为了更好地理解如何开发基于ESP8266的应用程序,可以从名为`ESP8266-Demos`的项目入手。此项目包含了多个示例工程,旨在展示ESP8266的各种功能特性以及编程技巧[^1]。 #### WiFi 连接配置指导 针对想要实现设备联网需求的情况,存在专门面向ESP8266 Wi-Fi设置方面的文档说明。该资料不仅介绍了基本概念还提供了具体操作流程来帮助完成Wi-Fi网络接入过程中的参数调整工作[^2]。 #### MicroPython 开发入门 如果计划采用MicroPython作为主要编程语言,则需先获取适用于ESP8266平台版本的固件镜像文件,并按照指示方法刷写至硬件之上;这是执行任何后续步骤之前必不可少的前提条件之一[^3]。 #### ATK-ESP8266 模块简介 特别指出的是,在众多不同型号当中这里重点讨论了ATK-ESP8266这款产品而非其他变种如ESP-01等。对于后者有兴趣者可参照官方资源进一步探索其特点与应用场景[^4]。 #### Arduino IDE 集成环境搭建 当涉及到利用Arduino集成开发环境中编写控制逻辑时,用户应当熟悉怎样加载特定库支持以及正确安装驱动以便顺利编译上传代码样例给目标单片机。例如,可以通过打开指定路径下的`.ino`源码文件启动IDE并依据提示完成相应设定项的选择[^5]。 ```cpp // 示例:简单的WiFi连接测试代码片段 #include <ESP8266WiFi.h> const char* ssid = "your_SSID"; const char* password = "your_PASSWORD"; void setup() { Serial.begin(115200); delay(10); // We start by connecting to a WiFi network Serial.println(); Serial.print("Connecting to "); Serial.println(ssid); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(""); Serial.println("WiFi connected"); } void loop() {} ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值