だいぶ前に、amazonで圧力センサーモジュールのBMP280↓を買っておいた。
送料込みで153円という超破格値。
送料を除いたら一体何円残るのか?と心配してしまう。

ちなみに、おじさんはBMP280(気圧センサ)を使ったことが無い
使ったことが無いので、試してみなければならない。
今回は、これとPico Wを使ってセンサーIoTを ちょっこと作ってみたい。
気圧だけだとつまらないので、SCD40を使ってCO2、温湿度も測ってスマホから確認できるように仕立ててみる。
SCD40はAli-Expressで1600円くらいで買える。以前よりは安くなったが、まだお高い。
CPUボードはRaspberry Pi Pico Wを使う。前に試したけど基板が大きくて使いにくい感じがして、そのまま放置していた。今回はこれを有効活用。
今回の回路図はこちら↓
I2Cで繋いだだけの簡単な物

ブレッドボードでこんな感じ。
中央の上側の小型基板がBMP280モジュール
中央の下側がSCD40モジュール

1.3インチのOLEDを使った。(コントローラーがSH1106のもの)
最初に書いた通り、おじさんはBMP280を使ったことが無い。
ネットで検索すると、BMP280を使った記事がたくさん出てくるので、ありがたく参考にさせていただく。ライブラリを使えば簡単らしい。
まず、Adafruit_BMP280.hをインストール(依存関係も全てインストール)

BMP280のテスト用のコードをChatGPTにお願いして書いてもらった。
#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BMP280.h>
Adafruit_BMP280 bmp;
void setup() {
Serial.begin(115200);
while (!Serial); // USBシリアルの初期化待ち
// I2Cの初期化(Picoではピン番号を指定可能)
Wire.setSDA(12); // GP12 = SDA
Wire.setSCL(13); // GP13 = SCL
Wire.begin();
// BMP280の初期化(アドレスは 0x76 または 0x77)
if (!bmp.begin(0x76)) {
Serial.println("BMP280が見つかりません。アドレスや配線を確認してください。");
while (1); // 停止
}
Serial.println("BMP280 初期化成功!");
}
void loop() {
float pressure = bmp.readPressure() / 100.0F; // hPa
float temperature = bmp.readTemperature(); // °C
Serial.print("気圧: ");
Serial.print(pressure);
Serial.println(" hPa");
Serial.print("温度: ");
Serial.print(temperature);
Serial.println(" °C");
delay(1000);
}
おお、ちゃんと動く。
シリアルモニタで、気圧と温度を1秒ごとに更新して表示される。

もう一つのセンサであるSCD40は以前におじさんが使ったことが有る↓
この記事に有るようにSensirion I2C SCD4x ライブラリを使っても良いが、別に短いコードで動くことが分かっていたので、こちらを使う
変数を宣言
//-------- SCD40 sensor -------
float humidity, temp, CO2_data;
uint8_t data[12];
//
測定値の読み込みと、測定開始と停止のコード
//----------------------------------
// 温湿度、CO2濃度を取得
//----------------------------------
void CO2_read(){
int counter;
//
// send read data command
Wire.beginTransmission(SCD_ADDRESS);
Wire.write(0xec);
Wire.write(0x05);
Wire.endTransmission();
// read measurement data: 2 bytes co2, 1 byte CRC,
// 2 bytes T, 1 byte CRC, 2 bytes RH, 1 byte CRC,
// 2 bytes sensor status, 1 byte CRC
// stop reading after 12 bytes (not used)
// other data like ASC not included
Wire.requestFrom(SCD_ADDRESS, 12);
counter = 0;
while (Wire.available()) {
data[counter++] = Wire.read();
}
// floating point conversion according to datasheet
CO2_data = (float)((uint16_t)data[0] << 8 | data[1]);
// convert T in degC
temp = -45 + 175 * (float)((uint16_t)data[3] << 8 | data[4]) / 65536;
// convert RH in %
humidity = 100 * (float)((uint16_t)data[6] << 8 | data[7]) / 65536;
}
//
//==========================================
// stop scd measurement
//==========================================
//
void stop_SCD_measurement(){
Wire.beginTransmission(SCD_ADDRESS);
Wire.write(0x3f);
Wire.write(0x86);
Wire.endTransmission();
// wait for sensor
delay(20);
}
//===========================================
// start scd measurement in periodic mode, will update every 5 s
//===========================================
//
void start_SCD_measurement(){
Wire.beginTransmission(SCD_ADDRESS);
Wire.write(0x21);
Wire.write(0xb1);
Wire.endTransmission();
}
で動かすと、こんな感じで表示

最近、efontを使うことを覚えたので、日本語で表示。
とりあえず、基本的な動作確認が出来た。
次はWiFiを有効にして、Webブラウザから測定値を読めるようにしたい。
全体のコードはこちら↓ 興味のある方はどうぞ
Sensor_IoT_v0_1
「また、にゃにか作っているようだニャ」
