冬天关灯不求人:用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爱好者。
希望你喜欢这个项目,如果有任何问题或想要分享你的创意,欢迎在评论区留言!

Comments NOTHING