ESP8266-01s+继电器无损实现远程开机(可接入小爱小度)

咕哒 2022年11月14日 507次浏览

忽然想起来家里还有个ESP8266,做个远程开机模块吧。用于解决人在公司但又想临时用下家里电脑,一直开机不环保费钱的弊端。

准备工作

所需装备

  • ESP8266-01s
  • Relay模块 继电器
  • CH340烧录器
  • 杜邦线若干

总成本约11元

所需软件

实现

安装Arduino IDE

无脑下一步。。一切弹出均点“安装”等确认选项
设置中文及附加开发板地址

填入https://www.arduino.me/package_esp8266com_index.json

安装CH340驱动

双击”CH341SER.exe“等待自解压完成,弹出框点“安装”即可

Arduino IDE esp8266扩展包

双击"esp8266_package_3.0.2_arduinocn.exe"等待解压完成即可。

导入blinker Arduino库


直接选择blinker-library-master.zip压缩包即可,无需自行解压

获取key

安装点灯APP进入后点击右上角添加设备,选择“独立设备”

然后选择“网络接入”,即可看到Secret Key,复制发送到电脑备用

添加一个按钮组件,名字必须为“btn-xiw”(详见下方源码)

编译并上传

接入小爱及APP控制

#define BLINKER_WIFI
#define BLINKER_MIOT_OUTLET   //小爱同学

#include <Blinker.h>

char auth[] = "*******";  // 上一步复制的Secret Key
char ssid[] = "*******";  // wifi 名字
char pswd[] = "*******";  // wifi 密码
BlinkerButton Button1("btn-xiw");     //定义按钮键名
bool oState = false;
int counter = 0;
void miotPowerState(const String & state)
{
    BLINKER_LOG("need set power state: ", state);

    if (state == BLINKER_CMD_ON) {     //小爱同学控制开命令 此处修改为点动模式,适合按钮操作,
        digitalWrite(0, LOW);
        delay(200);
        digitalWrite(0, HIGH);
        BlinkerMIOT.powerState("on");

        BlinkerMIOT.print();

        oState = true;
    }
    else if (state == BLINKER_CMD_OFF) {   //小爱同学控制关命令 此处修改为点动模式,适合按钮操作,
        digitalWrite(0,LOW);
        delay(200);
        digitalWrite(0, HIGH);
        BlinkerMIOT.powerState("off");

        BlinkerMIOT.print();

        oState = false;
    }
}

void miotQuery(int32_t queryCode)      //小爱同学控制
{
    BLINKER_LOG("MIOT Query codes: ", queryCode);

    switch (queryCode)
    {
        case BLINKER_CMD_QUERY_ALL_NUMBER :
            BLINKER_LOG("MIOT Query All");
            BlinkerMIOT.powerState(oState ? "on" : "off");
            BlinkerMIOT.print();
            break;
        case BLINKER_CMD_QUERY_POWERSTATE_NUMBER :
            BLINKER_LOG("MIOT Query Power State");
            BlinkerMIOT.powerState(oState ? "on" : "off");
            BlinkerMIOT.print();
            break;
        default :
            BlinkerMIOT.powerState(oState ? "on" : "off");
            BlinkerMIOT.print();
            break;
    }
}

void dataRead(const String & data)      // 如果未绑定的组件被触发,则会执行其中内容
{
    BLINKER_LOG("Blinker readString: ", data);

    Blinker.vibrate();
   
    uint32_t BlinkerTime = millis();
   
    Blinker.print("millis", BlinkerTime);
}

void button1_callback(const String & state)     //点灯app内控制按键触发
{
    BLINKER_LOG("get button state: ", state);
    digitalWrite(0,LOW);
    delay(200);
    digitalWrite(0, HIGH);
}

void setup()
{
    Serial.begin(115200);
    BLINKER_DEBUG.stream(Serial);

    pinMode(0, OUTPUT);              //定义io口为输出
    digitalWrite(0, HIGH);           //定义io默认为高电平

    Blinker.begin(auth, ssid, pswd);
    Blinker.attachData(dataRead);
   
    BlinkerMIOT.attachPowerState(miotPowerState);
    BlinkerMIOT.attachQuery(miotQuery);
    Button1.attach(button1_callback);      
}

void loop()
{
    Blinker.run();
}

接入小度及APP控制

#define BLINKER_WIFI
#define BLINKER_DUEROS_OUTLET

#include <Blinker.h>

char auth[] = "*******";  // 上一步复制的Secret Key
char ssid[] = "*******";  // wifi 名字
char pswd[] = "*******";  // wifi 密码

#define BUTTON_1 "ButtonKey"
BlinkerButton Button1("btn-xiw");     //定义按钮键名
int counter = 0;
bool oState = false;

void button1_callback(const String & state)     //点灯app内控制按键触发
{
    BLINKER_LOG("get button state: ", state);
    digitalWrite(0,LOW);
    delay(200);
    digitalWrite(0, HIGH);
}

void duerPowerState(const String & state)
{
    BLINKER_LOG("need set power state: ", state);

    if (state == BLINKER_CMD_ON) {
        digitalWrite(0, LOW);
        delay(200);
        digitalWrite(0, HIGH);
        BlinkerDuerOS.powerState("on");
        BlinkerDuerOS.print();

        oState = true;
    }
    else if (state == BLINKER_CMD_OFF) {
        digitalWrite(0,LOW);
        delay(200);
        digitalWrite(0, HIGH);
        BlinkerDuerOS.powerState("off");
        BlinkerDuerOS.print();

        oState = false;
    }
}

void duerQuery(int32_t queryCode)
{
    BLINKER_LOG("DuerOS Query codes: ", queryCode);

    switch (queryCode)
    {
        case BLINKER_CMD_QUERY_POWERSTATE_NUMBER :        
            BLINKER_LOG("DuerOS Query power state");
            BlinkerDuerOS.powerState(oState ? "on" : "off");
            BlinkerDuerOS.print();
            break;
        case BLINKER_CMD_QUERY_TIME_NUMBER :
            BLINKER_LOG("DuerOS Query time");
            BlinkerDuerOS.time(millis());
            BlinkerDuerOS.print();
            break;
        default :
            BlinkerDuerOS.powerState(oState ? "on" : "off");
            BlinkerDuerOS.print();
            break;
    }
}

void dataRead(const String & data)
{
    BLINKER_LOG("Blinker readString: ", data);

    Blinker.vibrate();
    
    uint32_t BlinkerTime = millis();
    
    Blinker.print("millis", BlinkerTime);

}

void setup()
{
    Serial.begin(115200);
    BLINKER_DEBUG.stream(Serial);

    pinMode(0, OUTPUT);              //定义io口为输出
    digitalWrite(0, HIGH);           //定义io默认为高电平

    Blinker.begin(auth, ssid, pswd);
    Blinker.attachData(dataRead);
    
    BlinkerDuerOS.attachPowerState(duerPowerState);
    BlinkerDuerOS.attachQuery(duerQuery);
    Button1.attach(button1_callback);
}

void loop()
{
    Blinker.run();
}

选择好对应的com口和开发板,点击上传即可。
image-1668412677770

安装

主板上开机的原理如图所示,当开机键按下时A点电平被拉低,使得ATX电源第9脚和第14脚被短接,激活ATX电源,开始给主板供电。

将ESP01S插入继电器底座,继电器针脚定义如图。根据开机原理,我们开机按钮引出接入公共端和常开端。

思路一:USB取电

BIOS中开启USB关机供电,将继电器使用杜邦线接入主板USB针脚VCC,GND

思路二:ATX电源9pin取电

利用上述开机电路原理,直接将继电器接入主板24pin供电第9脚5VSB,负极任意一条黑色GND

演示

开机

关机