気圧センサー(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
プチモンテ ※この記事を書いた人
![]() | |
![]() | 💻 ITスキル・経験 サーバー構築からWebアプリケーション開発。IoTをはじめとする電子工作、ロボット、人工知能やスマホ/OSアプリまで分野問わず経験。 画像処理/音声処理/アニメーション、3Dゲーム、会計ソフト、PDF作成/編集、逆アセンブラ、EXE/DLLファイルの書き換えなどのアプリを公開。詳しくは自己紹介へ |
| 🎵 音楽制作 BGMは楽器(音源)さえあれば、何でも制作可能。歌モノは主にロック、バラード、ポップスを制作。歌詞は抒情詩、抒情的な楽曲が多い。楽曲制作は🔰2023年12月中旬 ~ | |









