想用esp8266通过wifi网络控制台式电脑开关机。网上查到电脑开关机是两根线一根高电平,一根GND,两条线短暂的接触就能开机
而且只要两根杜邦线不需要其它,一根IO口接高电平(POWER +),一根GND接电脑的GND(POWER -),开始时输出高电平,开关机时给它一个1秒的低电平再恢复成高电平即可开机。重启也是一样的。
用单片机控制电脑开关机,如何设计电路? (amobbs.com 阿莫电子论坛 - 东莞阿莫电子网站)
esp8266代码,框架是Arduino
#include <Arduino.h>
#include <ESP8266WiFiMulti.h>
#define MAX_SRV_CLIENTS 1
WiFiClient serverClients[MAX_SRV_CLIENTS];
ESP8266WiFiMulti WiFiMulti;
WiFiServer tcp_server(8462);
IPAddress local_IP(192, 168, 1, 121); // 想要设定的静态ip
IPAddress gateway(192, 168, 1, 1); // 当前网关
IPAddress subnet(255, 255, 255, 0); // 当前子网掩码
void setup()
{
// 串口
Serial.begin(115200);
delay(100);
// 连接wifi
WiFi.config(local_IP, gateway, subnet); // 设置静态IP
WiFi.mode(WIFI_STA);
//添加多个wifi连接时自动选择
WiFiMulti.addAP("xxxxxxxx", "yyyyyyyy");
WiFiMulti.addAP("zzzzzzzz", "vvvvvvvv");
while (WiFiMulti.run() != WL_CONNECTED)
{
Serial.print(".");
delay(500);
}
Serial.println('\n'); // WiFi连接成功后
Serial.print("Connected to "); // NodeMCU将通过串口监视器输出。
Serial.println(WiFi.SSID()); // 连接的WiFI名称
Serial.print("IP address:\t"); // 以及
Serial.println(WiFi.localIP()); // NodeMCU的IP地址
// tcp
tcp_server.begin();
tcp_server.setNoDelay(true);
Serial.print("Ready! Use 'telnet ");
Serial.print(WiFi.localIP()); // 获得服务器本地IP
Serial.println(" 8462' to connect");
// gpio
pinMode(0, OUTPUT);
pinMode(2, OUTPUT);
GPIO_OUTPUT_SET(0, 1); // GPIO0负责开关机
GPIO_OUTPUT_SET(2, 1); // GPIO2负责重启
}
void loop()
{
uint8_t i;
// 检测服务器端是否有活动的客户端连接
if (tcp_server.hasClient())
{
for (i = 0; i < MAX_SRV_CLIENTS; i++)
{
// 查找空闲或者断开连接的客户端,并置为可用
if (!serverClients[i] || !serverClients[i].connected())
{
if (serverClients[i])
serverClients[i].stop();
serverClients[i] = tcp_server.available();
continue;
}
}
// 若没有可用客户端,则停止连接
WiFiClient serverClient = tcp_server.available();
serverClient.stop();
}
// 检查客户端的数据
for (i = 0; i < MAX_SRV_CLIENTS; i++)
{
if (serverClients[i] && serverClients[i].connected())
{
if (serverClients[i].available())
{
int index = 0; // 字符下标
char buff[200]; //
// 先接收数据
while (serverClients[i].available())
{
int c = serverClients[i].read();
buff[index++] = (char)c;
}
// 处理数据,客户端发送一个10表示开机,20表示重启
if (buff[0] == 10)
{ // 开关
GPIO_OUTPUT_SET(0, 0);
delay(1000);
GPIO_OUTPUT_SET(0, 1);
}
else if (buff[0] == 20)
{ // 重启
GPIO_OUTPUT_SET(2, 0);
delay(1000);
GPIO_OUTPUT_SET(2, 1);
}
serverClients[i].write("ok");
}
}
}
}
控制程序里用dart写的,分两个程序,分别控制开关机和重启,没有界面
Future<void> power()async{
await Socket.connect('192.168.1.121', 8462).then((socket) async {
socket.add([10]);
await socket.flush();
print(utf8.decoder.convert( await socket.first));
await socket.close();
print('over');
});
}
Future<void> powerRst()async{
await Socket.connect('192.168.1.121', 8462).then((socket) async {
socket.add([20]);
await socket.flush();
print(utf8.decoder.convert( await socket.first));
await socket.close();
print('over');
});
}
Future<void> main(List<String> arguments) async {
await power();
}
编译dart compile exe .\bin\send.dart 重命名为 开关机.exe
改一下main方法
Future<void> main(List<String> arguments) async {
await powerRest();
}
编译dart compile exe .\bin\send.dart 重命名为 重启.exe
========================================================
改用web控制