请教如何自动同步ESP8266引脚状态到blinker APP-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 2426|回复: 5

[已解答] 请教如何自动同步ESP8266引脚状态到blinker APP

[复制链接]
发表于 2020-7-12 20:51 | 显示全部楼层 |阅读模式
小爱音箱控制ESP-01S打开/关闭继电器后,如何同步继电器状态到blinker APP?现在的状态是接通电后,APP按键控制,模块和继电器指示灯同时亮灭,一旦小爱音箱控制一次,指示灯状态就会正好相反!请教代码改进,下面是我现在的代码:
  1. #define BLINKER_WIFI
  2. #define BLINKER_MIOT_OUTLET

  3. #include <Blinker.h>

  4. char auth[] = "cb5******1cf"; // Blinker APP中添加设备时生成的Secret Key
  5. char ssid[] = "ty****op"; // WIFI名称
  6. char pswd[] = "155******25"; // WIFI密码

  7. int GPIO = 0; // 定义继电器输入引脚为GPIO/0

  8. bool oState = false;

  9. // 新建组件对象
  10. BlinkerButton Button1("btn-abc");

  11. // 按下按键即会执行该函数
  12. void button1_callback(const String & state)
  13. {
  14. // digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));
  15. digitalWrite(GPIO, !digitalRead(GPIO));
  16. BLINKER_LOG("get button state: ", state);

  17. if (state == BLINKER_CMD_BUTTON_TAP) {
  18. BLINKER_LOG("Button tap!");

  19. Button1.icon("fal fa-siren");
  20. Button1.color("#0000FF");
  21. // Button1.text("Your button name or describe");
  22. Button1.print();
  23. }
  24. else if (state == BLINKER_CMD_BUTTON_PRESSED) {
  25. BLINKER_LOG("Button pressed!");

  26. Button1.icon("fal fa-siren-on");
  27. Button1.color("#FFFF00");
  28. // Button1.text("Your button name or describe");
  29. Button1.print();
  30. }
  31. else if (state == BLINKER_CMD_BUTTON_RELEASED) {
  32. BLINKER_LOG("Button released!");

  33. Button1.icon("fal fa-siren");
  34. Button1.color("#FF0000");
  35. // Button1.text("Your button name or describe");
  36. Button1.print();
  37. }
  38. else if (state == BLINKER_CMD_ON) {
  39. BLINKER_LOG("Toggle on!");

  40. Button1.icon("fal fa-light-switch-on");
  41. Button1.color("#0000FF");
  42. Button1.text("ON");
  43. Button1.print("on");
  44. }
  45. else if (state == BLINKER_CMD_OFF) {
  46. BLINKER_LOG("Toggle off!");

  47. Button1.icon("fal fa-light-switch-off");
  48. Button1.color("#FF0000");
  49. Button1.text("OFF");
  50. Button1.print("off");
  51. }
  52. else {
  53. BLINKER_LOG("Get user setting: ", state);

  54. Button1.icon("fal fa-light-switch");
  55. Button1.color("#FFFF00");
  56. // Button1.text("Your button name or describe");
  57. Button1.print();
  58. }
  59. }


  60. // 小爱电源类的操作接口
  61. // 用户自定义电源类操作的回调函数
  62. void miotPowerState(const String & state)
  63. {
  64. BLINKER_LOG("need set power state: ", state);

  65. if (state == BLINKER_CMD_ON) {
  66. // digitalWrite(LED_BUILTIN, HIGH);
  67. digitalWrite(GPIO, LOW);

  68. BlinkerMIOT.powerState("on");
  69. BlinkerMIOT.print();

  70. oState = true;
  71. }
  72. else if (state == BLINKER_CMD_OFF) {
  73. // digitalWrite(LED_BUILTIN, LOW);
  74. digitalWrite(GPIO, HIGH);

  75. BlinkerMIOT.powerState("off");
  76. BlinkerMIOT.print();

  77. oState = false;
  78. }
  79. }

  80. // 小爱设备查询接口
  81. // 用户自定义设备查询的回调函数
  82. void miotQuery(int32_t queryCode)
  83. {
  84. BLINKER_LOG("MIOT Query codes: ", queryCode);

  85. switch (queryCode)
  86. {
  87. case BLINKER_CMD_QUERY_ALL_NUMBER :
  88. BLINKER_LOG("MIOT Query All");
  89. BlinkerMIOT.powerState(oState ? "on" : "off");
  90. BlinkerMIOT.print();
  91. break;
  92. case BLINKER_CMD_QUERY_POWERSTATE_NUMBER :
  93. BLINKER_LOG("MIOT Query Power State");
  94. BlinkerMIOT.powerState(oState ? "on" : "off");
  95. BlinkerMIOT.print();
  96. break;
  97. default :
  98. BlinkerMIOT.powerState(oState ? "on" : "off");
  99. BlinkerMIOT.print();
  100. break;
  101. }
  102. }

  103. // 如果未绑定的组件被触发,则会执行其中内容
  104. void dataRead(const String & data)
  105. {
  106. BLINKER_LOG("Blinker readString: ", data);

  107. Blinker.vibrate();

  108. uint32_t BlinkerTime = millis();

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

  111. void setup()
  112. {
  113. // 初始化串口
  114. Serial.begin(115200);
  115. BLINKER_DEBUG.stream(Serial);
  116. // BLINKER_DEBUG.debugAll();

  117. // 初始化有LED的IO
  118. // pinMode(LED_BUILTIN, OUTPUT);
  119. // digitalWrite(LED_BUILTIN, HIGH);
  120. pinMode(GPIO, OUTPUT); // 设定GPIO0为输出引脚
  121. digitalWrite(GPIO, HIGH); // 设定GPIO0为高电位

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

  125. Button1.attach(button1_callback);

  126. BlinkerMIOT.attachPowerState(miotPowerState); // 注册小爱电源类操作回调函数
  127. BlinkerMIOT.attachQuery(miotQuery); // 注册小爱设备查询的回调函数
  128. }

  129. void loop() {
  130. Blinker.run();
  131. }
复制代码


 楼主| 发表于 2020-7-12 20:52 | 显示全部楼层
  1. if (state == BLINKER_CMD_BUTTON_TAP) {
  2. BLINKER_LOG("Button tap!");

  3. Button1.icon("fal fa-siren");
  4. Button1.color("#0000FF");
  5. // Button1.text("Your button name or describe");
  6. Button1.print();
  7. }
  8. else if (state == BLINKER_CMD_BUTTON_PRESSED) {
  9. BLINKER_LOG("Button pressed!");

  10. Button1.icon("fal fa-siren-on");
  11. Button1.color("#FFFF00");
  12. // Button1.text("Your button name or describe");
  13. Button1.print();
  14. }
  15. else if (state == BLINKER_CMD_BUTTON_RELEASED) {
  16. BLINKER_LOG("Button released!");

  17. Button1.icon("fal fa-siren");
  18. Button1.color("#FF0000");
  19. // Button1.text("Your button name or describe");
  20. Button1.print();
  21. }
复制代码
 楼主| 发表于 2020-7-12 20:53 | 显示全部楼层

普通按键这一块,一般什么情况下用呢,TAP、PRESSED、RELEASED
发表于 2020-7-12 23:48 | 显示全部楼层
1.blinker只负责通信,如何处理收到的指令,是你自己写的。你自己把GPIO状态按需求写就行了。
2.tap、press、pressup 对应的是短按、长按、长按释放,什么时候需要,也是你自己决定的。
发表于 2020-7-13 23:02 | 显示全部楼层
本帖最后由 skygz 于 2020-7-13 23:12 编辑

void MIOTpowerState(void)
{//根据oState 标志 同步给小爱同学,  在button1_callback里面加入MIOTpowerState()调用
  BlinkerMIOT.powerState(oState ? "on" : "off");
  BlinkerMIOT.print();
}

void HeartBeat(void)
{ //根据oState 标志 同步 按钮当前状态到APP里
  //Button1.text(oState ? "已开启" : "已关闭");
  Button1.print(oState ? "on" : "off");

}
void button1_callback(const String & state)
{
    digitalWrite(GPIO, !digitalRead(GPIO));
    oState = !oState; //标志也要 改变
    MIOTpowerState(); //同步给小爱
    HeartBeat();//同步给APP
  //app里用的是普通按键 那么都是tap状态, 后面判断长按 短按什么的, 用不上的话可以移除。
  //以上代码, 不论是 长按还是短按 都会触发。如果需要判断状态则如下
   if (state == "tap"){
     //将上面的几句代码 都移进入这里。。。
  }
}

void setup()
{
    ..........省略。
    Blinker.attachHeartbeat(HeartBeat);
}

 楼主| 发表于 2020-7-14 18:45 | 显示全部楼层
skygz 发表于 2020-7-13 23:02
void MIOTpowerState(void)
{//根据oState 标志 同步给小爱同学,  在button1_callback里面加入MIOTpowerSt ...

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

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-11-28 16:51 , Processed in 0.069717 second(s), 15 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表