02利用Blynk遠端控制電器
(2017/07/25)
於前一單元,我們已經知道DIFI的紅外線發射器與接收器要如何寫程式來使用了,接下來我們要利用DIFI的WIFI功能(ESP8266),透過網路來控制電器,由於我們沒有寫自己的APP,所以利用Blynk的APP來透過手機來控制電器!所以,現在很熱門的功能回到家前,先把家中的冷氣、電燈打開,在此利用DIFI,結合網路及紅外線發射器的功能,就變得非常簡單了~~~
一、環境建置:
此部分一樣參考之前的講義
板子選NodeMCU
最原始的程式內容
二、修改程式,讓上面程式結合DIFI紅外線發射器的功能:
首先,我們希望利用Blynk建立一個按鍵,當這按鍵被按一下時,電視就會開機或關機
參考資料:https://community.blynk.cc/t/solved-blynk-ir-samsung-tv-remote-power-on-off/15067
完整程式如下(有增加的部分用紅色字標示)
#define BLYNK_PRINT Serial
#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>
#include <IRremoteESP8266.h>
#include <IRsend.h>
IRsend irsend(4); // An IR LED is controlled by GPIO pin 4 (D2) //DIFI的IR發射器接在腳位4(D2)
// You should get Auth Token in the Blynk App.
// Go to the Project Settings (nut icon).
char auth[] = "4fedf5172ef54ce288641edc211bf9"; //從EMAIL取得認證碼
// Your WiFi credentials.
// Set password to "" for open networks.
char ssid[] = "Xiaomi_6F5A"; //無線AP的帳密
char pass[] = "12345678";
void setup()
{
// Debug console
irsend.begin();
Serial.begin(115200, SERIAL_8N1, SERIAL_TX_ONLY);
//Serial.begin(9600);
Blynk.begin(auth, ssid, pass);
}
void loop()
{
Blynk.run();
}
BLYNK_WRITE(V1){ //利用Blynk建立一個按鍵,這按鍵使用虛擬腳位,當這按鍵被按一下時,電視就會開機或關機
int onoff = param.asInt();
if(onoff == 1){
irsend.sendNEC(0x430218E7, 32); //電視開機或關機的程式碼
}
}
利用 Blynk 的APP來寫程式
先下載及安裝Blynk的APP
註冊及登入
建立一個新專案
專案建立完成後,會寄一組【認證碼】到你的MAIL,這認證碼在上面的程式會用到
開始來建立自己的APP了
點選Button來新增一個按鍵元件
設定Button的內容,這邊選Virtual(虛擬腳位) V1
控制畫面建立完成
測試成功
註:如果增加了【頻道+】(使用V2的虛擬腳位)、【頻道-】(使用V3的虛擬腳位),程式要再增加下面這兩個函式
BLYNK_WRITE(V2){ //頻道+
int onoff = param.asInt();
if(onoff == 1){
irsend.sendNEC(0x4302D827, 32);
}
}
BLYNK_WRITE(V3){ //頻道-
int onoff = param.asInt();
if(onoff == 1){
irsend.sendNEC(0x4302F00F, 32);
}
}
三、針對非NEC格式編碼的遙控器,如我家日立冷氣機:
接下來要來控制冷氣的開與關
利用前一單元 IRrecvDumpV2 程式取得的編碼,如果是取得NEC格式的碼,就按照上面程式來做,但若非NEC格式的碼,我們也在這來測試看看,以下為我家日立冷氣開關按鍵所取得的碼,它的Encoding 是UNKNOWN,所以我們採用下方的uint16_t rawData[211]來處理
Encoding : UNKNOWN
Code : 60AC103 (106 bits)
Timing[211]:
+3500, -3350 + 500, -1250 + 500, - 400 + 500, -1300
+ 500, -1300 + 550, - 350 + 500, - 400 + 500, -1300
+ 500, - 450 + 500, -1250 + 500, - 400 + 500, -1250
+ 500, - 400 + 500, -1250 + 500, -1250 + 500, -1300
+ 500, - 400 + 550, - 350 + 550, -1250 + 500, - 400
+ 500, - 400 + 500, -1300 + 500, -1250 + 500, - 400
+ 500, -1300 + 550, - 400 + 500, -1250 + 550, - 400
+ 500, -1300 + 500, - 400 + 500, - 400 + 550, - 350
+ 550, -1300 + 500, -1300 + 500, -1250 + 550, -1250
+ 500, -1300 + 500, - 400 + 500, - 400 + 550, - 400
+ 500, - 450 + 500, - 400 + 550, -1250 + 500, -1250
+ 500, - 400 + 500, -1300 + 500, - 400 + 500, - 400
+ 550, - 400 + 500, -1300 + 500, - 400 + 500, -1250
+ 550, -1250 + 500, - 400 + 550, -1250 + 500, - 400
+ 550, - 400 + 500, - 400 + 500, - 400 + 500, - 400
+ 500, - 400 + 500, - 400 + 550, - 400 + 500, - 400
+ 500, - 400 + 500, - 400 + 500, - 450 + 500, - 400
+ 550, - 400 + 500, - 400 + 500, - 400 + 500, - 400
+ 500, - 450 + 500, - 400 + 550, - 400 + 500, - 400
+ 500, - 400 + 500, - 400 + 500, - 450 + 500, - 400
+ 550, - 400 + 500, - 400 + 500, - 400 + 500, - 400
+ 500, - 400 + 500, - 400 + 550, - 400 + 500, - 400
+ 500, - 400 + 550, - 400 + 500, - 450 + 500, - 400
+ 550, -1250 + 500, - 350 + 550, - 400 + 500, - 400
+ 500, - 400 + 550, - 400 + 500, -1250 + 500, -1300
+ 500, -1250 + 500, -1250 + 550, - 400 + 500, - 400
+ 500, - 400 + 550
uint16_t rawData[211] = {3500,3350, 500,1250, 500,400, 500,1300, 500,1300, 550,350, 500,400, 500,1300, 500,450, 500,1250, 500,400, 500,1250, 500,400, 500,1250, 500,1250, 500,1300, 500,400, 550,350, 550,1250, 500,400, 500,400, 500,1300, 500,1250, 500,400, 500,1300, 550,400, 500,1250, 550,400, 500,1300, 500,400, 500,400, 550,350, 550,1300, 500,1300, 500,1250, 550,1250, 500,1300, 500,400, 500,400, 550,400, 500,450, 500,400, 550,1250, 500,1250, 500,400, 500,1300, 500,400, 500,400, 550,400, 500,1300, 500,400, 500,1250, 550,1250, 500,400, 550,1250, 500,400, 550,400, 500,400, 500,400, 500,400, 500,400, 500,400, 550,400, 500,400, 500,400, 500,400, 500,450, 500,400, 550,400, 500,400, 500,400, 500,400, 500,450, 500,400, 550,400, 500,400, 500,400, 500,400, 500,450, 500,400, 550,400, 500,400, 500,400, 500,400, 500,400, 500,400, 550,400, 500,400, 500,400, 550,400, 500,450, 500,400, 550,1250, 500,350, 550,400, 500,400, 500,400, 550,400, 500,1250, 500,1300, 500,1250, 500,1250, 550,400, 500,400, 500,400, 550}; // UNKNOWN 60AC103
Arduino程式(修改部分為粉紅色字的部分)
#define BLYNK_PRINT Serial
#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>
#include <IRremoteESP8266.h>
#include <IRsend.h>
IRsend irsend(4); // An IR LED is controlled by GPIO pin 4 (D2) //DIFI的IR發射器接在腳位4(D2)
// You should get Auth Token in the Blynk App.
// Go to the Project Settings (nut icon).
char auth[] = "4fedf5172ef54ce288641edc211bf9"; //從EMAIL取得認證碼
// Your WiFi credentials.
// Set password to "" for open networks.
char ssid[] = "Xiaomi_6F5A"; //無線AP的帳密
char pass[] = "12345678";
uint16_t rawData[211] = {3500,3350, 500,1250, 500,400, 500,1300, 500,1300, 550,350, 500,400, 500,1300, 500,450, 500,1250, 500,400, 500,1250, 500,400, 500,1250, 500,1250, 500,1300, 500,400, 550,350, 550,1250, 500,400, 500,400, 500,1300, 500,1250, 500,400, 500,1300, 550,400, 500,1250, 550,400, 500,1300, 500,400, 500,400, 550,350, 550,1300, 500,1300, 500,1250, 550,1250, 500,1300, 500,400, 500,400, 550,400, 500,450, 500,400, 550,1250, 500,1250, 500,400, 500,1300, 500,400, 500,400, 550,400, 500,1300, 500,400, 500,1250, 550,1250, 500,400, 550,1250, 500,400, 550,400, 500,400, 500,400, 500,400, 500,400, 500,400, 550,400, 500,400, 500,400, 500,400, 500,450, 500,400, 550,400, 500,400, 500,400, 500,400, 500,450, 500,400, 550,400, 500,400, 500,400, 500,400, 500,450, 500,400, 550,400, 500,400, 500,400, 500,400, 500,400, 500,400, 550,400, 500,400, 500,400, 550,400, 500,450, 500,400, 550,1250, 500,350, 550,400, 500,400, 500,400, 550,400, 500,1250, 500,1300, 500,1250, 500,1250, 550,400, 500,400, 500,400, 550}; // UNKNOWN 60AC103
void setup()
{
// Debug console
irsend.begin();
Serial.begin(115200, SERIAL_8N1, SERIAL_TX_ONLY);
//Serial.begin(9600);
Blynk.begin(auth, ssid, pass);
}
void loop()
{
Blynk.run();
}
BLYNK_WRITE(V1){ //利用Blynk建立一個按鍵,這按鍵使用虛擬腳位,當這按鍵被按一下時,冷氣就會開機或關機
int onoff = param.asInt();
if(onoff == 1){
irsend.sendRaw(rawData, 211, 38); // Send a raw data capture at 38kHz.
delay(2000);
}
}
測試成功