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();
}
因为是24小时运行,为安全起见,建议在ac-dc模块前面,加装250v1A保险管、10D561K压敏电阻,为了防止对电网的干扰,建议加装安规电容275V 0.1uF、20mh共模电感 。。。。:lol 本帖最后由 jerryiot 于 2022-2-9 08:57 编辑
关于ESP01S的烧录,淘宝买个烧录器要十块钱,我这种抠货怎么会掏钱,于是我自己用USB转ESP模块改了一个,把杜邦线切开,一端焊GND 一端焊GIO0,下载的时候,接起来就完事。
只需要不到2块钱 还包邮。。。。
下面抽时间打算给家里的乌龟池子做个 水泵+自动浇水器。
好厉害好厉害 配网不能修改authkey,毫无意义, njbhqm 发表于 2022-2-9 10:21
配网不能修改authkey,毫无意义,
自己家用 为何要频繁修改 authkey imhm 发表于 2022-2-9 12:20
因为是24小时运行,为安全起见,建议在ac-dc模块前面,加装250v1A保险管、10D561K压敏电阻,为了防止对电网 ...
牛逼 完全不懂 jerryiot 发表于 2022-2-9 14:05
牛逼 完全不懂
https://detail.tmall.com/item.htm?spm=a1z0d.6639537.1997196601.38.d5437484ha4NJU&id=652876014149
参看海凌科这个电源模块的典型应用电路。
页:
[1]