Arduino 继电器控制(Blinker+ 小度)

一、前期准备

1. D1 UNO R3 WIFI 开发板,
2. 继电器
3. 电源
4. 小度音箱
5. Blinker 账户
6. 百度账户
7. Arduino IDE
8. Blinker library 0.3.4
9. ESP8266 开发板支持库 2.7.1

二、设备及接线图

Arduino 继电器控制(Blinker+ 小度)_第1张图片

三、程序

 /*******************************************
  * 本代码采用D1 UNO R3 WIFI + 继电器板通过测试
  */
/************************************************************
很多时候,#define 后只有一个参数,经常出现在头文件的开始处。
解释:
定义宏,并在预处理过程中将其替换为空字符串(即删除)。
这样做主要是为了标记某些内容,使程序阅读者能够清楚标记表明的意义,同时又不影响被编译的源代码。
也就是说,用法同define后接两个参数,只是后一个参数为空字符串。用途包括:
(1)定义一个符号用来给#if(n)def判断。          
(2)多文件编译中防止头文件被重复包含。
 **********************************************************************/
#define BLINKER_WIFI
#define BLINKER_PRINT Serial
//此句允许小度APP扫描到此设备
#define BLINKER_DUEROS_OUTLET

#include 
//设备连接BLINKER及家中的WIFI
char auth[] = "Blink app生成的密钥";
char ssid[] = "wifi名字";
char pswd[] = "wifi密码";

bool oState = false;
//Blinker APP中控制继电器的按钮
BlinkerButton btn_TVP("btn-TVP");

int TV_Pin = D5;
//与小度APP进行电源状态交互
void duerPowerState(const String & state)
{
    BLINKER_LOG("need set power state: ", state);

    if (state == BLINKER_CMD_ON) {
        digitalWrite(TV_Pin, HIGH);

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

        oState = true;
    }
    else if (state == BLINKER_CMD_OFF) {
        digitalWrite(TV_Pin, LOW);

        BlinkerDuerOS.powerState("off");
        BlinkerDuerOS.print();

        oState = false;
    }
}
//用户自定义设备查询的回调函数:
void duerQuery(int32_t queryCode)
{
    BLINKER_LOG("DuerOS Query codes: ", queryCode);

    switch (queryCode)
    {
        case BLINKER_CMD_QUERY_ALL_NUMBER :
            BLINKER_LOG("DuerOS Query All");
            BlinkerDuerOS.powerState(oState ? "on" : "off");
            BlinkerDuerOS.print();
            break;
        case BLINKER_CMD_QUERY_POWERSTATE_NUMBER :
            BLINKER_LOG("AliGenie Query Power State");
            BlinkerDuerOS.powerState(oState ? "on" : "off");
           BlinkerDuerOS.print();
            break;
        default :
            BlinkerDuerOS.powerState(oState ? "on" : "off");
            BlinkerDuerOS.print();
            break;
    }
}

void dataRead(const String & data)
{
    BLINKER_LOG("Blinker readString: ", data);

    Blinker.vibrate();
    
    uint32_t BlinkerTime = millis();
    
    Blinker.print("millis", BlinkerTime);
}
//Blinker APP 按钮控制命令
void btn_TVP_callback(const String & state)     //点灯app内控制按键触发
{
     BLINKER_LOG("get button state: ", state);
    digitalWrite(TV_Pin, !digitalRead(TV_Pin));
}
void setup()
{
    Serial.begin(115200);
    //debug 命令
    BLINKER_DEBUG.stream(BLINKER_PRINT);
    BLINKER_DEBUG.debugAll();
    //继电器接入公共端和常开端口,电压初始化为低电压,接入高电压后吸合供电
    pinMode(TV_Pin, OUTPUT);
    digitalWrite(TV_Pin, LOW);

    Blinker.begin(auth, ssid, pswd);
    Blinker.attachData(dataRead);
    
    BlinkerDuerOS.attachPowerState(duerPowerState);
    BlinkerDuerOS.attachQuery(duerQuery);
    btn_TVP.attach(btn_TVP_callback); 
}

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

以上程序基于Arduino IDE–实例–Blinker–Blinker_AliGenie–AliGenie_OUTLET修改而来。
Blinker APP 中设置一个按钮,命名为“btn_TVP”,语音设置:打开电视机–on,关闭电视机–off

四 、采过的坑

1.  关于开发板,最初想为了一步到位,买了带WIFI的D1开发板,结果发现与UNO R3的基础板有很大不同,为了找到相关资料饶了很多弯路。最终才找到了下图的参数

Arduino 继电器控制(Blinker+ 小度)_第2张图片
2. 在修改程序的过程中,一直处于修改,上传,修改,上传的境地,自己细心都不够,没有一次行修改完成。

五、目前修在的问题

 1. 语音控制目前不稳定,初步怀疑为家里网络的质量差导致。

注:以上信息全部来自互联网,如果涉及版权请告知即删。转载请注明出处。谢谢!

你可能感兴趣的:(智能家居)