物聯那點事兒之小愛同學網絡控制電腦開機(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根。


配件圖片:

           esp8266燒錄器    esp01s      物聯網繼電器
                        圖3-1 esp8266燒錄器                       圖3-2wifii模塊 esp01s                               圖3-3 wifi繼電器


軟件準備

如果有安裝可省略此步,也可參考自制網絡溫溼度計或者點燈科技官網
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這種操作很沒有必要。
歡迎一起討論一起進步,有問題可在下方評論,一起進步!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章