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