问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

宿舍远程关灯神器:低成本ESP8266 WIFI+舵机+blinker方案

创作时间:
作者:
@小白创作中心

宿舍远程关灯神器:低成本ESP8266 WIFI+舵机+blinker方案

引用
CSDN
1.
https://blog.csdn.net/weixin_53631107/article/details/136792642

在宿舍里,有时候我们希望能够在离开时远程关闭灯光,但又不想进行复杂的电路改装。本文将介绍一个低成本的解决方案,使用ESP8266和舵机实现远程关灯功能,整个项目预算控制在20元以内,非常适合DIY爱好者尝试。

一、材料清单

  • esp8266MCU开发板一块(10元左右)
  • sg50舵机一个(6元左右)
  • 数据线一根
  • 公转母杜邦线3根(2元)
  • 充电宝或者220v转5V充电器一根

二、Arduino IDE配置ESP8266环境

首先从Arduino官网下载最新版本的Arduino IDE软件并安装。安装完成后,进入首选项(Preferences),找到附加开发板管理器地址(Additional Board Manager URLs),并在其后添加如下信息:

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

之后点击工具 - 开发板 - 开发板管理器,选择NodeMcu1.0(esp-12E Module)。硬件连接时,端口选择COM3或者COM5,如果端口没选对的话上传会显示"COMX不成功"。

三、WIFI配置

在代码中需要修改以下三个地方:

char auth[] = ""; //!key! 代码需更改的地方
char ssid[] = ""; //!wifi名称! (不要有中文和空格,如果使用热点需要设为2.4G频)
char pswd[] = ""; //!wifi密码!

四、点灯科技设置

手机打开点灯科技APP,进入设备设置界面。设置三个按钮和四个滑块,具体设置如下:

  • 三个按钮的数据键名分别为btn-max、btn-min、btn-pw
  • 四个滑块的数据键名分别为max-num、min-num、ser-num、time-num
  • 最后一个滑块(time-num)的最大值最小值可以根据需求设置,代表循环的间隔时间,单位为毫秒。


五、接线

接线图如下:


设备在线以后进入控制界面,将位置2的滑块设置到适当位置,再点击位置2的按钮,可以看舵机转动。

六、附录(代码)

#include <Servo.h>
#define BLINKER_WIFI
#include <Blinker.h>
char auth[] = ""; //!key! 代码需更改的地方
char ssid[] = ""; //!wifi名称!
char pswd[] = ""; //!wifi密码!
// 新建组件对象
BlinkerButton Button1("btn-max"); //位置1 按钮 数据键名
BlinkerButton Button2("btn-min"); //位置2 按钮 数据键名
BlinkerButton Button3("btn-pw"); //循环模式 按钮 数据键名 开关模式
Servo myservo;
BlinkerSlider Slider1("max-num"); //位置1 滑块 数据键名 范围1-180
BlinkerSlider Slider2("min-num"); //位置2 滑块 数据键名 范围1-180
BlinkerSlider Slider3("ser-num"); //实时位置 滑块 数据键名 范围1-180
BlinkerSlider Slider4("time-num"); //循环模式间隔时间 滑块 数据键名 范围单位毫秒
bool xunhuan_mode = false;
int servo_max, servo_min, ser_num, time_num;

void button1_callback(const String &state) { //位置1按钮
    BLINKER_LOG("get button state: ", servo_max);
    myservo.write(servo_max);
    Blinker.vibrate();
}

void button2_callback(const String &state) { //位置2按钮
    BLINKER_LOG("get button state: ", servo_min);
    myservo.write(servo_min);
    Blinker.vibrate();
}

void button3_callback(const String &state) { //位置3按钮 开关模式
    if (state == "on") {
        xunhuan_mode = true;
        Button3.print("on");
        Blinker.delay(100);
    } else if (state == "off") {
        xunhuan_mode = false;
        Button3.print("off");
        Blinker.delay(100);
    }
}

void slider1_callback(int32_t value)
{
    servo_max = value;
    Slider1.color("#1E90FF");
    Slider1.print();
    BLINKER_LOG("get slider value: ", value);
}

void slider2_callback(int32_t value)
{
    servo_min = value;
    Slider2.color("#FFF8DC");
    Slider2.print();
    BLINKER_LOG("get slider value: ", value);
}

void slider3_callback(int32_t value)
{
    ser_num = value;
    myservo.write(ser_num);
    Blinker.delay(100);
    BLINKER_LOG("get slider value: ", value);
}

void slider4_callback(int32_t value)
{
    time_num = value;
    Blinker.delay(100);
    BLINKER_LOG("get slider value: ", value);
}

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);
    Button3.attach(button3_callback);
    Slider1.attach(slider1_callback);
    Slider2.attach(slider2_callback);
    Slider3.attach(slider3_callback);
    Slider4.attach(slider4_callback);
    myservo.attach(5); //servo.attach():设置舵机数据引脚
    myservo.write(10); //servo.write():设置转动角度
    servo_max = 70;
    servo_min = 120;
    time_num = 500;
}

void loop()
{
    Blinker.run();
    if (xunhuan_mode == true) {
        xunhuan();
    }
}
© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号