気圧センサー(LPS25H)の使い方 - I2C版 [Arduino]
気圧をhPa(ヘクトパスカル)で取得できる「LPS25H」の使い方です。
このセンサーには温度計も内蔵しているので「気圧計」だけではなく「高度計」なども作成する事が可能です。

実行結果

基準値となる海面0mにおける1気圧(標準大気圧)は「1013.25hPa」です。標高(高度)が上がるほど気圧が下がります。
この記事はLPS25HのI2C接続版です。SPI接続版はこちらです。
使用部品・材料
総額で約1070円です。(Arduino本体の値段を除く)
部品/材料 | 値段 | 備考 |
---|---|---|
ブレッドボード | ¥270 | 秋月電子の通販コード(P-00315) |
LPS25H使用 気圧センサーモジュールDIP化キット | ¥600 | 秋月電子の通販コード(K-08338) |
I2Cバス用双方向電圧レベル変換モジュール(FXMA2102) | ¥200 | 秋月電子の通販コード(M-05825) |
カーボン抵抗器 | 数円 | 10kΩ(2個)を使用。 |
配線図
センサー側のSCL/SDAには10kΩのプルアップをしています。
LPS25Hの基盤裏のJ1、J2を「はんだ付け」すると10kの抵抗は不要ですが、SPI接続ができなくなるので「はんだ付け」はしない方が良いです。

※このセンサーは3.3V機器なので5VのSCL/SDAの電圧を3.3Vにレベル変換しています。
スケッチ(プログラム)
現在地の「気圧、温度、標高」をシリアルモニターへ表示します。
#include <Wire.h> // デバイスアドレス(スレーブ) uint8_t DEVICE_ADDRESS = 0x5C; // 2進 1011100 // テスト用レジスタの結果 bool WHO_AM_I = false; void setup() { Serial.begin(9600); // マスタとしてI2Cバスに接続する Wire.begin(); // テスト用レジスタの読み込み Wire.beginTransmission(DEVICE_ADDRESS); Wire.write(0x0F); Wire.endTransmission(); // デバイスへ1byteのレジスタデータを要求する Wire.requestFrom(DEVICE_ADDRESS, 1); while(Wire.available() == 0) {} uint8_t test = Wire.read(); if(0xBD != test){ Serial.println("レジスタの値が正常に取得できません。"); return; } WHO_AM_I = true; // CTRL_REG1(制御レジスタ1) Wire.beginTransmission(DEVICE_ADDRESS); // CTRL_REG1のアドレス Wire.write(0x20); // パワーダウンをオフにしてセンサー周期を1Hzにする // パワーダウン制御 : 1->Active mode // 出力データレート : 0,0,1->1Hz(1秒1回) Wire.write(0x90); // 2進 10010000 Wire.endTransmission(); } void loop() { // テストに成功しない場合は終了 if(!WHO_AM_I) return; int i; uint8_t RegTbl[5]; // デバイスから1byte毎にレジスタを読み込む // ※このデバイスは複数バイトをまとめて取得できないらしい hamatta(-; for (i=0; i< 5; i++){ Wire.beginTransmission(DEVICE_ADDRESS); Wire.write(0x28 + i ); Wire.endTransmission(); // デバイスへ1byteのレジスタデータを要求する Wire.requestFrom(DEVICE_ADDRESS, 1); while(Wire.available() == 0) {} RegTbl[i] = Wire.read(); } // --- [気圧] --- // 読み取った「3byte」を24bitに変換する // ※UNOは16bitを超えるシフトはできませんので、乗算で対処しています。 hamatta(-; uint16_t lo = RegTbl[1] << 8 | RegTbl[0]; uint32_t hi = RegTbl[2] * 65536; // 16bitの左シフト float P = (hi + lo) / 4096.0; Serial.print("気圧:"); Serial.print(P); Serial.print("hPa(mbar)"); // --- [温度] --- // 温度は符号ありのデータ型でOK int temperature = (RegTbl[4] << 8 | RegTbl[3]); float T = 42.5 + (temperature / 480.0); Serial.print(" 温度:"); Serial.print(T); Serial.print("℃"); // --- [標高] --- float H = ((pow(1013.25 / P, 1 / 5.257) - 1) * (T+ 273.15)) / 0.0065; Serial.print(" 標高:"); Serial.print(H); Serial.println("m"); delay(1000); }
公式
気圧と温度から標高を求める

H = 標高, P0= 海面気圧(1013.25), P =現在の気圧, T = 現在の温度
最後に
その他に割り込み機能などがありますので、各自で調査してみてください。
スポンサーリンク
掲示板
ArduinoやRaspberry Piなどの電子工作の掲示板を作成しました。質問やわからない事は電子工作 (Arduino・ラズパイ等)でユーザー同士で情報を共有して下さい。
関連記事
公開日:2017年06月23日
記事NO:02437