本人初学,求教一个APP状态反聩的问题。-Arduino中文社区 - Powered by Discuz! Archiver

xpmcn 发表于 2021-9-18 20:43

本人初学,求教一个APP状态反聩的问题。

本帖最后由 xpmcn 于 2021-9-19 06:37 编辑

学习修改了一个APP+本地按钮的开关,但是1、打开APP中设备时不按开关按钮没有状态反馈(按调试中的刷新也不反馈);2、按开关按钮后大多数时候也不及时反馈,按调试中的刷新才反馈状态。重点想解决第1个问题,当然第2个问题也能解决更好。特求教,谢谢!

#define BLINKER_WIFI
#define BLINKER_MIOT_LIGHT
#define BLINKER_ESP_SMARTCONFIG
#include <Blinker.h>
char auth[] = "74592f80a84e";//APP中获取到的Secret Key(密钥)

//手机配网

#define RELAY 0
#define KEY 2
int relay_State = 0;
int KEY_NUM = 0;


// 新建组件对象
BlinkerButton Button1("btn-abc");//注意:要和APP组件’数据键名’一致// 按下BlinkerAPP按键即会执行该函数
void button1_callback(const String & state)
{
    if (state == BLINKER_CMD_ON) {
    BLINKER_LOG("Toggle on!");
    Button1.text("断电");
    relay_State = 1;
    Button1.print("on");
}
else if (state == BLINKER_CMD_OFF) {
    BLINKER_LOG("Toggle off!");
    Button1.color("#FF0000");
    Button1.text("插座已送电");
    relay_State = 0;
    Button1.print("off");
}
Blinker.vibrate();
}

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

Blinker.vibrate();

uint32_t BlinkerTime = millis();

Blinker.print("millis", BlinkerTime);
//Text1.print("os time", BlinkerTime);
}

void setup() {
// 初始化串口,并开启调试信息,仅调试用,可以删除
Serial.begin(115200);
BLINKER_DEBUG.stream(Serial);
// 初始化IO
pinMode(RELAY, OUTPUT);
pinMode(KEY, INPUT);
digitalWrite(RELAY,HIGH);//上电继电器释放

// 初始化blinker
Blinker.begin(auth);
Button1.attach(button1_callback);
Blinker.attachData(dataRead);
}

void loop() {
Blinker.run();

KEY_NUM = 0;
if (digitalRead(KEY) == LOW)
{
    delay(10);
    if (digitalRead(KEY) == LOW)
    {
      KEY_NUM = 1;
      while (digitalRead(KEY) == LOW);
    }
}
if (KEY_NUM == 1)
{
    relay_State = relay_State + 1;
}
if (relay_State >= 2)
{
    relay_State = 0;
}

if (relay_State == 1)
{
    digitalWrite(RELAY, LOW);
}
else
{
    digitalWrite(RELAY, HIGH);
}
}

点灯官方 发表于 2021-9-18 20:53

可以先阅读教程学习:https://www.arduino.cn/thread-104162-1-1.html

xpmcn 发表于 2021-9-19 12:17

#define BLINKER_WIFI
#define BLINKER_MIOT_LIGHT
#define BLINKER_ESP_SMARTCONFIG
#include <Blinker.h>
char auth[] = "74592f80a84e";//APP中获取到的Secret Key(密钥)

//此版本带手机配网功能,不需在程序中写入WiFi账号密码,只需要填写设备密钥

#define RELAY 0
#define KEY 2
int relay_State = 0;
int KEY_NUM = 0;


// 新建组件对象
BlinkerButton Button1("btn-abc");//注意:要和APP组件’数据键名’一致// 按下BlinkerAPP按键即会执行该函数
void button1_callback(const String & state)
{
    if (state == BLINKER_CMD_ON) {
    BLINKER_LOG("Toggle on!");
    Button1.text("断电");
    relay_State = 1;
    Button1.print("on");
}
else if (state == BLINKER_CMD_OFF) {
    BLINKER_LOG("Toggle off!");
    Button1.color("#FF0000");
    Button1.text("插座已送电");
    relay_State = 0;
    Button1.print("off");
}
Blinker.vibrate();
}

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

Blinker.vibrate();

uint32_t BlinkerTime = millis();

Blinker.print("millis", BlinkerTime);
//Text1.print("os time", BlinkerTime);
}

// 心跳包函数
void heartbeat() {

    if (relay_State == BLINKER_CMD_ON) {
    BLINKER_LOG("Toggle on!");
    Button1.text("断电");
    relay_State = 1;
    Button1.print("on");
}
else if (relay_State == BLINKER_CMD_OFF) {
    BLINKER_LOG("Toggle off!");
    Button1.color("#FF0000");
    Button1.text("插座已送电");
    relay_State = 0;
    Button1.print("off");
}
}
void setup() {
// 初始化串口,并开启调试信息,仅调试用,可以删除
Serial.begin(115200);
BLINKER_DEBUG.stream(Serial);
// 初始化IO
pinMode(RELAY, OUTPUT);
pinMode(KEY, INPUT);
digitalWrite(RELAY,HIGH);//上电继电器释放

// 初始化blinker
Blinker.begin(auth);
Button1.attach(button1_callback);
Blinker.attachData(dataRead);
//注册一个心跳包
Blinker.attachHeartbeat(heartbeat);
}

void loop() {
Blinker.run();

KEY_NUM = 0;
if (digitalRead(KEY) == LOW)
{
    delay(10);
    if (digitalRead(KEY) == LOW)
    {
      KEY_NUM = 1;
      while (digitalRead(KEY) == LOW);
    }
}
if (KEY_NUM == 1)
{
    relay_State = relay_State + 1;
}
if (relay_State >= 2)
{
    relay_State = 0;
}

if (relay_State == 1)
{
    digitalWrite(RELAY, LOW);
}
else
{
    digitalWrite(RELAY, HIGH);
}
}

哪位能指点一下,编译时出错:
"Blinker.h" 对应多个库
已使用: C:\Users\MY\Documents\Arduino\libraries\blinker-library-master222
未使用:C:\Users\MY\Documents\Arduino\libraries\blinker-library-master
exit status 1
为开发板 Generic ESP8266 Module 编译时出错。

在文件 -> 首选项开启
“编译过程中显示详细输出”选项
这份报告会包含更多信息。

点灯官方 发表于 2021-9-19 15:00

1.你装了两个库,请把删除了,然后按照文档重新装库。
2.写有error才是报错信息,你提供的信息中没有报错。

xpmcn 发表于 2021-9-20 15:06

本帖最后由 xpmcn 于 2021-9-20 15:29 编辑

重新安装了最新的环境和库除了没有库的提示外还是同样的提示,哪位可以帮助看一看代码是否有问题。

奈何col 发表于 2021-9-21 09:41

xpmcn 发表于 2021-9-20 15:06
重新安装了最新的环境和库除了没有库的提示外还是同样的提示,哪位可以帮助看一看代码是否有问题。 ...

您发的提示,只能说明您装了两个库,请把这两个库都删除了,再安装新的库。

这个提示不是报错,你要使用鼠标拖拽报错信息右侧的滚动条,在信息中找到写有“error”的地方,那个才是报错。

xpmcn 发表于 2021-9-23 12:57

本帖最后由 xpmcn 于 2021-9-23 13:08 编辑

终于编译通过了,总结一下。二种开关状态反馈,一是单纯的APP按键操作反馈状态,点开设备是没有开关状态反馈的,点击按钮后反馈状态不同步;二是单纯的设置心跳包反馈状态,点开APP的设备就显示开关当前的开关状态,点击按钮后要是30-60秒刷新状态;三是把前面二种方式混合用,点击按钮后状态反馈也是不同步。下面罗列出以上二种情况的代码,初学小白一枚,请指导!

//按键执行操作
BlinkerButton Button1("btn-abc");
void button1_callback(const String & state)
{
    if (state == BLINKER_CMD_ON) {
    BLINKER_LOG("Toggle on!");
    Button1.text("断电");
    relay_State = 1;
    Button1.print("on");
}
else if (state == BLINKER_CMD_OFF) {
    BLINKER_LOG("Toggle off!");
    Button1.color("#FF0000");
    Button1.text("插座已送电");
    relay_State = 0;
    Button1.print("off");
}
Blinker.vibrate();
}


//心跳包返回设备当前状态
void heartbeat()
{
   if (digitalRead(relay_State) == LOW)
    {
      Button1.print("on");
      Button1.text("断电");
    }
    else
    {
    Button1.print("off");
    Button1.color("#FF0000");            //设置app按键是红色
    Button1.text("插座已送电");
    }
}
页: [1]
查看完整版本: 本人初学,求教一个APP状态反聩的问题。