物联那点事儿之小爱同学网络控制电脑开机(arduino+点灯科技篇)

前言

  上一个帖子写的是自制网络温湿度计,里面对需要用到的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根。


配件图片:

           物联那点事儿之小爱同学网络控制电脑开机(arduino+点灯科技篇)_第1张图片    物联那点事儿之小爱同学网络控制电脑开机(arduino+点灯科技篇)_第2张图片      物联那点事儿之小爱同学网络控制电脑开机(arduino+点灯科技篇)_第3张图片
                        图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继电器的构造:(此继电器是低电平触发)

           物联那点事儿之小爱同学网络控制电脑开机(arduino+点灯科技篇)_第4张图片
常开端:继电器吸合前悬空,吸合后和公共端短接;
公共端:继电器公用接口;
常闭端:继电器吸合前短接,吸合后和公共端悬空;
注:具体要根据功能需求确定使用常开端还是常闭端哈。


电脑开机原理: 机箱开关键连接主板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 

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这种操作很没有必要。
欢迎一起讨论一起进步,有问题可在下方评论,一起进步!

你可能感兴趣的:(物联那点事儿)