以下の記事の続きになります。
●Arduino MKR WiFi 1010 で Groveモジュールを使う(Arduino MKR Connector Carrier を利用、Grove - Gesture のお試し) - Qiita
https://qiita.com/youtoy/items/6f1cea34457d0dd547da
前回のジェスチャーセンサーに引き続き、以下のCO2濃度・温湿度センサーを試してみた話です。
●Grove - CO2 & Temperature & Humidity Sensor (SCD30) - Seeed Wiki
https://wiki.seeedstudio.com/Grove-CO2_Temperature_Humidity_Sensor-SCD30/
下準備
まずは、Arduino MKR WiFi 1010 でサンプルの Blink などが実行できる状態にしておきます。
詳細については、前回の記事の「とりあえずの動作確認」の部分などをご参照ください。
「Grove - CO2 & Temperature & Humidity Sensor (SCD30) 」を動作させる
ライブラリの準備
以下のライブラリを利用すれば良さそうです。
●Seeed-Studio/Seeed_SCD30: carbon dioxide sensor
https://github.com/Seeed-Studio/Seeed_SCD30
公式の以下の手順に従って、ライブラリを追加します。
ZIPファイルをダウンロードし、Arduino IDE上でファイル指定で読み込む、という流れです。
●How to install an Arduino library - Seeed Wiki
https://wiki.seeedstudio.com/How_to_install_Arduino_Library/
Groveケーブルの接続
公式の Wiki を見ると I2C での接続になるようです。
前回使った「Grove - Gesture」と同じように「TWI」と書かれたところに接続します。
Arduino MKR Connector Carrier の場合はあ、以下のような感じになりました。
— you (@youtoy) October 25, 2021
プログラム
プログラムは、公式の Wiki のものを使います。
特に書きかえなどはせず、そのまま使ってみます。
#include "SCD30.h"
#if defined(ARDUINO_ARCH_AVR)
#pragma message("Defined architecture for ARDUINO_ARCH_AVR.")
#define SERIAL Serial
#elif defined(ARDUINO_ARCH_SAM)
#pragma message("Defined architecture for ARDUINO_ARCH_SAM.")
#define SERIAL SerialUSB
#elif defined(ARDUINO_ARCH_SAMD)
#pragma message("Defined architecture for ARDUINO_ARCH_SAMD.")
#define SERIAL SerialUSB
#elif defined(ARDUINO_ARCH_STM32F4)
#pragma message("Defined architecture for ARDUINO_ARCH_STM32F4.")
#define SERIAL SerialUSB
#else
#pragma message("Not found any architecture.")
#define SERIAL Serial
#endif
void setup()
{
Wire.begin();
SERIAL.begin(115200);
SERIAL.println("SCD30 Raw Data");
scd30.initialize();
}
void loop()
{
float result[3] = {0};
if(scd30.isAvailable())
{
scd30.getCarbonDioxideConcentration(result);
SERIAL.print("Carbon Dioxide Concentration is: ");
SERIAL.print(result[0]);
SERIAL.println(" ppm");
SERIAL.println(" ");
SERIAL.print("Temperature = ");
SERIAL.print(result[1]);
SERIAL.println(" ℃");
SERIAL.println(" ");
SERIAL.print("Humidity = ");
SERIAL.print(result[2]);
SERIAL.println(" %");
SERIAL.println(" ");
SERIAL.println(" ");
SERIAL.println(" ");
}
delay(2000);
}
動作させた結果
公式のサンプルプログラムをそのまま動作させて、シリアルモニタの表示を確認してみます。
そうすると、以下のように二酸化炭素濃度と温湿度の値が表示されていました。
「Grove - CO2 & Temperature & Humidity Sensor (SCD30) 」のお試しの続き。
— you (@youtoy) October 25, 2021
無事、シリアルモニタ上で「二酸化炭素濃度・温湿度」の値が得られました。
気温のほうは、別の温湿度計の値とわりとズレてる感じがするけど、どちらが正しいんだろう? pic.twitter.com/WNzrWA66sv
ググってみた情報によると、二酸化炭素濃度の値は 1000 ppm を下回っているので、良好ということらしいです。
そして、ふと「これってキャリブレーションとか必要ないのかな?」と思ってみたりなど(仕様や説明を、もう少し見てみなければ...)。
【追記】 キャリブレーションについて
「これってキャリブレーションとか必要ないのかな?」とツイートもしていたのですが、それについて自分で調べ始める前に、ツイートにコメントをいただきました。
GitHubに
— kn1cht / けいえぬ (@kn1cht) October 25, 2021
> The sensor has to be exposed to fresh air for at least 1 hour every day.
と書いてあるので自動キャリブレーションされるようです。毎日外気と同じ400ppmになる環境(夜間は人がいない、定期的に窓開け換気するなど)に置いてあれば大丈夫です
おわりに
前回に引き続き、Arduino MKR Connector Carrier を使った Groveモジュール利用の軽いお試しをしてみました。
Groveモジュールを使うと、センサーとボードの接続も、プログラムの作成も楽に進められて良い感じです。
【追記】 他のモジュールを試した話
Grove - 3-Axis Digitial Compass v2.0
以下も試してみました。
●Grove - 3-Axis Digitial Compass v2.0 - Seeed Wiki
https://wiki.seeedstudio.com/Grove-3-Axis_Digitial_Compass_v2.0/
ライブラリはこちらです。
●Seeed-Studio/Grove_3_Axis_Compass_V2.0_BMM150: Bosch BMM150 3 axis compass sensor Arduino library
https://github.com/Seeed-Studio/Grove_3_Axis_Compass_V2.0_BMM150
プログラムは、公式の Wiki に書かれたものそのままです。
#include <Arduino.h>
#include <Wire.h>
// libraries
#include "bmm150.h"
#include "bmm150_defs.h"
BMM150 bmm = BMM150();
void setup()
{
Serial.begin(9600);
if(bmm.initialize() == BMM150_E_ID_NOT_CONFORM) {
Serial.println("Chip ID can not read!");
while(1);
} else {
Serial.println("Initialize done!");
}
}
void loop()
{
bmm150_mag_data value;
bmm.read_mag_data();
value.x = bmm.raw_mag_data.raw_datax;
value.y = bmm.raw_mag_data.raw_datay;
value.z = bmm.raw_mag_data.raw_dataz;
float xyHeading = atan2(value.x, value.y);
float zxHeading = atan2(value.z, value.x);
float heading = xyHeading;
if(heading < 0)
heading += 2*PI;
if(heading > 2*PI)
heading -= 2*PI;
float headingDegrees = heading * 180/M_PI;
float xyHeadingDegrees = xyHeading * 180 / M_PI;
float zxHeadingDegrees = zxHeading * 180 / M_PI;
Serial.print("Heading: ");
Serial.println(headingDegrees);
delay(100);
}
動作させた結果は以下のとおりです。
こちらを試してみた際の、シリアルモニタでの出力。
— you (@youtoy) October 25, 2021
●Grove - 3-Axis Digitial Compass v2.0 - Seeed Wiki
https://t.co/HyolX4Hfuz pic.twitter.com/M3CgeIgbYO