接上文物联网ESP8266之温湿度上传到点灯科技blinkerapp
本文主要是使用点灯科技blinker app进行按键绑定的示例,在智能家居应用开发中,app控制家电开关是个比较典型的使用案例。
示例完整代码:MQTT_PUB.ino
// 新建组件对象对应的是app中的组件名称
BlinkerButton Button1("btn-abc");
BlinkerNumber Number1("num-abc");
远程开机绑定的函数,通过按键事件,可以开关灯,这些是智能家居中最常见的app控制电器开关。
// 按下按键即会执行该函数进行开关灯
void button1_callback(const String & state)
{
BLINKER_LOG("get button state: ", state);
digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));
}
// 改进:
// 因为app端不知道当前灯的状态,所以改动button为switch类型
void button1_callback(const String & state)
{
BLINKER_LOG("get button state: ", state);
// digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));
if (state=="on") {
digitalWrite(LED_BUILTIN, LOW);
// 反馈开关状态
Button1.print("on");
} else if(state=="off"){
digitalWrite(LED_BUILTIN, HIGH);
// 反馈开关状态
Button1.print("off");
}
}
绑定数据,当app按下button时,通过串口查看实践,button按下事件string为tap
如果是开关按键:
三种类型区别如下:
**普通按键**
每次按下发送的指令为
{"btn-abc":"tap"}
**开关按键**
按键本身会保存开关状态,默认为off,按下时会发送
{"btn-abc":"on"}
保存的状态为on时,按下会发送
{"btn-abc":"off"}
// 此函数用于捕捉手机上的所有的请求,此函数在窜口可以观察到数据
void dataRead(const String & data)
{
BLINKER_LOG("Blinker readString: ", data);
counter++;
Number1.print(counter); //回传数据到app组件
if (BLINKER_PROTOCOL_MQTT != NULL) {
String pub_topic = String("/device/") + Blinker.deviceName() + String("/s");
String pub_data = "{\"toDevice\":\"the device name you need pub to\",\"data\":{\"hello\":\"blinker\"}}";
BLINKER_PROTOCOL_MQTT->publish(pub_topic.c_str(), pub_data.c_str());
}
}
setup函数
上文用的温湿度传感器的gpio口我改到了3,这样温湿度读取不影响观察远程开关的灯亮灭。
void setup()
{
Serial.begin(115200);
BLINKER_DEBUG.stream(Serial);
// 初始化有LED的IO
pinMode(LED_BUILTIN, OUTPUT);
digitalWrite(LED_BUILTIN, LOW);
dht.begin();
// 初始化blinker
Blinker.begin(auth, ssid, pswd);
Blinker.attachHeartbeat(heartbeat);//将传感器回调函数加载,回传数据
// attach callback function
Blinker.attachData(dataRead);
Button1.attach(button1_callback);
}
上传后,在app端按钮会看到开灯和关灯的效果了。