気温センサ(BME280)をArduino(Seeed XIOA)で使う
気温センサ(BME280)をArduino互換マイコン(Seeed XIOA)で使う方法を説明します。
使用センサ
BME280 - I2C気圧・気温センサ・湿度センサ
気圧・気温・湿度が計測できるI2C接続のセンサです。
使用マイコン
Seeeduino XIAO
Seeeduinoシリーズ最小でArm Cortex-M0+を搭載した、
低電力Arduino互換マイクロコントローラです。
表示装置
OLD128×64ドットで表示
チップはSH1106となります。
マイコンとはI2C接続します。
バッテリー
リチウムポリマバッテリー
3.7V 110mAh
接続は以下です。
I2C接続時のプルアップ抵抗はOLED側に内蔵されてるので追加していません。BME280単独で使用する際には必要になります。
XIAO - BME280
SDA - SDA :黄線
SCL - SCL :橙線
3V3 - Vin :赤線
GND - GND :茶線
XIAO - OLED
SDA - SDA :黄線
SCL - SCL :橙線
3V3 - Vin :赤線
GND - GND :茶線
XIAO - LiPoバッテリー
XIAOの裏面に接続します
VIN - 赤線
GND - 黒線
プログラム
センサーモジュール、OLEDを使うためのライブラリはスケッチ→ライブラリのインクリード→ライブラリの管理をクリックするとライブラリダイヤログが開きます。温度センサのライブラリは入力ボックスにBME280を入力すると対応するライブラリが表示されます。BME280 Libraryを選んでインストールボタンをクリックします。
センサーIDがAdafruitのものと異なるためライブラリの中のファイルAdafruit_BME280.cppの117行目をコメントにしてください
OLEDのライブラリは入力ボックスにu8g2を入力すると対応するライブラリが表示されます。u8g2 Libraryを選んでインストールボタンをクリックします。
プログラムは以下になります。
#include <Wire.h>
#include <Adafruit_BME280.h>
#include <Arduino.h>
#include <U8g2lib.h>
#define I2C_SCL 5 //
#define I2C_SDA 4 //
Adafruit_BME280 bme; // I2C
unsigned long delayTime;
U8G2_SH1106_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);
void setup() {
Serial.begin(9600);
Serial.println(F("BME280 START"));
unsigned status;
u8g2.begin();
Wire.begin(I2C_SDA, I2C_SCL);
// You can also pass in a Wire library object like &Wire2
status = bme.begin(0x76);
if (!status) {
Serial.println("Could not find a valid BME280 sensor, check wiring, address, sensor ID!");
while (1) delay(10);
}
delayTime = 1000;
Serial.println();
}
void loop() {
printValues();
printScreenValues();
delay(delayTime);
}
void printScreenValues() {
char result1[8];
char result2[8];
char result3[8];
char str1[20]="Temp= ";
char str2[20]="Pres= ";
char str3[20]="Humi= ";
char unit1[4]=" *c";
char unit2[5]=" hPa";
char unit3[3]=" %";
u8g2.clearBuffer(); // clear the internal memory
u8g2.setFont(u8g2_font_ncenB08_tr); // choose a suitable font
//u8g2.drawStr(0,10,"Hello World!");
dtostrf(bme.readTemperature(), 4, 1, result1);
strcat(str1, result1);
strcat(str1, unit1);
u8g2.drawStr(0,10,str1);
dtostrf(bme.readPressure() / 100.0F, 6, 1, result2);
strcat(str2, result2);
strcat(str2, unit2);
u8g2.drawStr(0,20,str2);
dtostrf(bme.readHumidity(), 4, 1, result3);
strcat(str3, result3);
strcat(str3, unit3);
u8g2.drawStr(0,30,str3);
u8g2.sendBuffer(); // transfer internal memory to the display
}
void printValues() {
Serial.print("Temperature = ");
Serial.print(bme.readTemperature());
Serial.println(" *C");
Serial.print("Pressure = ");
Serial.print(bme.readPressure() / 100.0F);
Serial.println(" hPa");
Serial.print("Humidity = ");
Serial.print(bme.readHumidity());
Serial.println(" %");
Serial.println();
}
OLEDの表示が始まれば書き込みが成功しています。