文章目录

  • 前言
  • 一、物联网是什么?
  • 二、效果展示
  • 1.使用的硬件
  • 2.接线展示
  • 三.TMP模块供电,状态检测
  • 四 代码解析
  • 1、 指定PIN,定义一些按钮
  • 2、这是小爱同学的代码,BLinker还支持天猫精灵,我没有!
  • 3、这一块有点乱了,不过还是能接受的
  • 4、主体结构
  • 五 最终的效果
  • 总结



前言

电脑远程启动的方法有很多,前几年我都是使用NAS运行Docker的形式,使用WOL的方式唤醒,但是还得在关机的问题上下功夫。最近研究了一下物联网,于是乎这个问题就显得如此的简单了。温馨提示:请操作机箱前先保存好电脑里的东西,不要问我为什么!


一、物联网是什么?

我的理解万物皆可联,只要用电就能改成智能化。

二、效果展示

1.使用的硬件

1、Nodemcu开发板
2、公对母 杜邦线 4根
3、母对母 杜邦线 2根
最重要的还有你要有一台台式机。

2.接线展示

接线原理:

将机箱内开关按键杜邦线拔出,中间接上Nodemcu。TMP3.3VSB是TMP模块长供电的,状态检测线也是用这个模块实现的。

esp8266 启动不起来 esp8266开机_单片机


esp8266 启动不起来 esp8266开机_单片机_02

三.TMP模块供电,状态检测

因为这一块不是都一样的,所以我拿出来说一下。我的主板是华硕 ROG STRIX Z390-H GAMING,本来我都想好用usb供电了,在浏览论坛的时候看到有人说这个模块,但不是每个主板都有的,我就从官网找到主板的使用说明,其中有介绍话不多说上图。

esp8266 启动不起来 esp8266开机_单片机_03


不难看出,供电迎刃而解,不过+3V的口都是在开机状态下才会有电的,那通过这种特性,可以把+3V作为状态检测来用,有电就是开机,没电就是关机。供电也不是只能选择+3VSB,听论坛的人说可以从硬盘电源线中接电,由于我找到了解决方式所以没试。这样供电和状态检测就解决了,其他的接线就是插的问题了。

四 代码解析

1、 指定PIN,定义一些按钮

/* 导入自建库文件 */
#include "ISTMAIN.h" //自建库,不用搜
#include "ISTWEB.h" //自建库,不用搜
#include "OneButton.h"
#include <Ticker.h>

Ticker flipper; //定义定时器

#define PW_W 13         //定义外部开关连接 D7接开关按钮
#define PW_N 14         //定义内部开关连接,D5接主板的,POWER3.3V
#define PW_STA 4        //定义状态检测PIN
bool PW_STA_INIT = false;       //初始化开关机状态

OneButton button(PW_W, true); //使用onebutton实现物理按键长按短按的功能
// 新建组件对象
BlinkerButton Button1("btn-abc");

// 按下按键即会执行该函数
void button1_callback(const String & state)
{
  Serial.println("已按下!");
  digitalWrite(PW_N, 0);
  Blinker.delay(500);
  digitalWrite(PW_N, 1);
  Button1.text("正在操作");
  flipper.attach(10, flip);
}

2、这是小爱同学的代码,BLinker还支持天猫精灵,我没有!

void miotPowerState(const String & state)
{
  BLINKER_LOG("need set power state: ", state);
  if (state == BLINKER_CMD_ON && digitalRead(PW_STA) == 0) {
    button1_callback("on"); //模拟按键开关机
    BlinkerMIOT.powerState("on");//小爱反馈状态
    BlinkerMIOT.print();
    PW_STA_INIT = true; //电脑状态赋值
  }
  else if (state == BLINKER_CMD_OFF && digitalRead(PW_STA) == 1) {
    button1_callback("off");
    BlinkerMIOT.powerState("off"); 
    BlinkerMIOT.print();
    PW_STA_INIT = false; 
  }
}
//查询电脑状态
void miotQuery(int32_t queryCode) {
  BLINKER_LOG("XiaoAi Query codes: ", queryCode);
  switch (queryCode) {
    //小爱查询全部内容
    case BLINKER_CMD_QUERY_ALL_NUMBER :
      BLINKER_LOG("MIOT Query All");
      BLINKER_LOG(digitalRead(PW_STA));
      BlinkerMIOT.powerState(digitalRead(PW_STA) ? "on" : "off");
      BlinkerMIOT.print();
      break;
    case BLINKER_CMD_QUERY_POWERSTATE_NUMBER :
      BLINKER_LOG("MIOT Query Power State");
      BlinkerMIOT.powerState(digitalRead(PW_STA) ? "on" : "off");
      BlinkerMIOT.print();
      break;
    default :
      BlinkerMIOT.powerState(PW_STA_INIT ? "on" : "off");
      BlinkerMIOT.print();
      break;
  }
}

3、这一块有点乱了,不过还是能接受的

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

  Blinker.vibrate();

  uint32_t BlinkerTime = millis();

  Blinker.print("millis", BlinkerTime);
}

//修改BlinkerAPP的状态
void RelayState(int num) {
  if (digitalRead(PW_STA) == HIGH)
  {
    Button1.icon("fas fa-desktop");
    Button1.color("#FFA500");   //设置app按键是纯黄色,16进制颜色码
    Button1.text("已打开");          //设置app按键注释“开”
    Button1.print("on");
    PW_STA_INIT = true;
    BLINKER_LOG("电脑已打开!");
  } else if (digitalRead(PW_STA) == LOW)
  {
    Button1.icon("fas fa-desktop");
    //设置app按键是灰色,16进制颜色码
    Button1.color("#E6E6FA");   //设置app按键是纯黄色,16进制颜色码
    Button1.text("已关闭");          //设置app按键注释“关”
    Button1.print("off");
    PW_STA_INIT = false;
    BLINKER_LOG("电脑已关闭!");
  }
}

//物理按键长按功能,状态同步没做,不过不影响小爱,但blinkerAPP上会有延时
void attachLongPressStart() {
  Serial.println("longPressStart-长按开始");
  digitalWrite(PW_N, 0);//按下按钮
}

void attachLongPressStop() {
  Serial.println("longPressStart-长按结束");
  digitalWrite(PW_N, 1);//松开按钮
}

//APP端点击开关后在指定的秒数后获取状态,因为关机状态不是实时的
void flip() {
  RelayState(1);
  flipper.detach();
}

//心跳包刷新状态
void heartbeat()
{
  RelayState(1);
}

4、主体结构

void setup()
{
  // 初始化串口
  Serial.begin(9600);
  SPIFFS.begin();//这个地方要开启
  BLINKER_DEBUG.stream(Serial);
  //  BLINKER_DEBUG.debugAll();
  pinMode(LED_BUILTIN, OUTPUT);
  digitalWrite(LED_BUILTIN, 1);
  pinMode(PW_W, INPUT_PULLUP);
  digitalWrite(PW_W, 0);
  pinMode(PW_N, OUTPUT);
  digitalWrite(PW_N, 1);
  pinMode(PW_STA, OUTPUT);
  PW_STA_INIT = digitalRead(PW_STA);//初始化开关机状态
  bool conn_status = CONNECT_WIRELESS(); //自动配网,自己封装的,blinker有自带功能。
  if (!conn_status) {
    //启动AP服务器
    LOCALSERVER_RUN();
    //启动无线连接
    //    WIFI_RUN();
    //启动web服务器
    run_webserver();
  } else {
    button.reset();
    button.setPressTicks(200); //设置长按时长为1000毫秒,默认值为:800毫秒
    //  button.attachClick(myClickFunction);
    button.attachLongPressStart(attachLongPressStart);
    button.attachLongPressStop(attachLongPressStop);//初始化长按结束回调函数
    //blinker数据接收
    Blinker.attachData(dataRead);
    //小爱同学反馈信息,调用设备查询函数,查询设备开关机状态
    BlinkerMIOT.attachQuery(miotQuery);
    //小爱同学反馈信息,调用设备查询函数,查询设备开关机状态
    BlinkerMIOT.attachPowerState(miotPowerState);    //添加这一行,作用是注册下面的回调函数
    //按键回调
    Button1.attach(button1_callback);
    Blinker.attachHeartbeat(heartbeat);//心跳包
    //启动web服务器
    //    run_webserver();
  }
}

void loop() {
  button.tick(); //按键循环检测
  Blinker.run();
}

五 最终的效果


Nodemcu远程开电脑演示!


下图的电脑1就是我的电脑了

esp8266 启动不起来 esp8266开机_单片机_04


esp8266 启动不起来 esp8266开机_esp8266 启动不起来_05

总结

这样我就可以通过小爱同学,移动终端,随时随地的开关我的电脑了,虽然我还能通过SIRI快捷指令开关机,但是有时候会失灵,这种方式也不一定不失灵。但是技术在于折腾,我岌岌可危的发际线!