前言
上一个帖子写的是自制网络温湿度计,里面对需要用到的app和编译软件写的都很清楚,这个帖子呢就写一下小爱同学网络控制电脑开机的小项目,首先要声明一点,一定要弄明白ardunio编程、esp8266模块(esp01/nodemcu),这样的话看这篇帖子就很容易啦,如果想继续跟着做的话,还是用自制网络温湿度计的例程上手比较快。
硬件材料:
(1)esp8266烧录器一个,用来给wifi模块烧写程序。
(2)esp8266烧录器配套的wifi模块一个(esp01或者esp01s都可)。
注:esp01是两个led灯,esp01s是一个led信号灯,都是wifi模块,但是一定要和烧录器配套。建议两个各买一个,备用和实验。
(3)物联网wifi继电器一个,我这里用的是这种有转接板的可以接esp01的这种,当然也有没有转接板的,肯定就不能接esp01了,没有转接板的可以接到nodemcu开发板上(也是esp8266的一个模块,不过引脚比较多所以连接的设备也就比较多),如需购买看下图!
注:仔细看下图的配件,wifi继电器接线是需要用一字小螺丝刀(2.5mm)拧的,手里没有的在网上记得买昂。
(4)杜邦线4根。
配件图片:
图3-1 esp8266烧录器 图3-2wifii模块 esp01s 图3-3 wifi继电器
下面是我用的电子零件淘宝链接,个人觉得这家店铺的性价比超级高!推荐一下,复制淘口令打开手机淘宝即可下单,如有过期请在评论区留言! esp8266烧录器:(¥D1XY1EC9mdh¥-GOOD-)
wifi模块esp01s(推荐买安信可品牌,通信比较好):(¥LB7C1ECRamN¥-GOOD-)
与esp01s配套的继电器:¥BKgK1ECreBy¥-GOOD-)
软件准备
如果有安装可省略此步,也可参考自制网络温湿度计或者点灯科技官网。
1.电脑端安装Arduino IDE,esp8266扩展,安装blinker库。
2.手机安装点灯科技app、米家、小爱同学。
工作原理
首先看一下wifi继电器的构造:(此继电器是低电平触发)
常开端:继电器吸合前悬空,吸合后和公共端短接;
公共端:继电器公用接口;
常闭端:继电器吸合前短接,吸合后和公共端悬空;
注:具体要根据功能需求确定使用常开端还是常闭端哈。
电脑开机原理: 机箱开关键连接主板PW两个引脚引脚,当 PW两个引脚先断开再短接,从而使得电源给主板和其他设备供电从而开机。关机也是如此。
注:这里的继电器是连接的pw引脚,模拟电脑开关键的动作,而不是直接断电源。
继电器控制电脑开关机原理:wifi继电器的常闭端和公共端连接pw引脚,收到远程信号时,继电器先悬空后吸合,从而起到远程控制开关机的作用。
供电原理:电脑在关机插电源的时候会有5v供电的,称为待命电压,具体哪根线供电看下面具体流程。
具体流程:
(1)线路连接。
电脑关机状态下的5v供电线:
将电源线在主板下拔下来,将有卡子的一面儿面对着自己,从右往左数第九根紫色线就是5v供电线(第九引脚),可以连接wifi继电器的vcc,然后随便找一根黑色线连接GND。
具体接法:将VCC线头去掉塑料头压扁后插入到5V供电线的卡子中(或者直接用公对母杜邦线,将公直接拧在继电器端),GND线同。wifi模块继电器的长闭端和公共端相连(没有一一对应要求)。
wifi继电器 | 接口 |
---|---|
vcc | 电源线有卡子的一面对着自己,从右往左数第九根紫色线口 |
GND | 电源线随便一黑色线口 |
长闭端NO | 电脑主板PW任意一引脚 |
公共端COM | 电脑主板PW另外一引脚 |
注:检验是否供电方法,将wifi模块插到继电器esp8266转接板上,如果esp01s的led灯亮,说明已经供电。 |
(2)将esp01s插到烧录器上,打开ardunio IDE,开发板选择esp8266Module,端口选择对应端口.
(3)复制手机点灯科技app中arduino设备的key,粘贴到程序中。
(4)程序思路:
- 电脑按下开机键,PW引脚瞬时短接,不是一直短接,短接后会断开,关机也是如此。
- 模仿开机键的功能在程序中实现可以通过触发继电器继电器实现。
- 如果要控制开机,先要给继电器一个低电平触发继电器悬空,然后再给一个高电平吸合.,使用点动效果实现模拟开关机的功能。
(5)程序代码,代码解释部分写到注释里了,具体请看注释。
#define BLINKER_WIFI
#define BLINKER_MIOT_OUTLET //小爱同学配置电源类设备
#include <Blinker.h>
char auth[] = "********";//你的设备key
char ssid[] = "********";//你的wifi名字
char pswd[] = "********";//你的wifi密码
BlinkerButton Button1("btn-abc"); //定义按钮键名
bool oState = false; //全局变量,电脑状态设为false 关机状态
int counter = 0; //计数器
//自定义电源类操作的回调函数
void miotPowerState(const String & state)
{
//blinkwer打印电脑状态
BLINKER_LOG("need set power state: ", state);
if (state == BLINKER_CMD_ON)//小爱同学控制开机命令
{
/*先给io设备一个低电平触发继电器吸合,使得开关由接通变为断开,
然后再给高电平,使得开关由断开变为接通状态,点动控制开机。*/
digitalWrite(0, LOW);
delay(200);
digitalWrite(0, HIGH);
BlinkerMIOT.powerState("on");
BlinkerMIOT.print();
oState = true;
}
else if (state == BLINKER_CMD_OFF)//小爱同学控制关机命令
{
/*先给io设备一个低电平触发继电器吸合,使得开关由接通变为断开,
然后再给高电平,使得开关由断开变为接通状态,点动控制关机。*/
digitalWrite(0,LOW);
delay(200);
digitalWrite(0, HIGH);
BlinkerMIOT.powerState("off");//执行关机命令
BlinkerMIOT.print();
oState = false;
}
}
void miotQuery(int32_t queryCode)//自定义设备查询函数
{
BLINKER_LOG("MIOT Query codes: ", queryCode);
switch (queryCode)
{
case BLINKER_CMD_QUERY_ALL_NUMBER ://小爱查询全部内容
BLINKER_LOG("MIOT Query All");//小爱查询
//查询电脑开关机,如果ostate为真,状态为“on”开机,如果为假,状态为“off”关机。
BlinkerMIOT.powerState(oState ? "on" : "off");
BlinkerMIOT.print();
break;//终止循环
case BLINKER_CMD_QUERY_POWERSTATE_NUMBER :
BLINKER_LOG("MIOT Query Power State");//小爱同学查询电脑状态
BlinkerMIOT.powerState(oState ? "on" : "off");
BlinkerMIOT.print();
break;
default :
BlinkerMIOT.powerState(oState ? "on" : "off");
BlinkerMIOT.print();
break;
}
}
void dataRead(const String & data) // 如果未绑定的组件被触发,则会执行其中内容
{
BLINKER_LOG("Blinker readString: ", data);//读取字符串,打印
Blinker.vibrate();//起刷新作用
uint32_t BlinkerTime = millis();//获取到系统运行的时间
Blinker.print("millis", BlinkerTime);//打印出来
}
void button1_callback(const String & state)//点灯app内控制按键触发
{
BLINKER_LOG("get button state: ", state);
//app按键一旦触发,就会给设备高电平开始工作
/*先给io设备一个低电平触发继电器吸合,使得开关由接通变为断开,
然后再给高电平,使得开关由断开变为接通状态,点动控制开机。*/
digitalWrite(0,LOW);
delay(200);
digitalWrite(0, HIGH);
}
void setup()//主程序
{
//初始化串口
Serial.begin(115200);
BLINKER_DEBUG.stream(Serial);
pinMode(0, OUTPUT);//定义io口为输出
/*定义io默认为高电平,因为是连接的常闭端,低电平触发继电器。
而我们在默认情况下是要保证开关处于接通状态,所以要给io口设置默认为高电平*/
digitalWrite(0, HIGH);
//初始化blinker
Blinker.begin(auth, ssid, pswd);
Blinker.attachData(dataRead);
Button1.attach(button1_callback);
//小爱同学反馈信息,调用设备查询函数,查询设备开关机状态
BlinkerMIOT.attachQuery(miotQuery);
//小爱同学反馈信息,小爱控制开关机操作
BlinkerMIOT.attachPowerState(miotPowerState);
}
void loop()//主循环,多次运行blinker(即以上程序)
{
Blinker.run();
}
(6)编译,无错后上传程序。
(6) 将wifi模块在烧录器上拔下来,然后插到wifi继电器上即可。
(7)在手机点灯app上添加按钮,数据键名要和代码一致。
(8)给小米同学添加训练,实现小爱同学语音控制开关机。
可改进之处
(1)这里使用的小爱同学,同样也是可以修改代码使用天猫精灵和百度小度,可参考点灯科技官网。
(2)这里我是直接把电脑开关键的线从pw引脚上直接拔下来,使用wifi继电器的话这个开关键就没有用了。
解决方法:采用并联的方式,
- 直接将开关键的线破开口并入wifi继电器长闭端和公共端,操作不好会弄坏电脑连接开机键的线。
- 用母对公杜邦线连接PW引脚,在这根杜邦线上破口并联,这样即使有损害也不影响电脑开机键自带的线。
总结
经过两次编写blinker的程序以及对程序的分析来看,也是因为功能的需求,程序实则是由两大块构成,一是设备数据和blinker客户端的交互,二是设备数据和小爱同学的交互,两个功能的代码其实并不影响,如果只想要Blinker-app显示的话,完全可以把小爱同学部分的代码删除,当然如果只想要语音控制的话必须还要包括blinker的设备key,小爱同学语音控制也是要借助点灯科技编写好的小爱的api接口,小爱同学添加训练的时候也要对应手机blinker的设备,当然,只要语音不要blinker这种操作很没有必要。
欢迎一起讨论一起进步,有问题可在下方评论,一起进步!