ESP01s + blinker + 小度音响 13元实现客厅灯远程控制-Arduino中文社区 - Powered by Discuz! Archiver

jerryiot 发表于 2022-2-8 17:44

ESP01s + blinker + 小度音响 13元实现客厅灯远程控制

本帖最后由 jerryiot 于 2022-2-9 08:58 编辑

13元就能把家里的老旧客厅灯实现为WIFI语音智能灯!快来试试吧!家里的客厅灯无法远程控制,于是用esp01搭配blinker实现wifi远程控制,最后绑定到小度音响实现了语音控制,一套的成本差不多13块,方便好用。先上成品!https://www.bilibili.com/video/BV1i3411Y777?share_source=copy_web

然后,开始搞!上硬件:
https://cdn.jerrycoding.com/media/ckeditor_upload/2022/01/20/_20220120171207.jpg
竟然要了2元运费,心痛!!!
ESP01s作为主控芯片,搭配ESP01sRelay继电器模块,就能通过ESP芯片控制继电器的开合。选择这款继电器的目的在于可以直接把ESP01插进去使用,简化了电路。一个稳压模块用于将220V转为5V给继电器供电。
原理其实很简单,大概就是:ESP01S连接WIFI上线后接收手机端APP发送的开合信号,转化为GIO0脚的高低电平进而控制继电器的开合。电路图不会画,随便搞下https://cdn.jerrycoding.com/media/ckeditor_upload/2022/01/20/image_2xdaFrD.png最后得到的实物图:https://cdn.jerrycoding.com/media/ckeditor_upload/2022/01/20/_20220120174657_kGmhc6T.jpghttps://cdn.jerrycoding.com/media/ckeditor_upload/2022/01/20/_20220120180804.jpg编写程序。这里用到的是 点灯 ,具体简单的入门可以参照 点灯官网 https://www.diandeng.tech/home在点灯APP中新添加一个设备,设置个开关按钮,取名btn-abc:https://cdn.jerrycoding.com/media/ckeditor_upload/2022/01/20/_20220120175159.jpg在ESP01芯片上烧写代码,就可实现基于点灯APP的远程控制了:#define BLINKER_WIFI

#include <Blinker.h>

char auth[] = "xxxxxaaaaa";//设备的KEY 在点灯 APP 设备中可查
char ssid[] = "yyy";      //wifi 名称
char pswd[] = "xxx";    //wifi 密码

// 新建组件对象
BlinkerButton Button1("btn-abc");   //APP中添加的按钮控件名字

// 按下按键即会执行该函数
void button1_callback(const String & state)
{
    BLINKER_LOG("get button state: ", state);
    Serial.print("state");
    if(state == "on")
    {
      Serial.print("state ON");
      digitalWrite(LED_BUILTIN, LOW);
      digitalWrite(0, HIGH);          //GPIO0控制继电器开合
      Button1.color("#6666ff");
      Button1.text("已开启");
      Button1.print("on");
      oState = true;
    }
    else if(state == "off")
    {
      Serial.print("state OFF");
      digitalWrite(LED_BUILTIN, HIGH);
      digitalWrite(0, LOW);         //GPIO0控制继电器开合
      Button1.color("#708090");
      Button1.text("已关闭");
      Button1.print("off");
      oState = false;
    }
    else{}
}

void setup()
{
    // 初始化串口
    Serial.begin(9600);
    BLINKER_DEBUG.stream(Serial);
    BLINKER_DEBUG.debugAll();
   
    // 初始化有LED的IO
    pinMode(LED_BUILTIN, OUTPUT);
    digitalWrite(LED_BUILTIN, LOW);
   
    pinMode(0, OUTPUT);
    digitalWrite(0, HIGH);
   
    // 初始化blinker
    Blinker.begin(auth, ssid, pswd);
    Button1.attach(button1_callback);
}

void loop() {
    Blinker.run();
}接下来继续关于小度音响的接入。具体的文档介绍及示例代码可以看官网 https://diandeng.tech/doc/dueros用在智能灯上面,基本的功能也只有 关 开,于是这里选择的的设备类型为:light#define BLINKER_DUEROS_LIGHT设备接收到命令后的回调函数:void duerPowerState(const String & state)
{
    BLINKER_LOG("need set power state: ", state);

    if (state == BLINKER_CMD_ON) {
      digitalWrite(LED_BUILTIN, LOW);
      digitalWrite(0, HIGH);
      Button1.color("#6666ff");
      Button1.text("已开启");
      Button1.print("on");
      BlinkerDuerOS.powerState("on");
      BlinkerDuerOS.print();
      oState = true;
    }
    else if (state == BLINKER_CMD_OFF) {
      digitalWrite(LED_BUILTIN, HIGH);
      digitalWrite(0, LOW);
      Button1.color("#708090");
      Button1.text("已关闭");
      Button1.print("off");
      BlinkerDuerOS.powerState("off");
      BlinkerDuerOS.print();
      oState = false;
    }
}接收到命令后再修改引脚高低电平的同时,也把按钮的状态及文字告知APP,这样交互性好一些。查询命令的回调函数:void duerQuery(int32_t queryCode)
{
    BLINKER_LOG("DuerOS Query codes: ", queryCode);

    switch (queryCode)
    {
      case BLINKER_CMD_QUERY_POWERSTATE_NUMBER:
            BLINKER_LOG("DuerOS Query power state");
            BlinkerDuerOS.powerState(oState ? "on" : "off");
            BlinkerDuerOS.print();
            break;
      case BLINKER_CMD_QUERY_TIME_NUMBER:
            BLINKER_LOG("DuerOS Query time");
            BlinkerDuerOS.time(millis());
            BlinkerDuerOS.print();
            break;
      default :
            BlinkerDuerOS.powerState(oState ? "on" : "off");
            BlinkerDuerOS.print();
            break;
    }
}两个回调函数完成后,再setup启动函数中绑定即可void setup()
{
    BlinkerDuerOS.attachPowerState(duerPowerState);
    BlinkerDuerOS.attachQuery(duerQuery);
}烧写代码后,设备将会正常上线,在点灯 APP上看到上线。接下来,在小度 APP上进行 blinker 账号的绑定与设备同步。打开小度APP——右上角 添加设备——搜索 blinker——绑定账号。绑定完成后点击同步设备,要保证设备是在线的,否则同步是不显示的。同步完成后会显示刚刚的设备:https://cdn.jerrycoding.com/media/ckeditor_upload/2022/02/08/_20220208173318.jpg接下来,就可以使用语音进行控制了。最后,贴一下完整代码:记得修改 wifi 及 设备的authkey#define BLINKER_WIFI

#define BLINKER_DUEROS_LIGHT

#include <Blinker.h>

char auth[] = "xxx";
char ssid[] = "xxxxxeee";
char pswd[] = "233222eeee";

// 新建组件对象
BlinkerButton Button1("btn-abc");

bool oState = false;

void duerPowerState(const String & state)
{
    BLINKER_LOG("need set power state: ", state);

    if (state == BLINKER_CMD_ON) {
      digitalWrite(LED_BUILTIN, LOW);
      digitalWrite(0, HIGH);
      Button1.color("#6666ff");
      Button1.text("已开启");
      Button1.print("on");
      BlinkerDuerOS.powerState("on");
      BlinkerDuerOS.print();
      oState = true;
    }
    else if (state == BLINKER_CMD_OFF) {
      digitalWrite(LED_BUILTIN, HIGH);
      digitalWrite(0, LOW);
      Button1.color("#708090");
      Button1.text("已关闭");
      Button1.print("off");
      BlinkerDuerOS.powerState("off");
      BlinkerDuerOS.print();
      oState = false;
    }
}

void duerQuery(int32_t queryCode)
{
    BLINKER_LOG("DuerOS Query codes: ", queryCode);

    switch (queryCode)
    {
      case BLINKER_CMD_QUERY_POWERSTATE_NUMBER:
            BLINKER_LOG("DuerOS Query power state");
            BlinkerDuerOS.powerState(oState ? "on" : "off");
            BlinkerDuerOS.print();
            break;
      case BLINKER_CMD_QUERY_TIME_NUMBER:
            BLINKER_LOG("DuerOS Query time");
            BlinkerDuerOS.time(millis());
            BlinkerDuerOS.print();
            break;
      default :
            BlinkerDuerOS.powerState(oState ? "on" : "off");
            BlinkerDuerOS.print();
            break;
    }
}

// 按下按键即会执行该函数
void button1_callback(const String & state)
{
    BLINKER_LOG("get button state: ", state);
    Serial.print("state");
    if(state == "on")
    {
      Serial.print("state ON");
      digitalWrite(LED_BUILTIN, LOW);
      digitalWrite(0, HIGH);
      Button1.color("#6666ff");
      Button1.text("已开启");
      Button1.print("on");
      oState = true;
    }
    else if(state == "off")
    {
      Serial.print("state OFF");
      digitalWrite(LED_BUILTIN, HIGH);
      digitalWrite(0, LOW);
      Button1.color("#708090");
      Button1.text("已关闭");
      Button1.print("off");
      oState = false;
    }
    else{}
}

void setup()
{
    // 初始化串口
    Serial.begin(9600);
    BLINKER_DEBUG.stream(Serial);
    BLINKER_DEBUG.debugAll();
   
    // 初始化有LED的IO
    pinMode(LED_BUILTIN, OUTPUT);
    digitalWrite(LED_BUILTIN, LOW);
   
    pinMode(0, OUTPUT);
    digitalWrite(0, HIGH);
   
    // 初始化blinker
    Blinker.begin(auth, ssid, pswd);

    Button1.attach(button1_callback);

    BlinkerDuerOS.attachPowerState(duerPowerState);
    BlinkerDuerOS.attachQuery(duerQuery);
}

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


imhm 发表于 2022-2-9 12:20

因为是24小时运行,为安全起见,建议在ac-dc模块前面,加装250v1A保险管、10D561K压敏电阻,为了防止对电网的干扰,建议加装安规电容275V 0.1uF、20mh共模电感 。。。。:lol

jerryiot 发表于 2022-2-8 17:51

本帖最后由 jerryiot 于 2022-2-9 08:57 编辑

关于ESP01S的烧录,淘宝买个烧录器要十块钱,我这种抠货怎么会掏钱,于是我自己用USB转ESP模块改了一个,把杜邦线切开,一端焊GND 一端焊GIO0,下载的时候,接起来就完事。

只需要不到2块钱 还包邮。。。。
下面抽时间打算给家里的乌龟池子做个 水泵+自动浇水器。

weiqinglong51 发表于 2022-2-8 18:37

好厉害好厉害

njbhqm 发表于 2022-2-9 10:21

配网不能修改authkey,毫无意义,

jerryiot 发表于 2022-2-9 10:33

njbhqm 发表于 2022-2-9 10:21
配网不能修改authkey,毫无意义,

自己家用 为何要频繁修改 authkey

jerryiot 发表于 2022-2-9 14:05

imhm 发表于 2022-2-9 12:20
因为是24小时运行,为安全起见,建议在ac-dc模块前面,加装250v1A保险管、10D561K压敏电阻,为了防止对电网 ...

牛逼 完全不懂

imhm 发表于 2022-2-9 16:32

jerryiot 发表于 2022-2-9 14:05
牛逼 完全不懂

https://detail.tmall.com/item.htm?spm=a1z0d.6639537.1997196601.38.d5437484ha4NJU&id=652876014149

参看海凌科这个电源模块的典型应用电路。
页: [1]
查看完整版本: ESP01s + blinker + 小度音响 13元实现客厅灯远程控制