ESP32で温度・湿度・気圧センサー「BME280」を使う(I2C)
この記事では、ESP32に温度・湿度・気圧が測定できる万能センサ「BME280」を接続して、測定値を取得する方法を紹介します。
今回の成果物はこんな感じ。1秒おきに周囲の環境を出力してくれます。
接続はI2Cで、結線もかなり簡単です!
事前準備
以下の部品を用意してください。BME280はAmazonで簡単に手に入れることができます(もちろん秋月電子などにもあります)。
BME280のライブラリインストール
BME280を動かすにはライブラリが必要です。様々な提供者により多種多様なライブラリが提供されていますが、今回はAdafruit BME280 Libraryを使いました。
- ライブラリマネージャからBME280と検索してライブラリをインストールする。
- 同様に「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という便利なサービスで作っていきます!
目次
ESP32で温度・湿度・気圧センサー「BME280」を使う(I2C)
この記事では、ESP32に温度・湿度・気圧が測定できる万能センサ「BME280」を接続して、測定値を取得する方法を紹介します。
今回の成果物はこんな感じ。1秒おきに周囲の環境を出力してくれます。
接続はI2Cで、結線もかなり簡単です!
事前準備
以下の部品を用意してください。BME280はAmazonで簡単に手に入れることができます(もちろん秋月電子などにもあります)。
BME280のライブラリインストール
BME280を動かすにはライブラリが必要です。様々な提供者により多種多様なライブラリが提供されていますが、今回はAdafruit BME280 Libraryを使いました。
回路
BME280には様々なタイプの基板がありますが、ESP32との結線は基本的に以下の通りです。
特にプルアップが必要かどうかは動作にかかわってくるので、よく確認してください。基板についていない場合、数kΩの抵抗をSCL,SDA-3.3V間に挟みます。
プログラム(コピペで動く)
回路ができたら、以下のプログラムをコンパイルして書き込んでみましょう!
解説
ライブラリのインクルードとbmeオブジェクト
Wire.hはI2C接続に、その下の2つはセンサーの値の取得に使われるライブラリです。4行目ではセンサーの値を取得するオブジェクト
bme
を生成しています。これにbme.hoghoge()
のようにして、センサーの値にアクセスします。初期設定
コメントの通りです。I2Cのアドレスですが、各商品ページに記載されています。私の場合は0x76でしたので上記のように設定しました。
メインプログラム
こちらはほぼ見たままですね!先程も説明しましたが、bme280から値を取得するにはbmeオブジェクトの関数(メソッド)を呼び出すだけでOKです。
温度取得には
.readTemperature()
,気圧取得にはreadPressure()
,湿度取得には.readHumidity()
メソッドを使います。.readPressure()
で取得される気圧は当然Pa単位なので、hPa単位にするには100で割ります。まとめ
今回はI2C接続を使ってBME280の値をESP32から取得しました。
どちらかといえばArduino的な使い方をしましたね。次回はこのセンサーを使って、ESP32にしかできないWeb上で見れる温度・湿度・気圧グラフをAmbientという便利なサービスで作っていきます!