blinker做的卧室灯开关发现一个问题-Arduino中文社区 - Powered by Discuz! Archiver

houguanghaha 发表于 2020-5-29 11:39

blinker做的卧室灯开关发现一个问题

本帖最后由 houguanghaha 于 2020-5-29 12:00 编辑

做了一个卧室灯开关并安装到墙壁86盒中,实现了小爱同学,墙壁开关点动控制开关灯.看起来一切正常.但是有时半夜没有操作灯自动亮了,可能是某些信息号干扰,但不知如何解决?

接线图如下


程序如下
#define BLINKER_WIFI
#define BLINKER_MIOT_LIGHT
#define BLINKER_PRINT Serial
#include <Blinker.h>
#include <ESP8266WiFi.h>
WiFiServer server(80);

char auth[] = "123";
char ssid[] = "123";
char pswd[] = "123";

int GPIO = 0;
//实体按钮开关
int switch_button = 2;
int temp = 0;

BlinkerButton ButtonOn("btn-on");
BlinkerButton ButtonOff("btn-off");
BlinkerButton ButtonState("btn-state");

void button_on_callback(const String & state) {
BLINKER_LOG("get button state: ", state);
digitalWrite(GPIO, HIGH);
ButtonState.print("on");
ButtonState.color("#00BB00");
ButtonState.text("灯亮了");
Blinker.vibrate();
}
void button_off_callback(const String & state) {
BLINKER_LOG("get button state: ", state);
digitalWrite(GPIO, LOW);
ButtonState.print("off");
ButtonState.color("#FF0000");
ButtonState.text("灯关了");
Blinker.vibrate();
}
void miotPowerState(const String & state)
{
BLINKER_LOG("need set power state: ", state);
if (state == BLINKER_CMD_ON) {
    digitalWrite(GPIO, HIGH);
    BlinkerMIOT.powerState("on");
    BlinkerMIOT.print();
}
else if (state == BLINKER_CMD_OFF) {
    digitalWrite(GPIO, LOW);
    BlinkerMIOT.powerState("off");
    BlinkerMIOT.print();
}
}
void heartbeat()
{
BLINKER_LOG("状态同步!");
if (digitalRead(GPIO) == LOW)
{
    ButtonState.print("on");
    ButtonState.color("#00BB00");
    ButtonState.text("灯亮了");
}
else
{
    ButtonState.print("off");
    ButtonState.color("#FF0000");
    ButtonState.text("灯关了");
}
}
void setup() {
Serial.begin(115200);
BLINKER_DEBUG.stream(Serial);
pinMode(GPIO, OUTPUT);
pinMode(switch_button, INPUT);
digitalWrite(GPIO, LOW);
Blinker.begin(auth, ssid, pswd);
ButtonOn.attach(button_on_callback);
ButtonOff.attach(button_off_callback);
BlinkerMIOT.attachPowerState(miotPowerState);

Blinker.attachHeartbeat(heartbeat);

server.begin();
Serial.println(F("Server started"));
}
void loop() {
Blinker.run();

temp = digitalRead(switch_button);
if (temp == LOW) {
    digitalWrite(GPIO, !digitalRead(GPIO));
    pinMode(switch_button, INPUT_PULLUP);
    delay(300);
}

WiFiClient client = server.available();
if (!client) {
    delay(100);
    return;
}
String req = client.readStringUntil('\r');
Serial.println(req);
client.flush();
int val;
if (req.indexOf("/gpio/on") != -1)
    digitalWrite(GPIO, HIGH);

else if (req.indexOf("/gpio/off") != -1)
    digitalWrite(GPIO, LOW);

else {
    Serial.println("invalid request");
    client.print("HTTP/1.1 404\r\n");
    client.stop();
    return;
}
client.flush();
// Prepare the response
String s = "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n<!DOCTYPE HTML>\r\n<html>\r\nWelcome to 666! ";
s += "</html>\n";

client.print(s);
delay(1);
Serial.println("Client disonnected");
}


奈何col 发表于 2020-5-29 12:08

估计是设备重启了,具体只有看设备调试信息。

houguanghaha 发表于 2020-5-29 14:54

奈何col 发表于 2020-5-29 12:08
估计是设备重启了,具体只有看设备调试信息。

重启默认是关闭状态,灯也应该不亮才对啊,现在是自动触发了

奈何col 发表于 2020-5-29 16:24

houguanghaha 发表于 2020-5-29 14:54
重启默认是关闭状态,灯也应该不亮才对啊,现在是自动触发了

1.控制程序都是你自己写的,服务器不会发送控制信息。
2.重启时或程序出错,需要自己判断了
3.看调试信息

howlet 发表于 2020-6-1 00:52

如果排除程序问,用的是图片所示的AC-DC没有隔离电源。个人觉得应当是电源问题,遇到电涌导致三极管打开。换个隔离DC电源或纯充电宝供电试试看吧。

keliyuan 发表于 2020-6-1 22:25

本帖最后由 keliyuan 于 2020-6-1 22:30 编辑


暗盒开关线很容易受电源线干扰,
GPIO接一个10K下拉电阻。

topdog 发表于 2020-6-1 22:57

设计时要考虑手动关闭的,再考虑远程自动关闭,否则就会非常尴尬。:L

liuyb 发表于 2020-6-11 22:25

楼主你那个点动开关不是执行复位的么 怎么控制开关灯啊

时光星星 发表于 2020-6-16 09:26

楼主,用了您的代码,为什么连小爱都控制不了

houguanghaha 发表于 2020-6-17 15:18

topdog 发表于 2020-6-1 22:57
设计时要考虑手动关闭的,再考虑远程自动关闭,否则就会非常尴尬。

目前已经正常
页: [1] 2
查看完整版本: blinker做的卧室灯开关发现一个问题