Arduino UNO R4 Minimaでセンサ・インターフェーシング ⑳ 気圧センサ MS8607

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

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

AdafruitのStemma QT/Qwiicボード

 MS8607ボード解説のページ

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

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

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

 MS8607のデータシート

  • 電源電圧  1.5~3.6V
  • 気圧測定範囲 300~1200mbar、確度±2mbar、分解能±0.016mbar
  • 湿度測定範囲 0~100%RH、確度±3%RH、分解能±0.04%RH
  • 温度測定範囲 -40~85℃、確度±1℃、分解能±0.002℃
  • インターフェース I2C(0~400kHz)
  • スレーブ・アドレス 0x40(固定、湿度)、0x76(固定、温度と気圧)

使用環境

  • Arduino UNO R4 Minima
  • Arduino IDE 2.2.1
  • Windows10 22H2

接続

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

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

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

  0x40と0x76を見つけてきました。

 


ライブラリの用意

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

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


サンプル・スケッチ

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

コンパイル、実行します。

 

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_MS8607.h>
#include <Adafruit_Sensor.h> Adafruit_7segment matrix = Adafruit_7segment(); Adafruit_MS8607 ms8607; void setup(void) { Serial.begin(115200); while (!Serial) delay(10); // will pause Zero, Leonardo, etc until serial console opens Serial.println("MS8607 + 7seg LED"); // Try to initialize! if (!ms8607.begin()) { Serial.println("Failed to find MS8607 chip"); while (1) { delay(10); } } Serial.println("MS8607 Found!"); ms8607.setHumidityResolution(MS8607_HUMIDITY_RESOLUTION_OSR_8b); Serial.print("Humidity resolution set to "); switch (ms8607.getHumidityResolution()){ case MS8607_HUMIDITY_RESOLUTION_OSR_12b: Serial.println("12-bit"); break; case MS8607_HUMIDITY_RESOLUTION_OSR_11b: Serial.println("11-bit"); break; case MS8607_HUMIDITY_RESOLUTION_OSR_10b: Serial.println("10-bit"); break; case MS8607_HUMIDITY_RESOLUTION_OSR_8b: Serial.println("8-bit"); break; } // ms8607.setPressureResolution(MS8607_PRESSURE_RESOLUTION_OSR_4096); Serial.print("Pressure and Temperature resolution set to "); switch (ms8607.getPressureResolution()){ case MS8607_PRESSURE_RESOLUTION_OSR_256: Serial.println("256"); break; case MS8607_PRESSURE_RESOLUTION_OSR_512: Serial.println("512"); break; case MS8607_PRESSURE_RESOLUTION_OSR_1024: Serial.println("1024"); break; case MS8607_PRESSURE_RESOLUTION_OSR_2048: Serial.println("2048"); break; case MS8607_PRESSURE_RESOLUTION_OSR_4096: Serial.println("4096"); break; case MS8607_PRESSURE_RESOLUTION_OSR_8192: Serial.println("8192"); break; } Serial.println(""); matrix.begin(0x71); matrix.setBrightness(0x05); // default 0x0E } void loop() { sensors_event_t temp, pressure, humidity; ms8607.getEvent(&pressure, &temp, &humidity); float tempC = temp.temperature; float press = pressure.pressure; float humi = humidity.relative_humidity; Serial.print("Temperature: ");Serial.print(tempC); Serial.println(" degrees C"); Serial.print("Pressure: ");Serial.print(press); Serial.println(" hPa"); Serial.print("Humidity: ");Serial.print(humi); Serial.println(" %rH"); Serial.println(""); matrix.print(tempC, DEC); matrix.writeDisplay(); delay(2000); matrix.print(press, DEC); matrix.writeDisplay(); delay(2000); matrix.print(humi, DEC); matrix.writeDisplay(); delay(5000); }


 実行例です。

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

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

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

 スケッチです。


#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <Adafruit_MS8607.h>
#include <Adafruit_Sensor.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_MS8607 ms8607; void setup(void) { Serial.begin(115200); while (!Serial) delay(10); // will pause Zero, Leonardo, etc until serial console opens Serial.println("MS8607 + OLED SSD1306"); // Try to initialize! if (!ms8607.begin()) { Serial.println("Failed to find MS8607 chip"); while (1) { delay(10); } } Serial.println("MS8607 Found!"); ms8607.setHumidityResolution(MS8607_HUMIDITY_RESOLUTION_OSR_8b); Serial.print("Humidity resolution set to "); switch (ms8607.getHumidityResolution()){ case MS8607_HUMIDITY_RESOLUTION_OSR_12b: Serial.println("12-bit"); break; case MS8607_HUMIDITY_RESOLUTION_OSR_11b: Serial.println("11-bit"); break; case MS8607_HUMIDITY_RESOLUTION_OSR_10b: Serial.println("10-bit"); break; case MS8607_HUMIDITY_RESOLUTION_OSR_8b: Serial.println("8-bit"); break; } // ms8607.setPressureResolution(MS8607_PRESSURE_RESOLUTION_OSR_4096); Serial.print("Pressure and Temperature resolution set to "); switch (ms8607.getPressureResolution()){ case MS8607_PRESSURE_RESOLUTION_OSR_256: Serial.println("256"); break; case MS8607_PRESSURE_RESOLUTION_OSR_512: Serial.println("512"); break; case MS8607_PRESSURE_RESOLUTION_OSR_1024: Serial.println("1024"); break; case MS8607_PRESSURE_RESOLUTION_OSR_2048: Serial.println("2048"); break; case MS8607_PRESSURE_RESOLUTION_OSR_4096: Serial.println("4096"); break; case MS8607_PRESSURE_RESOLUTION_OSR_8192: Serial.println("8192"); break; } Serial.println(""); 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(79,3); display.println("Humidity"); display.setCursor(4,34); display.println("Pressure:"); display.display(); delay(200); } void loop() { sensors_event_t temp, pressure, humidity; ms8607.getEvent(&pressure, &temp, &humidity); float tempC = temp.temperature; float press = pressure.pressure; float humi = humidity.relative_humidity; Serial.print("Temperature: ");Serial.print(tempC); Serial.println(" degrees C"); Serial.print("Pressure: ");Serial.print(press); Serial.println(" hPa"); Serial.print("Humidity: ");Serial.print(humi); Serial.println(" %rH"); Serial.println(""); 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(80,17); display.fillRect(80, 17, 46, 16, SSD1306_BLACK); display.println(humi,1); display.setCursor(10, 46); display.fillRect(10, 46, 100, 16, SSD1306_BLACK); display.println(press); display.display(); delay(5000); }

 実行例です。

前へ

Arduino UNO R4 Minimaでセンサ・インターフェーシング ⑲ 気圧センサ DPS310

次へ

Arduino UNO R4 Minimaでセンサ・インターフェーシング ㉑ 気圧センサ LPS22