DIY智慧型電燈開關

五月 5, 2017
Facebook
Twitter
圖片

Juliann Brown攝

智慧型電燈泡其實有個大問題, 就是只有燈泡比較有智慧。至於牆上的電燈開關,就不怎麼有智慧了。如果你想對智慧型燈泡搞破壞,很簡單,把它連接上手動開關,它就會呆住了。該被換掉的並不是燈泡,而是開關。
PARTS
  • Arduino Uno微控制板
  • Adafruit nRF8001 Bluefruit LE 擴充板,Adafruit 商品編號#1697,adafruit.com
  • 免焊麵包板
  • 跳線
  • LED(1)
  • 電阻,220Ω(1),10kΩ(1)
  • 觸摸開關(瞬時型),用於製作原型
  • PowerSwitch Tail變壓器,用來控制一般電燈泡或其他家電。
TOOLS
  • 已安裝好 Arduino IDE的電腦,軟體可從arduino.cc/downloads免費下載
  • 烙鐵
  • 小的螺絲起子

什麼是智慧型開關?

智慧型開關不僅可以手動控制,還能透過低功耗藍牙(Bluetooth Low Energy,BLE)進行無線遙控,用你的智慧型手機或是其他行動裝置都做得到。開關本身也可以偵測燈泡的當前狀態──也就是燈泡的開關與否──只要開關被觸動,就會透過藍牙向安裝的應用程式發送訊息,以更新狀態。
以下就是進行藍牙控制連接與組態的步驟,可以用來遙控家裡或工作室的檯燈等任何透過交流電送電的家電用品。而所謂智慧型的部分,就得仰賴Arduino微控制板了。

1. 閃爍LED

閃爍LED可說是硬體版的「Hello, World」──就像測試新軟體一樣,測試Arduino是否設置無誤。準備好Arduino微控制板、一塊麵包板、一顆LED、一個220Ω電阻、幾條跳線,按照Massimo Banzi的教學來設定。在範例程式碼中,Arduino的13號腳位將HIGH(開)設定為1秒,LOW(關)設定為1秒,接著繼續循環。

2. 加入觸摸開關

現在把小顆的觸摸開關和10kΩ電阻連接起來,如圖A 所示。
圖片

圖A。Alasdair Allan繪

圖片

這兩支針腳是相連的……這兩支也是

圖片

觸摸開關按鈕

筆記:我們現在做的步驟稱為「去彈跳」。如果你將按鈕的一邊接上+5V 電源,一邊連接至ARDUINO 的4 號腳位,那麼4 號腳位其實是浮動(FLOATING)的,因為它並未接上任何東西。這樣程式碼會是無效的,還可能憑空偵測到不存在的開關動作。為了避免這個情形,我們會使用電阻把針腳「下拉」到GND。如此一來腳位就不再浮動,而是設為LOW 的狀態。
下載這個專題的Arduino程式碼。開啟Arduino IDE,進入Library Manager,在搜尋框中輸入BLEPeripheral,選擇BLEPeripheral.h並點選安裝。
接著,在Ardiono IDE開啟下載好的blesmart-switch.ino草稿碼,上傳到Arduino控制板。現在當你一按按鈕,LED就會發亮,再按一次就會關掉囉。

3. 加入藍牙模組

關於低功耗藍牙

低功耗藍牙無線協議(BLE,又被稱為藍牙智能)將全世界區分為周邊裝置(Peripheral devices)──如感測器和喇叭,以及中央裝置(Central devices)──如手機和筆記型電腦。周邊裝置能以兩種模式運作:直接連接中央裝置的模式,以及廣播模式(broadcasting)。一旦連線成功,中央裝置便可以接收周邊裝置所提供的一連串服務。
針對我們的智慧型電燈開關,我們要打造一個可以提供單一服務的BLE 周邊裝置。其單一服務有著兩個特性:可讀取、可寫入、用來把開關打開和關上的「Switch」(開關)特性;以及可以訂閱這項特性,藉以獲知開關狀態改變的「Status」(狀態)特性。幸運地,每一個服務和特性都有各自的通用唯一識別碼(uuID),讓我們可以輕鬆地將現有BLE 服務加進專題的程式碼中。
我們的服務會長得像這樣:
此外,我們也可以使用描述符(descriptor)來向終端使用者提供純文字服務說明。在這裡,我們用的是特性使用者描述(Characteristic user Description,uuID 0x2901)。
現在你已經安裝好可運作的按鈕電燈開關,接著來加入低功耗藍牙吧!這個專題用的藍牙板是以Nordic Semiconductor nRF8001晶片組為基礎的Adafruit Bluefruit LE。請參照圖B 將藍牙板連接到Arduino。​2號腳位對應RDY,9號是RST,10號是REQ。
圖片

智慧型電燈開關接線,再加上藍牙模組就大功告成

4. 編寫智慧開關程式

開啟Arduino草稿碼ble-light-withpowertail.ino,並瀏覽以下步驟,檢查你的Smart Light Switch程式碼有沒有按部就班建立以下服務:
  • 用BLE周邊程式庫新增周邊裝置實例(instance)。
  • 新增lightswitchservice,UUID為0×FF10。
  • 新增開關( Switch )與狀態( State )特定與描述符。
BLEPeripheral blePeripheral = BLEPeripheral (BLE_REQ, BLE_RDY, BLE_RST);
BLEService lightswitch = BLEService(“FF10”);
BLECharCharacteristic switchCharacteristic = BLECharCharacteristic(“FF11”, BLERead | BLEWrite);
BLEDescriptor switchDescriptor = BLEDescrip tor(“2901”, “Switch”);
BLECharCharacteristic stateCharacteristic = BLECharCharacteristic(“FF12”, BLENotify);
BLEDescriptor stateDescriptor = BLEDescrip tor(“2901”, “State”);
接著進行組態配置:
  • 設定本地域名(Local Name) (用於通用藍牙存取)與裝置名稱(Device Name) (用於周邊裝置的廣播封包資料)。
  • 輸入服務特性與描述符,作為你的特定周邊裝置屬性。
  • 廣播低功耗藍牙服務,並掃描(poll)低功耗藍牙訊息。
  • 設定開關在按鈕按住時為開,按鈕放開時為關。
pinMode(LED_PIN, OUTPUT);
pinMode(BUTTON_PIN, INPUT);
blePeripheral.setLocalName(“Light Switch”);
blePeripheral.setDeviceName(“Smart Light Switch”);
blePeripheral.setAdvertisedServiceUuid(lightswitch.uuid());
blePeripheral.addAttribute(lightswitch);
blePeripheral.addAttribute(switchCharacteristic);
blePeripheral.addAttribute(switchDescriptor);
blePeripheral.addAttribute(stateCharacteristic);
blePeripheral.addAttribute(stateDescriptor);
blePeripheral.begin();
將草稿碼存檔並上傳至控制板。有了按鈕,你想怎樣開關LED都沒問題囉。如果你開啟序列主控臺(Serial Console),會看到一行Smart Light Switch字樣,每次你開或關LED的時候,就會出現新的訊息。
另外,你可以用BLE「拋出」開關,因為我們已經委派了一個事件處理器,當周邊裝置輸入寫入指令時,就會被呼叫:
switchCharacteristic.setEventHandler(BLEWritten, switchCharacteristicWritten);
在草稿碼最後的loop()函數下面,我們已新增事件處理函數。現在你可以用BLE遙控LED囉!

5. 測試藍牙服務

現在你只差一個通用低功耗藍牙檢視程式來檢測並啟動服務。在手機或平板上, 到任何應用程式商店都可以, 下載LightBlue(適用於iOS)或nRF Master Control Panel(適用於Android)。這兩個程式顯示的資訊都相同,只是版面有點差異。
開啟其中任一個程式,它就會掃描搜尋低功耗藍牙裝置,你可以從搜尋到的裝置列表中選擇一個周邊裝置,並且可以探索裝置的服務和特性等資訊。
現在我們來看看LightBlue(圖C )裡顯示的Smart Light Switch。滑開周邊裝置清單,點進Smart Light Switch,就可以看到該服務廣播的資料顯示兩個特性:開關(Switch),也就是程式碼的讀取與寫入(Read/Write),以及狀態(State),也就是通知(Notify)。如果你註冊了LightBlue,可以訂閱它的通知功能,只要點選狀態(State)特性區塊的「聽取通知」(Listen for notifications),它就會在LED狀態改變時通知你。
圖片

圖C

Switch特性區塊則會顯示目前的特性值,現在應該是0x00,即LED為關閉。點選「寫入新值」(Write new value)來開啟編輯器, 輸入0 1 後按「完成」(Done),這時LED就會開啟,螢幕亦會顯示新的值0x01。如果你有訂閱通知,就會看到上面跳出新通知,告訴你特性值改變了(圖D )。
圖片

圖D。獲取LED狀態改變通知

如果序列主控臺開著, 你也會看到主控臺print出燈亮的特性事件訊息(Characteristic event: light on)。
最後, 如果你現在按一下實體的觸摸開關,就會另外再看到LightBlue的通知,顯示LED狀態變回 0x00。大功告成,你製作了一個智慧型電燈開關!

6. 連接實體燈泡

現在來把這個智慧型開關接上你的檯燈吧。PowerSwitch Tail(圖E )是個讓生活更簡單的東西,可以把亂糟糟的電線藏起來,還可以用繼電器和Arduino控制板把交流電電器開開關關。超棒。
將三條電線連接到PowerSwitch Tail的螺絲端子上,左邊的位置(有+in標示)插上+5V,中間(標示-in)接上訊號線,右邊接地線。接著, 按照圖F 所示連接Arduino板、開關和PowerSwitch Tail。
圖片

圖F。把LED換成PowerSwitch Tail

將PowerSwitch Tail插入牆上插座,再拔下一個交流電檯燈或家電的插頭(安全承受範圍:120V最大電流15A),插進PowerSwitch的插座。
PowerSwitch Tail可以「常開」或「常關」兩種模式接線。基於安全考量,我們會使用常開的組態設定:當Arduino訊號線路變更為LOW,電流才會通過,其他時間檯燈都會是關閉狀態。
這樣一來,訊號線路為LOW而非HIGH的時候,才會啟動繼電機制,所以我們要把LED_PIN的邏輯反過來。回到我們寫好的程式碼,會看見到處都有digitalWrite(LED_PIN, HIGH),請將它修改為digitalWrite(LED_PIN, LOW),反之亦同。現在你的手機搖控的可不是LED了,而是你的家用檯燈呢!
(譯:潘榮美)
本文摘錄自《Make:國際中文版28》。​更進階的版本及其他藍牙專題,可參考最新書籍《動手玩藍牙:用Arduino、Raspberry Pi與智慧型手機打造低功耗藍牙專題》
28期 無人機革命
飛上藍天,五臺可自製起飛的快速無人機
無人機領域在近年來有了大幅進展。在幾年前,要擁有一臺四旋翼的唯一方法就是自行製作,全得仰賴網路社群的指導,例如DIY Drones網站,以及開放原始碼的ArduPilot開發環境等資源。
智慧型手機改變了世界的樣貌,並不是因為它讓我們更方便打電話,而是因為它讓我們以全新的方式連結網路和真實世界。用低功耗藍牙(Bluetooth Low Energy)打造和控制你的周遭環境,親自駕馭這股科技的力量吧!
Social media & sharing icons powered by UltimatelySocial