初めてのRaspberry Pi BLEプログラミング (5) BME280②温度、気圧、湿度
前回、ラズパイにBME280をつなぎ、温度を送るペリフェラルを作りました。ここでは、このセンサで測定できる気圧と湿度を追加します。
●修正;main.py
bleno.startAdvertising('BME280-all',
Local Nameを新しくしました。
primaryService = BME280_3Service();
サービスを記述したファイル名を変更しました。
from pybleno import *
import sys
import signal
from BME280_3Service import *
bleno = Bleno()
primaryService = BME280_3Service();
def onStateChange(state):
print('on -> stateChange: ' + state);
if (state == 'poweredOn'):
bleno.startAdvertising('BME280-all', [primaryService.uuid]);
else:
bleno.stopAdvertising();
bleno.on('stateChange', onStateChange)
def onAdvertisingStart(error):
print('on -> advertisingStart: ' + ('error ' + error if error else 'success'));
if not error:
def on_setServiceError(error):
print('setServices: %s' % ('error ' + error if error else 'success'))
bleno.setServices([
primaryService
], on_setServiceError)
bleno.on('advertisingStart', onAdvertisingStart)
bleno.start()
print ('Hit to disconnect')
if (sys.version_info > (3, 0)):
input()
else:
raw_input()
bleno.stopAdvertising()
bleno.disconnect()
print ('terminated.')
sys.exit(1)
●修正;BME280Service.py
ファイル名をBME280_3Service.pyに変更します。温度、気圧、湿度のそれぞれのキャラを記述します。
from pybleno import *
from BME280_T_Characteristic import *
from BME280_P_Characteristic import *
from BME280_H_Characteristic import *
class BME280_3Service(BlenoPrimaryService):
def __init__(self):
BlenoPrimaryService.__init__(self, {
'uuid': '12345678-1234-5678-1234-56789abcdef0',
'characteristics': [
BME280_T_Characteristic(),
BME280_P_Characteristic(),
BME280_H_Characteristic()
]})
●修正;BME280Characteristic.py
Serviceで三つのキャラを指定しました。ファイル名をBME280Characteristic.pyをベースに、三つのキャラ用ファイルを作ります。
◆BME280_T_Characteristic.py
温度用です。
from pybleno import *
import array
import board
import busio
import adafruit_bme280
import struct
i2c = busio.I2C(board.SCL, board.SDA)
bme280 = adafruit_bme280.Adafruit_BME280_I2C(i2c, 0x76)
class BME280_T_Characteristic(Characteristic):
def __init__(self):
Characteristic.__init__(self, {
'uuid': '12345678-1234-5678-1234-56789abcdef7',
'properties': ['read'],
'value': None
})
def onReadRequest(self, offset, callback):
#callback(Characteristic.RESULT_SUCCESS, array.array('B', [int(bme280.temperature)]))
callback(Characteristic.RESULT_SUCCESS, array.array('B', list(struct.pack('>f', (bme280.temperature))) ))
◆BME280_P_Characteristic.py
気圧用です。
from pybleno import *
import array
import board
import busio
import adafruit_bme280
import struct
i2c = busio.I2C(board.SCL, board.SDA)
bme280 = adafruit_bme280.Adafruit_BME280_I2C(i2c, 0x76)
class BME280_P_Characteristic(Characteristic):
def __init__(self):
Characteristic.__init__(self, {
'uuid': '12345678-1234-5678-1234-56789abcdef8',
'properties': ['read'],
'value': None
})
def onReadRequest(self, offset, callback):
#callback(Characteristic.RESULT_SUCCESS, array.array('B', [int(bme280.temperature)]))
callback(Characteristic.RESULT_SUCCESS, array.array('B', list(struct.pack('>f', (bme280.pressure))) ))
◆BME280_H_Characteristic.py
湿度用です。
rom pybleno import *
import array
import board
import busio
import adafruit_bme280
import struct
i2c = busio.I2C(board.SCL, board.SDA)
bme280 = adafruit_bme280.Adafruit_BME280_I2C(i2c, 0x76)
class BME280_H_Characteristic(Characteristic):
def __init__(self):
Characteristic.__init__(self, {
'uuid': '12345678-1234-5678-1234-56789abcdef9',
'properties': ['read'],
'value': None
})
def onReadRequest(self, offset, callback):
#callback(Characteristic.RESULT_SUCCESS, array.array('B', [int(bme280.temperature)]))
callback(Characteristic.RESULT_SUCCESS, array.array('B', list(struct.pack('>f', (bme280.humidity))) ))
sudo python3 main.pyで実行します。
