BLE 온도계를 만들고 Pythonista3에서 온도를 얻습니다.

BLE 온도계를 만들어 Pythonista3에서 온도를 얻습니다.



소개



그렇게 말하면, Pythonista3는 BLE(Bluetooth Low Energy)가 취급할 수 있구나.
그러고 보니 ESP-WROOM-32의 블루투스 기능을 사용한 적이 없구나.
그럼 BLE 온도계에서 온도를 얻으십시오!

하고 싶은 일



BLE 온도계 (ESP-WROOM-32 + 온도 센서)에서 iPhone으로 온도를 얻습니다.

준비한 것



ESP-WROOM-32(ESP32-DevKitC)
온도 센서 DS18B20
iPhone (Pythonista3 설치됨)

방법



ESP-WROOM-32와 DS18B20을 연결하여 온도를 측정한다.
ESP-WROOM-32의 BLE로 온도를 전송합니다.
온도가 아무래도 신경이 쓰일 때, iPhone에서 온도를 수신한다.

완성 이미지





만들기



ESP-WROOM-32와 DS18B20 연결



DS18B20은 1-wire로 연결한다. 데이터 시트는 다음과 같다.

따라서 ESP-WROOM-32는 다음과 같이 연결됩니다.

연결 완료


온도 센서로부터 온도를 얻는다



DS18B20과 1-wire 통신을 실시하여 온도를 취득한다.
프로그램은 feelfreelinux/ds18b20을 참고했다.

ESP-WROOM-32에서 BLE 사용



소스 코드



조금 길기 때문에 github에 두었다.
esp/thermometer
ds18b20.c : 온도 센서로부터 값을 얻는다.
gatts_thermometer.c : ESP32를 BLE 서버로 만듭니다. 클라이언트의 READ 이벤트에서 센서 값을 전송합니다.
※빌드에는 ESP-IDF 가 필요

프로그램은 ESP-IDF 에 부속되어 있는 GATT Server 샘플을 이용해 작성했다.
GATT에 대해서는 【BLE 사용】GATT(Generic Attribute Profile) 개요이 매우 참고가 되었다.
제품화하지는 않으므로 UUID는 적절한 값을 사용합니다.

Pythonista3에서 BLE 사용



소스 코드



Pythonista3에서 cb을 사용하여 온도 데이터를 얻습니다.
UUID는 위의 프로그램과 일치합니다.

thermo_client.py
import ui
import cb
import sound
import struct

TM_SERVICE_UUID = '00FF'
TM_CHAR_UUID = 'FF01'

class MyCentralManagerDelegate (object):
    def __init__(self):
        self.peripheral = None
        self.temp = 0

    def did_discover_peripheral(self, p):
        global text_state
        print('+++ Discovered peripheral: %s (%s)' % (p.name, p.uuid))
        if p.name and 'ESP_THERMOMETER' in p.name and not self.peripheral:
            # Keep a reference to the peripheral, so it doesn't get garbage-collected:
            self.peripheral = p
            cb.connect_peripheral(self.peripheral)
            text_state.text = 'Detected'

    def did_connect_peripheral(self, p):
        print('*** Connected: %s' % p.name)
        print('Discovering services...')
        p.discover_services()

    def did_fail_to_connect_peripheral(self, p, error):
        print('Failed to connect')

    def did_disconnect_peripheral(self, p, error):
        print('Disconnected, error: %s' % (error,))
        self.peripheral = None

    def did_discover_services(self, p, error):
        for s in p.services:
            if TM_SERVICE_UUID in s.uuid:
                print('+++ Thermometer found')
                p.discover_characteristics(s)

    def did_discover_characteristics(self, s, error):
        if TM_SERVICE_UUID in s.uuid:
            for c in s.characteristics:
                if TM_CHAR_UUID in c.uuid:
                    print('read temperature sensor...')
                    self.peripheral.read_characteristic_value(c)

    def did_write_value(self, c, error):
        print('Did enable temperature sensor')

    def did_update_value(self, c, error):
        global text_temp
        if TM_CHAR_UUID == c.uuid:
            # 
            self.temp = (c.value[0] + (c.value[1]*256))/16
            print(self.temp)
            text_temp.text=(str(self.temp) + '℃')

view = ui.View()                                      
view.name = 'THERMOMETER'                                    
view.background_color = 'white'

text_state = ui.TextView()
text_state.frame = (view.width * 0.5, view.height * 0.2, view.width, view.height*0.3)
text_state.flex = 'LRTB'
text_state.font = ('<system>', 18)
text_state.text_color = 'grey'

text_temp = ui.TextView()
text_temp.frame = (view.width * 0.25, view.height * 0.4, view.width, view.height)
text_temp.flex = 'WHLRTB'
text_temp.font = ('<system-bold>', 50)                                                    

view.add_subview(text_state)
view.add_subview(text_temp)
view.present('sheet')

delegate = MyCentralManagerDelegate()
print('Scanning for peripherals...')
text_state.text = 'Scanning'
cb.set_central_delegate(delegate)
cb.scan_for_peripherals()

# Keep the connection alive until the 'Stop' button is pressed:
try:
    while True: pass
except KeyboardInterrupt:
    # Disconnect everything:
    cb.reset()

이쪽도 github에 두었다. ぇr도_cぃ엔t. py

테스트



Pythonista3에서 termo_client.py를 실행.

획득 성공!!
약간 추운 온도.

마지막으로



원격으로 하는 의미 있는 것인가라는 츳코미는 받아들이지 않습니다.
집안에서는 그다지 도움이 되지 않지만, 농장 등에서는 도움이 될지도 모른다(전력 절약).

참고 사이트



우분투에서 ESP32로 블루투스 연결하여 신호를 보내고받는 방법
cb — Connecting to Bluetooth LE Peripherals
feelfreelinux/ds18b20
【BLE 사용】GATT(Generic Attribute Profile) 개요

좋은 웹페이지 즐겨찾기