BLE 온도계를 만들고 Pythonista3에서 온도를 얻습니다.
17863 단어 CESP-WROOM-32파이썬BLEPythonista
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.pyimport 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) 개요
Reference
이 문제에 관하여(BLE 온도계를 만들고 Pythonista3에서 온도를 얻습니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/mitazet/items/ea17c1df676cdac78d69
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
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()
Reference
이 문제에 관하여(BLE 온도계를 만들고 Pythonista3에서 온도를 얻습니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/mitazet/items/ea17c1df676cdac78d69텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)