本帖最后由 skygz 于 2021-3-1 15:17 编辑
物理开关 改用 3线可双控用的开关, 物理开关 不接 灯泡控制, 灯泡交由 继电器控制
物理开关 1,2,3 公共脚2 接 8266 另一个 GPIO, 1脚接高电平, 3脚接地
按代码处理, 不管 是 天猫精灵 还是Blinker APP 还是 实体物理开关 任一个开关状态 都不会影响了。。
//对于blinker APP里的开关状态 由Blinker.attachHeartbeat(HeartBeat); 进行同步。
其它代码 按常规ChangeRelay(!digitalRead(GPIO_RELAY), 0);控制继电器即可。
bool KeySwitchStatus = false;
bool LastKeySwitchStatus = false; //实体按键 自锁状态
int GPIO_BTNSWITCH = 14; //实体按键
void AlipowerState(uint8_t num)
{
BlinkerAliGenie.powerState(oState[num] ? "on" : "off", num);
BlinkerAliGenie.print();
}
void ChangeRelay(int iState, uint8_t num)
{
if (num == 0){
digitalWrite(GPIO_RELAY, iState);
}
oState[num] = !iState;
HeartBeat(); //同步开关状态给blinker app
}
void ChangeSwitch(void){
Serial.println(F("switch button state: tap"));
ChangeRelay(!digitalRead(GPIO_RELAY), 0); //继电器 IO取反
AlipowerState(0); //同步 开关状态给天猫精灵
pinMode(GPIO_BTNSWITCH, INPUT_PULLUP);
Blinker.delay(500);
}
void KeySwitch(void) //机械开关动作判断
{
KeySwitchStatus = digitalRead(GPIO_BTNSWITCH) == 0 ? false : true;
if (KeySwitchStatus != LastKeySwitchStatus)
{
ChangeSwitch();
LastKeySwitchStatus = KeySwitchStatus;
}
}
void loop() {
Blinker.run();
//实体按钮,自锁 切换继电器状态
KeySwitch();
}
|