ESP32で温度・湿度・気圧センサー「BME280」を使う(I2C)

ESP32で温度・湿度・気圧センサー「BME280」を使う(I2C)

この記事では、ESP32に温度・湿度・気圧が測定できる万能センサ「BME280」を接続して、測定値を取得する方法を紹介します。

今回の成果物はこんな感じ。1秒おきに周囲の環境を出力してくれます。

接続はI2Cで、結線もかなり簡単です!

事前準備

以下の部品を用意してください。BME280はAmazonで簡単に手に入れることができます(もちろん秋月電子などにもあります)。

BME280のライブラリインストール

BME280を動かすにはライブラリが必要です。様々な提供者により多種多様なライブラリが提供されていますが、今回はAdafruit BME280 Libraryを使いました。

  1. ライブラリマネージャからBME280と検索してライブラリをインストールする。
  2. 同様に「Adafruit_sensor」と調べてAdafruit United Sensorというライブラリをインストールする

回路

BME280には様々なタイプの基板がありますが、ESP32との結線は基本的に以下の通りです。

BME280 ESP32 備考
SCL/SCK GPIO22 基板に抵抗が付いていない場合プルアップの必要あり
SDA GPIO21 基板に抵抗が付いていない場合プルアップの必要あり
SDO GND I2CかSPIかを決めるピン。GNDでI2C。
VCC 3.3V 3.3Vを流すこと。ロジックレベルがこれで決まっているので5Vを繋ぐと壊れる。
GND GND

特にプルアップが必要かどうかは動作にかかわってくるので、よく確認してください。基板についていない場合、数kΩの抵抗をSCL,SDA-3.3V間に挟みます。

プログラム(コピペで動く)

回路ができたら、以下のプログラムをコンパイルして書き込んでみましょう!

#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>
Adafruit_BME280 bme;

float temp;
float pressure;
float humid;

void setup() {
  Serial.begin(115200);
  bool status;
  status = bme.begin(0x76);  
  while (!status) {
    Serial.println("BME280 sensorが使えません");
    delay(1000);
  }
}
void loop() { 
  temp=bme.readTemperature();
  pressure=bme.readPressure() / 100.0F;
  humid=bme.readHumidity();
  Serial.print("温度 ;");
  Serial.print(temp);
  Serial.println(" °C");
   
  Serial.print("気圧 ;");
  Serial.print(pressure);
  Serial.println(" hPa");
  Serial.print("湿度 ;");
  Serial.print(humid);
  Serial.println(" %");
  Serial.println();
  delay(1000);
}

解説

ライブラリのインクルードとbmeオブジェクト

#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>
Adafruit_BME280 bme;

Wire.hはI2C接続に、その下の2つはセンサーの値の取得に使われるライブラリです。4行目ではセンサーの値を取得するオブジェクトbmeを生成しています。これにbme.hoghoge()のようにして、センサーの値にアクセスします。

初期設定

float temp;    //温度を入れる変数
float pressure;    //気圧を入れる関数
float humid;    //湿度を入れる関数

void setup() {
  Serial.begin(115200);
  bool status;
  status = bme.begin(0x76);  //bmeオブジェクトにI2Cのアドレス0x76をセット
  while (!status) {
    Serial.println("BME280 sensorが使えません");    //bme280と通信できるまで待つ
    delay(1000);
  }
}

コメントの通りです。I2Cのアドレスですが、各商品ページに記載されています。私の場合は0x76でしたので上記のように設定しました。

メインプログラム

void loop() { 
  temp=bme.readTemperature();
  pressure=bme.readPressure() / 100.0F;
  humid=bme.readHumidity();
  Serial.print("温度 ;");
  Serial.print(temp);
  Serial.println(" °C");
   
  Serial.print("気圧 ;");
  Serial.print(pressure);
  Serial.println(" hPa");
  Serial.print("湿度 ;");
  Serial.print(humid);
  Serial.println(" %");
  Serial.println();
  delay(1000);
}

こちらはほぼ見たままですね!先程も説明しましたが、bme280から値を取得するにはbmeオブジェクトの関数(メソッド)を呼び出すだけでOKです。

温度取得には.readTemperature(),気圧取得にはreadPressure(),湿度取得には.readHumidity()メソッドを使います。

.readPressure()で取得される気圧は当然Pa単位なので、hPa単位にするには100で割ります

まとめ

今回はI2C接続を使ってBME280の値をESP32から取得しました。
どちらかといえばArduino的な使い方をしましたね。次回はこのセンサーを使って、ESP32にしかできないWeb上で見れる温度・湿度・気圧グラフAmbientという便利なサービスで作っていきます!

コメントする

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

Exit mobile version