BME280で気圧や高度を測定‼(Arduino編)
高性能で便利なBME280センサーを使って、今回は気圧や高度を測定したいと思います‼
ちなみにこのセンサーは温度、湿度、気圧、を主に取得できる優れものです‼
高度はその気圧の変化を基に出します。
類似品にBMP180やBMP280という商品もあり、こちらは気温と気圧のみとなっており、その分安価になります。
BMP180よりもBMP280の方が精度がよく、勿論どちらも気圧が取得できるので高度も同じく気圧の変化を基に出せます。
そのため、高度だけを求めるならBMP180/BMP280の方がコスパ的には圧倒的にいいです‼
・「仕様」
冒頭でも少し触れていますがBME280は、いろんなシリーズが出ており、それぞれの違いは下記の画像の様になります。
今回使うBME280は十分高性能なセンサーですが、更にそれを超えるセンサーがたくさんあります‼
勿論下にいく程値段は上がりますが、よく見かけるのはBMP280、BME280、BME680ですね。
BME280のスペック
・計測範囲(気圧):300~1100hPa(±1hPa)(分解能0.18Pa)
・計測範囲(温度):-40~85℃(±1℃)(分解能0.01℃)
・計測範囲(湿度):0=100%(±3%)(分解能0.008%)
・インターフェース: i2C (最大3.4mhz)
・ピンピッチ:2.54mm
BME280に関しては、3.3Vモデルと5Vのモデルがありますが、
5Vモデルでは5Vに対応、尚且つ3.3Vレベル変換回路搭載も内蔵しているので3.3Vにも対応しています。
3.3Vモデルは i2CとSPIに対応しています。その分5Vモデルよりかは若干サイズが大きくなります。
①「部品準備」
・気圧センサー(BME280)(5V)
電子工作ステーション 990円(送料無料)
※コスパ的にきつい場合はBMP280(330円程)でも大丈夫です。
(BMP180では試していないので今回はスルーします)
・Arduino Nano
(後にブレッドボード一枚で納めたいのでNanoを使います‼)
電子工作ステーション 1180円(送料無料)
※はんだ付けされていない状態です。はんだ付けが必要な方ははんだ付けサービスも同時にご購入をお勧めします。
・ジャンパーワイヤー(オス・メス)(4本)
電子工作ステーション 105円(500円以上で送料無料)
とりあえずこれで取得はできます‼
②「簡易回路」
Arduino Nanio | BME280 |
3.3V | VIN |
GND | GND |
A5 | SCL |
A4 | SDA |
③「開発環境」
Adafruit_BME280.hを使えるようにライブラリーのインストールをします。
Arduino IDEを開き、「ツール」→「ライブラリーを管理…」を押します。
そうするとライブラリーマネージャーが開くので、「BME280」と検索すると、
「Adafruit BME280 Library」というのが出てくるのでそれをインストールします。
※BMP280を使われる場合は、同じようにBMP280で検索し、同じようにライブラリーをインストールすればOKです。
④「いよいよプログラミング」
温度、湿度、気圧、高度すべて取得するプログラムです‼
※BMP280を使われる場合は、BME280と書いてあるところをすべてBMP280に置き換えれば動きます。
(湿度は取得できなくなります。)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
//BME280のライブラリーを取り込みます。 #include<Adafruit_BME280.h> //1013.25は地球の海面上の大気圧の平均値(1気圧)です。 #define SEALEVELPRESSURE_HPA (1013.25) Adafruit_BME280 bme; unsigned long delayTime; float temperature;//気温 float barometric;//気圧 float altitude;//高度 float humidity;//湿度 void setup() { Serial.begin(115200); bool status; status = bme.begin(0x76); if (!status) { Serial.println("BME280 sensor"); while (10); } delayTime = 1000; } void loop() { temperature = bme.readTemperature(); barometric = bme.readPressure() / 100.0F; altitude = bme.readAltitude(SEALEVELPRESSURE_HPA); humidity = bme.readHumidity(); Serial.print("温度:"); Serial.print(temperature); Serial.println("°C"); Serial.print("気圧:"); Serial.print(barometric); Serial.println("hpa"); Serial.print("高度:"); Serial.print(altitude); Serial.println("m"); Serial.print("湿度:"); Serial.print(humidity); Serial.println("%"); Serial.println(); delay(delayTime); } |
★豆知識
・arduinoの世界では、double型はfloat型と同じ精度の実装となっているようで、doubleにしても、精度は向上しないようです。
④「結果」
シリアルモニターを開いてみてみます。
気温と湿度は屋への温湿度計とほぼ同じ数値‼
気圧も天気図やアメダス、スマホの気圧計と比べてもほぼ一致!
しかし、高度が残念ながら明らかに違う….
海抜は2~3mくらい、5階で測定(5階の高さは約15m)しているので17m前後の数値が出てくれないと合ってるとは言えませんね。
勿論気圧も僅かにですが常に変化しているので、それに応じて高度も同じ位置に置いているだけなのに数十センチ単位で変化しまくる。
そしてこの方法だとPCとArduinoを常に接続した状態にしないと測定できません。
やはり外に持ち出して測定したい!
ということで部品を追加して持ち運び式に変えたいと思います‼
⑤「部品追加」
・0.96インチOLEDディスプレイモジュール (SSD1306) (イエロー/ブルー)
電子工作ステーション 480円
・ブレッドボード 6穴モデル
電子工作ステーション 490円
※6穴モデルではなく、通常の400穴Verでも大丈夫です。
・ブレッドボード・ジャンパーワイヤー
電子工作ステーション 400円
・Type-Cケーブル(持っていなければ)
電子工作ステーション 330円
・モバイルバッテリー
(外で持ち運びできるようにするために使います)
ちなみに20000mAhでワイヤレス充電にも対応していて、値段も安い最強モバイルバッテリーはこちら↓
⑥「回路」
Arduino Nanio | BME280 |
VIN | 3.3V |
GND | GND |
SCL | A5 |
SDA | A4 |
OLEDディスプレイ | Arduino Nano |
GND | GND |
VDD | 5V |
SCK | A5 |
SDA | A4 |
ジャンパーワイヤーで下記の画像のように配置すると、ブレッドボード1枚で収まるのでお勧めです。
⑦「プログラム」
BME280の値をディスプレイに表示させるプログラムです。
湿度は画面に収まらないため気温、気圧、高度のみ表示させます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 |
/* RGBセンサーモジュール用ライブラリーをインクルード */ #include <Wire.h> #include <Adafruit_Sensor.h> #include<Adafruit_BME280.h> #define SEALEVELPRESSURE_HPA (1013.25) Adafruit_BME280 bme; unsigned long delayTime; float temperature;//気温 float barometric;//気圧 float altitude;//高度 float humidity;//湿度 /* OLEDディスプレイモジュール用ライブラリーをインクルード */ #include<Wire.h> #include<Adafruit_GFX.h> #include<Adafruit_SSD1306.h> //ディスプレイ変数の宣言 Adafruit_SSD1306 display(0); void setup() { Serial.begin(115200); //ディスプレイの初期化 display.begin(SSD1306_SWITCHCAPVCC, 0x3C); //mbe280 bool status; status = bme.begin(0x76); if (!status) { Serial.println("BME280 sensor"); while (10); delayTime = 1000; } } void loop() { /* * ディスプレイに表示。 * 但し、湿度は画面に収まらないため気温、気圧、高度のみ。 */ display.clearDisplay(); //ディスプレイをクリア temperature = bme.readTemperature(); barometric = bme.readPressure() / 100.0F; altitude = bme.readAltitude(SEALEVELPRESSURE_HPA); humidity = bme.readHumidity(); //温度表示 display.setTextSize(1); //文字サイズを設定 display.setTextColor(WHITE); //文字色を設定 display.setCursor(0, 0); //文字の開始位置を設定 display.print("ondo:"); display.print(temperature); //変数nをディスプレイ出力するよう設定 //気圧 display.setTextSize(1); //文字サイズを設定 display.setTextColor(WHITE); //文字色を設定 display.setCursor(0, 10); //文字の開始位置を設定 display.print("kiatu:"); display.print(barometric); //変数nをディスプレイ出力するよう設定 //高度表示 display.setTextSize(1); //文字サイズを設定 display.setTextColor(WHITE); //文字色を設定 display.setCursor(0, 20); //文字の開始位置を設定 display.print("koudo:"); display.print(altitude); //変数nをディスプレイ出力するよう設定 display.display(); //上記条件でディスプレイ表示 /* * 一応シリアルモニターにも表示できるようにしときます。 */ Serial.print("温度:"); Serial.print(temperature); Serial.println("°C"); Serial.print("気圧:"); Serial.print(barometric); Serial.println("hpa"); Serial.print("高度:"); Serial.print(altitude); Serial.println("m"); Serial.print("湿度:"); Serial.print(humidity); Serial.println("%"); Serial.println(); delay(delayTime); //1秒間待つ } |
⑧「結果」
モバイルバッテリーを装備し、いざ検証!
高度そのものは気圧を基に出しているだけなので、当日の気圧によってはマイナス表記になったりし、
全くやくに立ちませんでした。
エレベータに行き、高度の変化が取れるか確認してみたところ、
ちゃんと取れました‼
数センチ単位で合ってるわけではないですが、
何階分ぐらい動いたかは高度で確認することはできました‼
ということで、気圧センサーによる高度の測定は、現在地の高度を測定できるというよりも、
どのくらい高度に変化があったかを測定できるという結果になりました‼
もしかしたら上手くプログラムで調整すれば現在地の高度も測定できるようにすることも可能かもしれません。
以上、ご閲覧ありがとうございました^^