Arduino MKR WiFi 1010 で Groveモジュールを使う 【その2】 （Arduino MKR Connector Carrier を利用、CO2濃度・温湿度センサーのお試し）

以下の記事の続きになります。

●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 などが実行できる状態にしておきます。
詳細については、[前回の記事の「とりあえずの動作確認」の部分](https://qiita.com/youtoy/items/6f1cea34457d0dd547da#%E3%81%A8%E3%82%8A%E3%81%82%E3%81%88%E3%81%9A%E3%81%AE%E5%8B%95%E4%BD%9C%E7%A2%BA%E8%AA%8D)などをご参照ください。

## 「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](https://wiki.seeedstudio.com/Grove-CO2_Temperature_Humidity_Sensor-SCD30/) を見ると I2C での接続になるようです。
![Groveケーブルの接続](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/fa57ebfa-3fa9-81b4-c465-249f7bd24add.jpeg)

前回使った「Grove - Gesture」と同じように「TWI」と書かれたところに接続します。
Arduino MKR Connector Carrier の場合はあ、以下のような感じになりました。

<blockquote class="twitter-tweet" data-conversation="none"><p lang="ja" dir="ltr">接続 <a href="https://t.co/i5eLLZCAq4">pic.twitter.com/i5eLLZCAq4</a></p>&mdash; you (@youtoy) <a href="https://twitter.com/youtoy/status/1452653077371121675?ref_src=twsrc%5Etfw">October 25, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

### プログラム
プログラムは、[公式の Wiki](https://wiki.seeedstudio.com/Grove-CO2_Temperature_Humidity_Sensor-SCD30/) のものを使います。
特に書きかえなどはせず、そのまま使ってみます。

```cpp
#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);
}
```

### 動作させた結果
公式のサンプルプログラムをそのまま動作させて、シリアルモニタの表示を確認してみます。
そうすると、以下のように二酸化炭素濃度と温湿度の値が表示されていました。

<blockquote class="twitter-tweet" data-conversation="none"><p lang="ja" dir="ltr">「Grove - CO2 &amp; Temperature &amp; Humidity Sensor (SCD30) 」のお試しの続き。<br>無事、シリアルモニタ上で「二酸化炭素濃度・温湿度」の値が得られました。<br><br>気温のほうは、別の温湿度計の値とわりとズレてる感じがするけど、どちらが正しいんだろう？ <a href="https://t.co/WNzrWA66sv">pic.twitter.com/WNzrWA66sv</a></p>&mdash; you (@youtoy) <a href="https://twitter.com/youtoy/status/1452657186690064384?ref_src=twsrc%5Etfw">October 25, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

ググってみた情報によると、二酸化炭素濃度の値は 1000 ppm を下回っているので、良好ということらしいです。
そして、ふと「これってキャリブレーションとか必要ないのかな？」と思ってみたりなど（仕様や説明を、もう少し見てみなければ...）。

#### 【追記】 キャリブレーションについて
「これってキャリブレーションとか必要ないのかな？」とツイートもしていたのですが、それについて自分で調べ始める前に、ツイートにコメントをいただきました。

<blockquote class="twitter-tweet" data-conversation="none"><p lang="ja" dir="ltr">GitHubに<br>&gt; The sensor has to be exposed to fresh air for at least 1 hour every day.<br>と書いてあるので自動キャリブレーションされるようです。毎日外気と同じ400ppmになる環境（夜間は人がいない、定期的に窓開け換気するなど）に置いてあれば大丈夫です</p>&mdash; kn1cht / けいえぬ (@kn1cht) <a href="https://twitter.com/kn1cht/status/1452659702257516546?ref_src=twsrc%5Etfw">October 25, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

## おわりに
前回に引き続き、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 に書かれたものそのままです。

```cpp
#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);
}
```

動作させた結果は以下のとおりです。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">こちらを試してみた際の、シリアルモニタでの出力。<br><br>●Grove - 3-Axis Digitial Compass v2.0 - Seeed Wiki<br>　<a href="https://t.co/HyolX4Hfuz">https://t.co/HyolX4Hfuz</a> <a href="https://t.co/M3CgeIgbYO">pic.twitter.com/M3CgeIgbYO</a></p>&mdash; you (@youtoy) <a href="https://twitter.com/youtoy/status/1452679129174724611?ref_src=twsrc%5Etfw">October 25, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>