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









