{{ 'fb_in_app_browser_popup.desc' | translate }} {{ 'fb_in_app_browser_popup.copy_link' | translate }}
{{ 'in_app_browser_popup.desc' | translate }}
{{word('consent_desc')}} {{word('read_more')}}
{{setting.description}}
{{ childProduct.title_translations | translateModel }}
{{ getChildVariationShorthand(childProduct.child_variation) }}
{{ getSelectedItemDetail(selectedChildProduct, item).childProductName }} x {{ selectedChildProduct.quantity || 1 }}
{{ getSelectedItemDetail(selectedChildProduct, item).childVariationName }}
課程大綱
1. 電量
2. 紅外線感測器 IR
3. 重力感測器 G-Sensor
課程內容
1. 接著我們要來處理從小黑盤那裡接收到的資料。
當和小黑盤連線完成後,小黑盤每0.01秒(10ms)會回傳一次資料。
資料由16個英文字母或數字組成,是16進位的格式,分別代表的資料如圖所示。
意思就是說小黑盤每0.01秒就會把包括電量、IR和G-Sensor的資料包在一起傳出來給我們。
我們先練習處理這些資料,之後再利用這些資料做一些應用。
讓我們開始吧,以下為示範影片。
2. 我們還是直接沿用「Lesson06」,到左上方「專案」 → 「另存專案」。
新名稱為「Lesson09」,App名稱為「接收資料」。
放進一個「開始接收」按紐和五個之後用來顯示電源、IR和G-Sensor數值的標籤。
3. 接著進到「程式設計」頁面。
在「當”開始接收”. 被點選 執行」裡放進接收資料的程式方塊。
接收資料和傳送命令一樣都需要「serviceUuid」和「characteristicUuid」。
接收資料中這兩個值分別如下:
serviceUuid: 6E400001-B5A3-F393-E0A9-E50E24DCCA9E
characteristicUuid: 6E400003-B5A3-F393-E0A9-E50E24DCCA9E
可以發現「serviceUuid」和傳送命令的一樣,而「characteristicUuid」只差一個數字。
「utf16」這裡要加入「假」程式方塊。
4. 點選「開始接收」按鈕後就會開始接收資料。
我們可以從「當”BluetoothLE1”. StringsReceived 執行」程式方塊裡取得接收到的資料。
也可以在這裡將接收到的資料轉換成我們想要的形式。
5. 我們從電量一步一步開始,將原始資料轉換成我們想要的電量資料形式,最後結果會如圖中所示。
6. 首先我們可以從「當”BluetoothLE1”. StringsReceived 執行」裡得到原始資料,就是「取”stringValues”」。
當滑鼠移到箭頭指示處,就會出現擴展程式方塊,再點選「取”stringValues”」就會出現在畫面中了。
這裡「取”stringValues”」就是我們接收到的原始資料,包含16個英文字母和數字的一串文字,這裡假設是 [“41AF0036ED00E8003700”] 。
7. 電量是原始資料裡的1AF。
圖中程式方塊可以從一個字串裡擷取出我們想要的部分,我們用它來從原始資料中擷取出1AF。
需要兩個資訊,一個是1AF是從字串的第幾位開始,另一個是1AF的長度。
1AF從1開始,1是位在從左向右數的第4位,注意 [ 和“ 都算一個。
然後1AF長度是3。
如此圖中的程式方塊就是我們要的1AF。
8. 1AF是16進位的格式,我們將它轉成10進位 。
然後再除以100,就得到我們要的電量。以電壓形式表示,這裡就是4.31V。
電量充飽時大約是4.3V左右,建議在3.2V的時候就要充電。
9. 做後再把得到的電量組合到標籤「設”電量”. ”文字”為」的後面就完成了。
到目前的過程是: 按「開始接收」按紐 → 開始接收資料 → 接收到資料後,從原始資料中擷取出我們要的部分(電量) → 標籤「電量」顯示目前電量。
這就是接收資料的基本流程了。
10. 接下來在電量後面4個字串就是IR的數值,算一下是原始資料第幾位開始?
11. IR值不用除100,轉換成十進位後直接使用就行了。
圖中的IR值是0036,轉換成十進位是54。
IR值的大小範圍以16進位表示是0到FFFF,轉換成十進位是0到65535。
12. 基本上當手離IR越近,數值會越大。
如圖所示離小黑盤約50公分時IR值大約100多,距離約2公分時會到最大值65535。
* IR感測器會感測反射回來的紅外線數值,所以得到的數值基本上和距離成反比(距離越遠,數值越小,但不是線性關係)。
數值也跟反射面材質和顏色有關,譬如說手或書本、黑紙或白紙,在同樣高度會得到不同數值。
然後也會受陽光影響,因為陽光中也有紅外線。
13. 中場休息一下,可以先匯出apk檔並試著用手在小黑盤上下移動看看IR值的變化。
最後就是G-Sensor了。
想把G-Sensor的原始數值轉成我們想要的格式,會有點複雜。
如果最後真的還是不太了解轉換的步驟,可以直接跳過直接使用製作好的程式方塊,因為重點還是在G-Sensor的應用。
14. 小黑盤的G-Sensor可感測到XYZ三個方向的加速度變化,所以會有Gx、Gy和Gz三個值。
15. 我們開始製作程式方塊。
先加進三個變數,分別為Gx、Gy和Gz,初始值都是0。
16. 接下來以Gx為範例。
首先從原始資料中擷取出16進位的Gx值,轉換為10進位後設為「變數」Gx。
17. 「變數」Gx的範圍是0 ~ 65535。
小黑盤的G-Sensor感測範圍是-2g ~ 2g,XYZ三個方向都一樣(g是重力加速度的單位,代表三個方向都能感測到+-2g的加速度)。
所以我們要把 “0 ~ 65535” 轉成以 “-2 ~ 2”的方式來呈現。
轉換後的數值對照要如圖所示。
“0 ~ 65535” 從32767和32768的中間切一半, “0 ~ 32767” 分給 “0 ~ 2”, “32768 ~ 65535” 分給 “-2 ~ 0” 。
* 為什麼0到65535轉換時不是直接從-2到2,而是先從0到2,再突然變成-2然後又到0?
其實中間包含了「1補數」的概念,原始資料應該先從16進位轉換成二進位,這樣看就會比較清楚,但這裡還是以應用為主,所以就先跳過了。
18. 接著我們就照著圖將程式方塊組好。
轉換內容分成兩種情況,一個是 “<=32767” ,一個是 “>32767” 。
“<=32767” 時要將 “0 ~ 32767” 轉換成 “0 ~ 2”。
“>32767” 時要將 “32768 ~ 65535” 轉換成 “-2 ~ 0”。
19. “<=32767” 的部分比較容易,「變數」Gx直接除以16384就好。
20. 除出來的數值只要取到小數點後兩位。
在「內建方塊」中的「數學」裡找到這個程式方塊,可以選擇要保留小數點後幾位數字,這裡我們選擇2。
21. 在 “>32767” 的部分,「變數」Gx要先減65535,然後再除以16384就可以了。
依相同方式完成Gy和Gz的轉換,注意Gy和Gz在原始資料中的位置。
22. 小黑盤不同方向轉動時G-Sensor值的變換。
大家可以試著各方向轉轉看,會更了解其中的相對關係。
當小黑盤的USB充電孔垂直地面朝上時Gx=1,Gx值與轉動角度相對關係。(小黑點是蜂鳴器孔)
23. 完整程式設計如圖,趕快匯出試試看吧!