質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.44%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

0回答

1047閲覧

pythonでesp32をBLE通信 nRFToolBoxで体温計が表示されません

dras

総合スコア2

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/11/29 10:16

編集2021/12/01 00:20

###やりたいこと
pythonでesp32を操作し、BLE通信を行いたいです。
nRFToolBoxでHealth Thermometer Moniterで体温を見れるようにしたいです。

###分からないところ
Temperature measurementでの温度の表し方。
Client Characteristic Configurationの使い方。
それをどうやってgatts_writeに書き込むか

###コード

Python

1import bluetooth 2import struct 3import math 4import time 5 6 7from machine import * 8from micropython import const 9 10 11_IRQ_CENTRAL_CONNECT = const(1) 12_IRQ_CENTRAL_DISCONNECT = const(2) 13_IRQ_GATTC_NOTIFY = const(18) 14 15 16_HEALTH_THERM_UUID = bluetooth.UUID(0x1809) 17_DEVICE_INFO_UUID = bluetooth.UUID(0x180A) 18 19 20_TEM_CHAR = (bluetooth.UUID(0x2A1C), bluetooth.FLAG_INDICATE) 21_CLI_CHAR = (bluetooth.UUID(0x2902), bluetooth.FLAG_READ|bluetooth.FLAG_WRITE) 22 23_MAN_CHAR = (bluetooth.UUID(0x2A29), bluetooth.FLAG_READ) 24_MOD_CHAR = (bluetooth.UUID(0x2A24), bluetooth.FLAG_READ) 25_SYS_CHAR = (bluetooth.UUID(0x2A23), bluetooth.FLAG_READ) 26 27 28_HEALTH_THERM_SERVICE = (_HEALTH_THERM_UUID, (_TEMP_CHAR, _CLI_CHAR)) 29_DEVICE_INFO_SERVICE = (_DEVICE_INFO_UUID, (_MAN_CHAR, _MOD_CHAR, _SYS_CHAR)) 30_SERVICES = (_HEALTH_THERM_SERVICE,_DEVICE_INFO_SERVICE) 31 32 33_ADV_APPEARANCE_GENERIC_THERMOMETER = const(768) 34 35 36class BLETemperature: 37 def __init__(self, ble, name="health-therm"): 38 self._ble = ble 39 self._ble.active(True) 40 self._ble.irq(self._irq) 41 self._connections = set() 42 ((self._Temp, self._Cli),(self._Man, self._Mod, self._Sys)) = self._ble.gatts_register_services(_SERVICES) 43 self._payload = advertising_payload(name=name, services=[_HEALTH_THERM_UUID], appearance=_ADV_APPEARANCE_GENERIC_THERMOMETER) 44 self._advertise() 45 46 def _irq(self, event, data): 47 if event == _IRQ_CENTRAL_CONNECT: 48 conn_handle, addr_type, addr = data 49 self._connections.add(conn_handle) 50 elif event == _IRQ_CENTRAL_DISCONNECT: 51 conn_handle, addr_type, addr = data 52 self._connections.remove(conn_handle) 53 self._advertise() 54 elif event == _IRQ_GATTC_NOTIFY: 55 conn_handle, value_handle, notify_data = data 56 57 def set_temperature(self, temp_deg_c, notify=False, indicate=False): 58 self._ble.gatts_write(self._Temp, struct.pack('<h', int(temp_deg_c * 100))) 59 if notify: 60 for conn_handle in self._connections: 61 print("notify!") 62 self._ble.gatts_notify(conn_handle, self._Temp) 63 64 def set_device(self): 65 self._ble.gatts_write(self._Man, "TSMC", True) 66 self._ble.gatts_write(self._Mod, "ESP32-DOWDQ5 Rev 1", True) 67 self._ble.gatts_write(self._Sys, struct.pack('l',14227020), True) 68 69 def _advertise(self, interval_us=500000): 70 self._ble.gap_advertise(interval_us, adv_data=self._payload) 71 72def demo(): 73 ble = bluetooth.BLE() 74 temp = BLETemperature(ble) 75 76 i = 0 77 78 temp.set_device() 79 80 adc = ADC(Pin(32)) 81 adc.atten(ADC.ATTN_11DB) 82 adc.read() 83 val = adc.read_u16() 84 85 while True: 86 adc.atten(ADC.ATTN_11DB) 87 val=adc.read_u16() 88 val=val/65535*3.6 89 val=((36000/val)-10000)/1000 90 val=-30.24*math.log(val)+95.664 91 92 print(val) 93 94 i = (i + 1) % 5 95 temp.set_temperature(val, notify=i==0, indicate=False) 96 time.sleep_ms(1000) 97 98if __name__ == "__main__": 99 demo()

###進展
Health thermometer Serviceを見直した結果、UUIDとCharacteristicが間違っていたので直した結果、
The device does not have required services.
という注意は出なくなりました。

ですがnRFToolBoxではまだ温度が表示されず、nRFConnectでの温度表示も正しい値が出なくなりました。

怪しいと睨んでいるのは
__init__のadvertising_payloadのservicesの値
set_temperatureのgatts_writeの()の中身
の二つです。

どなたか使い方を教えてくれませんか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

y_waiwai

2021/11/29 10:22

このままではコードが読めないので、質問を編集し、<code>ボタンを押し、出てくる’’’の枠の中にコードを貼り付けてください
dras

2021/11/29 12:11

ご指摘ありがとうございます。修正しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.44%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問