前言
上一個帖子寫的是自制網絡溫溼度計,裏面對需要用到的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繼電器
軟件準備
如果有安裝可省略此步,也可參考自制網絡溫溼度計或者點燈科技官網。
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這種操作很沒有必要。
歡迎一起討論一起進步,有問題可在下方評論,一起進步!