冬天关灯不求人:用ESP8266和舵机制作智能开关

冬天关灯不求人:用ESP8266和舵机制作智能开关

所需材料

  • ESP8266 NodeMCU 开发板(比如 NodeMCU 1.0, 约10元)
  • SG90舵机(约6元)
  • 杜邦线(3根公转母,约2元)
  • 5V充电宝或220V转5V电源适配器(为ESP8266和舵机提供电力)
  • 数据线(连接ESP8266到电脑)
  • 手机(安装Blinker应用来控制)

环境配置:让Arduino IDE支持ESP8266

首先,我们需要配置好Arduino IDE,以便能够编写和上传代码到ESP8266上。

1. 安装Arduino IDE

前往Arduino官网下载并安装最新版的Arduino IDE。

2. 配置ESP8266开发环境

在Arduino IDE中,点击文件 > 首选项,然后在附加开发板管理器的URL框中添加以下地址:

http://arduino.esp8266.com/stable/package_esp8266com_index.json

点击确定,然后进入工具 > 开发板 > 开发板管理器,搜索并安装ESP8266库。

3. 选择开发板与端口

工具 > 开发板中,选择 NodeMCU 1.0 (ESP-12E Module),并选择正确的端口(例如COM3或COM5)。

4. 修改Wi-Fi信息

在代码中,修改Wi-Fi的名称和密码:

char ssid[] = "your_WIFI_name";  // Wi-Fi名称
char pswd[] = "your_WIFI_password"; // Wi-Fi密码
        

硬件连接:准备ESP8266和舵机

1. 连接舵机

舵机有三根线:棕色(接地)、红色(接5V电源)、黄色(接数据引脚)。将黄色线连接到ESP8266的D1引脚(GPIO5)。红色线连接到5V,棕色线连接到GND。

2. 电源

我们可以使用一个5V的充电宝或220V转5V电源适配器来给ESP8266和舵机供电。确保电源稳定。

编写代码:控制舵机转动

现在,我们来编写代码,通过ESP8266控制舵机转动。代码中包括了按钮、滑块等功能,通过Blinker应用来控制。

#include 
#define BLINKER_WIFI
#include 

char auth[] = "your_auth_key";   // 替换为Blinker设备的auth_key
char ssid[] = "your_WIFI_name";  // 替换为Wi-Fi名称
char pswd[] = "your_WIFI_password"; // 替换为Wi-Fi密码

Servo myservo;  // 创建舵机对象

// Blinker组件
BlinkerButton Button1("btn-max");  // 位置1按钮
BlinkerButton Button2("btn-min");  // 位置2按钮
BlinkerSlider Slider1("max-num");  // 位置1滑块
BlinkerSlider Slider2("min-num");  // 位置2滑块
BlinkerSlider Slider3("ser-num"); // 实时位置滑块
BlinkerSlider Slider4("time-num"); // 循环时间滑块

int servo_max = 70;  // 最大位置角度
int servo_min = 120; // 最小位置角度
int ser_num = 0;     // 当前舵机角度
int time_num = 500;  // 循环模式间隔时间(毫秒)

bool xunhuan_mode = false;  // 循环模式开关

// 按钮回调函数
void button1_callback(const String &state) {
    myservo.write(servo_max);  // 转到最大位置
    Blinker.vibrate();  // 振动反馈
}

void button2_callback(const String &state) {
    myservo.write(servo_min);  // 转到最小位置
    Blinker.vibrate();  // 振动反馈
}

// 滑块回调函数
void slider1_callback(int32_t value) {
    servo_max = value;
    Slider1.color("#1E90FF");
    Slider1.print();
}

void slider2_callback(int32_t value) {
    servo_min = value;
    Slider2.color("#FFF8DC");
    Slider2.print();
}

void slider3_callback(int32_t value) {
    ser_num = value;
    myservo.write(ser_num);  // 实时更新舵机位置
    Blinker.delay(100);
}

void slider4_callback(int32_t value) {
    time_num = value;
    Blinker.delay(100);
}

// 循环模式控制
void xunhuan() {
    myservo.write(servo_max);
    Blinker.delay(time_num / 2);
    myservo.write(servo_min);
    Blinker.delay(time_num / 2);
}

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

    Button1.attach(button1_callback);
    Button2.attach(button2_callback);
    Slider1.attach(slider1_callback);
    Slider2.attach(slider2_callback);
    Slider3.attach(slider3_callback);
    Slider4.attach(slider4_callback);

    myservo.attach(5);  // 设置舵机引脚为D1(GPIO5)
    myservo.write(10);  // 初始舵机角度
}

void loop() {
    Blinker.run();  // 监听Blinker控制
    if (xunhuan_mode) {
        xunhuan();  // 循环模式控制
    }
}
        

代码解析:

  • 舵机控制:通过Servo库控制舵机的转动。按钮Button1控制舵机到最大位置,按钮Button2控制舵机到最小位置。
  • 滑块控制:通过滑块控制舵机的最大和最小位置,以及实时舵机的位置。
  • 循环模式:xunhuan函数实现循环模式,舵机在最大和最小位置之间来回转动。

配置Blinker应用:控制舵机

1. 创建设备并绑定

打开Blinker应用,创建一个新设备,选择ESP8266作为设备类型。在应用中创建控件:Button1(位置1按钮)、Button2(位置2按钮)、Slider1(位置1滑块)、Slider2(位置2滑块)、Slider3(实时位置滑块)、Slider4(循环时间滑块)。设置控件的数据键名,与代码中的键名保持一致。

2. 控制舵机

在Blinker应用中 ::contentReference[oaicite:0]{index=0}

在Blinker应用中,点击按钮来控制舵机的角度,调整滑块来控制舵机的位置。

测试与调试

1. 测试硬件

按下按钮,舵机会转到指定的位置。调整滑块,检查舵机是否按照滑块的设置正确转动。

2. 测试Blinker控制

在Blinker应用中操作按钮和滑块,确保舵机响应正确。

3. 测试循环模式

开启循环模式,观察舵机是否按设定的时间间隔在最大和最小位置之间切换。

效果如下

总结

通过这篇教程,你已经成功制作了一个简单的智能开关系统。通过ESP8266与舵机的结合,你可以轻松地控制家里的设备开关,甚至通过手机或语音助手来控制它。项目的硬件部分简单易懂,代码也非常直观,适合初学者和DIY爱好者。

希望你喜欢这个项目,如果有任何问题或想要分享你的创意,欢迎在评论区留言!

此作者没有提供个人介绍。
最后更新于 2026-01-30