前言
- 这次的小玩意儿是个灯条,可以用<font color=””red””>打火机点亮,吹气熄灭,手机和小爱也能控制
- 这是自己编写的程序,目的是为了练习传感器、开关、手机APP、小爱音箱共同控制设备
- 实验用的继电器可以控制250V以内的设备,考虑到安全因素用的是6V灯条
- 火焰传感器只负责开灯,震动开关只负责关灯,APP和小爱可以随意控制
- 接入小爱使用的是插座程序,不为什么,就是大意选错了,懒得改
所需硬件
- ESP8266开发板(10元)
- 火焰传感器模块(4元)
- 震动开关(2元)
- 6V灯条(0.5元)
踩坑
- ESP8266使用外部中断,绑定的函数必须声明为 <font color=””red””>ICACHE_RAM_ATTR,否则疯狂重启,原因不明
- ESP8266 12E的供电可以接用4.5 – 9伏正极接 VIN 负极接GND,或者3.3V接3.3V引脚
实物图
- 使用9V电池供电,可以独立使用了
- 实物图中震动传感器没接,那玩意儿不好用
完整代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 |
// 初始化Blinker #define BLINKER_WIFI #define BLINKER_MIOT_OUTLET #include <Blinker.h> // Blinker头文件 const int relayPin = D1; // 继电器 const int firePin = D2; // 火焰传感器 const int shockPin = D5; // 震动传感器 volatile bool state = 0; // 记录灯条状态 BlinkerButton Button1("btn"); // APP按键组件 char auth[] = "******"; char ssid[] = "*****"; char pswd[] = "******"; void setup() { pinMode(relayPin, OUTPUT); pinMode(firePin, INPUT); // 震动开关设置为外部中断,注意!ledOff函数必须声明为 ICACHE_RAM_ATTR 否则疯狂重启 attachInterrupt(digitalPinToInterrupt(shockPin), ledOff, CHANGE); Serial.begin(115200); BLINKER_DEBUG.stream(Serial); // 串口输出调试信息 Blinker.begin(auth, ssid, pswd); // 设备上线 Blinker.attachData(dataRead); // 接受到未匹配函数的指令执行dataRead函数 BlinkerMIOT.attachPowerState(miotPowerState); // 小爱控制回调函数 BlinkerMIOT.attachQuery(miotQuery); // 小爱状态查询回调函数 Button1.attach(button1_callback); // 按键回调函数 } void loop() { Blinker.run(); // 运行Blinker并保持设备在线 int fire = digitalRead(firePin); int shock = digitalRead(shockPin); if (fire == HIGH && state == 0){ // 控制继电器开闭 digitalWrite(relayPin, HIGH); state = 1; } } // 中断函数 注意坑,ESP8266必须声明 ICACHE_RAM_ATTR 不然疯狂重启 ICACHE_RAM_ATTR void ledOff(){ digitalWrite(relayPin, LOW); // 熄灯 state = 0; // 改变灯条状态 } // 小爱控制回调函数 void miotPowerState(const String & State) { BLINKER_LOG("状态设置为: ", State); if (State == BLINKER_CMD_ON) { digitalWrite(relayPin, HIGH); state = 1; BlinkerMIOT.powerState("on"); // 反馈状态给小爱 BlinkerMIOT.print(); }else if (State == BLINKER_CMD_OFF) { digitalWrite(relayPin, LOW); state = 0; BlinkerMIOT.powerState("off"); // 反馈状态给小爱 BlinkerMIOT.print(); } } // 状态函数 void miotQuery(int32_t queryCode) { BLINKER_LOG("小爱查询代码: ", queryCode); switch (queryCode) { case BLINKER_CMD_QUERY_ALL_NUMBER : BLINKER_LOG("MIOT Query All"); BlinkerMIOT.powerState(state ? "on" : "off"); // 根据state反馈状态给小爱 BlinkerMIOT.print(); break; case BLINKER_CMD_QUERY_POWERSTATE_NUMBER : BLINKER_LOG("MIOT Query Power State"); BlinkerMIOT.powerState(state ? "on" : "off"); BlinkerMIOT.print(); break; default : BlinkerMIOT.powerState(state ? "on" : "off"); BlinkerMIOT.print(); break; } } // 未绑定函数的指令执行此函数 void dataRead(const String & data) { BLINKER_LOG("Blinker读取到的指令: ", data); Blinker.vibrate(); // 手机震动 uint32_t BlinkerTime = millis(); // 运行时间 Blinker.print("millis", BlinkerTime); // 反馈给手机APP } // 按下按键即会执行该函数 void button1_callback(const String & State) { BLINKER_LOG("按键状态: ", State); digitalWrite(relayPin, !digitalRead(relayPin)); // 继电器取反执行 state = state ? 0 : 1; // state取反 } |
近期评论