TOP > カテゴリ > ロボット・電子工作・マイコン >

気圧センサー(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 = 現在の温度

最後に

その他に割り込み機能などがありますので、各自で調査してみてください。





関連記事



公開日:2017年06月23日
記事NO:02437