本人初学,求教一个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);
}
}
可以先阅读教程学习:https://www.arduino.cn/thread-104162-1-1.html #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 编译时出错。
在文件 -> 首选项开启
“编译过程中显示详细输出”选项
这份报告会包含更多信息。
1.你装了两个库,请把删除了,然后按照文档重新装库。
2.写有error才是报错信息,你提供的信息中没有报错。 本帖最后由 xpmcn 于 2021-9-20 15:29 编辑
重新安装了最新的环境和库除了没有库的提示外还是同样的提示,哪位可以帮助看一看代码是否有问题。 xpmcn 发表于 2021-9-20 15:06
重新安装了最新的环境和库除了没有库的提示外还是同样的提示,哪位可以帮助看一看代码是否有问题。 ...
您发的提示,只能说明您装了两个库,请把这两个库都删除了,再安装新的库。
这个提示不是报错,你要使用鼠标拖拽报错信息右侧的滚动条,在信息中找到写有“error”的地方,那个才是报错。 本帖最后由 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]