![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh8UrERVUSEiz3-XVcTUt5yKoldQ0vkE8XFVyHcsAJJ94ncOjhRylPUtrG4ttZIgkYThIhrleCD0TRiJkvOhwz234d2QrknmXi0hdzb-g8pvLdVdvD7AxuaZ3LaW4t8dkUmkW5QAGagbVYr/s640/200726_BME280_Arduino_3.jpg)
最近スープラの電飾が頓挫しましたどうもこんにちは
その反省を活かすためにいろいろと(物資とか)準備中です。
準備ができるまでの間は電子工作に時間を割いているのですが、今Arduinoに大ハマり中です。(Arduino自体を基板発注から作ろうとも思っています)
で、今回やってみたのは「BME280」を使った簡易的な温度、湿度、気圧計です。
OLEDディスプレイでこの3つの値を確認できるようにします。
【目次】
用意した物
- BME280搭載モジュール-Amazon
- OLED(SSD1306ドライバ)-Amazon
- Arduino MEGA2560 r3互換機(UNOとかでもOK)-Amazon
- AE-PCA9306(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 件のコメント :
コメントを投稿