BME280拡張機能日本語仕様を用いたプログラム例の紹介
【ブロックをjavascriptで示す】
// センサーの初期化
// I2Cアドレスを設定
BME280.Address(BME280.BME280_I2C_ADDRESS.ADDR_0x76)
// センサー起動
BME280.PowerOn()
// センター安定化のために1秒待つ
basic.pause(1000)
micro:bitはBME280と通信する際、I2Cを利用します。まず I2Cアドレスを指定し、micro:bitがBME280に指令を出すときの送り先(アドレス)をmicro:bitに教えます。BME280の場合は0x76か0x77です。どちらを利用するかはBME280センサーモジュールの種類やセンサーモジュールの設定によって異なります。BME280拡張機能日本語仕様の場合、ブロック内のプルダウンで0x76か0x77を選択します。次にmicro:bitにBME28の起動命令を出すように指示します。
一時停止はセンサーの安定化のための命令。BME280起動直後は、データ測定が不安定なので1000ミリ秒=1秒ほど待ってやると値が安定します。
【ブロックをjavascriptで示す】
// Aを押すとmicoro:bitのLEDに気温(摂氏 小数第1位)をmicro:bitのLEDに表示
input.onButtonPressed(Button.A, function () {
basic.showNumber(BME280.temperature(BME280.BME280_T.T_C, BME280.RPoint.RPt))
})
// Bを押すとmicoro:bitのLEDに気温(hPa 小数第1位)をmicro:bitのLEDに表示
input.onButtonPressed(Button.B, function () {
basic.showNumber(BME280.pressure(BME280.BME280_P.hPa, BME280.RPoint.RPt))
})
// AとBを同時に押すとmicoro:bitのLEDに湿度(% 小数第1位)をmicro:bitのLEDに表示
input.onButtonPressed(Button.AB, function () {
basic.showNumber(BME280.humidity(BME280.RPoint.RPt))
})
気温ブロック・気圧ブロック・湿度ブロックにより気温・気圧・湿度をBME280から取り出して文字列にし、単位をつけてmicro:bitのLEDに表示するプログラムです。micro:bitの入力ブロックとBME280拡張機能日本語仕様のブロックを組み合わせたものです。
直接の気温・気圧・湿度の各ブロックを使っていますが変数を利用してもかまいません。応用として測定した気温・気圧・湿度を変数に収め、USB経由でPCに送信することも可能です。
【ブロックをjavascriptで示す】
// 初期設定
// 変数の定義
let 標高差 = 0
let 基準点の気圧 = 0
// センサーの初期設定
BME280.Address(BME280.BME280_I2C_ADDRESS.ADDR_0x76)
BME280.PowerOn()
BME280.PowerOff()
基準点の気圧 = BME280.pressure(BME280.BME280_P.hPa, BME280.RPoint.RPd)
)
// Aを押すとmicoro:bitのLEDに標高差が表示
input.onButtonPressed(Button.A, function () {
標高差 = BME280.getElevationdifference(
BME280.Eldf.altd_m,
BME280.Rpoint2.RP1st,
基準点の気圧,
BME280.BME280_P.hPa
)
})
気温・気圧から標高差を求めます。
基準気圧(基準点の気圧)を変数「基準点の気圧」に収め、ブロックの指定の場所に入れることで、基準点との標高差を計算しています。結果は変数「標高差」に格納し、文字列にし単位をつけてmicro:bitのLEDに表示します。
直接ブロックには出てきませんが、MakeCodeエディタで変数を定義しています。javascriptの「let 標高差 = 0」「let 基準点の気圧 = 0」が変数の定義になります。
【ブロックをjavascriptで示す】
// 変数の定義
let 気温 = 0
// ボタンAを押すと飽和水蒸気圧(小数第1位)+hPaがmicro:bitのLEDに表示
input.onButtonPressed(Button.A, function () {
basic.showString("" + BME280.Calcsvpnow(BME280.Rpoint2.RP1st) + "hPa")
})
// ボタンBを押すと飽和水蒸気(整数)++g/m^3がmicro:bitのLEDに表示。
input.onButtonPressed(Button.B, function () {
気温 = BME280.temperature(BME280.BME280_T.T_C, BME280.RPoint.RPt)
basic.showString("" + BME280.Calcsva(気温, BME280.Rpoint2.Rintg) + "g/m^3")
})
飽和水蒸気圧・飽和水蒸気量を求めます。
飽和水蒸気圧はBME280から直接気温の値を得て計算し、文字列にし単位をつけてmicro:bitのLEDに表示させています。飽和水蒸気量はBME280から気温の数値を得て、変数「気温」に収め、ブロックの指定の場所に入れることで、飽和水蒸気量を計算しています。結果は文字列にし単位をつけてmicro:bitのLEDに表示します。MakeCodeエディタで変数「気温」を定義しています。
【ブロックをjavascriptで示す】
// ボタンA+Bを押すと露点(整数)+Cがmicro:bitのLEDに表示
input.onButtonPressed(Button.AB, function () {
basic.showString("" + BME280.getDewpointnow(BME280.Rpoint2.Rintg) + "c")
})
露点を求めます。
露点は気温と湿度が分かれば求めることができます。BME280から気温・湿度の値を得て計算し、文字列にし単位をつけてmicro:bitのLEDに表示させています。利用している改良マグヌス式は近似値を求める式なので若干のずれがあります。MakeCodeエディタで変数「気温」と「湿度」を定義し気温・湿度を変数に代入して求めるブロックを利用する方法もあります。詳しくは「2.ブロックの紹介」を参考にしてください。
BME280で測定した気温・気圧・湿度と気温・気圧を利用して算出した標高差をPCに送り、ブラウザ上でグラフ化をします。

【ブロックをjavascriptで示す】
// 初期設定
let 湿度 = 0
let 標高差 = 0
let 気圧 = 0
let 気温 = 0
let command = ""
let 基準点の気圧 = 0
serial.redirectToUSB()
BME280.Address(BME280.BME280_I2C_ADDRESS.ADDR_0x76)
BME280.PowerOn()
basic.pause(1000)
基準点の気圧 = BME280.pressure(BME280.BME280_P.hPa, BME280.RPoint.RPd)
// メイン
// シリアル通信ブロック群の条件ブロックでイベントを作成
serial.onDataReceived(serial.delimiters(Delimiters.NewLine), function () {
// PCから送られてきた文字が改行コードだった時は
// 改行コードの手前まで変数commandに代入
command = serial.readUntil(serial.delimiters(Delimiters.NewLine))
// commandがGETなら気温・気圧・標高差・湿度をカンマ切りで文字列にしてPCに送信
if (command == "GET") {
気温 = BME280.temperature(BME280.BME280_T.T_C, BME280.RPoint.RPt)
気圧 = BME280.pressure(BME280.BME280_P.hPa, BME280.RPoint.RPt)
標高差 = BME280.getElevationdifference(
BME280.Eldf.altd_m,
BME280.Rpoint2.RP1st,
基準点の気圧,
BME280.BME280_P.hPa
)
湿度 = BME280.humidity(BME280.RPoint.RPt)
serial.writeNumbers([
気温,
気圧,
標高差,
湿度
])
// commandがRESET_P0なら基準点の気圧を再取得し、P0 updated:をつけてPCに基準点の気圧を送信
} else if (command == "RESET_P0") {
基準点の気圧 = BME280.pressure(BME280.BME280_P.hPa, BME280.RPoint.RPd)
serial.writeLine("P0 updated: " + 基準点の気圧)
}
})
PCにBME280が取得したデータと基準点との標高差を送信するプログラム
センサーと親機(この場合PC)間のデータ授受にはセンサーから親機にデータを一定間隔で送るプッシュ型と親機からのリクエストで親機にデータを送るプル型があります。リアルタイムでグラフ化などをしたいとき、micro:bitの場合、PCとの通信はWeb Serial APIが比較的楽なようです。ただmicro:bitの場合Web Serial APIだとプッシュ型でのデータ送信は苦手のようです。データが欠落した時の処理が上手くいかないため、データ処理がもたつきます。プル型だと比較的安定します。そのため上の例ではプル型で処理をしています。具体的にはPCからmicro:bitにWeb Serial APIで送られてきた信号が改行コードの場合、イベントが発生するという構造になっています。
PCとmicro:bitはあらかじめUSB接続をしておきます。MakeCodeエディタを開き、あらかじめ作成したブロックをmicro:bitにダウンロードします。ダウンロードが終わったらMakeCodeエディタは閉じておきます。開いたままだとMakeCodeへも信号が流れ、PCへデータにデータ欠損が起こり、安定しません。
サンプルプログラム集を用意しています。必要に応じてダウンロードしご利用ください。
<script src="GetData3.js"></script> を
<script src="新しいファイル名.js"></script> 」書き換えてください