實作App遠程遙控智慧家電控制中心

「未來家庭走向智能化,以App就能讓手機、平板電腦化身為遙控器,無線控制家中的電視、電燈、冷氣、窗簾等設備開關,讓居家生活更智慧與便利。」
(歐吉尚覺得此外還可以程式化,結合Big Data分析使用者行為反應,以更貼近使用者習性)

以上類似的台詞或許常被Startup使用在一些如Kickstarter的募資平台上,宣傳他們的智能家庭設備的Idea,期望能募得資金並將之商品化。

但,世界真的是又平且運轉的極高速呀成千上萬的感測原件與微控器的普及、Maker成為顯學、再加上中國大陸的崛起,事實上世界各地很多相同的Idea(有些或許也能在募資平台上看得到),很可能都已經商品化了例如,前一陣子在Kickstarter上募資的「App遙控智能插座」概念性產品,隔沒多久淘寶就已經在賣了平均價位在200~500人民幣。



前一陣子有顆小夜燈被小朋友玩壞掉,剛好這顆小夜燈是吃市電(110V, AC),有個硬體開關而且LED還可以用!




想成為Maker,當然逮到這種天賜的良機,就來改造屬於我個人的「App遙控智能插座」囉為了這次的Project還跑到電子材料行買了一堆「給西」,花了一千四百塊(),比整個Arduino與藍芽模組在內的完成品還貴(就為了焊那兩條電線)。還有,想當Maker的衝動是無價的!



Arduino的輸出電流約40 mA,因此想要切換較大電流/電壓的家電設備(例如燈泡、電視、音響或風扇)等開關時,最簡單的辦法是使用繼電器(Relay)。關於繼電器的工作原理與種類,大家可以自行上網Google或在Wiki上找到。



透過繼電器,我們便可以使用Arduino的小電壓/電流(~5V/40mA)來控制大電壓/電流(~110V/10A)的家電產品。我用的是單路10A(工作電壓範圍可至250V)的繼電器,大約50元台幣。



改造前先將它拆開來研究一下線路佈局,跟猜想的一樣,一顆按鍵開關(Switch Button)、很簡單的限流電阻加二極體與電容形成的穩壓電路。按鍵式小夜燈內部結構示意圖,我簡單地畫了一下。
 



用電表確認按鍵開關(Switch Button)的接腳之後,用線材把它焊接出來。(我手藝不巧,需要先用膠帶固定)
 



銲接完成,先將LED開關接到繼電器模組(取帶原本的硬體開關),再將繼電器模組接回Arduino板。從這張圖可以看出來,從前兩回專案開始,程式(BTCom)與電路我完全延用也沒拆。(非常環保,重複利用)
 




接線完成並將程式燒錄至Arduino後,我們將板子的USB電源移除改以9V(DC)電池取代。
請注意繼電器另一頭,我們接的是市電(110V, AC),因此操作時請務必非常小心尤其是Arduino板子跟繼電器模組的板子底部本身都沒有絕緣,手指頭觸摸很容易會不小心將任意兩銲接點給導通了! (我用包裝泡棉隔離)




當整個Arduino+DC電源測試完成之後,我隨手到廚房撿一個大小差不多,資源回收的盒子將整個系統包起來。
再次提醒! 繼電器另一頭,我們接的是市電(110V, AC)尤其是Arduino板子跟繼電器模組的板子底部本身都沒有絕緣,組裝時請勿用手指頭觸摸!!
 






完工很醜嗎沒關係,我們印一個殼給它,就叫「智慧家電控制中心」!
(Maker有這麼偷懶的嗎或許該用3D印表機印個Fashion的外殼吧?)





看到這兒,可能有人覺得毆吉尚鬼扯蛋。但真的沒有,因為此時Arduino還有好多數位與類比接腳還沒使用到,可以用來接溫濕度感測器與RTC時鐘模組並用LCD顯示。它真的非常容易變成擴充成為家用控制中心,追加成本不會超過40塊人民幣課本有的,我就不寫了!…


BOM (這次我們把虛擬通路也一起放進來Survey)
項目(不含運費)
台灣(台幣)
淘寶(人民幣)
Arduino UNO R3
290~450
12~40
Bluetooth HC-06
210~350
17~30
單路10A繼電器
50~180
3.5~12
410A繼電器
180~~390
13~24
溫濕度感測器
100~220
5~10
LCD1602(I2C|UART)
90~190
7~20
RTC時鐘模組
90~300
7~20
MIT AI2 Companion (Android)
Free
MIT App Inventor 2 (Windows)
Free







Android程式規劃
Android手機程式仍然跟上一回一樣使用BTCom,程式碼不用變(非常環保,重複利用)
如果懶得寫程式可以使用下面QR Code下載,若有Bug煩請告知,感恩!




不過這支App會被Android手機歸屬於來路不明的程式,安裝前請先將安全性設為允許不明來源的安裝,請放心不會收集用戶端資訊的安裝完成請記得取消允許不明來源的安裝,以免產生安全漏洞。









Arduino Uno端系統與程式規劃
繼上一回BTCom Project--用Android手機傳送命令(簡訊)到Arduino板子後。這一回,我們示範用Android手機App,透過藍芽遠程控制電源開關。我們可以「安全、便宜又簡單」地實做一個屬於自己的「App遠程遙控智慧家電控制中心」,其概念與系統接線如下如所示。




Arduino程式的部份,我們沿用BTCom App的藍芽控制,因此保留對應TV的控制處理繼電器,來開關遠端的插座電源。設計者當然也可以重新另取一個名子。

Arduino BTCom範例程式:

#include <SoftwareSerial.h>

#define MAX_BTCMDLEN 128
#define BTSW_TV     7  // pin7  BlueTooth Switch for TV
//#define BTSW_Sound  6  // pin6  BlueTooth Switch for Sound
//#define BTSW_Room   5  // pin5  BlueTooth Switch for Room
//#define BTSW_Fan    4  // pin4  BlueTooth Switch for Fan
#define BTSW_Rely  12  // 繼電器

// 建立一個軟體模擬的序列port
SoftwareSerial BTSerial(10,11); // HC-06/TX-->PIN10(Arduino/RX), HC-06/RX-->PIN11(Arduino/TX)

byte btCmdBuff[MAX_BTCMDLEN]; // up to 128 bytes BT command received from the Android system
int btCmdLen = 0; // received BT command length

void setup() {
    //Serial.begin(9600); // serial port for debugging
    BTSerial.begin(9600); // 建立藍芽軟體串列埠
    pinMode(BTSW_TV,OUTPUT);     // 設定電視開關
    pinMode(BTSW_Rely,OUTPUT);   // 設定繼電器

    digitalWrite(BTSW_TV,LOW);
    digitalWrite(BTSW_Rely,LOW);
}

void loop() {
    listenBTCmd();
    //showBTCmd(); // for debugging
    executeBTCmd();
}

void executeBTCmd() {
    char cmd[MAX_BTCMDLEN];
    if ( btCmdLen>0 ) {
        sprintf(cmd,"%s",btCmdBuff);
        //Serial.println(cmd);
        // 我們沿用對TV的藍芽控制處理繼電器
        if ( strcmp("tv,on",cmd)==0 ) {
            digitalWrite(BTSW_TV,HIGH);
            digitalWrite(BTSW_Rely,HIGH); // 開啟插座電源
        }
        if ( strcmp("tv,off",cmd)==0 ) {
            digitalWrite(BTSW_TV,LOW);
            digitalWrite(BTSW_Rely,LOW); // 關閉插座電源
        }
    }
}

void listenBTCmd() {
    char tmp; 
    btCmdLen = 0;
    memset(btCmdBuff,0,MAX_BTCMDLEN);
    while( BTSerial.available()>0 ) {
        if( (tmp=BTSerial.read())=='O' ){
            btCmdLen = 0;
        }
        btCmdBuff[(btCmdLen++)%MAX_BTCMDLEN] = tmp;
    }
}

void showBTCmd() {
    char cmd[MAX_BTCMDLEN];
    if ( btCmdLen>0 ) {
        sprintf(cmd,"%s",btCmdBuff);
        Serial.println(cmd);
    }
}









下次我們開始「自做」飛行器吧! 正式跨入小學堂!