お父にゃんの電子工作 -30ページ目

お父にゃんの電子工作

暇なおじさんが、電子工作(主にラジオ製作)をして勝手な感想を書く

だいぶ前に、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

 

「また、にゃにか作っているようだニャ」