{{ 'fb_in_app_browser_popup.desc' | translate }} {{ 'fb_in_app_browser_popup.copy_link' | translate }}

{{ 'in_app_browser_popup.desc' | translate }}

目錄 購物車 {{currentCart.getItemCount()}}
商品總數的上限為 100 件,請調整數量再點擊購買

oplate App 分享區

 

銀髮樂活  /  職能治療  /  運動健身  /  程式教育  /  app客製化

 

程式教育 > 基礎課程 > Lesson09 / 小黑盤的基本控制03

課程大綱

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值與轉動角度相對關係。(小黑點是蜂鳴器孔)

當小黑盤的蜂鳴器孔垂直地面朝上時Gy=1,Gy值與轉動角度相對關係。
當小黑盤平放時Gz=1,Gz值與轉動角度相對關係。

23.  完整程式設計如圖,趕快匯出試試看吧!