Arduino UNO R4 Minimaでセンサ・インターフェーシング ㉒ 気圧センサ LPS3X
Adafruitから入手した防水パッケージ付きMEMS気圧センサ LPS35HW(STMicroelectronics)を利用します。
気圧と温度が測定できます。
●AdafruitのStemma QT/Qwiicボード
LPS3Xボード解説のページ
Stemma QT/Qwiic(JST SH 4ピン)コネクタは2か所に装着されていて、どちらにつないでもかまいません。このコネクタを使ってI2Cで制御する場合、特に、ジャンパ線をつなぐなどは不要です。
コネクタは、表と裏のどちらも差し込めそうですが、ピンが内部の上部に並んでいるので、差し込める方向は一意です。ロック機構はないですが、すぐに抜けるということはありません。
●気圧センサLPS35HWのおもなスペック
LPS35HWのデータシートはこのWebページから
- 電源電圧 1.7~3.6V
 - 気圧測定範囲 260~1260hPa、確度;±1hPa、分解能;±0.1hPa
 - 温度測定範囲 -40~+85℃、確度;±1.5℃
 - インターフェース I2C(0~400kHz)、SPI(10MHz)
 - スレーブ・アドレス 0x5d、裏面のAddrをショートすると0x5c
 
●使用環境
- Arduino UNO R4 Minima
 - Arduino IDE 2.2.1
 - Windows10 22H2
 
●接続
Arduino UNO R4 MinimaのI2C信号とセンサ・ボードをJSTコネクタでつなぎます(Stemma QT/Qwiicボードの写真の比率は異なる)。
●スレーブ・アドレスを確認
従来からよく使われているi2cScanner.inoを動かしてスレーブ・アドレスを確認します。電源は3.3Vです。
0x5dを見つけてきました。
●ライブラリの用意
LPS3で検索して、見つかったAdafruit LPS35HWライブラリをインストールします。
インストールを始めたとき、関連のライブラリや依存関係をインストールするかというパネルが出た場合は、全てをインストールを選びます。
●サンプル・スケッチ
メニューのファイル->スケッチ例から、Adafruit LPS35HWのlps35hw_test.inoを選択し、
コンパイル、実行します。
SPI関連を取り除き、I2Cの記述だけ残したスケッチです。
#include <Adafruit_LPS35HW.h>
Adafruit_LPS35HW lps35hw = Adafruit_LPS35HW();
void setup() {
  Serial.begin(115200);
  // Wait until serial port is opened
  while (!Serial) { delay(1); }
  Serial.println("Adafruit LPS35HW Test");
  if (!lps35hw.begin_I2C()) {
    Serial.println("Couldn't find LPS35HW chip");
    while (1);
  }
  Serial.println("Found LPS35HW chip");
}
void loop() {
  float tempC = lps35hw.readTemperature();
  float press = lps35hw.readPressure();
  Serial.print("Temperature: ");
  Serial.print(tempC); Serial.println(" C");
  
  Serial.print("Pressure: ");
  Serial.print(press); Serial.println(" hPa");
  Serial.println();
  delay(1000);
}
●4桁の7セグメントLED表示器をつないで測定結果を表示する
連載の第4回目の記事を参照しながら表示器を接続します。
Arduino UNO R4 Minimaでセンサ・インターフェーシング ④ 温湿度センサSi7021の測定結果を7セグメントLEDに表示
 スケッチです。
7セグメントLED表示器は、第12回 温湿度センサ SHTC3でスレーブ・アドレスが重なったので、デフォルトの0x70から、ジャンパのA0をショートして0x71に変更してあります。デフォルトのまま使うときは0x70で使ってください。
#include <Wire.h>
#include <Adafruit_GFX.h>
#include "Adafruit_LEDBackpack.h"
#include <Adafruit_LPS35HW.h>
Adafruit_7segment matrix = Adafruit_7segment();
Adafruit_LPS35HW lps35hw = Adafruit_LPS35HW();
void setup() {
  Serial.begin(115200);
  // Wait until serial port is opened
  while (!Serial) { delay(1); }
  Serial.println("LPS35HW  + 7segmentLED");
  if (!lps35hw.begin_I2C()) {
    Serial.println("Couldn't find LPS35HW chip");
    while (1);
  }
  Serial.println("Found LPS35HW chip");
  matrix.begin(0x71);
  matrix.setBrightness(0x05);  // default 0x0E
}
void loop() {
  float tempC = lps35hw.readTemperature();
  float press = lps35hw.readPressure();
  Serial.print("\nTemperature: ");
  Serial.print(tempC); Serial.println(" C");
  
  Serial.print("Pressure: ");
  Serial.print(press); Serial.println(" hPa");
  matrix.print(tempC, DEC);
  matrix.writeDisplay();
  delay(2000);
  matrix.print(press, DEC);
  matrix.writeDisplay();
  delay(5000);
}
 実行例です。
●グラフィック・ディスプレイに測定結果を表示
次の記事を参考に、グラフィック・ディスプレイに測定した温度と気圧を表示します。
Arduino UNO R4 Minimaでセンサ・インターフェーシング ⑤ 温湿度センサSi7021の測定結果をグラフィック・ディスプレイに表示
スケッチです。
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <Adafruit_LPS35HW.h>
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
#define OLED_RESET    -1 // Reset pin # (or -1 if sharing Arduino reset pin)
#define SCREEN_ADDRESS 0x3D ///< See datasheet for Address; 0x3D for 128x64, 0x3C for 128x32
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
Adafruit_LPS35HW lps35hw = Adafruit_LPS35HW();
void setup() {
  Serial.begin(115200);
  // Wait until serial port is opened
  while (!Serial) { delay(1); }
  Serial.println("Adafruit  + OLED SSD1306");
  if (!lps35hw.begin_I2C()) {
    Serial.println("Couldn't find LPS35HW chip");
    while (1);
  }
  Serial.println("Found LPS35HW chip");
  display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS);
  display.clearDisplay();
  display.drawRect(0, 0, display.width(), display.height(), SSD1306_WHITE);
  display.setTextSize(1);                // Normal 1:1 pixel scale
  display.setTextColor(SSD1306_WHITE);   // Draw white text
  display.setCursor(3,3);
  display.println("Temperature:");
  display.setCursor(4,34);
  display.println("Pressure:");
  display.display();
  delay(200);
}
void loop() {
  float tempC = lps35hw.readTemperature();
  float press = lps35hw.readPressure();
  Serial.print("\nTemperature: ");
  Serial.print(tempC); Serial.println(" C");
  
  Serial.print("Pressure: ");
  Serial.print(press); Serial.println(" hPa");
  display.setTextSize(2);   // Draw 2X-scale text
  display.setTextColor(SSD1306_WHITE);
  display.setCursor(10,17);
  display.fillRect(10, 17, 70, 16, SSD1306_BLACK);
  display.println(tempC);
  display.setCursor(10, 46);
  display.fillRect(10, 46, 100, 16, SSD1306_BLACK);
  display.println(press);
  display.display();
  delay(5000);
}
実行例です。