日記；回すだけⅥ ② C++でプログラミング ＜BLEセントラル＞

　[前回](https://qiita.com/jamjam/items/1bc1e6a4b4d8d544611d)、ジョイスティックの動きをBLEで送信するペリフェラルをCircuitPythonを使って作りました。
　ここではその値を受けるセントラル側を作ります。

### マイコンはFeather nRF52840 Sense
　ペリフェラルで使ったFeather nRF52840でもよかったのですが、ほとんど同じマイコン・ボード[Feather nRF52840 Sense](https://learn.adafruit.com/adafruit-feather-sense)を使います。いくつかのセンサが搭載されています。
　入手先の例　[マルツ FEATHER NRF52840 SENSE【4516】](https://www.marutsu.co.jp/pc/i/35057277/)
　　[STEAM Tokyoストア Feather nRF52840 Sense](https://steam-tokyo.com/product/feather-nrf52840-sense/)

![IMG_4742.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407635/42fef1f4-c148-ffbc-1163-fcd308cb8c9b.png)



### UART用セントラル

　うまく動きません。

```python
from adafruit_ble import BLERadio
from adafruit_ble.advertising.standard import ProvideServicesAdvertisement
from adafruit_ble.services.nordic import UARTService
import time

ble = BLERadio()
ble.name ="Feather nRF52840 Express"
uart_connection = None
# See if any existing connections are providing UARTService.
if ble.connected:
    for connection in ble.connections:
        if UARTService in connection:
            uart_connection = connection
        break

while True:
    if not uart_connection:
        print("Scanning...")
        for adv in ble.start_scan(ProvideServicesAdvertisement, timeout=5):
            if UARTService in adv.services:
                print("found a UARTService advertisement")
                print(adv.address, adv.rssi)
                print(adv.complete_name, adv.tx_power)
                uart_connection = ble.connect(adv)
                print(uart_connection)
                break
        # Stop scanning whether or not we are connected.
        ble.stop_scan()

    while uart_connection and uart_connection.connected:
        print('connected ')

        while not uart_connection[UARTService].read(1)==b';':
            pass #uart_connection[UARTService].read(1)

        data = uart_connection[UARTService].read(12)
        print(data)
        time.sleep(1)
        #uart_connection.disconnect()
```

　UARTが送っている文字列の終端（あるかどうかは不明）がわからないのです。12文字ずつ読むと、読み始めるところから12文字を取得します。いろいろ工夫してみたのですが、途中であきらめました。

### 実数を受けるセントラル
　前回と同じSensorServiceクラスのSwitchBot.pyです。

```python
# SPDX-FileCopyrightText: 2020 Mark Raleson
# SPDX-License-Identifier: MIT
from adafruit_ble.uuid import VendorUUID
from adafruit_ble.services import Service
from adafruit_ble.characteristics import Characteristic
from adafruit_ble.characteristics.float import FloatCharacteristic

class SensorService(Service):

    uuid = VendorUUID("51ad213f-e568-4e35-84e4-67af89c79ef0")

    sensorsTheta = FloatCharacteristic(
        uuid=VendorUUID("e077bdec-f18b-4944-9e9e-8b3a815162b4"),
        properties=Characteristic.READ | Characteristic.NOTIFY,
    )

    sensorsVector = FloatCharacteristic(
        uuid=VendorUUID("528ff74b-fdb8-444c-9c64-3dd5da4135ae"),
        properties=Characteristic.READ | Characteristic.NOTIFY,
    )

    def __init__(self, service=None):
        super().__init__(service=service)
        self.connectable = True
```

　本体です。

```python
# SPDX-FileCopyrightText: 2020 Mark Raleson
# SPDX-License-Identifier: MIT
from SwitchBot import SensorService
from adafruit_ble import BLERadio
from adafruit_ble.advertising.standard import ProvideServicesAdvertisement
import time
import struct

ble = BLERadio()
ble.name ="Feather nRF52840 Express"
connection = None

while True:
    if not connection:
        print("Scanning")
        for adv in ble.start_scan(ProvideServicesAdvertisement):
            addr = adv.address
            s = ProvideServicesAdvertisement.matches
            #address = str(addr)[9:26]
            #print(address, adv)
            if SensorService in adv.services:
                connection = ble.connect(adv)
                print("Connected")
                break
            print(".")
        ble.stop_scan()
        print("stopped scan")
        if connection and connection.connected:
            service = connection[SensorService]
            while connection.connected:
                Theta = service.sensorsTheta
                Vector = service.sensorsVector
                print('Theta:  {:.1f}'.format(Theta))
                print('Vector: {:.2f}'.format(Vector))
                print("")
                time.sleep(1)
```

　前回の実数で送るプログラムをFeather nRF52840で動かしています。そのペリフェラルの送ってくるデータを表示します。
　実行中の様子です。デコードを特別にしなくても、実数に戻っています。送られてくる4バイトのデータは、通常メモリの内部に保存されているbinary32形式です。
![f203.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407635/6a5fe4e6-843e-e7f3-82c8-b6f121b47c6e.png)

### 次は表示にチャレンジ
![IMGP1453.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407635/4851a723-81dc-e8ae-795a-bee25b8b70ec.png)