esp8266 控制电脑开关机

想用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控制

https://gitee.com/ccdd8899/esp8266_relay

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值