接上文物联网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端按钮会看到开灯和关灯的效果了。