Sony Spresense用のCO2、温度湿度センサーボードを作ってみた

新型コロナの流行から人の密をCO2の濃度から判断するシステムが増えています。
そこでSony Spresenseから手軽に使える室内環境センサーボードを作ってみました。

CO2センサー : SGP30-2.5K　[VOCセンサー「SGP30 / SGPC3」(NRND)](https://www.sensirion.com/jp/environmental-sensors/gas-sensors/sgp30/)  
温度湿度センサー : SHTC1　[デジタル温湿度センサー 「SHTC1」](   https://www.sensirion.com/jp/environmental-sensors/humidity-sensors/digital-humidity-sensor-for-consumer-electronics-and-iot/)
共にsensirionが作っているセンサーですがSGP30はメーカー非推奨となっています。

写真
![CO2_TEMP_Board.fw.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99249/9929c41e-fe9c-635d-2847-6a381f1a3745.png)
回路図
![Spresense_SGP30_SHTC1-1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99249/75ec6875-1ad7-2554-c89f-fb4d178a0357.jpeg)


2つのセンサー共にArduino用のライブラリが使えますので以下のライブラリを追加して下さい。
SGP30　https://github.com/sparkfun/SparkFun_SGP30_Arduino_Library
SHTC1　https://github.com/winkj/arduino-sht

ライブラリのサンプルプログラムでセンサーが動作しているのを確認します。

```c++:Example1_BasicReadings.ino
// SPG30 Example1_BasicReadings
/*
  Library for the Sensirion SGP30 Indoor Air Quality Sensor
  By: Ciara Jekel
  SparkFun Electronics
  Date: June 28th, 2018
  License: This code is public domain but you buy me a beer if you use this and we meet someday (Beerware license).

  SGP30 Datasheet: https://cdn.sparkfun.com/assets/c/0/a/2/e/Sensirion_Gas_Sensors_SGP30_Datasheet.pdf

  Feel like supporting our work? Buy a board from SparkFun!
  https://www.sparkfun.com/products/14813

  This example reads the sensors calculated CO2 and TVOC values
*/

#include "SparkFun_SGP30_Arduino_Library.h" // Click here to get the library: http://librarymanager/All#SparkFun_SGP30
#include <Wire.h>

SGP30 mySensor; //create an object of the SGP30 class

void setup() {
  Serial.begin(9600);
  Wire.begin();
  //Initialize sensor
  if (mySensor.begin() == false) {
    Serial.println("No SGP30 Detected. Check connections.");
    while (1);
  }
  //Initializes sensor for air quality readings
  //measureAirQuality should be called in one second increments after a call to initAirQuality
  mySensor.initAirQuality();
}

void loop() {
  //First fifteen readings will be
  //CO2: 400 ppm  TVOC: 0 ppb
  delay(1000); //Wait 1 second
  //measure CO2 and TVOC levels
  mySensor.measureAirQuality();
  Serial.print("CO2: ");
  Serial.print(mySensor.CO2);
  Serial.print(" ppm\tTVOC: ");
  Serial.print(mySensor.TVOC);
  Serial.println(" ppb");

}
```

```c++:SHTC1_sample.ino
// SHTC1 Sample code
#include <Wire.h>

#include <shtc1.h>

SHTC1 shtc1;

void setup() {
  // put your setup code here, to run once
  Wire.begin();  
  Serial.begin(9600);
}

void loop() {
  // put your main code here, to run repeatedly:
  shtc1.readSample();
  Serial.print("SHTC1:\n");
  Serial.print("  RH: ");
  Serial.print(shtc1.getHumidity(), 2);
  Serial.print("\n");
  Serial.print("  T:  ");
  Serial.print(shtc1.getTemperature(), 2);
  Serial.print("\n");

  delay(1000);
}
```


両方のセンサーが動いているのを確認できたら、1つのプログラムにまとめます。

```c++:Spresense_SGP30_SHTC1.ino
#include "SparkFun_SGP30_Arduino_Library.h" // Click here to get the library: http://librarymanager/All#SparkFun_SGP30
#include <Wire.h>
#include <shtc1.h>

SGP30 mySensor; //create an object of the SGP30 class
SHTC1 shtc1;

void setup() {
  Serial.begin(115200);
  Wire.begin();
  //Initialize sensor
  if (mySensor.begin() == false) {
    Serial.println("No SGP30 Detected. Check connections.");
    while (1);
  }
  //Initializes sensor for air quality readings
  //measureAirQuality should be called in one second increments after a call to initAirQuality
  mySensor.initAirQuality();
  
}

void loop() {
  //First fifteen readings will be
  //CO2: 400 ppm  TVOC: 0 ppb
  delay(1000); //Wait 1 second
  //measure CO2 and TVOC levels
  mySensor.measureAirQuality();
  //measure TEMP and HUM levels
  shtc1.readSample();

  Serial.print("CO2: ");
  Serial.print(mySensor.CO2);
  Serial.print("ppm　tTVOC: ");
  Serial.print(mySensor.TVOC);
  Serial.print("ppb");

  Serial.print("  RH: ");
  Serial.print(shtc1.getHumidity(), 2);
  Serial.print("%  TEMP: ");
  Serial.print(shtc1.getTemperature(), 2);
  Serial.println("℃");
}
```

![SGP30.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99249/ef7c8976-5e1e-f038-4f41-a69f61730759.jpeg)

これでSony SpresenseでCO2、TOVC、温度、湿度のデータを取得出来るようになりました。
次回は取得したデータを Spresense LTE を使ってサーバー(クラウド)にアップロードするサンプルを公開します。

追記
[Sony Spresense LTE拡張ボードで温湿度、eCO2、TVOCのデータをCloud(Thingspeak)にアップロード](https://qiita.com/kaz19610303/items/e653e129437775d22272)