初めての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で実行します。