8266单路插座+本地开关+wifimanager配网-Arduino中文社区 - Powered by Discuz!
查看: 767|回复: 8

[分享] 8266单路插座+本地开关+wifimanager配网

[复制链接]

该用户从未签到

发表于 2021-9-5 18:55 | 显示全部楼层 |阅读模式
初学者,不对的地方望给与更正,目前使用该代码可本地开关,无网络连接时可手机网页配网,代码不是很完整,但使用上没有问题,关联天猫精灵、小度、小爱,新手可以直接拿去用;一定要提前安装blinker库和wifimanager库,需要的可到该网址下载中文版:https://github.com/taichi-maker/WiFiManager,界面如下:
好了,话不多说,直接上代码:



#define BLINKER_WIFI                    //接入方式:wifi
#define BLINKER_MIOT_OUTLET              //接入小爱插座库
#define BLINKER_DUEROS_OUTLET            //接入小度插座库
#define BLINKER_ALIGENIE_OUTLET         //接入天猫插座库
#define BLINKER_PRINT Serial            //串口协议库
#include <WiFiManager.h>                //wifimanager库
#include <Blinker.h>                    //官方库

char auth[] = "-------";           //设备key号

int relay=2;//继电器io2
int key=0;//本地轻触开关,io0与gnd接时动作
int counter = 0;

//使用web配置网络
WiFiManager wifiManager;
char devname[] = "ESP8266-01";   //定义WIFI名称和主机名
void WebConfig() {
  Serial.println("Entered config mode...");
  // 自动连接WiFi,参数是连接ESP8266时的WiFi名称
  wifiManager.setConfigPortalTimeout(60);  //设置连接超时时间60s
  wifiManager.autoConnect(devname);
  WiFi.hostname(devname);  //设置主机名
  // WiFi连接成功后将通过串口监视器输出连接成功信息
  Serial.println("");
    Serial.print("ESP8266 Connected to ");
    Serial.println(WiFi.SSID());              // WiFi名称
    Serial.print("IP address:\t");
    Serial.println(WiFi.localIP());           // IP
}


//*******新建组件对象
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(relay)==LOW) {              //如果state是on状态
    BLINKER_LOG("灭灯!");                           //串口打印
    digitalWrite(relay, HIGH);
    Button1.color("gray");                     //设置app按键是灰色
    Button1.text("插座已关闭");
    Button1.print("off");                         //反馈回按键状态是开
  }
  else if (digitalRead(relay)==HIGH) {       //如果state是off状态
    BLINKER_LOG("亮灯!");                         //串口打印
    digitalWrite(relay,LOW);
    Button1.color("red");                  //设置app按键是红色
    Button1.text("插座已打开");
    Button1.print("on");                      //反馈回按键状态是关
  }
}
//*******如果小爱有对设备进行操作就执行下面
void miotPowerState(const String & state)
{
    BLINKER_LOG("小爱语音操作!");              //串口打印

    if (state == BLINKER_CMD_ON){
        digitalWrite(relay,LOW);
        BlinkerMIOT.powerState("on");
        BLINKER_LOG("亮灯!");
        BlinkerMIOT.print();
    }
    else if (state == BLINKER_CMD_OFF){
        digitalWrite(relay,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(relay ? "on" : "off");
            BlinkerMIOT.print();
            break;
        case BLINKER_CMD_QUERY_POWERSTATE_NUMBER :
            BLINKER_LOG("MIOT Query Power State");
            BlinkerMIOT.powerState(relay ? "on" : "off");
            BlinkerMIOT.print();
            break;

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

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

    if (state == BLINKER_CMD_ON){
        digitalWrite(relay,LOW);
        BlinkerDuerOS.powerState("on");
        BLINKER_LOG("亮灯!");
        BlinkerDuerOS.print();
    }
    else if (state == BLINKER_CMD_OFF){
        digitalWrite(relay,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(relay ? "on" : "off");
            BlinkerDuerOS.print();
            break;
        case BLINKER_CMD_QUERY_POWERSTATE_NUMBER :
            BLINKER_LOG("DuerOS Query Power State");
            BlinkerDuerOS.powerState(relay ? "on" : "off");
            BlinkerDuerOS.print();
            break;

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

    if (state == BLINKER_CMD_ON){
        digitalWrite(relay,LOW);
        BlinkerAliGenie.powerState("on");
        BLINKER_LOG("亮灯!");
        BlinkerAliGenie.print();
    }
    else if (state == BLINKER_CMD_OFF){
        digitalWrite(relay,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(relay ? "on" : "off");
            BlinkerAliGenie.print();
            break;
        case BLINKER_CMD_QUERY_POWERSTATE_NUMBER :
            BLINKER_LOG("AliGenie Query Power State");
            BlinkerAliGenie.powerState(relay ? "on" : "off");
            BlinkerAliGenie.print();
        default :
            BlinkerAliGenie.powerState(relay ? "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定时向设备发送心跳包, 设备收到心跳包后会返回设备当前状态
void heartbeat()
{
  BLINKER_LOG("状态同步!");
   if (digitalRead(relay)==LOW)
    {
      Button1.print("on");
      Button1.color("red");              //设置app按键是红色
      Button1.text("继电器打开");
    }
    else
    {
    Button1.print("off");
    Button1.color("gray");              //设置app按键是灰色
    Button1.text("继电器关闭");
    }
}
///如果本地开关有动作执行下面手动模式
void sdms()
{
if (digitalRead(relay)==HIGH&&digitalRead(key)==LOW)
  {
     Blinker.delay(400);  //延时400ms,最少需150ms
     if (digitalRead(key)==HIGH)
     {            
      BLINKER_LOG("本地开关动作!");      
      BLINKER_LOG("亮灯!");                         //串口打印
      digitalWrite(relay,LOW);
      Button1.color("red");                  //设置app按键是红色
      Button1.text("继电器打开");
      Button1.print("on");
      }
   }
if (digitalRead(relay)==LOW&&digitalRead(key)==LOW)
    {              
      Blinker.delay(400);
      if (digitalRead(key)==HIGH)
        {
        BLINKER_LOG("本地开关动作!");
        BLINKER_LOG("灭灯!");                           //串口打印
        digitalWrite(relay, HIGH);
        Button1.color("gray");                     //设置app按键是灰色
        Button1.text("继电器关闭");
        Button1.print("off");
        }
      }
  }
void setup()
{
  // 初始化串口
  Serial.begin(115200);
  delay(10);
  BLINKER_DEBUG.stream(Serial);
  BLINKER_DEBUG.debugAll();

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

  // 初始化blinker
  WebConfig();  //配置网络  
  Blinker.begin(auth, WiFi.SSID().c_str(), WiFi.psk().c_str()); //初始化blinker
  Button1.attach(button1_callback);        //app按键回调
  Blinker.attachData(dataRead);  //状态回调
  Blinker.attachHeartbeat(heartbeat);              //app定时向设备发送心跳包, 设备收到心跳包后会返回设备当前状态进行语音操作和app操作同步。

  BlinkerMIOT.attachPowerState(miotPowerState);              //小爱语音操作注册函数
  BlinkerDuerOS.attachPowerState(duerPowerState);            //小度语音操作注册函数
  BlinkerAliGenie.attachPowerState(aligeniePowerState);      //天猫语音操作注册函数

  BlinkerMIOT.attachQuery(miotQuery);//小爱设备查询的回调函数
  BlinkerDuerOS.attachQuery(duerQuery);//小度设备查询的回调函数
  BlinkerAliGenie.attachQuery(aligenieQuery);//天猫设备查询的回调函数

}

void loop() {
  Blinker.run();
  sdms();//本地开关扫描

  }

QQ截图20210905184754.png

该用户从未签到

发表于 2021-9-6 18:05 | 显示全部楼层
楼主很实用啊,学习中

该用户从未签到

发表于 2021-9-7 13:50 | 显示全部楼层
谢谢分享,学习中

签到天数: 1 天

[LV.1]初来乍到

发表于 2021-9-13 02:03 来自手机 | 显示全部楼层
能不能把库文件直接放出来!里面看不懂不会下载

签到天数: 222 天

[LV.7]常住居民III

发表于 2021-9-14 00:09 | 显示全部楼层
修改手机设置界面在strings_en.h里面。

该用户从未签到

 楼主| 发表于 2021-9-15 10:31 | 显示全部楼层
搬砖工 发表于 2021-9-13 02:03
能不能把库文件直接放出来!里面看不懂不会下载

上面网址不是库文件吗?伸手党不要懒到这种程度好吗

该用户从未签到

发表于 2021-9-15 14:27 | 显示全部楼层
284003505 发表于 2021-9-15 10:31
上面网址不是库文件吗?伸手党不要懒到这种程度好吗

他应该是不知道库怎么在github上怎么下载。或者是被qiang了打不开网址哦。我也是找了好一会儿才找到库的ZIP下载

该用户从未签到

 楼主| 发表于 2021-9-16 08:07 | 显示全部楼层
HZB586 发表于 2021-9-15 14:27
他应该是不知道库怎么在github上怎么下载。或者是被qiang了打不开网址哦。我也是找了好一会儿才找到库的Z ...

好吧,我传上来

该用户从未签到

 楼主| 发表于 2021-9-16 08:08 | 显示全部楼层
中文汉化版wifimanager库

WiFiManager-master.zip

392.83 KB, 下载次数: 16

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

热门推荐

继电器断开瞬间esp32重启或者网络断开
继电器断开瞬间esp32重启
主要模块: 芯片ESP32-WROOM-32D 供电用的220V转5V模块,700mA 网络LAN8720A模块 继电
【Arduino】168种传感器系列实验(171)---HLK-V20离线语音模块
【Arduino】168种传感器系
37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是
【Arduino】168种传感器系列实验(181)---1.3寸OLED液晶屏模块
【Arduino】168种传感器系
37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是
大佬们,帮帮忙
大佬们,帮帮忙
为什么我写的子程序,单独使用运行没问题,两个程序合起来就只会运行一个程序
OLED 128*64自制可达10000000个选项的菜单(已更新)
OLED 128*64自制可达10000
OLED 128*64自制可达10000000个选项的菜单 温馨提示: 建议占个楼再食用本帖子
Copyright   ©2015-2016  Arduino中文社区  Powered by©Discuz!   
快速回复 返回顶部 返回列表