当先锋百科网

首页 1 2 3 4 5 6 7
/* ****************************************************************
 * ESP8266连网,Blinker平台,控制舵机实现远程和小度语音关灯,实现基本功能,有待改进。
 * *****************************************************************
 * 
 * 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.5 或更新的 ESP32/Arduino 支持包。
 * https://github.com/espressif/arduino-esp32/releases
 * 
 * 文档: https://diandeng.tech/doc
 *       
 * 
 * *****************************************************************/
//注意舵机为-90°~+90°
#define BLINKER_WIFI
#define BLINKER_DUEROS_OUTLET

#include <Blinker.h>
#include <Servo.h>

char auth[] = "86c8b6acd763";
char ssid[] =  "zcc";   // "CU_tfCE";
char pswd[] =  "1234567890";  //"ef25mg8w";

// 新建组件对象  注意:要和APP组件’数据键名’一致
BlinkerButton Button1("ddl1");
Servo servo_00;   //舵机输出口 GIPO0

bool oState = false;

//按下APP按键回调函数
void button1_callback(const String & state)
{
    BLINKER_LOG("get button state: ", state);

    if (state == BLINKER_CMD_ON) {
        BLINKER_LOG("Toggle on!");
        
      servo_00.write(60);  //舵机旋转角度 具体参数需要结合自身情况修改
      delay(1);           //给一个小延时
      delay(1000);   //舵机动作后延时一会回到初始位置
      servo_00.write(95); //设置该角度方便手动开关灯 就是开完灯舵机归位
        Button1.color("#7CFC00");
        Button1.print("on");
        oState = true;
    }
    else if (state == BLINKER_CMD_OFF) {
        BLINKER_LOG("Toggle off!");
        
      servo_00.write(130);  //同上一样的思路
      delay(1);
      delay(1000);
      servo_00.write(95);  
        Button1.color("#FF4500");
        Button1.print("off");
        oState = false;
    }
    BlinkerDuerOS.powerState(oState ? "on" : "off");
    BlinkerDuerOS.report();
}

//用户自定义电源类操作的回调函数:
//用小度语音时需要这个函数
void duerPowerState(const String & state)
{
    BLINKER_LOG("need set power state: ", state);

    if (state == BLINKER_CMD_ON) {
         servo_00.write(60);
         delay(1);
         delay(1000);
         servo_00.write(95);
        BlinkerDuerOS.powerState("on");
        BlinkerDuerOS.print();
        oState = true;
    }
    else if (state == BLINKER_CMD_OFF) {
         servo_00.write(130);
         delay(1);
         delay(1000);
         servo_00.write(95);
        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;
    }
}

//向Blinker服务器上报数据
void dataRead(const String & data)
{
    BLINKER_LOG("Blinker readString: ", data);

    // Blinker.vibrate();
   uint32_t BlinkerTime = millis();
   Blinker.print("millis", BlinkerTime);
   BlinkerDuerOS.powerState("on");
   BlinkerDuerOS.report();
}

void setup()
{
    Serial.begin(115200);
    BLINKER_DEBUG.stream(Serial);
    servo_00.attach(0);       //舵机信号管脚GPIO0
    Blinker.begin(auth, ssid, pswd);    //连接WIFI和Blinker服务器
    Blinker.attachData(dataRead);       //注册回调数据信息
    BlinkerDuerOS.attachPowerState(duerPowerState); //注册电源回调函数
    BlinkerDuerOS.attachQuery(duerQuery);           //注册查询回调函数
    Button1.attach(button1_callback);               //注册按键回调函数
}

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