ESP8266接入小爱同学系列--4.单个插座的Blinker设备APP适配

代码功能

之前几篇文章编写的程序,都是直接新建设备,对接小爱同学,Binker的APP中没有加入控件对设备进行控制。现在我们加入按钮控件对插座类设备进行控制。

目标

  • APP端能够对设备进行开关
  • APP端有设备状态反馈
  • 小爱同学控制设备时,设备状态也能实时反馈到APP控件

APP端修改

按钮控件属性

数据键名:按键对应的名称,代码新增组件时需要用到
按钮控件类型有三种:

  • 普通按钮:三种状态
    • 短按:按下立刻松开
    • 长按:持续按下
    • 释放:持续按下后释放
  • 开关按钮:两种状态
  • 自定义

显示文本:
显示图标:用于控件的图标更换
图标颜色:
背景设置:正常 透明 半透明 圆形

属性设置

这里我们添加的按钮控件属性如下:
数据键名:btn-pwr
按键类型:开关按键
背景设置:圆形

代码适配

按钮程序适配步骤

  • 新建组件对象
BlinkerButton Button1("btn-pwr");//开关按钮
  • 添加按钮回调函数,并修改
void button1_callback(const String & state)
{
    BLINKER_LOG("get button state: ", state);
    digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));

    if (state == BLINKER_CMD_BUTTON_TAP) { //轻触按键  短按
        BLINKER_LOG("Button tap!");

        // Button1.icon("icon_1");
        Button1.color("#FF0000");
        Button1.text("Your button name or describe");
        Button1.print();
    }
    else if (state == BLINKER_CMD_BUTTON_PRESSED) {  //轻触按键  长按
        BLINKER_LOG("Button pressed!");

        // Button1.icon("icon_1");
        Button1.color("#FFFF00");
        Button1.text("Your button name or describe");
        Button1.print();
    }
    else if (state == BLINKER_CMD_BUTTON_RELEASED) {//轻触按键  释放
        BLINKER_LOG("Button released!");

        // Button1.icon("icon_1");
        Button1.color("#FFFFFF");
        Button1.text("Your button name or describe");
        // Button1.text("Your button name", "describe");
        Button1.print();
    }
    else if (state == BLINKER_CMD_ON) {//开关按键  打开
        BLINKER_LOG("Toggle on!");
        digitalWrite(pin, HIGH);
        oState = true;
        // Button1.icon("icon_1");
        Button1.color("#0000FF");
        Button1.text("ON");
        // Button1.text("Your button name", "describe");
        Button1.print("on");
    }
    else if (state == BLINKER_CMD_OFF) {//开关按键  关闭
        BLINKER_LOG("Toggle off!");
        digitalWrite(pin, LOW);
        oState = false;
        // Button1.icon("icon_1");
        Button1.color("#00FFFF");
        Button1.text("OFF");
        // Button1.text("Your button name", "describe");
        Button1.print("off");
    }
    else {
        BLINKER_LOG("Get user setting: ", state);

        // Button1.icon("icon_1");
        Button1.color("#FFFFFF");
        Button1.text("Your button name or describe");
        // Button1.text("Your button name", "describe");
        Button1.print();
    }
}
  • 注册按钮回调函数
Button1.attach(button1_callback);
  • 添加小爱同学控制状态反馈
/*小米设备状态查询回调函数*/
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(oState ? "on" : "off");
            BlinkerMIOT.print();
            if(oState)
            {
                Button1.color("#00FFFF");
                Button1.text("OFF");
                // Button1.text("Your button name", "describe");
                Button1.print("off");
            }
            else
            {
                Button1.color("#0000FF");
                Button1.text("ON");
                // Button1.text("Your button name", "describe");
                Button1.print("on"); 
            }
            break;
        case BLINKER_CMD_QUERY_POWERSTATE_NUMBER :
            BLINKER_LOG("MIOT Query Power State");
            BlinkerMIOT.powerState(oState ? "on" : "off");
            BlinkerMIOT.print();
            if(oState)
            {
                Button1.color("#00FFFF");
                Button1.text("OFF");
                // Button1.text("Your button name", "describe");
                Button1.print("off");
            }
            else
            {
                Button1.color("#0000FF");
                Button1.text("ON");
                // Button1.text("Your button name", "describe");
                Button1.print("on"); 
            }
            break;
        default :
            BlinkerMIOT.powerState(oState ? "on" : "off");
            BlinkerMIOT.print();
            break;
    }
}

全部代码

/* *****************************************************************
 *
 * Download latest Blinker library here:
 * https://github.com/blinker-iot/blinker-library/archive/master.zip
 * 
 * 
 * Blinker is a cross-hardware, cross-platform solution for the IoT. 
 * It provides APP, device and server support, 
 * and uses public cloud services for data transmission and storage.
 * It can be used in smart home, data monitoring and other fields 
 * to help users build Internet of Things projects better and faster.
 * 
 * Make sure installed 2.5.0 or later ESP8266/Arduino package,
 * if use ESP8266 with Blinker.
 * https://github.com/esp8266/Arduino/releases
 * 
 * Make sure installed 1.0.2 or later ESP32/Arduino package,
 * if use ESP32 with Blinker.
 * https://github.com/espressif/arduino-esp32/releases
 * 
 * Docs: https://doc.blinker.app/
 *       https://github.com/blinker-iot/blinker-doc/wiki
 * 
 * *****************************************************************
 * 
 * Blinker 库下载地址:
 * https://github.com/blinker-iot/blinker-library/archive/master.zip
 * 
 * Blinker 是一套跨硬件、跨平台的物联网解决方案,提供APP端、设备端、
 * 服务器端支持,使用公有云服务进行数据传输存储。可用于智能家居、
 * 数据监测等领域,可以帮助用户更好更快地搭建物联网项目。
 * 
 * 如果使用 ESP8266 接入 Blinker,
 * 请确保安装了 2.5.0 或更新的 ESP8266/Arduino 支持包。
 * https://github.com/esp8266/Arduino/releases
 * 
 * 如果使用 ESP32 接入 Blinker,
 * 请确保安装了 1.0.2 或更新的 ESP32/Arduino 支持包。
 * https://github.com/espressif/arduino-esp32/releases
 * 
 * 文档: https://doc.blinker.app/
 *       https://github.com/blinker-iot/blinker-doc/wiki
 * 
 * *****************************************************************/

#define BLINKER_WIFI
#define BLINKER_MIOT_OUTLET

#include <Blinker.h>
#include <ESP8266WiFi.h>
int count = 0;
bool WIFI_Status = true;

#define pin D1
char auth[] = "dc76a24d1cc0";

bool oState = false;

//新建组件对象
BlinkerButton Button1("btn-pwr");//开关按钮

// 按键回调函数
void button1_callback(const String & state)
{
    BLINKER_LOG("get button state: ", state);
    digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));

    if (state == BLINKER_CMD_BUTTON_TAP) { //轻触按键  短按
        BLINKER_LOG("Button tap!");

        // Button1.icon("icon_1");
        Button1.color("#FF0000");
        Button1.text("Your button name or describe");
        Button1.print();
    }
    else if (state == BLINKER_CMD_BUTTON_PRESSED) {  //轻触按键  长按
        BLINKER_LOG("Button pressed!");

        // Button1.icon("icon_1");
        Button1.color("#FFFF00");
        Button1.text("Your button name or describe");
        Button1.print();
    }
    else if (state == BLINKER_CMD_BUTTON_RELEASED) {//轻触按键  释放
        BLINKER_LOG("Button released!");

        // Button1.icon("icon_1");
        Button1.color("#FFFFFF");
        Button1.text("Your button name or describe");
        // Button1.text("Your button name", "describe");
        Button1.print();
    }
    else if (state == BLINKER_CMD_ON) {//开关按键  打开
        BLINKER_LOG("Toggle on!");
        digitalWrite(pin, HIGH);
        oState = true;
        // Button1.icon("icon_1");
        Button1.color("#0000FF");
        Button1.text("ON");
        // Button1.text("Your button name", "describe");
        Button1.print("on");
    }
    else if (state == BLINKER_CMD_OFF) {//开关按键  关闭
        BLINKER_LOG("Toggle off!");
        digitalWrite(pin, LOW);
        oState = false;
        // Button1.icon("icon_1");
        Button1.color("#00FFFF");
        Button1.text("OFF");
        // Button1.text("Your button name", "describe");
        Button1.print("off");
    }
    else {
        BLINKER_LOG("Get user setting: ", state);

        // Button1.icon("icon_1");
        Button1.color("#FFFFFF");
        Button1.text("Your button name or describe");
        // Button1.text("Your button name", "describe");
        Button1.print();
    }
}
/* 智能配网模式 */
void smartConfig()
{
  WiFi.mode(WIFI_STA);//设置STA模式
  Serial.println("\r\nWait for Smartconfig...");//打印log信息
  WiFi.beginSmartConfig();//开始SmartConfig,等待手机端发出用户名和密码
  while(1)
  {
    Serial.println(".");
    digitalWrite(LED_BUILTIN,HIGH);//指示灯闪烁
    delay(1000);
    digitalWrite(LED_BUILTIN,LOW);//指示灯闪烁
    delay(1000);
    if(WiFi.smartConfigDone())//配网成功,接收到SSID和密码
    {
      Serial.println("SmartConfig Success");
      Serial.printf("SSID:%s\r\n", WiFi.SSID().c_str());
      Serial.printf("PSW:%s\r\n", WiFi.psk().c_str());
      break;      
      }
    }  
}
void miotPowerState(const String & state)
{
    BLINKER_LOG("need set power state: ", state);

    if (state == BLINKER_CMD_ON) {
        digitalWrite(LED_BUILTIN, HIGH);
        digitalWrite(pin, HIGH);
        BlinkerMIOT.powerState("on");
        BlinkerMIOT.print();

        oState = true;
    }
    else if (state == BLINKER_CMD_OFF) {
        digitalWrite(LED_BUILTIN, LOW);
        digitalWrite(pin, LOW);
        BlinkerMIOT.powerState("off");
        BlinkerMIOT.print();

        oState = false;
    }
}
/*小米设备状态查询回调函数*/
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(oState ? "on" : "off");
            BlinkerMIOT.print();
            if(oState)
            {
                Button1.color("#00FFFF");
                Button1.text("OFF");
                // Button1.text("Your button name", "describe");
                Button1.print("off");
            }
            else
            {
                Button1.color("#0000FF");
                Button1.text("ON");
                // Button1.text("Your button name", "describe");
                Button1.print("on"); 
            }
            break;
        case BLINKER_CMD_QUERY_POWERSTATE_NUMBER :
            BLINKER_LOG("MIOT Query Power State");
            BlinkerMIOT.powerState(oState ? "on" : "off");
            BlinkerMIOT.print();
            if(oState)
            {
                Button1.color("#00FFFF");
                Button1.text("OFF");
                // Button1.text("Your button name", "describe");
                Button1.print("off");
            }
            else
            {
                Button1.color("#0000FF");
                Button1.text("ON");
                // Button1.text("Your button name", "describe");
                Button1.print("on"); 
            }
            break;
        default :
            BlinkerMIOT.powerState(oState ? "on" : "off");
            BlinkerMIOT.print();
            break;
    }
}

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

    Blinker.vibrate();
    
    uint32_t BlinkerTime = millis();
    
    Blinker.print("millis", BlinkerTime);
}

void setup()
{
    Serial.begin(115200);
    BLINKER_DEBUG.stream(Serial);
    
    pinMode(pin, OUTPUT);
    digitalWrite(pin, LOW); 
    pinMode(LED_BUILTIN, OUTPUT);
    digitalWrite(LED_BUILTIN, LOW);
    Serial.println("\r\n正在连接WIFI...");

    while(WiFi.status()!=WL_CONNECTED)//判断是否连接WIFI成功
    {
      if(WIFI_Status)
      {
          Serial.print(".");
          digitalWrite(LED_BUILTIN, HIGH);  
          delay(500);                       
          digitalWrite(LED_BUILTIN, LOW);    
          delay(500);                 
          count++;
          if(count>=5)//5s
          {
              WIFI_Status = false;
              Serial.println("WiFi连接失败,请用手机进行配网"); 
          }        
        }
        else
        {
          smartConfig();  //微信智能配网
          }
      }

   Serial.println("连接成功");  
   Serial.print("IP:");
   Serial.println(WiFi.localIP());
   
   Blinker.begin(auth,WiFi.SSID().c_str(),WiFi.psk().c_str());
   Blinker.attachData(dataRead);
   
    BlinkerMIOT.attachPowerState(miotPowerState);//注册回调函数
    BlinkerMIOT.attachQuery(miotQuery);
    Button1.attach(button1_callback);
}

void loop()
{
    Blinker.run();
}
发布了24 篇原创文章 · 获赞 6 · 访问量 3976

猜你喜欢

转载自blog.csdn.net/weixin_43482414/article/details/104445369