BME280をArduinoで動かしてみる(電子工作)


最近スープラの電飾が頓挫しましたどうもこんにちは

その反省を活かすためにいろいろと(物資とか)準備中です。

準備ができるまでの間は電子工作に時間を割いているのですが、今Arduinoに大ハマり中です。(Arduino自体を基板発注から作ろうとも思っています)

で、今回やってみたのは「BME280」を使った簡易的な温度、湿度、気圧計です。

OLEDディスプレイでこの3つの値を確認できるようにします。


【目次】

用意した物

  • BME280搭載モジュール-Amazon
  • OLED(SSD1306ドライバ)-Amazon
  • Arduino MEGA2560 r3互換機(UNOとかでもOK)-Amazon
  • AE-PCA9306(I2Cレベル変換)-秋月電子

ArduinoMEGAは手持ちのUNOが他の用事で使えなかったので使いましたがMEGAである必要は全くなし。

あとはブレッドボードとかジャンパー線も必要です。


配線


回路図(配線図)です。


使用するBME280は3.3V、OLEDディスプレイとArduinoは5VなのでI2Cレベル変換を間に挟む必要があります。

そこを除けば非常にシンプルだと思います。



プログラム

プログラムです。
プログラミングに関して何の知識もないのでおかしなところ、意味のないところがあると思います。
このプログラムを使用したことによる事故等の責任は負いませんので

#include <Adafruit_SSD1306.h>
#include <Adafruit_GFX.h>
#include <SparkFunBME280.h>
#include <Wire.h> //I2Cライブラリ

#define BME280_ADRS 0x76 //SDOをGNDに落としているので0x76、+3.3Vに繋いだ場合は0x77。
#define OLED_ADRS 0x3C

Adafruit_SSD1306 display(-1);
BME280 BMESensor;

void setup() {
  Wire.begin(); //I2Cのリセット
  INIT_OLED(); //OLEDの初期化と準備
  INIT_BME280(); //BME280の初期化
}

void loop() {
  display.fillRect(32,2,93,18,BLACK); //温度表示を消去
  display.fillRect(32,24,93,18,BLACK); //湿度表示を消去
  display.fillRect(32,45,93,18,BLACK); //気圧表示を消去
  
  display.setTextSize(2); //文字サイズを指定
  display.setTextColor(WHITE); //文字色を指定
  display.setCursor(32,2); //カーソルの座標を指定
  display.print(String(BMESensor.readTempC(),1)+""); //温度を取得

  display.setCursor(32,24);
  display.print(String(BMESensor.readFloatHumidity(),0)+"%"); //湿度を取得

  display.setCursor(32,45);
  display.print(String(BMESensor.readFloatPressure()/100.0,0)+"hPa"); //気圧を取得

  display.display(); //ディスプレイを更新
  delay(5000); //5秒間隔で更新
}

void INIT_BME280(void) //BME280の初期化関数
{
  BMESensor.setI2CAddress(BME280_ADRS); //アドレス指定
  BMESensor.beginI2C(); //センサーと通信開始

  //データシート参照
  BMESensor.setFilter(1); //0 to 4 See 3.4.4
  BMESensor.setStandbyTime(0); //0 to 7 See table 27.
  BMESensor.setTempOverSample(1); //0 to 16 See table 24.
  BMESensor.setPressureOverSample(1); //0 to 16 See table 23.
  BMESensor.setHumidityOverSample(1); //0 to 16 See table 19.
  
  BMESensor.setMode(MODE_NORMAL); //動作モード選択。MODE_SLEEP, MODE_FORCED, MODE_NORMAL is valid. See 3.3
}

void INIT_OLED(void) //OLEDの初期化と準備。128*64
{
  display.begin(SSD1306_SWITCHCAPVCC,0x3C); //初期化
  display.clearDisplay(); //ディスプレイクリア
  display.setCursor(0,0); //枠の表示
  display.setTextColor(WHITE);
  display.drawLine(0,0,127,0,WHITE); //横線
  display.drawLine(0,21,127,21,WHITE);
  display.drawLine(0,42,127,42,WHITE);
  display.drawLine(0,63,127,63,WHITE);
  display.drawLine(0,0,0,63,WHITE); //縦線
  display.drawLine(127,0,127,63,WHITE);

  display.setTextSize(1); //Tempを表示
  display.setTextColor(WHITE);
  display.setCursor(1,1);
  display.print("Temp");

  display.setTextSize(1); //Humidを表示
  display.setTextColor(WHITE);
  display.setCursor(1,22);
  display.print("Humid");

  display.setTextSize(1); //Pressを表示
  display.setTextColor(WHITE);
  display.setCursor(1,43);
  display.print("Press");

  display.display();
}

一部SparkFunBME280.hライブラリのサンプルプログラムを利用しています(”データシート参照”の部分です)

これで以下のような感じで動作します。


本当は「℃」も表示したかったのですが、OLEDのライブラリが対応していないので出来ませんでした。
自分でフォントを用意しないといけませんね。

撮影時点ではエアコンを25度設定で動かしていました。
BME280の数値が25.4℃、60%、1009hPaです。
温湿度計機能のあるCITIZEN製デジタル時計は23.6℃、66%を示していました。

温湿度に関しては校正された物を持っていないのでどちらが正しいのかは分かりません。
気圧に関しては気象庁の情報が見れますし、撮影時点で1011hPaだったようなのでこちらは校正できそうです。


ということでおしまい
次は雷センサーを作ろうと思います。

実は現在進行形で、雷センサー自体は形になったのですがRTCを組み込むのに手こずっています。
そのあたりが解決したら更新しようかなぁと

0 件のコメント :

コメントを投稿