平时我们都是通过机箱面板上的开机按钮进行开机,当这个按钮在按下时,主板上的电源引脚(PWR+, PWR-)被短接,产生开机信号,然后进入开机流程。如果希望自己实现远程开机,只要想办法通过远程的方式做到短接这两个引脚即可。这是一种与WOL远程唤醒(这是一种标准协议)完全不同的开机模式(实现网络唤醒功能,并整合到自己的应用)。

本文将介绍如何用ESP8266来实现远程开机(由于远程唤醒需要存在可用网络,所以该方案在跨公网环境下无法对软路由这种核心设备进行控制),以及根据电源监测来实现无人值守的开机状态自动恢复(适用需要7×24小时开机的场景,时间有点紧张,这个无人值守开机留着下一篇写吧)。

如果希望在方案中同时以两种方式开机,需要注意保证优先物理开机,再网络唤醒,否则物理开机动作发生在开机状态时,反而会造成系统关机,而网络唤醒则没有这个问题。此外,无论是远程开机方案还是无人值守的开机状态自动恢复,只要涉及到物理开机方案,均需要到系统中将电源按钮的响应动作设置为不进行任何操作,绝不能设置为关机睡眠休眠,以防止在电脑开机状态时误发物理开机信号导致系统关机或睡眠。

远程物理开机的流程非常简单:ESP8266连接wifi -> 进入网络监听状态(socket或http服务) -> (收到信号后) -> 物理开机。

物理连接:ESP8266作为继电器控制端进行连线,主板的PWR+和PWR-跳线作为被控端以常开方式连接继电器(手里没有闲置的能拿来测试的电脑,直接用一块PC电源做为被控端,开机信号在短接电源的PS-ON引脚和GND时发出,随后断开继电器)。

这个应用的本质是由ESP8266接受网络请求,并根据请求来控制继电器,把继电器的控制设备改为插座,它就变成一个带远程控制的插座;改成台灯就是带远程控制的台灯……可以衍生出很多有意思的东西。

回到远程开机这个应用本身,它仍然存在可以改进的地方,比如当前开机状态的检测,如果已经开机就直接跳过开机动作,以免误操作。这个检测留到下一篇写,下一篇计划做个无人值守的开机状态恢复,实现自动检测当前开机状态,并在关机状态时自动开机的功能。


#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
ESP8266WebServer server(80);

void http404() {
  server.send(404, "text/plain", "404");
}

void httpDefault() {
  digitalWrite(16, LOW);//闭合
  server.send(200, "text/plain", "command sent.");
  delay(500);
  digitalWrite(16, HIGH);//断开
}

void setup() {
  Serial.begin(9600);
  pinMode(16, OUTPUT);
  digitalWrite(16, HIGH);

  WiFi.begin("SSID", "WIFI_PASSWORD");
  while (WiFi.status() != WL_CONNECTED) {
    Serial.println("WIFI CONNECTING.");
    delay(500);
  }
  Serial.println(WiFi.localIP());
  server.on("/", httpDefault);
  server.onNotFound(http404);
  server.begin();
}

void loop() {
  server.handleClient();
}
分类: articles