こんにちは。筆者のオウルです。
今回もマニアック記事になります。
前回、Arduinoというマイコンを使った手作り二酸化炭素濃度測定装置で使ったセンサーについてご紹介します。
AQI(空気質指数)、TVOC(総揮発性有機化合物)、eCO2(二酸化炭素濃度)、温度、湿度センサー ENS160+AHT21
今回使用したのは、この「ENS160+AHT21」です。
このセンサーがとても優秀で、このサイズなのにAQI(空気質指数)、TVOC(総揮発性有機化合物)、eCO2(二酸化炭素濃度)、温度、湿度を測定することができます。
私が購入した時は982円でした。
はんだ付け初チャレンジでしたが、100均のDAISOで売られているはんだを使ってみたのですが質が悪いのかあまりうまくいかなかったので、こちらの太洋電機産業のはんだを追加購入し、ササっと取り付けました。
ENS160とArduinoの配線
ENS160 | Arduino |
---|---|
3V3 | 3.3V |
GND | GND |
SCL | A5 |
SDA | A4 |
今回はArduino Unoの互換品を使用したのでこの配線で。
使用ライブラリ
Arduino IDEで追加したライブラリはこちら。
- SparkFun_Indoor_Air_Quality_Sensor-ENS160_Arduino_Library
執筆時のバージョンは1.1.0でした。
サンプルプログラム
最初はシリアルモニターにサンプルプログラムで測定してみました。(以下、一部機械翻訳で日本語に置換しています)
#include <Wire.h>
#include "SparkFun_ENS160.h"
SparkFun_ENS160 myENS;
int ensStatus;
void setup()
{
Wire.begin();
Serial.begin(115200);
if( !myENS.begin() )
{
Serial.println("Could not communicate with the ENS160, check wiring.");
while(1);
}
Serial.println("Example 1 Basic Example.");
// 室内空気質センサーの設定をリセットします。
if( myENS.setOperatingMode(SFE_ENS160_RESET) )
Serial.println("Ready.");
delay(100);
// 設定を適用するには、デバイスをアイドル状態にする必要があります。
// myENS.setOperatingMode(SFE_ENS160_IDLE);
// 標準動作に設定する
// その他には、SFE_ENS160_DEEP_SLEEPとSFE_ENS160_IDLEがあります。
myENS.setOperatingMode(SFE_ENS160_STANDARD);
// ここには 4 つの値があります。
// 0 - 動作正常: 標準動作
// 1 - ウォームアップ: 電源投入後 3 分間発生します。
// 2 - 初期起動: 動作開始後 1 時間発生します。
// センサーの寿命中に 1 回のみ発生します。
// 3 - 有効な出力なし
ensStatus = myENS.getFlags();
Serial.print("Gas Sensor Status Flag (0 - Standard, 1 - Warm up, 2 - Initial Start Up): ");
Serial.println(ensStatus);
}
void loop()
{
if( myENS.checkDataStatus() )
{
Serial.print("Air Quality Index (1-5) : ");
Serial.println(myENS.getAQI());
Serial.print("Total Volatile Organic Compounds: ");
Serial.print(myENS.getTVOC());
Serial.println("ppb");
Serial.print("CO2 concentration: ");
Serial.print(myENS.getECO2());
Serial.println("ppm");
Serial.print("Gas Sensor Status Flag (0 - Standard, 1 - Warm up, 2 - Initial Start Up): ");
Serial.println(myENS.getFlags());
Serial.println();
}
delay(200);
}
温度センサーの比較
家にあったDHT22センサー、ENS160+AHT21、dretecの温湿度センサーの3つで数値を比較してみました。
温度 | 湿度 | |
---|---|---|
DHT22 | 17.50 ℃ | 46.60 % |
AHT21 | 20.03 ℃ | 47.65 % |
dretec | 16.20 ℃ | 43.00 % |
ENS160+AHT21だけ数値が高かったです。
調べてみると、他の方も温湿度調整用の処理を入れているようなので参考にさせていただくことにしました。
温度の調整コード
#define TEMPERATURE_CORRECTION -4
float rawTemperature = AHT21.readTemperature();
float temperature = rawTemperature + TEMPERATURE_CORRECTION;
それがこちら。
単純に-4℃下げる処理でした。
温度 | 湿度 | |
---|---|---|
DHT22 | 17.00 ℃ | 47.00 % |
AHT21 | 15.60 ℃ | 60.91 % |
dretec | 16.00 ℃ | 43.00 % |
下げた状態での比較。
位置にもよりますが、DHT22やdretecと同じ値付近を示しているので-4で良さそうです。
湿度センサーの比較
湿度も同じように比較してみました。
温度 | 湿度 | |
---|---|---|
DHT22 | 17.30 ℃ | 46.40 % |
AHT21 | 15.90 ℃ | 47.30 % |
dretec | 16.00 ℃ | 42.00 % |
他のセンサー同様、値に狂いはなさそうですが、調整処理をまとめてくださっている方がいたのでこちらも参考に使ってみました。
湿度の調整コード
float calcMaxVaperPressure(float temp)
{
return 6.1078 * pow(10, 7.5 * temp / (temp + 237.3));
}
float recalculateHumidity(float temp, float rh)
{
float temp2 = temp + TEMPERATURE_CORRECTION;
return rh * calcMaxVaperPressure(temp) * (temp2 + 273.15) /
((temp + 273.15) * calcMaxVaperPressure(temp2));
}
float rawHumidity = AHT21.readHumidity();
float humidity = recalculateHumidity(rawTemperature, rawHumidity);
温度 | 湿度 | |
---|---|---|
DHT22 | 17.00 ℃ | 47.00 % |
AHT21 | 15.60 ℃ | 60.91 % |
dretec | 16.00 ℃ | 43.00 % |
こちらは逆に調整処理を入れるとおかしな数値をたたき出すようになってしまいました。
センサーの個体差があるのかもしれませんが、今回は無しでいくことにしました。
手作り空気汚染装置の完成
以下の条件でアラーム音がなる装置を作成してみました。
種類 | 閾値 | アラーム音 |
---|---|---|
AQI | 4 以上 | こいぬのマーチ |
TVOC | 660 ppb 以上 | 茶色の小瓶 |
eCO2 | 1,000 ppm 以上 | きらきら星 |
以上、素晴らしいセンサーの紹介でした。
コメントを残す