気圧センサー(LPS25H)の使い方 - SPI版 [Arduino]
気圧をhPa(ヘクトパスカル)で取得できる「LPS25H」の使い方です。

実行結果

基準値となる海面0mにおける1気圧(標準大気圧)は「1013.25hPa」です。標高(高度)が上がるほど気圧が下がります。
この記事はLPS25HのSPI接続版です。I2C接続版及び標高の算出方法などの詳細はこちらです。
使用部品・材料
総額で約1,270円です。(Arduino本体の値段を除く)
部品/材料 | 値段 | 備考 |
---|---|---|
ブレッドボード | ¥270 | 秋月電子の通販コード(P-00315) |
LPS25H使用 気圧センサーモジュールDIP化キット | ¥600 | 秋月電子の通販コード(K-08338) |
I2Cバス用双方向電圧レベル変換モジュール(FXMA2102) 2個 | ¥400 | 秋月電子の通販コード(M-05825) |
配線図
Arduino UNOの動作電圧は5V。LPS25Hの動作電圧は1.7-3.6Vですので、電圧レベル変換モジュールを使用して3.3Vで接続しています。

ロジック変換モジュールのFXMA108は相性が悪く正常に接続できませんでしたので、FXMA2102を2個使用しています。
※FXMA108を使用してレジスタデータを取得すると、本来の「0xBD(1011 1101)」というデータが「0xBF(1011 1111)」になります。(何故か下位バイトが必ず0x0Fになる)
SPI接続用のピン
マスターはArduino。スレーブはLPS25Hです。
番号 | 名称 | 内容 |
---|---|---|
13 | SCK | Serial ClocK。データ転送の同期の為のマスターからのクロ ック信号。 |
12 | MISO | Master In Slave Out。スレーブからマスターへデータを送る。 |
11 | MOSI | Master Out Slave In。マスターからスレーブへデータを送る。 |
(10) | SS | Slave Select pin。スレーブ選択ピン。10ピン以外でも使用可能です。 SPI接続でデバイス間の通信をする場合は、このピンをLOWにしている間に行います。通信を終了する場合はHIGHにします。 |
このピン番号と名称はArduinoで使用されているものです。デバイスによって異なる場合があります。
スケッチ(プログラム)
現在地の「気圧、温度、標高」をシリアルモニターへ表示します。
#include <SPI.h> // SCK : pin 13 (Serial ClocK) // MISO : pin 12 (Master In Slave Out) // MOSI : pin 11 (Master Out Slave In) // SS : pin 10 (Slave Select pin) // テスト用レジスタの結果 bool WHO_AM_I = false; void setup() { Serial.begin(9600); // SPIの初期化 // ※自動的に「SCK、MOSI、SSのピンの動作はOUTPUT」となり「SSはHIGH」となる SPI.begin(); // SPI転送モード // クロック位相(CPOL) = 1 クロック極性(CPHA) = 1 SPI.setDataMode(SPI_MODE3); // SPI送受信用のビットオーダー(MSBFIRST) SPI.setBitOrder(MSBFIRST); // SPIクロック分周器 4MHz = 16MHz/4 SPI.setClockDivider(SPI_CLOCK_DIV4) ; // テスト用レジスタの読み込み digitalWrite(SS, LOW); // WHO_AM_Iのレジスタアドレス(0x0F)に移動する SPI.transfer(0x0F | 0x80); // 1byteのデータを取得する uint8_t test = SPI.transfer(0x00); digitalWrite(SS, HIGH); if(0xBD != test){ Serial.println("レジスタの値が正常に取得できません。"); return; } WHO_AM_I = true; // CTRL_REG1(制御レジスタ1) digitalWrite(SS, LOW); // CTRL_REG1のアドレス SPI.transfer(0x20); // パワーダウンをオフにしてセンサー周期を1Hzにする // パワーダウン制御 : 1->Active mode // 出力データレート : 0,0,1->1Hz(1秒1回) SPI.transfer(0x90); // 2進 10010000 digitalWrite(SS, HIGH); } void loop() { // テストに成功しない場合は終了 if(!WHO_AM_I) return; int i; uint8_t RegTbl[5]; // 5byteのデータを取得する for (int i = 0; i < 5; i++) { digitalWrite(SS, LOW); SPI.transfer(0x80 | (0x28 + i)); RegTbl[i] = SPI.transfer(0x00); digitalWrite(SS, HIGH); } // --- [気圧] --- // 読み取った「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);}
以上です。
スポンサーリンク
掲示板
ArduinoやRaspberry Piなどの電子工作の掲示板を作成しました。質問やわからない事は電子工作 (Arduino・ラズパイ等)でユーザー同士で情報を共有して下さい。
関連記事
公開日:2017年06月23日 最終更新日:2017年07月22日
記事NO:02438