Arduino UNO R4 WiFiでBLE ① 気圧センサLPS22をつなぐ

 Adafruitから入手したMEMS気圧センサ LPS22HB(STMicroelectronics)を利用します。

 気圧温度が測定できます。

 マイコン・ボードArduino UNO R4 WiFiは、Wi-FiとBLEの無線通信をサポートしています。3回にわたって、BLEで送信と受信を行います。

AdafruitのStemma QT/Qwiicボード

  LPS22ボード解説のページ

 Stemma QT/Qwiic(JST SH 4ピン)コネクタは2か所に装着されていて、どちらにつないでもかまいません。このコネクタを使ってI2Cで制御する場合、特に、ジャンパ線をつなぐなどは不要です。

 コネクタは、表と裏のどちらも差し込めそうですが、ピンが内部の上部に並んでいるので、差し込める方向は一意です。ロック機構はないですが、すぐに抜けるということはありません。

気圧センサLPS22のおもなスペック

 LPS22HBのデータシートはこの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 WiFi
  • Arduino IDE 2.2.1
  • Windows10 22H2

接続

 Arduino UNO R4 WiFiのI2C信号とセンサ・ボードをJSTコネクタでつなぎます(Stemma QT/Qwiicボードの写真の比率は異なる)。

スレーブ・アドレスを確認

 従来からよく使われているi2cScanner.inoを動かしてスレーブ・アドレスを確認します。

 このマイコン・ボードには、Qwiic専用コネクタが用意されていますが、LPS22は認識されませんでした。

2024/01/30)Qwiic専用コネクタには、このボードにある二つのバスの内 2番目のバスに接続されています。

   Arduino UNO R4 WiFi Qwiic コネクタ

Wire1.begin();
libraryName.begin( Wire1 );

のように、記述することになる。未確認。

(追記終わり)

 I/O端子のSCLとSDA端子、電源端子を利用し、Stemma QT/Qwiicコネクタを取り付けます。

 電源は3.3Vです。

  0x5dを見つけてきました。

ライブラリの用意

 LPS22で検索して、見つかったAdafruit LPS2Xライブラリをインストールします。

 インストールを始めたとき、関連のライブラリや依存関係をインストールするかというパネルが出た場合は、全てをインストールを選びます。

サンプル・スケッチ

 メニューのファイル->スケッチ例から、Adafruit LPS2Xのadafruit_lps22_test.inoを選択し、

コンパイル、実行します。実行時の最初に表示される値は正しくないようなので、読み捨ててください。

 温度は、ほかの温度センサに比べて、+2±0.5℃と高めです。

 SPI関連を取り除き、I2Cの記述だけ残したスケッチです。


// Basic demo for pressure readings from Adafruit LPS2X
#include <Wire.h>
#include <Adafruit_LPS2X.h>
#include <Adafruit_Sensor.h> Adafruit_LPS22 lps; void setup(void) { Serial.begin(115200); while (!Serial) delay(10); // will pause Zero, Leonardo, etc until serial console opens Serial.println("Adafruit LPS22 test!"); // Try to initialize! if (!lps.begin_I2C()) { Serial.println("Failed to find LPS22 chip"); while (1) { delay(10); } } Serial.println("LPS22 Found!"); lps.setDataRate(LPS22_RATE_10_HZ); Serial.print("Data rate set to: "); switch (lps.getDataRate()) { case LPS22_RATE_ONE_SHOT: Serial.println("One Shot / Power Down"); break; case LPS22_RATE_1_HZ: Serial.println("1 Hz"); break; case LPS22_RATE_10_HZ: Serial.println("10 Hz"); break; case LPS22_RATE_25_HZ: Serial.println("25 Hz"); break; case LPS22_RATE_50_HZ: Serial.println("50 Hz"); break; case LPS22_RATE_75_HZ: Serial.println("75 Hz"); break; } } void loop() { sensors_event_t temp; sensors_event_t pressure; lps.getEvent(&pressure, &temp);// get pressure float tempC = temp.temperature; float press = pressure.pressure; Serial.print("Temperature: ");Serial.print(temp.temperature);Serial.println(" degrees C"); Serial.print("Pressure: ");Serial.print(pressure.pressure);Serial.println(" hPa"); Serial.println(""); delay(5000); }

グラフィック・ディスプレイに測定結果を表示

 次の記事を参考に、グラフィック・ディスプレイに測定した温度と気圧を表示します。

  Arduino UNO R4 Minimaでセンサ・インターフェーシング ⑤ 温湿度センサSi7021の測定結果をグラフィック・ディスプレイに表示

 スケッチです。


 // Basic demo for pressure readings from Adafruit LPS2X
#include <Wire.h>
#include <Adafruit_LPS2X.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_SSD1306.h> Adafruit_LPS22 lps; Adafruit_SSD1306 display = Adafruit_SSD1306(128, 64, &Wire); void setup(void) { Serial.begin(115200); while (!Serial) delay(10); // will pause Zero, Leonardo, etc until serial console opens Serial.println("Adafruit LPS22 + ssd1306"); // Try to initialize! if (!lps.begin_I2C()) { Serial.println("Failed to find LPS22 chip"); while (1) { delay(10); } } Serial.println("LPS22 Found!"); lps.setDataRate(LPS22_RATE_10_HZ); Serial.print("Data rate set to: "); switch (lps.getDataRate()) { case LPS22_RATE_ONE_SHOT: Serial.println("One Shot / Power Down"); break; case LPS22_RATE_1_HZ: Serial.println("1 Hz"); break; case LPS22_RATE_10_HZ: Serial.println("10 Hz"); break; case LPS22_RATE_25_HZ: Serial.println("25 Hz"); break; case LPS22_RATE_50_HZ: Serial.println("50 Hz"); break; case LPS22_RATE_75_HZ: Serial.println("75 Hz"); break; } // SSD1306_SWITCHCAPVCC = generate display voltage from 3.3V internally if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3D)) { // Address 0x3C for 128x32 Serial.println(F("SSD1306 allocation failed")); for (;;) ; // Don't proceed, loop forever } display.display(); delay(500); // Pause for 2 seconds display.setTextSize(1); display.setTextColor(WHITE); display.setRotation(0); display.clearDisplay(); } void loop() { display.clearDisplay(); display.setCursor(0, 0); sensors_event_t temp; sensors_event_t pressure; lps.getEvent(&pressure, &temp);// get pressure Serial.print("Temperature: ");Serial.print(temp.temperature);Serial.println(" degrees C"); Serial.print("Pressure: ");Serial.print(pressure.pressure);Serial.println(" hPa"); Serial.println(""); display.println("Temperature: - `C"); display.print(temp.temperature, 2); display.println(""); display.println(""); display.println("Pressure: - hPa"); display.print(pressure.pressure, 1); display.display(); delay(5000); }

 実行例です。

前へ

Arduino UNO R4 Minimaでセンサ・インターフェーシング ㊳ IMU LSM6DSOX

次へ

Arduino UNO R4 WiFiでBLE ② LPS22のBLEペリフェラル