资讯详情

ESP8266利用Bliker、小爱同学和本地按钮控制4路开关

ESP8266利用Bliker、小艾和当地按钮控制4路开关


Blinker函数说明:

  • Button.color("#FFFF00"); //设置app按键是纯黄色,16进制颜色码
  • Button.text("开"); //设置app按键注释开
  • Button.icon("fal fa-power-on");//按键图标。

获取更多图标:https://fontawesome.com/v5.15/icons?d=gallery&p=2&c=arrows,design&m=free

使用配网注意事项

  • 如果是使用Smartconfig配网:

请启用宏定义: #define BLINKER_ESP_SMARTCONFIG和Setup函数中,Blinker.begin(auth); ///用这段手机配网 注释掉:Setup函数中,Blinker.begin(auth, ssid, pswd);///用这段代码配网

  • 若采用直接写入的配网方式:

宏定义注释: #define BLINKER_ESP_SMARTCONFIG和Setup函数中,Blinker.begin(auth); ///用这段手机配网 启用:Setup函数中,Blinker.begin(auth, ssid, pswd);///用这段代码配网

实例代码

本文直接用代码写入wifi配网的方式。

/* ***************************************************************** * 程序功能:blinker 小爱同学 本地按键(点触自复位)控制插座4路插孔/开关 * 1.使用开发板:nodemcu-ESP8266(模块ESP-12F) * 2.程序功能1:使用Blinker 手机APP添加设备并绑定,通过Blinker APP或者小爱同学, * 远程控制开发板连接的继电器开关 * 3.程序功能2:使用本地开关控制继电器开关,并反馈继电器状态Blinker控制按钮 * 4.例程文件:小爱:https://www.diandeng.tech/doc/xiaoai * SmartConfig自动配网:https://blog.csdn.net/u014091490/article/details/105178037 * Blinker心跳包:https://github.com/blinker-iot/blinker-doc/wiki/Blinker-Arduino-库使用手册 * 5.程序参考:blinker库例程--blinker-library-master\examples\Blinker_MIOT\MIOT_MULTI_OUTLET * *****************************************************************/  #define BLINKER_WIFI //支持wifi //#define BLINKER_ESP_SMARTCONFIG //Smartconfig或手机微信扫码自动配网,代码配网请注 #define BLINKER_MIOT_MULTI_OUTLET //支持多路插座,最多4个插座 #define BLINKER_PRINT Serial //串口协议库 #define BLINKER_WITHOUT_SSL //blinker远程通信远程通信进行加密,但通信加密会消耗大量的信息RAM,如果你对通信安全没有要求                      //可添加宏BLINKER_WITHOUT_SSL为了获得更多的可用性RAM,BLINKER_WITHOUT_SSL目前只能用于ESP8266,其他设备RAM足以加密通信   #include <Blinker.h> //使用第三方Blinker库   char auth[] = "7963c4b7e283";      //Blinker APP(阿里云服务器必须连接小爱同学)Secret Key(密钥) ///用这段代码配网 char ssid[] = "MERCURY_D268G";                     //wifi名称 char pswd[] = "pba5ayzk";              //wifi密码   span class="token comment">//定义继电器信号
#define Relay_1 5 //定义继电器1信号接入GPIO5,D1
#define Relay_2 4 //定义继电器2信号接入GPIO4,D2
#define Relay_3 0 //定义继电器3信号接入GPIO0,D3
#define Relay_4 2 //定义继电器4信号接入GPIO2,D4

//定义本地开关信号
#define KG_1 14 //定义开关1信号接入GPIO14,D5
#define KG_2 12 //定义开关2信号接入GPIO12,D6
#define KG_3 13 //定义开关3信号接入GPIO13,D7
#define KG_4 3 //定义开关4信号接入GPIO3,RX(GPIO15/D8持续低电平,后更改为GPIO3/RX接口)
 
// 新建Blinker软件组件对象
BlinkerButton Button("MainSwitch");     //组件对象,要和APP组件中的“数据键名”一致,总开关
BlinkerButton Button1("Switch1");       //组件对象,要和APP组件中的“数据键名”一致,开关1
BlinkerButton Button2("Switch2");       //组件对象,要和APP组件中的“数据键名”一致,开关2
BlinkerButton Button3("Switch3");       //组件对象,要和APP组件中的“数据键名”一致,开关3
BlinkerButton Button4("Switch4");       //组件对象,要和APP组件中的“数据键名”一致,开关4
BlinkerButton Button5("Refresh");       //APP端按钮状态刷新

//定义插座状态,用于小爱同学状态反馈
bool oState[5] = { 
         false };
#define OUTLET_ALL 0 //所有插孔
#define OUTLET_NO_1 1 //插座插孔一
#define OUTLET_NO_2 2 //插座插孔二
#define OUTLET_NO_3 3 //插座插孔三
#define OUTLET_NO_4 4 //插座插孔四

//反馈继电器状态函数
void RelayState(int num)
{ 
        
  switch(num)
  { 
        
    case 1:   //插座插孔一状态
        if(digitalRead(Relay_1)==LOW)
        { 
        
          Button1.color("#FFFF00");   //设置app按键是纯黄色,16进制颜色码
          Button1.text("插座1开");          //设置app按键注释“开”
          Button1.print("on");
          oState[1] = true;
        }
        else if(digitalRead(Relay_1==HIGH))
        { 
        
          Button1.color("#808080");   //设置app按键是灰色,16进制颜色码
          Button1.text("插座1关");          //设置app按键注释“关”
          Button1.print("off");
          oState[1] = false;
        }
        break;
    case  2:
        if(digitalRead(Relay_2)==LOW)
        { 
        
          Button2.color("#FFFF00");   //设置app按键是纯黄色,16进制颜色码
          Button2.text("插座2开");          //设置app按键注释“开”
          Button2.print("on");
          oState[2] = true;
        }
        else if(digitalRead(Relay_2==HIGH))
        { 
        
          Button2.color("#808080");   //设置app按键是灰色,16进制颜色码
          Button2.text("插座2关");          //设置app按键注释“关”
          Button2.print("off");
          oState[2] = false;
        }
        break;
    case  3:
        if(digitalRead(Relay_3)==LOW)
        { 
        
          Button3.color("#FFFF00");   //设置app按键是纯黄色,16进制颜色码
          Button3.text("插座3开");          //设置app按键注释“开”
          Button3.print("on");
          oState[3] = true;
        }
        else if(digitalRead(Relay_3==HIGH))
        { 
        
          Button3.color("#808080");   //设置app按键是灰色,16进制颜色码
          Button3.text("插座3关");          //设置app按键注释“关”
          Button3.print("off");
          oState[3] = false;
        }
        break;
    case  4:
        if(digitalRead(Relay_4)==LOW)
        { 
        
          Button4.color("#FFFF00");   //设置app按键是纯黄色,16进制颜色码
          Button4.text("插座4开");          //设置app按键注释“开”
          Button4.print("on");
          oState[4] = true;
        }
        else if(digitalRead(Relay_4==HIGH))
        { 
        
          Button4.color("#808080");   //设置app按键是灰色,16进制颜色码
          Button4.text("插座4关");          //设置app按键注释“关”
          Button4.print("off");
          oState[4] = false;
        }
        break;
        default:
            break;
  }
}
 
//小爱同学控制插座多个插孔
void ctrl_multi_outlet(uint8_t num, uint8_t io_level)
{ 
        
    switch (num)
        { 
        
            case 0:  //所有插孔
                digitalWrite(Relay_1, io_level);//控制继电器1
                digitalWrite(Relay_2, io_level);//控制继电器2
                digitalWrite(Relay_3, io_level);//控制继电器3
                digitalWrite(Relay_4, io_level);//控制继电器4
                break;
            case 1:  //插座插孔一
                digitalWrite(Relay_1, io_level);//控制继电器1
                break;
            case 2:  //插座插孔二
                digitalWrite(Relay_2, io_level);//控制继电器2
                break;
            case 3:  //插座插孔三
                digitalWrite(Relay_3, io_level);//控制继电器3
                break;
            case 4:  //插座插孔四
                digitalWrite(Relay_4, io_level);//控制继电器4
                break;
            default:
                break;
        }
}
 
//小爱电源类回调,例如:“打开插座”、“打开插座插孔一”、“打开插座插孔二”
void miotPowerState(const String & state, uint8_t num)
{ 
        
    BLINKER_LOG("need set outlet: ", num, ", power state: ", state);
 
    if (state == BLINKER_CMD_ON) 
    { 
        
        ctrl_multi_outlet(num, LOW);//打开继电器,num表示是多少路(继电器低电平出发)
        BlinkerMIOT.powerState("on", num);
        BlinkerMIOT.print();
        RelayState(num);
 
        oState[num] = true;
    }
   else if (state == BLINKER_CMD_OFF) 
    { 
        
        ctrl_multi_outlet(num, HIGH);//关闭继电器,num表示是多少路
 
        BlinkerMIOT.powerState("off", num);
        BlinkerMIOT.print();
        RelayState(num);
 
        oState[num] = false;
    }
}

//小爱设备查询的回调函数,查询设备状态,例如:“插座插孔一状态”
void miotQuery(int32_t queryCode,uint8_t num)
{ 
        
    BLINKER_LOG("插孔",num,"状态",",codes:", queryCode);

    switch (num)
    { 
        
         case 0 :
            BLINKER_LOG("状态:");
            BlinkerMIOT.powerState(oState[1] ? "on" : "off");
            BlinkerMIOT.powerState(oState[2] ? "on" : "off");
            BlinkerMIOT.powerState(oState[3] ? "on" : "off");
            BlinkerMIOT.powerState(oState[4] ? "on" : "off"); 
            BlinkerMIOT.print();
            break;
         case 1 :
            BLINKER_LOG("插孔1状态:");
            BlinkerMIOT.powerState(oState[1] ? "on" : "off");
            BlinkerMIOT.print();
            break;
         case 2 :
            BLINKER_LOG("插孔2状态:");
            BlinkerMIOT.powerState(oState[2] ? "on" : "off");
            BlinkerMIOT.print();
            break;
         case 3 :
            BLINKER_LOG("插孔3状态:");
            BlinkerMIOT.powerState(oState[3] ? "on" : "off");
            BlinkerMIOT.print();
            break;
         case 4 :
            BLINKER_LOG("插孔4状态:");
            BlinkerMIOT.powerState(oState[4] ? "on" : "off");
            BlinkerMIOT.print();
            break;
         default :
            BlinkerMIOT.powerState(oState[1] ? "on" : "off");
            BlinkerMIOT.powerState(oState[2] ? "on" : "off");
            BlinkerMIOT.powerState(oState[3] ? "on" : "off");
            BlinkerMIOT.powerState(oState[4] ? "on" : "off"); 
            BlinkerMIOT.print();
            break;
    }
 }

// 在APP控制,按下MainSwitch按键即会执行该函数
void button_callback(const String & state)
{ 
        
    BLINKER_LOG("操作了MainSwitch: ", state);//APP中的Monitor控件打印的信息
    if (state=="on") 
    { 
        
        ctrl_multi_outlet(OUTLET_ALL, LOW);//打开继电器--所有
        // 反馈继电器状态
        Button.color("#FFFF00");   //设置app按键是纯黄色,16进制颜色码
        Button.text("开");          //设置app按键注释“开”
        Button.icon("fal fa-power-on");
        Button.print("on");
        Blinker.vibrate();  //开启继电器时反馈,让手机震动
    } else if(state=="off")
    { 
        
        ctrl_multi_outlet(OUTLET_ALL, HIGH);//关闭继电器--所有
        // 反馈继电器状态
        Button.color("#808080");   //设置app按键是纯黄色,16进制颜色码
        Button.text("关");          //设置app按键注释“开”
        Button.icon("fal fa-power-off");
        Button.print("off");
    }
}
 
// 在APP控制,按下Switch1按键即会执行该函数--第1路开关
void button1_callback(const String & state)
{ 
        
    BLINKER_LOG("get button state: ", state);//APP中的Monitor控件打印的信息
    if (state=="on") 
    { 
        
        ctrl_multi_outlet(OUTLET_NO_1, LOW);//打开继电器--第1路
        // 反馈继电器1状态
        RelayState(1);    //调用继电器反馈程序
    } else if(state=="off")
    { 
        
        ctrl_multi_outlet(OUTLET_NO_1, HIGH);//关闭继电器--第1路
        // 反馈继电器状态
        RelayState(1);    //调用继电器反馈程序
    }
}
 
// 在APP控制,按下Switch2按键即会执行该函数--第2路开关
void button2_callback(const String & state)
{ 
        
    BLINKER_LOG("get button state: ", state);//APP中的Monitor控件打印的信息
    if (state=="on") 
    { 
        
        ctrl_multi_outlet(OUTLET_NO_2, LOW);//打开继电器--第2路
        // 反馈继电器状态
        RelayState(2);    //调用继电器反馈程序
    } else if(state=="off")
    { 
        
        ctrl_multi_outlet(OUTLET_NO_2, HIGH);//关闭继电器--第2路
        // 反馈继电器状态
        RelayState(2);    //调用继电器反馈程序
    }
}
 
 // 在APP控制,按下Switch3按键即会执行该函数--第3路开关
 void button3_callback(const String & state)
{ 
        
    BLINKER_LOG("get button state: ", state);//APP中的Monitor控件打印的信息
    if (state=="on") 
    { 
        
        ctrl_multi_outlet(OUTLET_NO_3, LOW);//打开继电器--第3路
        // 反馈继电器状态
        RelayState(3);    //调用继电器反馈程序
    } else if(state=="off")
    { 
        
        ctrl_multi_outlet(OUTLET_NO_3, HIGH);//关闭继电器--第3路
        // 反馈继电器状态
        RelayState(3);    //调用继电器反馈程序
    }
}

// 在APP控制,按下Switch4按键即会执行该函数--第4路开关 
 void button4_callback(const String & state)
{ 
        
    BLINKER_LOG("get button state: ", state);//APP中的Monitor控件打印的信息
    if (state=="on") 
    { 
        
        ctrl_multi_outlet(OUTLET_NO_4, LOW);//打开继电器--第4路
        // 反馈继电器状态
        RelayState(4);    //调用继电器反馈程序
    } else if(state=="off")
    { 
        
        ctrl_multi_outlet(OUTLET_NO_4, HIGH);//关闭继电器--第4路
        // 反馈继电器状态
        RelayState(4);    //调用继电器反馈程序
    }
}

//APP端状态手动刷新按钮
void button5_callback(const String & state)
{ 
        
  for(int i=0;i<5;i++)
  { 
        
    RelayState(i);
  }
}

//心跳包刷新状态
 void heartbeat()
 { 
        
  for(int i=0;i<5;i++)
  { 
        
    RelayState
        标签: fa40继电器200kg继电器

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台