文章類型
開發平台
解決方案
關注主題
文章類型
開發平台
解決方案
關注主題

使用LinkIt 7697打造遠端遙控智能燈座

作者:Ches拔

不知道大家有沒有上 Amazon 看過美國市場熱門的Bulb socket adapter?這裡提供兩組讓大家研究研究 — EmberlightiDevices

其特點非常有趣,是使用 APP 遠端控制燈泡,我認識的台廠很多做這種產品,這一篇文章主要教大家自己做出遠端控制燈座的硬體;參考我在光華商場買的零件,價格也相當有趣,瞧瞧發票,老闆只算我200元哦!還可以做兩組燈座,是不是感覺賺到?

發票與購買到的材料

但前提是需要有一顆 LinkIt 7697,沒有屋頂的拍賣場只賣550元左右,加一加還是比 Amazon 的便宜。

以下實驗,一定要在專業人員協助操作下完成,以免有觸電風險

可以參考網路上的文章,將文章中必須使用「Arduino AC dimmer」之處,改成使用「LinkIt 7697 AC dimmer」。正巧我手上有一塊Arduino YUN,現在就先來試試文章提供的做法吧!

電路圖如下,分為上半部及下半部,Arduino 輸出 PWM 至 MOC3021 讓 Triac 當作 AC 開關,這樣就能使 AC Load 燈泡亮或滅。

電路圖

其實也可以只接 MOC3021 和 TRIAC 下半部,然而,雖然燈泡還是會亮,但會產生干擾。如果直視燈泡的話,它會亮的很奇怪,也就是閃爍一下下再亮,所以此時需要一個零點偵測,也就是電路的上半部。關於 Zero crossing detector 請參閱維基百科

電路是使用Arduino外部中斷上緣觸發做 Zero crossing detector,故 Arduino 內的 attachInterrupt() 這個 function 就顯得重要了。照著上面的電路焊接事小,上 AC 電才事大,小時候在學校實習課,曾被交流變壓器電到跳起來,還嚇得「合不攏嘴」,從那個時候開始,對AC電源都非常尊敬不敢造次。

以下是最後做好的洞洞板正反面:

洞洞板正面

洞洞板反面

千萬要做好萬全準備,用絕緣膠布把所有AC會經過的地方全貼起來,不可以有一點輕浮的態度及看不起AC大神的舉動,順便接到 Arduino Yun 上面。

用絕緣膠布把所有AC會經過的地方全貼起來

電流科普時間

什麼?你不知道被電到是什麼感覺,只知道被正妹放電到的感覺?!那你更不能錯過科普時間。

對人類而言,100至250伏特的交流電最容易致命,因為人身上的電阻,會使較低的電壓無法產生足夠的電流,而較高的電壓則使肌肉收縮的程度足以把觸電者反彈出來(但觸電者仍會被燒傷)。舉個例子:快打旋風裡面的人物被布蘭卡電到離不開,代表布蘭卡應是帶AC電。

布蘭卡

DC不會重複地使肌肉收縮,故AC比DC來的危險,所以AC電沒事別亂玩,叔叔是有「被」練過的。

那AC/DC代表什麼?代表著 Hard Rock 經典歌曲 Highway to Hell⋯⋯不是啦,我是說 AC to DC 轉換沒做好,就真的 Highway to Hell 了。這樣也能解釋為什麼 Bulb socket adapter 賣這麼貴,因為除了CE/FCC認證外,還要有UL等電源認證,保證不對人體造成傷害。

使用LinkIt 7697實測

回到正題,接到 Arduino Yun 上發現跑得很順,也清楚了解原理,現在要接到 LinkIt 7697 上試試,結果⋯⋯接到 LinkIt 7697 完全不會動!完全不會動!!完全不會動!!!

Debug 流程就不多做說明,後來才發現,LinkIt 7697 不是硬體有問題,而是 Arduino IDE 裡面外部中斷的 attachInterrupt() function 在 LinkIt 7697 居然掃瞄速度不夠快,這算是一個 Bug 了!

做一個實驗就能知道我在說什麼,以下是 Arduino IDE for LinkIt 7697 的 code,可以看到開了一個 PWM(pin9),output LED 為 pin14,而 attachInterrupt() 使用 pin2 當觸發,注意紅字的 delay()

int pinLed = 14;

int PWM = 9; // PWM pin

volatile int state = LOW;

void setup()

{

pinMode(pinLed, OUTPUT);

attachInterrupt(2, interrupt, CHANGE);

Serial.begin(9600);

}

void loop()

{

analogWrite(PWM, 255); // PWM最大值

digitalWrite(pinLed, state);

delay (500);

analogWrite(PWM, 0); // PWM最小值

digitalWrite(pinLed, state);

delay (500);

}

void interrupt()

{

state = !state;

Serial.println(“Interrupt”);

}

首先我們將 delay 設為500,上面黃色波形是 pin14 PWM 輸出,下面綠色波形是 pin2 跟著 PWM 上升下降改變輸出的波形。在 delay 為500時,外部中斷可以很準確的跟著 PWM 一起變化:

delay 為500時

接著將 delay 改為50,外部中斷還是可以很準確的跟著 PWM 變化:

將 delay 改為50

最後把 delay 改為5:

把 delay 改為5

咦?花黑噴?把同樣 delay 為5放到 Arduino Yun 上面,再修正一點點 code 試試:

int pinLed = 13;

int PWM = 9; // PWM pin

volatile int state = LOW;

void setup()

{

pinMode(pinLed, OUTPUT);

attachInterrupt(0, interrupt, CHANGE);

Serial.begin(9600);

}

void loop()

{

analogWrite(PWM, 255); // PWM最大值

digitalWrite(pinLed, state);

delay (5);

analogWrite(PWM, 0); // PWM最小值

digitalWrite(pinLed, state);

delay (5);

}

void interrupt()

{

state = !state;

Serial.println(“Interrupt”);

}

WHAT!? Arduino Yun是正常的,外部中斷可以跟的上PWM:

把同樣 delay 為5放到 Arduino Yun 上面,再修正一點點 code,此時抓到第三個LinkIt 7697的Bug

這代表我們抓到第三個LinkIt 7697的Bug!在漫畫裡集滿7顆龍珠能夠許願,目前集滿3個Bug能不能請求FAE支援(開玩笑的)好吧!既然不能用 attachInterrupt(),那我們就改用別的方法。

修正後的code如下:

int PWM = 14; // PWM pin

int flag1=0,flag2=0;

void setup(){

Serial.begin(9600);

pinMode(2, INPUT);

Serial.println(“Hello”);

}

void loop(){

int switchStatus = digitalRead(2);

String s = “”;

 

while (Serial.available()) {

char c = (char) Serial.read();

if(c!=’\n’)

{

s += c;

}

delay(1);

}

if(s==”d”){

flag1=1;

Serial.println(s);

}

if(s==”a”){

flag2=1;

Serial.println(s);

}

if(switchStatus==HIGH && flag1==1)

{

Serial.println(“ddd”);

analogWrite(PWM, 255); // 設定pin14輸出pwm,最大值為255

flag1=0;

}

if(switchStatus==HIGH && flag2==1)

{ Serial.println(“aaa”);

analogWrite(PWM, 0); // 設定pin14輸出pwm為0, low的意思

flag2=0;

}

}

由於本週被傳染感冒,咳到無法自拔,腦袋有如塞滿糨糊無法靈活運作,故沒有買調光式燈泡以及寫APP(這裡特別感謝韌體之神豐哥提供支援)。

以下影片使用一般燈泡搭配電腦的UART實際操作,取名為「近端遙控智障燈座」。在UART內按下d,燈泡發亮;按下a,燈泡熄滅。

因為MOC3020輸入位準一定要在4V以上,影片中其中一片洞洞板是自製的BJT放大器,將來會使用運算放大器以便縮小空間,例如LM386。電路圖如下:

電路圖

本次測試已進入硬體實際操作階段,有 LinkIt 7697 的朋友趕緊嘗試看看吧!

另外總結一連串測試下來的 LinkIt 7697 BUG LIST 給各位參考使用:
1、7697 Arduino IDE的WiFi設定,無法AP/Station轉換
2、 LinkIt 7697 Arduino IDE內的BLE Characteristic最多只能4個,再多就當機
3、 LinkIt 7697 Arduino IDE內的attachInterrupt(),掃瞄速度不夠快,會直接罷工,也就是本篇

小結

小的先去睡上一覺,將腦內糨糊取出,待製作完八月底為新創團隊演講的投影片再把APP操作補上。另外想偷偷問下⋯⋯如果沒工作,我可不可以為發哥服務,當QA(Quality Assurance)小弟啊?

(本文同步發表於作者部落格「物聯網學習筆記1」,文章連結;責任編輯:林佳盈)


◎加入我們的Line,獲得更多及時文章更新&活動資訊→

加入好友

Ches拔

Ches拔

兩個男孩的爸爸、下班變身孩子王、衝浪閱讀與coding、PM擔當RD魂。
Ches拔

上一篇: | 下一篇:

468 ad

我想回應

你的電子郵件位址並不會被公開。 必要欄位標記為 *

成城共創股份有限公司版權所有、轉載必究.Copyright(c) 2017 MakerPRO