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);

        • }

        • }

  • 測試成功