回馈论坛(小爱 小度 天猫)语音控制开关外加本地开关-Arduino中文社区 - Powered by Discuz! Archiver

13675003417 发表于 2021-2-25 16:02

回馈论坛(小爱 小度 天猫)语音控制开关外加本地开关

       分享一个01S的1路开关+本地开关+点灯APP内配网和一个8266开发板4路开关+4本地开关代码+点灯APP内配网两组代码都经过实测也都接入过3大音箱目前都没问题。至于怎么编译和接入第三方音箱 文档中心都有我这里就不介绍了。
这些代码都是收集论坛里大佬们发的贴子我只是做了一小部分改动希望对爱好者们有一定帮助,谢谢!!!!



1s的如下

#define BLINKER_WIFI                  //官方wifi协议库
#define BLINKER_ESP_SMARTCONFIG         // 进行配网
#define BLINKER_MIOT_LIGHT            //小爱灯类库
#define BLINKER_DUEROS_LIGHT            // 设置小度灯类库
#define BLINKER_ALIGENIE_LIGHT          // 设置天猫灯类库
#define BLINKER_PRINT Serial            //串口协议库
#include <Blinker.h>                  //官方库

char auth[] = "-------";         //设备key号
//char ssid[] = "------";                     //wifi名称
//char pswd[] = "------";            //wifi密码

int kg=0;//继电器输出
int kg2=2;//本地轻触开关,io0与gnd接时动作
//*******新建组件对象
BlinkerButton Button1("btn-abc");            //设置app按键的键名

//*******app上按下按键即会执行该函数app里按键有2种模式3钟不同样式,下面写出所有的开关状态。
void button1_callback(const String & state)            //用state来存储组键的值按键 : "tap"(点按); "pre"(长按); "pup"(释放)开关 : "on"(打开); "off"(关闭)
{
BLINKER_LOG("app操作了!: ", state);                //串口打印

if (digitalRead(kg)==LOW) {            //如果state是on状态
    BLINKER_LOG("灭灯!");                           //串口打印
    digitalWrite(kg, HIGH);
    Button1.color("#00FFFF");                     //设置app按键是深蓝色
    Button1.text("灭");
    Button1.print("off");                         //反馈回按键状态是开
}
else if (digitalRead(kg)==HIGH) {       //如果state是off状态
    BLINKER_LOG("亮灯!");                         //串口打印
   digitalWrite(kg,LOW);
    Button1.color("#0000FF");                  //设置app按键是浅蓝色
    Button1.text("亮");
    Button1.print("on");                      //反馈回按键状态是关
}
}
//*******如果小爱有对设备进行操作就执行下面
void miotPowerState(const String & state)
{
    BLINKER_LOG("小爱语音操作!");            //串口打印

    if (state == BLINKER_CMD_ON){
      digitalWrite(kg,LOW);
      BlinkerMIOT.powerState("on");
      BLINKER_LOG("亮灯!");
      BlinkerMIOT.print();
    }
    else if (state == BLINKER_CMD_OFF){
      digitalWrite(kg,HIGH);
      BlinkerMIOT.powerState("off");
      BLINKER_LOG("灭灯!");
      BlinkerMIOT.print();
    }
}

void miotQuery(int32_t queryCode)       //小爱设备查询的回调函数
{
    BLINKER_LOG("MIOT Query codes: ", queryCode);

    switch (queryCode)
    {
      case BLINKER_CMD_QUERY_ALL_NUMBER :
            BLINKER_LOG("MIOT Query All");
            BlinkerMIOT.powerState(kg ? "on" : "off");
            BlinkerMIOT.print();
            break;
      case BLINKER_CMD_QUERY_POWERSTATE_NUMBER :
            BLINKER_LOG("MIOT Query Power State");
            BlinkerMIOT.powerState(kg ? "on" : "off");
            BlinkerMIOT.print();
            break;

      default :
            BlinkerMIOT.powerState(kg ? "on" : "off");
            BlinkerMIOT.print();
            break;
    }
}

//*******如果小度有对设备进行操作就执行下面
void duerPowerState(const String & state)
{
    BLINKER_LOG("小度语音操作!");            //串口打印

    if (state == BLINKER_CMD_ON){
      digitalWrite(kg,LOW);
      BlinkerDuerOS.powerState("on");
      BLINKER_LOG("亮灯!");
      BlinkerDuerOS.print();
    }
    else if (state == BLINKER_CMD_OFF){
      digitalWrite(kg,HIGH);
      BlinkerDuerOS.powerState("off");
      BLINKER_LOG("灭灯!");
      BlinkerDuerOS.print();
    }
}

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(kg ? "on" : "off");
            BlinkerDuerOS.print();
            break;
      case BLINKER_CMD_QUERY_POWERSTATE_NUMBER :
            BLINKER_LOG("DuerOS Query Power State");
            BlinkerDuerOS.powerState(kg ? "on" : "off");
            BlinkerDuerOS.print();
            break;

      default :
            BlinkerDuerOS.powerState(kg ? "on" : "off");
            BlinkerDuerOS.print();
            break;
    }
}
//*******如果天猫精灵有对设备进行操作就执行下面
void aligeniePowerState(const String & state)
{
    BLINKER_LOG("天猫精灵语音操作!");            //串口打印

    if (state == BLINKER_CMD_ON){
      digitalWrite(kg,LOW);
      BlinkerAliGenie.powerState("on");
      BLINKER_LOG("亮灯!");
      BlinkerAliGenie.print();
    }
    else if (state == BLINKER_CMD_OFF){
      digitalWrite(kg,HIGH);
      BlinkerAliGenie.powerState("off");
      BLINKER_LOG("灭灯!");
      BlinkerAliGenie.print();
    }
}

void aligenieQuery(int32_t queryCode)      //天猫设备查询的回调函数

{
    BLINKER_LOG("AliGenie Query codes: ", queryCode);

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

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

    Blinker.vibrate();

    uint32_t BlinkerTime = millis();

    Blinker.print("millis", BlinkerTime);
}


//*******app定时向设备发送心跳包, 设备收到心跳包后会返回设备当前状态30s~60s一次
void heartbeat()
{
BLINKER_LOG("状态同步!");
   if (digitalRead(kg)==LOW)
    {
      Button1.print("on");
      Button1.color("#0000FF");            //设置app按键是浅蓝色
      Button1.text("亮");
    }
    else
    {
    Button1.print("off");
    Button1.color("#00FFFF");            //设置app按键是深蓝色
    Button1.text("灭");
    }
}
///如果本地开关有动作执行下面手动模式
void sdms(){
if (digitalRead(kg)==HIGH&&digitalRead(kg2)==LOW) { //
    Blinker.delay(150);//延时150ms不能太少标准按键成功率
    if (digitalRead(kg2)==HIGH){               
          BLINKER_LOG("本地开关动作!");      
   BLINKER_LOG("亮灯!");                         //串口打印
      digitalWrite(kg,LOW);
      Button1.color("#0000FF");                  //设置app按键是浅蓝色
      Button1.text("亮");
      Button1.print("on");
      }
}
if (digitalRead(kg)==LOW&&digitalRead(kg2)==LOW) {            
    Blinker.delay(150);
    if (digitalRead(kg2)==HIGH){
   BLINKER_LOG("本地开关动作!");
      BLINKER_LOG("灭灯!");                           //串口打印
      digitalWrite(kg, HIGH);
      Button1.color("#00FFFF");                     //设置app按键是深蓝色
      Button1.text("灭");
      Button1.print("off");
      }
}
}
void setup()
{
// 初始化串口
Serial.begin(115200);
delay(10);
BLINKER_DEBUG.stream(Serial);

// 初始化有LED的IO
pinMode(kg, OUTPUT);
digitalWrite(kg, HIGH);            //默认上电是关LOW 时的是接通继电器。
pinMode(kg2,INPUT_PULLUP);         //输入上拉

// 初始化blinker
Blinker.attachData(dataRead);
Blinker.begin(auth);//, ssid, pswd
Button1.attach(button1_callback);            //app上操作必须的注册回调函数关联按键名“Button1”和判断程序“button1_callback"
BlinkerMIOT.attachPowerState(aligeniePowerState);//小爱电源类操作的回调函数
BlinkerDuerOS.attachPowerState(aligeniePowerState);//小度电源类操作的回调函数
BlinkerAliGenie.attachPowerState(aligeniePowerState);//天猫电源类操作的回调函数
BlinkerMIOT.attachPowerState(miotPowerState);            //小爱语音操作注册函数
BlinkerDuerOS.attachPowerState(duerPowerState);            //小度语音操作注册函数
BlinkerAliGenie.attachPowerState(aligeniePowerState);      //天猫语音操作注册函数
Blinker.attachHeartbeat(heartbeat);            //app定时向设备发送心跳包, 设备收到心跳包后会返回设备当前状态进行语音操作和app操作同步。
BlinkerMIOT.attachQuery(miotQuery);//小爱设备查询的回调函数
BlinkerDuerOS.attachQuery(duerQuery);//小度设备查询的回调函数
BlinkerAliGenie.attachQuery(aligenieQuery);//天猫设备查询的回调函数

}

void loop() {
sdms();//本地开关手动模式函数
Blinker.run();
}




8266开发板的4路如下

#define BLINKER_WIFI                  //官方wifi协议库
#define BLINKER_ESP_SMARTCONFIG         // 进行配网
#define BLINKER_MIOT_MULTI_OUTLET    //设置小爱为多个插座的模式
#define BLINKER_DUEROS_MULTI_OUTLET//设置小度为多个插座的模式
#define BLINKER_ALIGENIE_MULTI_OUTLET//设置天猫精灵为多个插座的模式
#define BLINKER_PRINT Serial            //串口协议库
#include <Blinker.h>                  //官方库


char auth[] = "-------";         //设备key号
//char ssid[] = "-----";                     //wifi名称
//char pswd[] = "-----";            //wifi密码

//**软重启定义
uint32_t con_time = 0;    //断网记时
int con_flag = 0;    //断网标记,1为断网
void(*resetFunc) (void) = 0;//定义一个reset函数(用于重启)


   //灯
int kg1=14;//1 D5
int kg2=12;//2 D6
int kg3=13;//3 D7
int kg4=15;//4 D8

   //开关
int kg5=5;//1本地轻触开关,io2与gnd接时动作 D1
int kg6=4;//2D2
int kg7=0;//3D3
int kg8=2;//4D4

//*******新建组件对象   设置app按键的键名
BlinkerButton Button1("btn-1");         
BlinkerButton Button2("btn-2");
BlinkerButton Button3("btn-3");
BlinkerButton Button4("btn-4");

char Port;
int Feedback = 0;
int OnorOff = 0;

//*******app上按下按键即会执行该函数app里按键有2种模式3钟不同样式,下面写出所有的开关状态。
////////////////////////////////////////////////////////////////////////////1
void button1_callback(const String & state)            //用state来存储组键的值按键 : "tap"(点按); "pre"(长按); "pup"(释放)开关 : "on"(打开); "off"(关闭)
{
BLINKER_LOG("app操作了 按键1 : ", state);                //串口打印

if (digitalRead(kg1)==HIGH) {            //如果state是on状态
    BLINKER_LOG("灭灯!");                           //串口打印
    digitalWrite(kg1, LOW);
    Button1.color("#00FFFF");                     //设置app按键是深蓝色
    Button1.text("灭");
    Button1.print("off");                         //反馈回按键状态是关
}
else if (digitalRead(kg1)==LOW) {       //如果state是off状态
    BLINKER_LOG("亮灯!");                         //串口打印
   digitalWrite(kg1,HIGH);
    Button1.color("#FFFF00");                  //设置app按键是浅蓝色
    Button1.text("亮");
    Button1.print("on");                      //反馈回按键状态是开
}
}
///////////////////////////////////////////////////////////////////////////////2
void button2_callback(const String & state)            //用state来存储组键的值按键 : "tap"(点按); "pre"(长按); "pup"(释放)开关 : "on"(打开); "off"(关闭)
{
BLINKER_LOG("app操作了 按键2 : ", state);                //串口打印

if (digitalRead(kg2)==HIGH) {            //如果state是on状态
    BLINKER_LOG("灭灯!");                           //串口打印
    digitalWrite(kg2, LOW);
    Button2.color("#00FFFF");                     //设置app按键是深蓝色
    Button2.text("灭");
    Button2.print("off");                         //反馈回按键状态是关
}

else if (digitalRead(kg2)==LOW) {       //如果state是off状态
    BLINKER_LOG("亮灯!");                         //串口打印
   digitalWrite(kg2,HIGH);
    Button2.color("#0000FF");                  //设置app按键是浅蓝色
    Button2.text("亮");
    Button2.print("on");                      //反馈回按键状态是开
}
}


//////////////////////////////////////////////////////////////////////////3
void button3_callback(const String & state)            //用state来存储组键的值按键 : "tap"(点按); "pre"(长按); "pup"(释放)开关 : "on"(打开); "off"(关闭)
{
BLINKER_LOG("app操作了 按键3 : ", state);                //串口打印

if (digitalRead(kg3)==HIGH) {            //如果state是on状态
    BLINKER_LOG("灭灯!");                           //串口打印
    digitalWrite(kg3, LOW);
    Button3.color("#00FFFF");                     //设置app按键是深蓝色
    Button3.text("灭");
    Button3.print("off");                         //反馈回按键状态是关
}

else if (digitalRead(kg3)==LOW) {       //如果state是off状态
    BLINKER_LOG("亮灯!");                         //串口打印
   digitalWrite(kg3,HIGH);
    Button3.color("#FF0000");                  //设置app按键是浅蓝色
    Button3.text("亮");
    Button3.print("on");                      //反馈回按键状态是开
}
}


/////////////////////////////////////////////////////////////////////////4
void button4_callback(const String & state)            //用state来存储组键的值按键 : "tap"(点按); "pre"(长按); "pup"(释放)开关 : "on"(打开); "off"(关闭)
{
BLINKER_LOG("app操作了 按键4 : ", state);                //串口打印

if (digitalRead(kg4)==HIGH) {            //如果state是on状态
    BLINKER_LOG("灭灯!");                           //串口打印
    digitalWrite(kg4, LOW);
    Button4.color("#00FFFF");                     //设置app按键是深蓝色
    Button4.text("灭");
    Button4.print("off");                         //反馈回按键状态是关
}
else if (digitalRead(kg4)==LOW) {       //如果state是off状态
    BLINKER_LOG("亮灯!");                         //串口打印
   digitalWrite(kg4,HIGH);
    Button4.color("#006400");                  //设置app按键是浅蓝色
    Button4.text("亮");
    Button4.print("on");                      //反馈回按键状态是开
}


}



void Set_Butt(int num) //on反馈
{
    if (num == 1) {
      Button1.color("#FFFF00");                  //设置app按键是浅蓝色
    Button1.text("亮");
      Button1.print("on");      
    } else if (num == 2) {
      Button2.color("#0000FF");                  //设置app按键是浅蓝色
    Button2.text("亮");
      Button2.print("on");
    } else if (num == 3) {
      Button3.color("#FF0000");                  //设置app按键是浅蓝色
    Button3.text("亮");
      Button3.print("on");
    } else if (num == 4) {
      Button4.color("#006400");                  //设置app按键是浅蓝色
    Button4.text("亮");
      Button4.print("on");
    }   
}
void Reset_Butt(int num) //off反馈
{
    if (num == 1) {
          Button1.color("#00FFFF");                     //设置app按键是深蓝色
    Button1.text("灭");
      Button1.print("off");      
    } else if (num == 2) {
          Button2.color("#00FFFF");                     //设置app按键是深蓝色
    Button2.text("灭");
      Button2.print("off");
    } else if (num == 3) {
          Button3.color("#00FFFF");                     //设置app按键是深蓝色
    Button3.text("灭");
      Button3.print("off");
    } else if (num == 4) {
          Button4.color("#00FFFF");                     //设置app按键是深蓝色
    Button4.text("灭");
      Button4.print("off");
    }   
}


//*******如果小爱有对设备进行操作就执行下面

void miotPowerState(const String & state, uint8_t num)   //小爱控制函数
{
BLINKER_LOG("need set outlet: ", num, ", power state: ", state);
if (num == 1) {
    Feedback = 1;
    Port = kg1;      //指定每一路开关对应在开发板上的通道接口
} else if (num == 2) {
    Feedback = 2;
    Port = kg2;
} else if (num == 3) {
    Feedback = 3;
    Port = kg3;
} else if (num == 4) {
    Feedback = 4;
    Port = kg4;
}

if (state == BLINKER_CMD_ON) {
    OnorOff = 1;
    if(num == 0)
    {
      Feedback = 5;
      digitalWrite(kg1, HIGH);
      digitalWrite(kg2, HIGH);
      digitalWrite(kg3, HIGH);
      digitalWrite(kg4, HIGH);
    }
    else
    {
      digitalWrite(Port, HIGH);
    }

    BlinkerMIOT.powerState("on", num);
    BlinkerMIOT.print();
}
else if (state == BLINKER_CMD_OFF) {
    OnorOff = 2;
    if(num == 0)
    {
      Feedback = 5;
      digitalWrite(kg1, LOW);
      digitalWrite(kg2, LOW);
      digitalWrite(kg3, LOW);
      digitalWrite(kg4, LOW);
    }
    else
    {
      digitalWrite(Port, LOW);
    }

    BlinkerMIOT.powerState("off", num);
    BlinkerMIOT.print();
}
}

void miotQuery(int32_t queryCode)       //小爱设备查询的回调函数
{
    BLINKER_LOG("MIOT Query codes: ", queryCode);

    switch (queryCode)
    {
      case BLINKER_CMD_QUERY_ALL_NUMBER :
            BLINKER_LOG("MIOT Query All");
            BlinkerMIOT.powerState(kg1 ? "on" : "off");
            BlinkerMIOT.powerState(kg2 ? "on" : "off");
            BlinkerMIOT.powerState(kg3 ? "on" : "off");
            BlinkerMIOT.powerState(kg4 ? "on" : "off");
            BlinkerMIOT.print();
            break;
      case BLINKER_CMD_QUERY_POWERSTATE_NUMBER :
            BLINKER_LOG("MIOT Query Power State");
            BlinkerMIOT.powerState(kg1 ? "on" : "off");
            BlinkerMIOT.powerState(kg2 ? "on" : "off");
            BlinkerMIOT.powerState(kg3 ? "on" : "off");
            BlinkerMIOT.powerState(kg4 ? "on" : "off");
            BlinkerMIOT.print();
            break;

      default :
            BlinkerMIOT.powerState(kg1 ? "on" : "off");
            BlinkerMIOT.powerState(kg2 ? "on" : "off");
            BlinkerMIOT.powerState(kg3 ? "on" : "off");
            BlinkerMIOT.powerState(kg4 ? "on" : "off");
            BlinkerMIOT.print();
            break;
    }
}


//*******如果小度有对设备进行操作就执行下面

void duerPowerState(const String & state, uint8_t num)   //小度控制函数
{
BLINKER_LOG("need set outlet: ", num, ", power state: ", state);
if (num == 1) {
    Feedback = 1;
    Port = kg1;      //指定每一路开关对应在开发板上的通道接口
} else if (num == 2) {
    Feedback = 2;
    Port = kg2;
} else if (num == 3) {
    Feedback = 3;
    Port = kg3;
} else if (num == 4) {
    Feedback = 4;
    Port = kg4;
}

if (state == BLINKER_CMD_ON) {
    OnorOff = 1;
    if(num == 0)
    {
      Feedback = 5;
      digitalWrite(kg1, HIGH);
      digitalWrite(kg2, HIGH);
      digitalWrite(kg3, HIGH);
      digitalWrite(kg4, HIGH);
    }
    else
    {
      digitalWrite(Port, HIGH);
    }

    BlinkerDuerOS.powerState("on", num);
    BlinkerDuerOS.print();
}
else if (state == BLINKER_CMD_OFF) {
    OnorOff = 2;
    if(num == 0)
    {
      Feedback = 5;
      digitalWrite(kg1, LOW);
      digitalWrite(kg2, LOW);
      digitalWrite(kg3, LOW);
      digitalWrite(kg4, LOW);
    }
    else
    {
      digitalWrite(Port, LOW);
    }

    BlinkerDuerOS.powerState("off", num);
    BlinkerDuerOS.print();
}
}

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(kg1 ? "on" : "off");
            BlinkerDuerOS.powerState(kg2 ? "on" : "off");
            BlinkerDuerOS.powerState(kg3 ? "on" : "off");
            BlinkerDuerOS.powerState(kg4 ? "on" : "off");
            BlinkerDuerOS.print();
            break;
      case BLINKER_CMD_QUERY_POWERSTATE_NUMBER :
            BLINKER_LOG("DuerOS Query Power State");
            BlinkerDuerOS.powerState(kg1 ? "on" : "off");
            BlinkerDuerOS.powerState(kg2 ? "on" : "off");
            BlinkerDuerOS.powerState(kg3 ? "on" : "off");
            BlinkerDuerOS.powerState(kg4 ? "on" : "off");
            BlinkerDuerOS.print();
            break;

      default :
            BlinkerDuerOS.powerState(kg1 ? "on" : "off");
            BlinkerDuerOS.powerState(kg2 ? "on" : "off");
            BlinkerDuerOS.powerState(kg3 ? "on" : "off");
            BlinkerDuerOS.powerState(kg4 ? "on" : "off");
            BlinkerDuerOS.print();
            break;
    }
}

//*******如果天猫精灵有对设备进行操作就执行下面

void aligeniePowerState(const String & state, uint8_t num)   //小爱控制函数
{
BLINKER_LOG("need set outlet: ", num, ", power state: ", state);
if (num == 1) {
    Feedback = 1;
    Port = kg1;      //指定每一路开关对应在开发板上的通道接口
} else if (num == 2) {
    Feedback = 2;
    Port = kg2;
} else if (num == 3) {
    Feedback = 3;
    Port = kg3;
} else if (num == 4) {
    Feedback = 4;
    Port = kg4;
}

if (state == BLINKER_CMD_ON) {
    OnorOff = 1;
    if(num == 0)
    {
      Feedback = 5;
      digitalWrite(kg1, HIGH);
      digitalWrite(kg2, HIGH);
      digitalWrite(kg3, HIGH);
      digitalWrite(kg4, HIGH);
    }
    else
    {
      digitalWrite(Port, HIGH);
    }

   BlinkerAliGenie.powerState("on", num);
   BlinkerAliGenie.print();
}
else if (state == BLINKER_CMD_OFF) {
    OnorOff = 2;
    if(num == 0)
    {
      Feedback = 5;
      digitalWrite(kg1, LOW);
      digitalWrite(kg2, LOW);
      digitalWrite(kg3, LOW);
      digitalWrite(kg4, LOW);
    }
    else
    {
      digitalWrite(Port, LOW);
    }

    BlinkerAliGenie.powerState("off", num);
    BlinkerAliGenie.print();
}
}


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

    Blinker.vibrate();

    uint32_t BlinkerTime = millis();

    Blinker.print("millis", BlinkerTime);
}


void aligenieQuery(int32_t queryCode)      //天猫设备查询的回调函数

{
    BLINKER_LOG("AliGenie Query codes: ", queryCode);

    switch (queryCode)
    {
      case BLINKER_CMD_QUERY_ALL_NUMBER :
            BLINKER_LOG("AliGenie Query All");
            BlinkerAliGenie.powerState(kg1 ? "on" : "off");
            BlinkerAliGenie.powerState(kg2 ? "on" : "off");
            BlinkerAliGenie.powerState(kg3 ? "on" : "off");
            BlinkerAliGenie.powerState(kg4 ? "on" : "off");
            BlinkerAliGenie.print();
            break;
      case BLINKER_CMD_QUERY_POWERSTATE_NUMBER :
            BLINKER_LOG("AliGenie Query Power State");
            BlinkerAliGenie.powerState(kg1 ? "on" : "off");
            BlinkerAliGenie.powerState(kg2 ? "on" : "off");
            BlinkerAliGenie.powerState(kg3 ? "on" : "off");
            BlinkerAliGenie.powerState(kg4 ? "on" : "off");
            BlinkerAliGenie.print();
      default :
            BlinkerAliGenie.powerState(kg1 ? "on" : "off");
            BlinkerAliGenie.powerState(kg2 ? "on" : "off");
            BlinkerAliGenie.powerState(kg3 ? "on" : "off");
            BlinkerAliGenie.powerState(kg4 ? "on" : "off");
            BlinkerAliGenie.print();
            break;
    }
}



//*******app定时向设备发送心跳包, 设备收到心跳包后会返回设备当前状态30s~60s一次
void heartbeat()
{
BLINKER_LOG("状态同步!");

   //////////////////////////////////////////////1
   if (digitalRead(kg1)==HIGH)
    {
      Button1.print("on");
      Button1.color("#FFFF00");            //设置app按键是浅蓝色
      Button1.text("亮");
    }
    else
    {
    Button1.print("off");
    Button1.color("#00FFFF");            //设置app按键是深蓝色
    Button1.text("灭");
    }
////////////////////////////////////////////////2
if (digitalRead(kg2)==HIGH)
    {
      Button2.print("on");
      Button2.color("#0000FF");            //设置app按键是浅蓝色
      Button2.text("亮");
    }
    else
    {
    Button2.print("off");
    Button2.color("#00FFFF");            //设置app按键是深蓝色
    Button2.text("灭");
    }
//////////////////////////////////////////////////3

if (digitalRead(kg3)==HIGH)
    {
      Button3.print("on");
      Button3.color("#FF0000");            //设置app按键是浅蓝色
      Button3.text("亮");
    }
    else
    {
    Button3.print("off");
    Button3.color("#00FFFF");            //设置app按键是深蓝色
    Button3.text("灭");
    }


//////////////////////////////////////////4

    if (digitalRead(kg4)==HIGH)
    {
      Button4.print("on");
      Button4.color("#006400");            //设置app按键是浅蓝色
      Button4.text("亮");
    }
    else
    {
    Button4.print("off");
    Button4.color("#00FFFF");            //设置app按键是深蓝色
    Button4.text("灭");
    }



}


      ///如果本地开关有动作执行下面手动模式
void sdms(){

//////////////////////////////////////////////////////////////
if (digitalRead(kg1)==LOW&&digitalRead(kg5)==LOW) {
    Blinker.delay(150);//延时150ms不能太少标准按键成功率
    if (digitalRead(kg5)==HIGH){               
      BLINKER_LOG("本地开关1");      
      BLINKER_LOG("亮灯!");                         //串口打印
      digitalWrite(kg1,HIGH);
      Button1.color("#FFFF00");                  //设置app按键是浅蓝色
      Button1.text("亮");
      Button1.print("on");
      }
}
if (digitalRead(kg1)==HIGH&&digitalRead(kg5)==LOW) {            
    Blinker.delay(150); //延时150ms不能太少标准按键成功率
    if (digitalRead(kg5)==HIGH){
      BLINKER_LOG("本地开关1");
      BLINKER_LOG("灭灯!");                           //串口打印
      digitalWrite(kg1, LOW);
      Button1.color("#00FFFF");                     //设置app按键是深蓝色
      Button1.text("灭");
      Button1.print("off");
      }
}
////////////////////////////////////////////////////////////////////////////

if (digitalRead(kg2)==LOW&&digitalRead(kg6)==LOW) {
    Blinker.delay(150);//延时150ms不能太少标准按键成功率
    if (digitalRead(kg6)==HIGH){               
      BLINKER_LOG("本地开关2");      
      BLINKER_LOG("亮灯!");                         //串口打印
      digitalWrite(kg2,HIGH);
      Button2.color("#0000FF");                  //设置app按键是浅蓝色
      Button2.text("亮");
      Button2.print("on");
      }
}
if (digitalRead(kg2)==HIGH&&digitalRead(kg6)==LOW) {            
    Blinker.delay(150); //延时150ms不能太少标准按键成功率
    if (digitalRead(kg6)==HIGH){
      BLINKER_LOG("本地开关2");
      BLINKER_LOG("灭灯!");                           //串口打印
      digitalWrite(kg2, LOW);
      Button2.color("#00FFFF");                     //设置app按键是深蓝色
      Button2.text("灭");
      Button2.print("off");
      }
}
///////////////////////////////////////////////////////////

if (digitalRead(kg3)==LOW&&digitalRead(kg7)==LOW) {
    Blinker.delay(150);//延时150ms不能太少标准按键成功率
    if (digitalRead(kg7)==HIGH){               
      BLINKER_LOG("本地开关3");      
      BLINKER_LOG("亮灯!");                         //串口打印
      digitalWrite(kg3,HIGH);
      Button3.color("#FF0000");                  //设置app按键是浅蓝色
      Button3.text("亮");
      Button3.print("on");
      }
}
if (digitalRead(kg3)==HIGH&&digitalRead(kg7)==LOW) {            
    Blinker.delay(150); //延时150ms不能太少标准按键成功率
    if (digitalRead(kg7)==HIGH){
      BLINKER_LOG("本地开关3");
      BLINKER_LOG("灭灯!");                           //串口打印
      digitalWrite(kg3, LOW);
      Button3.color("#00FFFF");                     //设置app按键是深蓝色
      Button3.text("灭");
      Button3.print("off");
      }
}
/////////////////////////////////////////////////////
if (digitalRead(kg4)==LOW&&digitalRead(kg8)==LOW) {
    Blinker.delay(150);//延时150ms不能太少标准按键成功率
    if (digitalRead(kg8)==HIGH){               
      BLINKER_LOG("本地开关4");      
      BLINKER_LOG("亮灯!");                         //串口打印
      digitalWrite(kg4,HIGH);
      Button4.color("#006400");                  //设置app按键是浅蓝色
      Button4.text("亮");
      Button4.print("on");
      }
}
if (digitalRead(kg4)==HIGH&&digitalRead(kg8)==LOW) {            
    Blinker.delay(150); //延时150ms不能太少标准按键成功率
    if (digitalRead(kg8)==HIGH){
      BLINKER_LOG("本地开关4");
      BLINKER_LOG("灭灯!");                           //串口打印
      digitalWrite(kg4, LOW);
      Button4.color("#00FFFF");                     //设置app按键是深蓝色
      Button4.text("灭");
      Button4.print("off");
      }
}




}



void setup()
{
// 初始化串口
Serial.begin(115200);
BLINKER_DEBUG.stream(Serial);

// 初始化有LED的IO

pinMode(kg1, OUTPUT);
digitalWrite(kg1, LOW);            //默认上电是开LOW 时的是断开继电器。
pinMode(kg5,INPUT_PULLUP);         //输入上拉
///////////////////////////////////////////
pinMode(kg2, OUTPUT);
digitalWrite(kg2, LOW);            //默认上电是开LOW 时的是断开继电器。
pinMode(kg6,INPUT_PULLUP);         //输入上拉
////////////////////////////////
    pinMode(kg3, OUTPUT);
digitalWrite(kg3, LOW);            //默认上电是开LOW 时的是断开继电器。
pinMode(kg7,INPUT_PULLUP);         //输入上拉
////////////////////////////////////
    pinMode(kg4, OUTPUT);
digitalWrite(kg4, LOW);            //默认上电是开LOW 时的是断开继电器。
pinMode(kg8,INPUT_PULLUP);         //输入上拉







// 初始化blinker
Blinker.attachData(dataRead);
Blinker.begin(auth);//, ssid, pswd

Button1.attach(button1_callback);   //app上操作必须的注册回调函数关联按键名“Button1”和判断程序“button1_callback"
Button2.attach(button2_callback);   //app上操作必须的注册回调函数关联按键名“Button1”和判断程序“button1_callback"
Button3.attach(button3_callback);   //app上操作必须的注册回调函数关联按键名“Button1”和判断程序“button1_callback"
Button4.attach(button4_callback);   //app上操作必须的注册回调函数关联按键名“Button1”和判断程序“button1_callback"

BlinkerMIOT.attachPowerState(miotPowerState);         //小爱语音操作注册函数
BlinkerDuerOS.attachPowerState(duerPowerState);       //小度语音操作注册函数
BlinkerAliGenie.attachPowerState(aligeniePowerState); //天猫精灵语音操作注册函数
Blinker.attachHeartbeat(heartbeat);                   //app定时向设备发送心跳包, 设备收到心跳包后会返回设备当前状态进行语音操作和app操作同步。
BlinkerMIOT.attachQuery(miotQuery);//小爱设备查询的回调函数
BlinkerDuerOS.attachQuery(duerQuery);//小度设备查询的回调函数
BlinkerAliGenie.attachQuery(aligenieQuery);//天猫设备查询的回调函数
}


int i=0;
long F_time = 0;
int count=0;


void loop() {
sdms();//本地开关手动模式函数

//**软重启
if (Blinker.connected())//Blinker.connected()函数反馈网络连接状态
{
con_flag = 0;
} else
{
if (con_flag == 0)
{
    con_time = millis();    //给断网时间赋初始值
    con_flag = 1;
} else
{
    if ((millis() - con_time) >= 90000)    //判断断网时间超90秒后执行重启,这个时间可根据实际需要调整
    {
      resetFunc();//启用这个函数就软重启设备
    }
}
}

Blinker.run();

if(OnorOff == 0)
    {

    }
    else if(OnorOff == 1)//如果是ON状态
    {
      delay(1000);
      if(Feedback < 5)//小于5 是单独控制 1-4
      {
            Set_Butt(Feedback);//反馈1-4
            OnorOff = 0;
      }else if(Feedback == 5)//等于5 是打开所有然后1.2s每个的速度反馈所有
      {
            if(millis() - F_time >=0)
            {
               F_time = millis();
               i++;
               Set_Butt(i);
               i%=4;
               if(i == 0) //当所有状态反馈完毕则退出
               {
                     Feedback = 0;
                     OnorOff = 0;
               }
            }   
      }
    }
    else if(OnorOff == 2)
    {
      delay(1000);
      if(Feedback < 5)//小于5 是单独控制 1-4
      {
            Reset_Butt(Feedback);//反馈1-4
            OnorOff = 0;
      }else if(Feedback == 5)//等于5 是 关闭 所有然后1.2s每个的速度反馈所有
      {
            if(millis() - F_time >=0)
            {
               F_time = millis();
               i++;
               Reset_Butt(i);
               i%=4;
               if(i == 0) //当所有状态反馈完毕则退出
               {
                     Feedback = 0;
                     OnorOff = 0;
               }
            }   
      }
    }


}



ebeeb 发表于 2021-2-25 16:30

支持下!这样用起来很方便,可以按键 程序 语音三种方式控制

441787154 发表于 2021-2-25 18:54

大神膜拜了

新人123 发表于 2021-2-26 17:32

大佬,用的同样1@

新人123 发表于 2021-2-26 17:37

大佬我用的也是esp-1s,低电平触发继电器,但在上电的一瞬间继电器会吸合一下,这个怎么解决?是上电瞬间程序输出了低电平然后被初始化io后变为高了吗?该怎么解决,改更基础的代码吗?

黄花菜2021 发表于 2021-3-7 23:03

四孔插的这个函数什么时候运行?
void duerQuery(int32_t queryCode)         //小度设备查询的回调函数

我烧录了上面的程序,打开小度APP控制是可以,但是状态没同步,也没有执行上面这个函数:duerQuery
有碰到同样问题的小伙伴么:'(

aaasym 发表于 2021-6-26 20:07

本帖最后由 aaasym 于 2021-7-6 10:51 编辑

程序可用!!

gyq-svip 发表于 2021-8-12 20:29

大佬666~我也要试试,谢谢分享,辛苦了!

liuhuayuan 发表于 2021-10-15 02:03

大神,我用的是esp-01s,低电平触发继电器,但在上电的一瞬间继电器会吸合一下,这个怎么解决?是上电瞬间程序输出了低电平然后被初始化io后变为高了吗?该怎么解决,改更基础的代码吗?

slaoliu 发表于 2021-11-19 21:29

试一试,先收藏
页: [1] 2
查看完整版本: 回馈论坛(小爱 小度 天猫)语音控制开关外加本地开关