Arduino UNO R4 WiFiでBLE ④ 気圧センサBME280をつなぐ

 Adafruitから入手したMEMS気圧センサ BME280(ボッシュ)を利用します。

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

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

AdafruitのStemma QT/Qwiicボード

  BME280ボード解説のページ

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

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

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

 BME280のデータシート

  • 動作電圧 1.71~3.6V
  • 動作温度範囲 -40~+85℃
  • 気圧測定範囲 300~1100hPa、分解能 ±0.12hPa(±1m)
  • 温度測定範囲 -40~+85℃、確度 ±0.5℃
  • 湿度測定範囲 0~100%、確度 ±3%
  • インターフェース I2C(最大3.4MHz)、SPI(最大10MHz)
  • スレーブ・アドレス 0x77。裏面のAddrをショートして0x76に設定できる

使用環境

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

接続

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

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

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

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

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

 電源は3.3Vです。

  0x77を見つけてきました。0x3dはグラフィック・ボードのアドレスです。

ライブラリの用意

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

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

サンプル・スケッチ

 メニューのファイル->スケッチ例から、Adafruit BME280のbme280test.inoを選択し、コンパイル、実行します。

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


// This is a library for the BME280 humidity, temperature & pressure sensor
//  Designed specifically to work with the Adafruit BME280 Breakout
//  ----> http://www.adafruit.com/products/2650
//  Written by Limor Fried & Kevin Townsend for Adafruit Industries.

#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h> float tempC; float pressure; float humidity; Adafruit_BME280 bme; // I2C void setup() { Serial.begin(115200); while (!Serial) delay(10); Serial.println(F("BME280 ssd1306")); unsigned status; // default settings status = bme.begin(); // You can also pass in a Wire library object like &Wire2 // status = bme.begin(0x76, &Wire2) if (!status) { Serial.println("Could not find a valid BME280 sensor, check wiring, address, sensor ID!"); Serial.print("SensorID was: 0x"); Serial.println(bme.sensorID(),16); Serial.print(" ID of 0xFF probably means a bad address, a BMP 180 or BMP 085\n"); Serial.print(" ID of 0x56-0x58 represents a BMP 280,\n"); Serial.print(" ID of 0x60 represents a BME 280.\n"); Serial.print(" ID of 0x61 represents a BME 680.\n"); while (1) delay(10); } Serial.println(); } void loop() { printValues(); delay(1000); } void printValues() { tempC = bme.readTemperature(); pressure = bme.readPressure() / 100.0; humidity = bme.readHumidity(); Serial.print("Temperature = "); Serial.print(tempC); Serial.println(" °C"); Serial.print("Pressure = "); Serial.print( pressure); Serial.println(" hPa"); Serial.print("Humidity = "); Serial.print(humidity); Serial.println(" %"); Serial.println(); }

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

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

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

 スケッチです。


 // This is a library for the BME280 humidity, temperature & pressure sensor
//  Designed specifically to work with the Adafruit BME280 Breakout
//  ----> http://www.adafruit.com/products/2650
//  Written by Limor Fried & Kevin Townsend for Adafruit Industries.

#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>
#include <Adafruit_SSD1306.h> float tempC; float pressure; float humidity; Adafruit_BME280 bme; // I2C Adafruit_SSD1306 display = Adafruit_SSD1306(128, 64, &Wire); void setup() { Serial.begin(115200); while (!Serial) delay(10); Serial.println(F("BME280 + ssd1306")); unsigned status; // default settings status = bme.begin(); // You can also pass in a Wire library object like &Wire2 // status = bme.begin(0x76, &Wire2) if (!status) { Serial.println("Could not find a valid BME280 sensor, check wiring, address, sensor ID!"); Serial.print("SensorID was: 0x"); Serial.println(bme.sensorID(),16); Serial.print(" ID of 0xFF probably means a bad address, a BMP 180 or BMP 085\n"); Serial.print(" ID of 0x56-0x58 represents a BMP 280,\n"); Serial.print(" ID of 0x60 represents a BME 280.\n"); Serial.print(" ID of 0x61 represents a BME 680.\n"); while (1) delay(10); } Serial.println(); // 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() { printValues(); delay(1000); } void printValues() { display.clearDisplay(); display.setCursor(0, 0); tempC = bme.readTemperature(); pressure = bme.readPressure() / 100.0; humidity = bme.readHumidity(); Serial.print("Temperature = "); Serial.print(tempC); Serial.println(" °C"); Serial.print("Pressure = "); Serial.print( pressure); Serial.println(" hPa"); Serial.print("Humidity = "); Serial.print(humidity); Serial.println(" %"); Serial.println(); display.println("Temperature: - `C"); display.print(tempC, 2); display.println(""); display.println(""); display.println("Pressure: - hPa"); display.print(pressure, 1); display.println(""); display.println(""); display.println("Humidity: - %"); display.print(humidity, 1); display.display(); }

 実行例です。

前へ

Arduino UNO R4 WiFiでBLE ③ LPS22のBLEペリフェラルと接続するセントラル

次へ

Arduino UNO R4 WiFiでBLE ⑤ BME280のBLEペリフェラル