本篇將簡單介紹如何用手機的 Slider 滑桿元件來控制Arduino上的LED燈漸明漸暗,當然就是用到 analogWrite的 PWM效果囉。
雙A計畫文章總覽:
範例影片如下:
先由下圖將藍牙發射器及LED接上Arduino (藍牙RX – Arduino D10, 藍牙TX – Arduino D11腳位)
App Inventor 編寫簡易的藍牙訊息發送程式
畫面元件很簡單,點選 BT List 之後,會顯示藍牙配對裝置清單,點選您已經配對好的藍牙裝置之後,就可藉由畫面中間的滑桿元件(自定義數值範圍為0~80,您也可以偷懶直接就定義為0~255)。App Inventor 會每隔按鈕就可點選。反覆點選就會送出不同的字元給Arduino 來控制LED亮滅。
程式說明:
STEP1:在 ListPicker1.BeforePicking事件中,將 BluetoothClient.AddressAndNames指令為 ListPicker1內容,代表點選將其內容連結到手機的已配對藍牙裝置清單。
STEP2:在 ListPicker1.AfterPicking事件中,確認連線成功之後,設定相關按鈕為 enabled/ disabled。
STEP3:本程式重點在於使用 CLock.Timer事件每 0.01 秒將 Slider 的當下數值透過 BluetoothClient元件的 SendText 指令送出。最後按下 Disconnect 斷線按鈕則中止藍牙連線,並將個畫面元件回復到初始狀態等候下一次連線。
Arduino的CODE
App Inventor PWM LED
#include <SoftwareSerial.h>
#include <Wire.h>//引用二個函式庫SoftwareSerial及Wire
SoftwareSerial I2CBT(10,11);//定義PIN10及PIN11分別為RX及TX腳位
byte cmmd[20];
int insize, a;
void setup() {
Serial.begin(9600); //Arduino起始鮑率:9600
I2CBT.begin(57600); //藍牙鮑率:57600(注意!鮑率每個藍牙晶片不一定相同,請務必確認
pinMode(9, OUTPUT); //請注意您使用的Arduino 該腳位是否支援 PWM (會有~符號),否則會看不到效果
}
void loop() {
while(1){
//讀取藍牙訊息
if ((insize=(I2CBT.available()))>0){
Serial.print("input size = ");
Serial.println(insize);
for (int i=0; i<insize; i++){
Serial.print(cmmd[i]=char(I2CBT.read()));
Serial.print(" ");
}//此段請參考上一篇解釋
}
if(insize==4){
a = (cmmd[0]-48)*10;
a=a+(cmmd[1]-48);
}
if(insize==3){
a=(cmmd[0]-48);
}
Serial.println(a);
analogWrite(9,map(a,0,80,0,255)); //使用 a 變數控制 LED 亮度
} //while
}
Post Views: 1,962
if(insize==4){
a = (cmmd[0]-48)*10;
a=a+(cmmd[1]-48);
}
if(insize==3){
a=(cmmd[0]-48);
}
Serial.println(a);
analogWrite(9,map(a,0,80,0,255)); //使用 a 變數控制 LED 亮度
} //while
編譯後出現錯誤~說沒有宣告a變數?
問題: ‘a’ was not declared in this scope
那我需要怎樣改呢??
您好, 這是我們疏漏沒有宣告a. 請在 int size; 後面加上a就好, 例如 int size,a; 這樣就沒問題囉. 文章內文也修正了.
我想把part1~part3 合成同一個程式,請問要如何運用?
hello, 當作自我挑戰練習一下吧~
感謝你們的教學,很清楚明瞭
但是我碰到一個問題
假設現在slider的數值是123.45
照理說應該收到一組insize=6的數據
我卻收到六組insize=1的數據
請問哪裡出錯了嗎?(讀取藍芽的部分是完全複製您的code的)
您好 您可以再檢查一下藍牙鮑率是否與您的藍牙晶片一致,若還是發生此類的問題可以將報率調整至57600 bps 我這邊測試是沒有問題的
請問一下 我的板子是UNO的有沒有關係
您好,所有 Arduino 相容板都是相同的接法。如果是 Motoduino 的話還有藍牙發射器的專用腳位,很方便
不好意思~我想請問這段程式碼意思是什麼??
if(insize==4){
a = (cmmd[0]-48)*10;
a=a+(cmmd[1]-48);
}
if(insize==3){
a=(cmmd[0]-48);
}
您好 由於App Inventor 的slider 會讀取到小數後第一位,因此會產生1+2(個位數、小數點、小數點後一位)或2+2(十位數、個位數、小數點、小數點後一位)的字元。
這樣Arduino在接收時,就會接收到3或4個字源資訊,所以我就依此判斷Arduino是接收到個位數或者是十位數,也因為只需要小數點前面的數值,
所以在計算時自動忽略小數點及小數點後一位的計算過程
您好:
我利用apinventor2 中的slider元件,發現回傳值不只是小數後第一位,
手機在滑動slider時,有時候會回傳小數後1位、2位、甚至好幾位,請問這是正常的嗎 ?
正常~請用 math/round 指令來四捨五入即可
大大您好,您在APP Inventor,disconnect的按鈕按下去的時候,忘記call BlueTooth client.disconnect了,提醒一下~
您好,抱歉拖這麼久,已經修正囉~
您好:
我想請問藍牙傳輸的正確率大概是多少?
因爲有時候他的值會出錯QQ
謝謝
您好,傳資料時掉封包是一定的,或多或少而已,無線傳輸尤其會這樣。至於藍牙的話,要看您傳送的資料是否為連續性資料,另外傳輸距離以及晶片本身品質也會有差異。
這也是為什麼我們要在[雙A計畫] Part3 中,資料前面加上’a’ 這個標頭符號的原因。
您好
我想請問 我在滑動拉桿的時候 LED 會閃爍
是藍芽晶片 出了問題嘛
您好,這樣是正常的,因為藍牙接收與發送都需要時間,因此 LED 閃爍會比較明顯。
請問
假設我有三首歌,我想要接著播放,要怎麼寫
網路範例都是只單純播放一首
我想設計成按下按鈕後,這三首歌一首播完接著下一首
您好,請參考我們的教學投影片,但要先確定您用的是哪一個函式庫,不過一定會有檢查檔案是否播放完畢的語法。所以您的需求應該是按鈕之後開始播第一首,檢查第一首播完之後,播第二首…
我們在MakerBar辦的Arduino習作工坊是用 SimpleSDAudio 這個函式庫,如果有需要的話可以把相關檔案寄給您喔
LED不會亮…不知道哪邊出問題了0.0….求救…藍芽有連上 程式是照打的但是沒顯示
您好,請確認一下 Arduino 端的程式有沒有執行起來?這也是可能的狀況。再回頭看一下,手機與 HC-05 是否已配對?手機的[連線] 點下去有沒有看這個裝置?
您好,請問一下,我用 Linkit one 做這個範例,可以正常控制,但是當 CLock.Timer 設定低於 1000ms 時,會無法控制LED,手機數字顯示正常,感覺 Linkit one 的藍芽沒接收到,請問解決這個問題要從那方面下手呢? 謝謝您的範例,對初學的我很有幫助 🙂
所以您可以從 App Inventor 去藍牙控制 LinkIt ONE 的 LED了嗎?其實就控制LED來說,頻率不需要太快。可否分享一下您的 code 給我看看? nissin@cavedu.com
不好意思,我在編譯的時候發生錯誤
bluetooth_LED.ino:1:1: error: expected unqualified-id before ‘<' token
這是在哪個部分有錯誤?
您好,最前面與最後的”pre”與”code” 這兩組標籤請不要複製,從#include 開始才是程式碼喔
我想請問一下,我APP下載至手機之後,先用兩隻手機試試看(以配對),
但是點開BT列後點以配對的手機,他顯示Error 507:Unable to connect.Is the device turned on?
這是正常的嗎? 謝謝!
您好,應該是正常的,配對歸配對,對方(另一隻手機)如果不接受外部連線的話就不算 connected.
您好 您的教學非常棒
有個問題想請教 如果我想讓arduino上的序列附的資料顯示在手機上
我該怎麼去做呢
您好,請參考本篇 http://wp.me/p3T9Qk-2xY
您好,我在執行時,版子上的TX燈並沒有亮
我程式都是照打,確定藍芽有連到!,這是哪裡出了問題??????
您好,請參考常見問題 http://wp.me/p3T9Qk-4b7 TX燈沒亮但您確定有連到的話(藍牙發射器上的紅燈應該長亮),那應該是 Arduino 沒有在執行程式
您好,請問利用APP Inventor所編寫的軟體,無法連接連芽模組 (xm -10b)=Error 507:Unable to connect.Is the device turned on?
有利用MIT的APP進行程式連接,也有使用一般的方式連接..但都失敗
但如果用一般商店內的APP(如nRF等),確實有連線到藍芽模組,(確認方式=>連接=燈持續量、未連接=燈持續閃爍),BLUE 4.0支援確認
而我另外嘗試使用”hm10-android-arduino-master”,此文章所提供的APP也是可以連接,所以我有點不明白這差異在哪裡了….
App Inventor 目前不支援 BLE喔
if(insize==4){
a = (cmmd[0]-48)*10;
a=a+(cmmd[1]-48);
}
if(insize==3){
a=(cmmd[0]-48);
}
Serial.println(a);
a = map(a, 0, 90, 0, 179); //使用 a 變數控制 servo 角度
myservo.write(a);
} //while
}//
您好~我依照您所教的方式改成用slider控制伺服馬達角度(如上),可是
好像會數值會亂跳耶,想請問要怎麼改會比較好呢?
ps最後ㄧ行的”“前面要有//,不然直接copy會有錯誤
及第一行
#include 去掉
才不會有錯誤
是的,這是我們用的程式碼外掛套件自行加上去的標籤,請多包涵~ 數值會亂跳,這可能是傳輸過程中掉封包導致數值不正確,也許可以寫個平均法來調整看看?
請問一定要用寫入時間嗎?不知為何在執行調整亮度的時候手機會當機?
建議要 delay,App Inventor 在時序控制上沒有很好,太頻繁收發的話很容易當機
您好我利用滑桿控制無刷馬達的轉速但似乎在傳值瞬間會爆衝
能幫我看看是不是程式的問題嗎
可以寄我的程式碼到你的email幫我看看嗎??
您好,請寄到 nissin@cavedu.com ,我們盡量幫忙就是囉~
您好,我是剛開始試玩Arduino的新手
我想請教一下,因為我最近有項專題,與版大您分享此項教學的功能類似
只是我的手機部分需分4個功能按鍵,左、右、加快、加慢
當我的麵包版上左右邊各有5顆LED燈(兩邊顏色不同)
我想當我按左鍵時,左邊LED燈就會依序發亮
當我按加快時,LED燈閃爍的速度就會加快
當我按加慢時,LED燈閃爍的速度就會變慢
右邊亦如此
請問,我Arduino版的程式部分該怎麼做修正(如果是以版大您分享的程式碼為例的話)
不好意思問了個麻煩的問題,如版大不嫌麻煩,還望請不吝賜教,謝謝!!
您好,請問您 Arduino 端的程式知道如何開始嗎? 請先把您所說的功能寫好,例如加快就是把 delay() 的參數降低。接著再定義 switch case 中的各個 case 去接收從 App Inventor 端所傳來的字元是什麼,這樣就搞定了。
你好 如果用analogwrite輸出4組不同的pwm會產生訊號不穩是正常的嗎?
有什麼方法可以解決?
更換藍芽模組或是arduino板?
您好,同時要發送這麼多訊號的話,可能需要多加一片 BT module 不然狀況可能只會更糟。這篇給您參考一下 http://www.element14.com/community/thread/41376/l/arduino-two-bluetooth-hc05?displayFullThread=true
讚!
Arduino程式第2行:#include
應該可以remark掉
程式內並沒有用到Wire.h內的相関函數或常數
TedLee
ok, 感謝您~
你好,我想請問,為何我找不到 when ___.beforepicking do 的咖啡色方塊
您好,那是改過名稱的 ListPicker 您直接新增一個 ListPicker 元件就可以看到 berforePicking 事件了
你好,我想請問,如果我現在插兩顆LED燈,想設計一個手機往右擺他會亮右邊,往左擺會亮左邊,請問程式碼要怎麼打?
您好,往右擺是使用哪種感測器呢?基本上這只要改一下 part1 就好。假設您使用姿態感測器,那就是XYZ某一軸的值滿足條件的話,發送某個字元,反之則是另一個字元。 Arduino 端只要把單一 LED 亮滅改成兩顆的指令就好,很簡單
版主你好:
我想請問一下 我直接燒入你的程式到mega板之後 我的led是恆亮的 Serial.monitor也是有數值回傳
想請版主協助
您好,請參閱常見問題
想要用拉桿來讓馬達轉動 請問可用這種方法嗎?還是有其他的程式可寫?
當然可以啊, 如果您是使用 L293D 這樣的直流馬達控制晶片的話, 只要去 analogWrite 晶片的 EN 腳位就可以控制馬達轉速了
你好!我想請問一下,為什麼我原封不動使用你的app及程式碼,但我使用拉桿時led燈卻會一直閃,我使用的是Uno板子跟hc-05藍芽
再麻煩解答了
閃爍是正常的, App Inventor 的 bluetoothclient 元件說真的不是寫得很好, 您無法期待用藍牙去遙控時的效果會與單機操作相同. 如果真的很想讓效果更好的話, 應該需要找一下數值平滑方法來避免數值亂跳. 另一方面, LED的品質也有影響的喔
版主您好~ 不好意思打擾~ 我是一位剛入門的Arduino 新手, 想請教一下, 如果我想使用兩組slider 分別控制兩個led燈進行亮滅,請問程式要怎麼寫才可以進行判斷?
您好,您可以用同一個事件去組合兩個 slider 的值(例如 255 與 123 組合成 255123 )之後發送出去給 Arduino 101, 板子收到再拆解即可。
當然要連續發送兩次也是可以
背景音樂是千本櫻!!!
被發現啦~
請問藍芽可以連接到,但是會跳出
Error 516:Unable to write:Broken pipe
建議斷線重連或是重新配對
請問 -48是什麼意思?
您好,RSSI:代表接收訊號強度,單位為 dBm (分貝/毫瓦)
你好CJHuang:
48為數字0的ascii code,因為從手機傳到arduino都是ascii code,所以要各減48才是正確數字。