文章目录
前言
电脑远程启动的方法有很多,前几年我都是使用NAS运行Docker的形式,使用WOL的方式唤醒,但是还得在关机的问题上下功夫。最近研究了一下物联网,于是乎这个问题就显得如此的简单了。温馨提示:请操作机箱前先保存好电脑里的东西,不要问我为什么!
一、物联网是什么?
我的理解万物皆可联,只要用电就能改成智能化。
二、效果展示
1.使用的硬件
1、Nodemcu开发板
2、公对母 杜邦线 4根
3、母对母 杜邦线 2根
最重要的还有你要有一台台式机。
2.接线展示
接线原理:
将机箱内开关按键杜邦线拔出,中间接上Nodemcu。TMP3.3VSB是TMP模块长供电的,状态检测线也是用这个模块实现的。
三.TMP模块供电,状态检测
因为这一块不是都一样的,所以我拿出来说一下。我的主板是华硕 ROG STRIX Z390-H GAMING,本来我都想好用usb供电了,在浏览论坛的时候看到有人说这个模块,但不是每个主板都有的,我就从官网找到主板的使用说明,其中有介绍话不多说上图。
不难看出,供电迎刃而解,不过+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就是我的电脑了
总结
这样我就可以通过小爱同学,移动终端,随时随地的开关我的电脑了,虽然我还能通过SIRI快捷指令开关机,但是有时候会失灵,这种方式也不一定不失灵。但是技术在于折腾,我岌岌可危的发际线!