ESP-12F WIFI远程电脑开机卡-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 3959|回复: 4

[分享] ESP-12F WIFI远程电脑开机卡

[复制链接]
发表于 2020-6-5 14:17 | 显示全部楼层 |阅读模式
本帖最后由 小小怪同学 于 2020-8-3 23:48 编辑

[md]# 一、功能介绍

**1.ESP-12F模组为主控,基于Blinker物联网平台,实现电脑远程控制
2.Blinker APP控制电脑远程开关机、远程重启、远程电脑状态查询
3.天猫精灵语音控制,实现电脑开关机、状态查询,能动口绝不动手**

# 二、远程电脑开机卡硬件
** (1).远程电脑开机卡开源硬件:[远程电脑开机卡](https://oshwhub.com/PQG2030PQG/tian-mao-jing-ling-yuan-cheng-kai-ji-ka)**

![PCB图]()
**PCB焊接图**
![装机图]()
![装机图]()
> 注:
> 1.右上角部分为程序下载电路
> 2.左下角部分为12V到3.3V稳压电路,未测试
> 3.PCIE接口和ESP8266模组之间为3.3V供电电路,测试稳定

# 三、软件教程
## 1、软件准备及设备添加

- **参考官方文档:[WIFI快速入门](https://diandeng.tech/doc/getting-start-8266)**


## 2、添加组件
**返回首页,会有一个新的设备(没有的话下滑刷新下),点击刚创建的设备,首次进入设备会弹出向导页,在向导页点击载入示例,接下来我们就开始创建图标界面,步骤如下:
   1.在设备首页面,点击右上角图标,进入界面布局面板**![图3]()
   **2.进入界面布局后,在屏幕下方找到  按钮  组件,点击添加,可拖动新建的图标来选择放置位置,如下图:**
   ![图1]()
**3.点击新建的图标,进入图标设置界面,把数据键名改为ButtonKey1(如下图,数据键名可任意填写,记住自己设置的数据键名,程序修改时会用到,创建多个同类型组件时数据键名不能相同,如按钮1数据键名为:`ButtonKey1`,按钮2数据键名可设为:`ButtonKey2`),然后点击保存完成设置**
   ![图2]()

**4.按以上步骤添加两个按钮组件,APP端两个控制按钮实现以下功能:
①开关机按钮(如APP中数据键名设为`ButtonKey1`的按钮),单击控制电脑开关机,开机状态长按控制电脑强制关机
②重启按钮(如APP中数据键名设为`ButtonKey2`的按钮),单击控制电脑重启,长按查询电脑开机状态并回传给APP**

**5.添加一个文本组件,用于显示电脑开关机状态,如图**
![1]()
**6.然后修改文本组件的参数,如图,参数可自行填写,记住自己修改的数据键名,修改程序会用到**
![2]()

**4.为了界面更美观,修改下背景,并保存界面布局,如图**
![图3]()
[/md]
[md]
## 3、修改程序并编译上传
**打开Arduino IDE,复制完整代码,在程序中找到如下变量:**      
[/md]

[md]```

char auth[] = "abcdefghijkl"; //在app中创建设备时获取到的Secret Key
char ssid[] = "abcdefg";      //你的WiFi热点名称,可以手机开热点
char pswd[] = "123456789";    //你的WiFi密码

//文本组件初始化, 创建对象
#define TEXTE1 "TextKey"
BlinkerText Text1(TEXTE1);

//按钮1初始化, 创建对象,用于正常开关机及强制关机
#define BUTTON1 "ButtonKey1"
BlinkerButton Button1(BUTTON1);

//按钮2初始化, 创建对象,用于电脑重启
#define BUTTON2 "ButtonKey2"
BlinkerButton Button2(BUTTON2);

```[/md]

[md]

**1.填入申请到的Secret Key(前面创建设备时保存的)和要连接的     WiFi热点名(ssid)、密码(pswd)**

**2.填入APP中`按钮组件`的`数据键名`以及`文本组件`的`数据键名`,将`TextKey`、`ButtonKey1`、`ButtonKey2`按以下方式修改程序:**

[/md]

[md]```
//文本组件初始化, 创建对象
#define TEXTE1 "TextKey"
BlinkerText Text1(TEXTE1);

//按钮1初始化, 创建对象,用于正常开关机及强制关机
#define BUTTON1 "ButtonKey1"
BlinkerButton Button1(BUTTON1);

//按钮2初始化, 创建对象,用于电脑重启
#define BUTTON2 "ButtonKey2"
BlinkerButton Button2(BUTTON2);
```[/md]

[md]
** 完整代码如下: **
[/md]

[md]```
#define BLINKER_WIFI
#define BLINKER_ALIGENIE_OUTLET

#include <Blinker.h>

char auth[] = "abcdefghijkl";
char ssid[] = "12345678";
char pswd[] = "12345678";


/***************************手机APP接口***********************/
//创建文本对象
#define TEXTE1 "TextKey"
BlinkerText Text1(TEXTE1);

//按钮1初始化, 创建对象,用于正常开关机及强制关机
#define BUTTON1 "ButtonKey1"
BlinkerButton Button1(BUTTON1);

//按钮2初始化, 创建对象,用于电脑重启
#define BUTTON2 "ButtonKey2"
BlinkerButton Button2(BUTTON2);

//按钮1数据处理回调函数
void Button1Callback(const String & state)
{   
    BLINKER_LOG("get button state: ", state);
    //电脑开关机操作
    if(state== "tap"){
      //检测电脑是否开机
      if(digitalRead(13)==LOW){
        //执行电脑关机
        digitalWrite(14, HIGH);
        delay(1000);
        digitalWrite(14, LOW);
        delay(15000);     //等待关机
        if(digitalRead(13)==HIGH){
        Text1.print("关机成功"    );
        }
        else{
        Text1.print("关机失败"    );  
        }
      }
      else{
        //执行电脑开机
        digitalWrite(14, HIGH);
        delay(1000);
        digitalWrite(14, LOW);
        delay(15000);     //等待开机
        if(digitalRead(13)==LOW){
        Text1.print("开机成功"    );
        }
        else{
        Text1.print("开机失败"    );  
        }
      }
    }
    //电脑强制关机操作
    if(state== "press"){
      //检测电脑是否开机
      if(digitalRead(13)==LOW){
        //电脑强制关机
        Text1.print("强制关机中"    );
        digitalWrite(14, HIGH);
      }
    }
    if(state== "pressup"){
      digitalWrite(14, LOW);
      delay(6000);
      if(digitalRead(13)==HIGH){
      Text1.print("关机成功"    );
      }
      else{
      Text1.print("关机失败"    );  
      }
    }
}

//按钮2数据处理回调函数
void Button2Callback(const String & state)
{   
    BLINKER_LOG("get button state: ", state);

    if(state== "tap"){
      //电脑重启
      digitalWrite(12, HIGH);
      delay(1000);
      digitalWrite(12, LOW);
      Text1.print("电脑重启中"     );
    }
    if(state== "press"){
      //电脑状态查询
      if(digitalRead(13)==LOW){
        Text1.print("电脑已开机"     );
      }
      else{
        Text1.print("电脑已关机"     );
      }
    }
}
/**********************************************************/


/***********************天猫精灵接口************************/

//天猫精灵开关类的操作接口
void aligeniePowerState(const String & state)
{
    BLINKER_LOG("need set power state: ", state);

    if (state == BLINKER_CMD_ON) {
        //检测电脑是否处于关机状态
        if(digitalRead(13)==HIGH) {
           //电脑开机
           digitalWrite(14, HIGH);
           delay(1000);
           digitalWrite(14, LOW);
           BlinkerAliGenie.powerState("on");
           BlinkerAliGenie.print();
           delay(15000);  //等待开机
           //检测是否开机成功
           if(digitalRead(13)==LOW){
              BlinkerAliGenie.powerState("on");
              BlinkerAliGenie.print();
           }
           else{
             BlinkerAliGenie.powerState("off");
             BlinkerAliGenie.print();
           }
        }
        else{
          BlinkerAliGenie.powerState("on");
          BlinkerAliGenie.print();
        }        
    }
    else if (state == BLINKER_CMD_OFF) {
        //检测电脑是否处于开机状态
        if(digitalRead(13)==LOW) {
           //电脑关机
           digitalWrite(14, HIGH);
           delay(1000);
           digitalWrite(14, LOW);
           BlinkerAliGenie.powerState("off");
           BlinkerAliGenie.print();
           delay(15000);  //等待关机
           //检测是否关机成功
           if(digitalRead(13)==HIGH){         
             BlinkerAliGenie.powerState("off");
             BlinkerAliGenie.print();
           }
           else{
             BlinkerAliGenie.powerState("on");
             BlinkerAliGenie.print();
           }
        }
        else{
          BlinkerAliGenie.powerState("off");
          BlinkerAliGenie.print();
        }
    }
}


//天猫精灵设备查询接口
void aligenieQuery(int32_t queryCode)
{
    BLINKER_LOG("AliGenie Query codes: ", queryCode);

    switch (queryCode)
    {
        case BLINKER_CMD_QUERY_ALL_NUMBER :         //所有属性查询
            BLINKER_LOG("AliGenie Query All");
            BlinkerAliGenie.powerState(digitalRead(13)==LOW ? "on" : "off");
            BlinkerAliGenie.print();
            break;
        case BLINKER_CMD_QUERY_POWERSTATE_NUMBER :  //查询电源状态
            BLINKER_LOG("AliGenie Query Power State");
            BlinkerAliGenie.powerState(digitalRead(13)==LOW ? "on" : "off");
            BlinkerAliGenie.print();
            break;
        default :
            BlinkerAliGenie.powerState("off");
            BlinkerAliGenie.print();
            break;
    }
}
/***************************************************************************/

//检测收到未解析数据时的回调函数
void dataRead(const String & data)
{
    BLINKER_LOG("Blinker readString: ", data);

    Blinker.vibrate();

    uint32_t BlinkerTime = millis();

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

void setup()
{
    //初始化串口服务
    Serial.begin(115200);   
    BLINKER_DEBUG.stream(Serial);
    //设置引脚模式并初始化引脚
    pinMode(14, OUTPUT);      //开关机控制引脚
    digitalWrite(14, LOW);
    pinMode(12, OUTPUT);      //重启控制引脚
    digitalWrite(12, LOW);
    pinMode(13, INPUT);       //电脑状态检测引脚
    //Binker设备配置
    Blinker.begin(auth,ssid,pswd);

    //注册Blinker APP命令的回调函数
    Blinker.attachData(dataRead);
    Button1.attach(Button1Callback); //按钮1回调函数注册
    Button2.attach(Button2Callback); //按钮2回调函数注册

    //注册天猫精灵控制命令的回调函数
    BlinkerAliGenie.attachQuery(aligenieQuery);           //注册设备查询函数
    BlinkerAliGenie.attachPowerState(aligeniePowerState); //注册电源开关函数
}

void loop()
{
    Blinker.run();
}
```[/md]

[md]

**一切就绪,开始上传代码**

- **1.点击左上角 *工具->开发板:”Arduino...”*   在列表中找到 NodeMCU 1.0(...) 并点击选择**

- **2.将ESP8266用USB-TTL下载器连接电脑,点击左上角 *工具->端口* ,选择正确的端口号**

- **3.编译并上传程序到esp8266开发板,如图**
![下载程序]()
**当出现下图所示的提示时,复位ESP8266,进入下载模式,等待上传完成**
![图7]()
- **上传成功后,打开串口调试器,手机开启热点(设置WIFI名 和
   WIFI密码为12345678,只有跟程序中设置一样,ESP8266才能连接该WIFI),复位ESP8266,等待开发板连接手机热点,当看到串口调试器打印出“MQTT Connected!”,说明设备已经成功连接到MQTT服务器**

- **打开手机APP,在APP中刷新,会看到原先创建设备显示在线,若显示未上线可以刷新一下**


# 四、 绑定天猫精灵

- **打开天猫精灵 App。点击右下角“我的”,点击“添加智能设备”**
- **在页面上方搜索栏,搜索blinker,并点击要添加的设备类型**
- **点击绑定账号,使用blinker账户登录,完成绑定**

**绑定成功后,在blinker App中配网成功的设备就会出现在您的智能家居设备列表中,回到设备列表,点击新添加的设备,进入配置界面,在配置界面可以进行一些简单设置,比如:设置地点为卧室。程序中,我们定义的控制设备类型为插座,那么我们就可以说“天猫精灵,打开卧式的插座”,天猫精灵就可以控制设备了。**

**1.天猫精灵支持的语音指令**
> **①灯**
>  打开/关闭{门口}的{灯}
>  把{卧室}的{灯}调为{红色}
>  把{卧室}的{灯}的{亮度调高一点}
>  把{卧室}的{灯}调为{影院模式}
>  把{门口}的{灯}的{色温}调到{1400}
>  把{卧室}的{灯}的{色温调暖一点}
> 查询{卧室}的{灯}的状态
> **②插座**
> 打开/关闭{厨房}的{插座}
> {客厅}的{插座}是否打开
> **③传感器**
> 查询{客厅}的{传感器}的{温度}/{湿度}/{PM2.5}

# 五、 天猫精灵组合指令设置
**在前面的程序中,我们定义的控制设备类型为插座**

```c
#define BLINKER_ALIGENIE_OUTLET  //控制设备类型为插座
```
**也就是说,当我们用天猫精灵控制电脑开机时,需要说“天猫精灵,打开卧式的插座”,是不是总感觉怪怪的,那如何将插座改为电脑,说“天猫精灵,打开电脑”,电脑就开机呢?天猫精灵APP的组合指令功能就能解决,下面就来配置吧:**

**1.打开天猫精灵APP,在下方找到首页,点击更多**
![APP]()
**2.在更多中找到组合指令,点击进入,再点击右上角的新建,进入组合指令创建界面**
![APP]()
**3.在指令问法处添加指令“打开电脑”,在执行指令处添加指令“打开卧室插座”,然后保存。这样我们就可以对天猫精灵说“天猫精灵,打开电脑”来控制电脑开机了。**

# 视频演示:[ESP-12F电脑远程开机卡视频演示](https://www.bilibili.com/video/av625959685?zw)
![电脑远程开机卡]()


**END**

[/md]





发表于 2020-6-6 08:22 | 显示全部楼层
文章写的真漂亮!图文并茂,章节清晰
发表于 2020-6-6 22:43 | 显示全部楼层
漂亮,赞个,能加入小同学和机械开关就更完美了,有时候手机和音响不在身边有手动开关会更好点
 楼主| 发表于 2020-6-8 21:01 | 显示全部楼层
雨梦随行 发表于 2020-6-6 22:43
漂亮,赞个,能加入小同学和机械开关就更完美了,有时候手机和音响不在身边有手动开关会更好点 ...

机箱的按键可以用的,天猫和机箱按键都能控制
 楼主| 发表于 2020-6-8 21:03 | 显示全部楼层
ebeeb 发表于 2020-6-6 08:22
文章写的真漂亮!图文并茂,章节清晰

用的Markdown格式
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-11-28 09:44 , Processed in 0.070534 second(s), 15 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表