ESP8266+SG90+点灯科技+小爱同学实现关灯
材料:
- ESP8266
- SG90
- 点灯科技app
- 米家(小爱同学)
一、整体思路
- 硬件功能:
- ESP8266 提供 Wi-Fi 功能和网络通信能力;
- SG90 舵机负责执行物理动作(拨动/按压家中的实体灯开关);
- 可以加一个 LED 用作状态指示(比如当前装置是否已经连上网络,或者是否执行过关灯操作等);
- 通过若干个杜邦线(公母头)完成电路连接。
- 软件功能:
- ESP8266 运行 Arduino 或其他类似固件,内置 Wi-Fi 驱动与网络通信;
- 以开发者身份将 ESP8266 设备接入小米 IoT 开发者平台
- 当对“小爱同学”说“关灯”或“开灯”时,云端触发设备上的指令,ESP8266 收到指令后执行舵机拨动动作;
- 接入点灯科技app,支持点按和滑动舵机的转动,再决定舵机动作。
三、电路连接
-
舵机接线:
- SG90 棕色 ——接入 GND(G) 引脚
- SG90 红色 —— 接入 VU 引脚
- SG90 橙色 —— 数字端口(D4)
- 注意: ESP8266 工作电压是 3.3V,但一般舵机需要 5V 供电,信号线用 3.3V PWM 通常也能驱动,但要确认舵机在这个电压下能够稳定工作。
-
ESP8266MOD供电:
- 用 USB 线连接电脑或 USB 适配器,为 ESP8266MOD提供电源;
- 如果电脑 USB 供电不足(如只有 500mA),舵机可能会动作无力或复位,可以使用额外的 5V/2A(3A) 适配器供电。这一点非常重要,使用笔记本电脑USB供电会导致频繁复位,信号灯一致闪烁。
四、开发环境准备
-
安装 Arduino IDE
- 前往 Arduino 官方网站Software | Arduino 下载并安装 Arduino IDE;
-
添加 ESP8266 开发板支持
- 打开 Arduino IDE,进入 “文件(File) -> 首选项(Preferences)”;
- 在“额外开发板管理器网址(Additional Boards Manager URLs)”处填入:
- https://arduino.esp8266.com/stable/package_esp8266com_index.json
- 然后在 “工具(Tools) -> 开发板(Boards) -> Boards Manager” 中搜索“ESP8266”,安装最新版本即可。如果无法加载可能需要开启代理下载,当然也可以直接导入安装包
-
配置Blink的库
项目 -> 加载库 -> 添加.zip 库 ->blinker-library-0.3.80210803.zip
通过网盘分享的文件:远程关灯Blinker
链接: https://pan.baidu.com/s/1IMRatTjzLpmqUCs-qEAw-g?pwd=2024 提取码: 2024 -
选择 ESP8266 开发板
- 在 “工具(Tools) -> 开发板(Boards)” 中选择 ESP8266 的Generic ESP8266 Module
五、示例代码
以下示例代码基于 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"); // 滑块组件键名
六、与小爱同学的对接
- Blinker 与小爱对接原理
- 通过在代码中定义
#define BLINKER_MIOT_LIGHT
,并在初始化时调用BlinkerMIOT.attachPowerState(miotPowerState)
,可以将设备作为“灯”接入米家生态。 - 在回调函数
miotPowerState()
中,根据小爱同学收到的指令(开/关),控制舵机动作,同时上报设备状态给米家(BlinkerMIOT.powerState(BLINKER_CMD_ON/OFF); BlinkerMIOT.print();
)。
- 通过在代码中定义
- 小爱控制体验
- 在“米家”App 中添加设备后,使用语音对小爱同学说“打开/关闭灯”(灯为你在米家中命名的设备),即可触发舵机最大角度/最小角度动作。
- 开关状态反馈
- 当设备接收到开或关的指令时,会执行舵机动作,并把执行结果通过
BlinkerMIOT.print()
回传给米家,从而保证米家后台展示状态的实时更新。
- 当设备接收到开或关的指令时,会执行舵机动作,并把执行结果通过
注意
- 要保证手机和设备处于同一个网络(或设备能够连接外网)才可以完成小爱同学的云端控制。
- 如果使用的不是米家智能家居生态,而是其他生态,需要选择对应的对接方式
七、舵机物理安装与校准
舵机硬件连接
- 供电:将舵机的红色电源线接到 5V(若使用 3.3V 供电,需要确保舵机兼容),棕色或黑色接到 GND。
- 信号:舵机的橙色/黄色线(信号线)接到 Arduino 或 ESP8266等主控的数字口(如本示例使用
D4
号引脚,特别注意不是D2)。 - 注意舵机一般工作电流较大,如果在带载荷时出现断电复位等情况,需要额外为舵机提供稳定的电源(比如独立电源,注意共地)。
初始位置校准
- 在示例代码中,将
servo_init
设置为90
度,意味着舵机初始化后会停留在中位。 - 如果发现舵机在 90° 时不是你所需的真正“中位”,可以通过:
- 重新安装舵机舵盘(horn)时让舵机转到代码里设定的 90° 后再插舵盘,以此实现硬件上的大致中位对齐。
- 根据需求修改
servo_init
的值,将其调整到一个合适的数值。
角度限位
- 如果舵机在 0° 或 180° 时出现抖动或卡顿,说明物理空间里达到极限,可以适当修改
servo_min
或servo_max
,来避免超出实际行程范围。
八、测试流程
上电自检
- 烧录代码后,上电或按下复位键 (115200 波特率)
- 如果初始化成功,按下复位键(RST)日志会输出
Servo initialized to: 90
以及 WiFi 连接信息,这些日志会在串口监视器(Serial Monitor)里输出。
按钮测试
- 通过 Blinker App(“数据大屏”或“控制面板”)上的 Button1和 Button2 测试:
- 点击 Button1,舵机应转至
servo_max
,再经过 1 秒延时后转回servo_init
。 - 点击 Button2,舵机应转至
servo_min
,再经过 1 秒延时后转回servo_init
。
- 点击 Button1,舵机应转至
滑块测试
- 在 Blinker App 中拖动滑块 Slider3,观察舵机转动角度是否随滑块数值变化。
- 如果舵机能随之转动,说明滑块功能正常。
- 根据需要可选择是否在滑块操作后自动复位(在
slider3_callback
函数里有注释说明)。
小爱同学语音测试
- 在米家 App 中添加设备(按 Blinker 官方指南),并将其命名为可语音识别的名称(例如“舵机”或“阀门”)。
- 对小爱同学说“打开舵机”或“关闭舵机”,观察舵机动作是否正常。
- 设备收到开/关指令后,会分别转至
servo_max
或servo_min
,并在 1 秒后回到servo_init
。
最终运行监控
- 确保在多次操作舵机后,系统不会出现断电、复位或者超时的问题。若出现供电不稳定情况,需要单独给舵机供电并与主控共地。
九、问题和建议
- 舵机抖动或复位问题
- 原因:供电不足、电流不稳、或者舵机在信号初始时没有有效 PWM;
- 解决:使用足够大电流的电源,或者给舵机单独供电(注意必须共地),在开机时先
myServo.attach(servoPin, minPulse, maxPulse)
并让舵机停在一个合适的角度。
- Wi-Fi 不稳定
- 原因:ESP8266 对电源稳定性比较敏感,或者路由器信号不好;
- 解决:使用靠谱的电源适配器。
- 接入D4引脚无反应
- 原因:ESP8266 包含多种类型
- 解决:可以更换其他信号引脚
十、总结
本项目使用 ESP8266 模块与 SG90 舵机相结合,借助 Blinker(点灯科技)和 米家(小爱同学)实现对实体灯开关的远程及语音控制。其核心思路是:ESP8266 通过 Wi-Fi 连接到互联网,与 Blinker 及米家云端进行数据交换,小爱同学(或 Blinker App)发送“开灯/关灯”的命令后,ESP8266 收到指令并驱动舵机拨动实体开关。
在硬件层面,需充分考虑舵机供电问题(可使用单独的 5V/2A 或更大功率电源,并与 ESP8266 共地)以保证稳定。通过 Arduino IDE 配置 ESP8266 环境后,加载示例代码并将舵机的信号线连接到合适的 GPIO(如 D4 引脚)。软件层面,Blinker 提供了便捷的控制面板(按钮、滑块)以及与米家的直连接口;在米家 App 中完成设备添加后即可通过“小爱同学”进行语音指令。测试过程中,通过观察串口日志与 Blinker App 的输出,可以快速了解舵机的工作状态、网络连接情况以及指令执行结果,进而进行进一步的调试或校正。整个项目成本低、改造轻量,可以为普通家居场景提供简易的物理按键远程/语音控制方案。