从零开始使用ESP8266 + Blinker 实现小爱同学可控可读取状态的多路插座

前言

一直对8266很感兴趣,放寒假嘛,也挺闲,刚好手头有原来买下的Nodemcu,就拿来做个多路开关

参考资料我会放到文章末尾

(渣渣新手练手的小东西,求大佬指导)

一.准备

1.硬件

  • nodemcu(ESP-12E)

  • 双路光耦继电器

2.用到的开发软件

  • Arduino IDE

  • Blinker APP

3.小爱同学(我使用的是一个小爱闹钟)

4.准备环境

5.你自己 Ciallo~(∠・ω< )⌒★

二.安装相关Arduino库&申请Blinker Secret Key

1.安装相关库
2.申请Secret Key
  • 打开Blinker APP,点击右上角的 “+”

  • 选择独立设备

  • 选择WiFi接入

  • 通信服务商选择阿里云

  • 复制Key

以下为流程图:

1 2 3 4 5

三.连接线路

1.继电器相关

在正式开始编程前,我们需要先了解一下继电器模块的模块参数以及说明
在这里插入图片描述

双路光耦继电器模块
2.Nodemcu相关

通过查阅资料可以了解到Nodemcu在编程时可以直接使用PCB上的丝印来表示IO口

3.链接

GND-GND

IN1-D5

IN2-D6

VCC-VV (由开发板提供5V)

四.编写程序&烧写程序

1.源码
/* *****************************************************************
 *
 * Download latest Blinker library here:
 * https://github.com/blinker-iot/blinker-library/archive/master.zip
 * 
 * 
 * Blinker is a cross-hardware, cross-platform solution for the IoT. 
 * It provides APP, device and server support, 
 * and uses public cloud services for data transmission and storage.
 * It can be used in smart home, data monitoring and other fields 
 * to help users build Internet of Things projects better and faster.
 * 
 * Make sure installed 2.7.4 or later ESP8266/Arduino package,
 * if use ESP8266 with Blinker.
 * https://github.com/esp8266/Arduino/releases
 * 
 * Make sure installed 1.0.4 or later ESP32/Arduino package,
 * if use ESP32 with Blinker.
 * https://github.com/espressif/arduino-esp32/releases
 * 
 * Docs: https://diandeng.tech/doc
 *       
 * 
 * *****************************************************************
 * 
 * Blinker 库下载地址:
 * https://github.com/blinker-iot/blinker-library/archive/master.zip
 * 
 * Blinker 是一套跨硬件、跨平台的物联网解决方案,提供APP端、设备端、
 * 服务器端支持,使用公有云服务进行数据传输存储。可用于智能家居、
 * 数据监测等领域,可以帮助用户更好更快地搭建物联网项目。
 * 
 * 如果使用 ESP8266 接入 Blinker,
 * 请确保安装了 2.7.4 或更新的 ESP8266/Arduino 支持包。
 * https://github.com/esp8266/Arduino/releases
 * 
 * 如果使用 ESP32 接入 Blinker,
 * 请确保安装了 1.0.4 或更新的 ESP32/Arduino 支持包。
 * https://github.com/espressif/arduino-esp32/releases
 * 
 * 文档: https://diandeng.tech/doc
 *       
 * 
 * *****************************************************************
 *
 *
 * -使用ESP8266控制双路光耦继电器,可接入小米小爱,通过小爱控制&查询当前状态-
 *
 * by Tracker     
 * My blog:https://baichuan2077.top
 * *****************************************************************/
 
#define BLINKER_WIFI
#define BLINKER_MIOT_MULTI_OUTLET

#include <Blinker.h>

//继电器控制口
int relay1 = D5;
int relay2 = D6;

bool oState[5] = { false };  //检测用

char auth[] = "申请到的密匙";
char ssid[] = "SSID";
char pswd[] = "密码";

// 新建组件对象
BlinkerButton Button1("btn-1");
BlinkerButton Button2("btn-2");


// 按下按键1即会执行该函数
void button1_callback(const String & state)
{
    BLINKER_LOG("get button1 state: ", state);
    digitalWrite(relay1, !digitalRead(relay1));

    //oState[1] = !(oState[1]);

}

// 如果未绑定的组件1被触发,则会执行其中内容
void dataRead1(const String & data)
{
    BLINKER_LOG("Blinker readString: ", data);
}

// 按下按键2即会执行该函数
void button2_callback(const String & state)
{    
    BLINKER_LOG("get button2 state: ", state);
    digitalWrite(relay2, !digitalRead(relay2));

    //oState[2] = !(oState[2]);
    
}

// 如果未绑定的组件2被触发,则会执行其中内容
void dataRead2(const String & data)
{
    BLINKER_LOG("Blinker readString: ", data);
}


void miotPowerState(const String & state, uint8_t num)             //relay继电器电源状态
{
    
    BLINKER_LOG("need set power state: ", state,"num-back", num);
    
    unsigned char i = 0; //初始化
      if(num == 1)
      {
        i = relay1;
      }
      else if(num == 2)
      {
        i = relay2;
      }
      
    
    if (state == BLINKER_CMD_ON) 
    {
        digitalWrite(i, HIGH);

        BlinkerMIOT.powerState("on");
        BlinkerMIOT.print();

        digitalWrite(i, !digitalRead(i));

        oState[num] = true;
    }
    else if (state == BLINKER_CMD_OFF) 
    {
        digitalWrite(i, LOW);
        
        BlinkerMIOT.powerState("off");
        BlinkerMIOT.print();
        digitalWrite(i, !digitalRead(i));

        oState[num] = false;
    }
  
}

void miotQuery(int32_t queryCode, uint8_t num)
{
    BLINKER_LOG("AliGenie Query outlet: ", num,", codes: ", queryCode);

    switch (queryCode)
    {
        case BLINKER_CMD_QUERY_ALL_NUMBER :
            BLINKER_LOG("MIOT Query All");
            BlinkerMIOT.powerState(oState[num] ? "on" : "off", num);
            BlinkerMIOT.print();
            break;
        case BLINKER_CMD_QUERY_POWERSTATE_NUMBER :
            BLINKER_LOG("MIOT Query Power State");
            BlinkerMIOT.powerState(oState[num] ? "on" : "off", num);
            BlinkerMIOT.print();
            break;
        default :
            BlinkerMIOT.powerState(oState[num] ? "on" : "off", num);
            BlinkerMIOT.print();
            break;
    }
}

void setup()
{
    // 初始化串口
    Serial.begin(115200);
    BLINKER_DEBUG.stream(Serial);
    BLINKER_DEBUG.debugAll();
    
    // 初始化IO
    pinMode(relay1, OUTPUT);
    digitalWrite(relay1, HIGH);
    pinMode(relay2, OUTPUT);
    digitalWrite(relay2, HIGH);
    // 初始化blinker
    Blinker.begin(auth, ssid, pswd);
    Blinker.attachData(dataRead1);                 //获取1
    Blinker.attachData(dataRead2);                 //获取2

    Button1.attach(button1_callback);              //按钮1
    Button2.attach(button2_callback);              //按钮2
    
    BlinkerMIOT.attachPowerState(miotPowerState);  //注册电源函数1
    BlinkerMIOT.attachQuery(miotQuery);            //注册回调函数
}

void loop() {
    Blinker.run();
}
2.烧录相关

开发板选择NodeMCU V1.0(ESP-12E Module)

其余保持默认即可

五.Blinker App &小爱绑定第三方设备

1.Blinker App配置相关

我在编写时添加了APP内的按钮控制,所以你也可以通过App来手动控制继电器通路状态

APP内
2.小米小爱绑定第三方设备

以我的小爱闹钟为例:

米家-我的-其他平台设备-右上角“添加”-选择“点灯科技”-绑定账户并同步设备

总结一下

最后我们可以通过小爱同学来控制插孔 以及查询插孔状态,还可以通过Blinker App来控制开关

语音指令例:

-打开插座插孔一

-插座插孔二的状态

由于我手头只有双路继电器,并不能展示更多路的控制

欢迎来我的博客玩 Ciallo~(∠・ω< )⌒★

My blog:https://baichuan2077.top/


使用到的参考资料:

点灯科技官方开发文档

nodeMCU 1.0简要数据手册

Arduino论坛参考帖-【智能取暖器DIY】ESP32+blinker接入小爱同学语音控制

Arduino论坛参考帖-小爱同学+Blinker如何控制多个继电器?

Blinker官方例程-MIOT_MULTI_OUTLET.ino

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐