Skip to content

空気質/温湿度センサーモジュール「ENS160 + AHT21」

Posted on:2023年11月23日
Post tags:

電子工作でよく使われている空気質センサーに CCS811 というのがあって、ネット上でもこのセンサーを使った情報がたくさん見つかる。しかし、この CCS811 は既に製造中止らしく、販売も少なくなって Amazon などでは以前よりも高値で販売されている。代替品としては同じ ScioSense 社(CCS811開発元のAMS社が2019年に設立した合弁企業)の ENS160 というものがあり、これを使った「ENS160 + AHT21」モジュールが販売されている。しかし、おそらく回路図やデータシートの類いが全く無いからだと思うが、ネット上にこのモジュールに関する日本語の情報がほとんど無いので購入して実際に試してみた。

|500

ENS160空気品質センサ | DigiKey によると、

ENS160は、センサの生測定値をオンチップで処理するインテリジェントなアルゴリズムをサポートしています。これらのアルゴリズムは、CO2換算値(eCO2)、総揮発性有機化合物(TVOC)、空気質指標(AQI)の算出、湿度/温度補正、ベースライン管理などをすべてチップ上で実行します。4つのセンサ素子と統合された独立したホットプレート制御により、エタノール、トルエン、水素、酸化性ガスなど幅広いVOCを優れた感度で検出することができます。

CCS811 と同様、温めた MOX(金属酸化物)が空気中の揮発性有機化合物によって抵抗値が変化することを利用してガス濃度を測定する MOX 方式のガスセンサーだ。このセンサーから取得できるデータは次の3つ。

今回購入したモジュールには、 ENS160 の他に温湿度センサー AHT21 が載っていて、温湿度データを使って補正することでより正確なデータを取得可能らしい。 ENS160 のデータシートには湿度 20-80% の環境では補正不要と書いてあるが、せっかくセンサーが付いているので利用することにする。ただし、 ENS160 と AHT21 は同じ基板上に実装されているというだけで、それぞれ個別にアクセスして温湿度の取得と補正値の設定は自分で行う必要があるようだ。

以上を踏まえて、実際に Arduino-ESP32 で動かしてみた。

I2C接続

I2Cを利用して、ESP32-DevKitCと以下のように接続した。
ENS160 + AHT21ESP32-DevKitC
VIN5V
GNDGND
SCL22
SDA21

Arduino 用ライブラリ

Arduino 用のライブラリはいくつか見つかるが、いろいろと試して最終的に以下の2つを採用することにした。

ENS160

AHT21

温湿度の補正

搭載されている AHT21 から取得できる温湿度の値ははっきり言って当てにならない。個体差もあるかもしれないが、うちにある他の温度計やセンサーと比べて常に 4℃ ほど高い値を返してくる。また、それに連動して湿度はかなり低い値になっている。基板上の AHT21 はリファレンス実装通りに周りを肉抜きされて問題なさそうに見えるだけに残念である。今回は補正用に利用するだけで精度はそこまで必要ないので、取得した温度を-4℃してさらに湿度を以下の計算式で再計算することにした。

温度 T の飽和水蒸気圧 e(T) は August の近似式1より、

|400

相対湿度 RH(%) のときの容積絶対湿度 VH (g/m3) は

|400

飽和時の容積絶対湿度 VHs (g/m3) は、

|400

よって、補正後の相対湿度 RH2(%) は補正後の温度を T2 とすると

|400

プログラム

#include <Arduino.h>
#include <Wire.h>

#include <AHTxx.h>
#include <DFRobot_ENS160.h>

#define PIN_SDA 21
#define PIN_SCL 22

#define TEMPERATURE_CORRECTION -4 // 温度補正 -4 ℃

DFRobot_ENS160_I2C ENS160(&Wire, /*I2CAddr*/ 0x53);
AHTxx AHT21(AHTXX_ADDRESS_X38, AHT2x_SENSOR);

uint8_t gAQI;
uint16_t gTVOC;
uint16_t gECO2;

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));
}

void setup()
{
  Serial.begin(115200);
  Wire.begin(PIN_SDA, PIN_SCL);

  Serial.println("ENS160 - Digital air quality sensor");
  while (ENS160.begin() != NO_ERR)
  {
    Serial.println("Communication with device failed, please check connection");
    delay(3000);
  }
  ENS160.setPWRMode(ENS160_STANDARD_MODE);

  while (!AHT21.begin(PIN_SDA, PIN_SCL))
  {
    Serial.println("Could not find a valid ATH20 sensor, check wiring!");
    delay(3000);
  }
  Serial.println("ATH20 sensor found");
}

void loop()
{
  /*
   * ENS160センサーのステータス取得
   *   0: 正常
   *   1: ウォームアップ(電源ONから3分間はこの状態、値は正確でない可能性がある)
   *   2: 初回スタートップ(初めての電源ONから1時間)
   *      24時間以上ONにしておくと解除されるらしいが毎回この状態になる?
   *   3: エラー
   */
  uint8_t sensorStatus = ENS160.getENS160Status();
  Serial.printf("Sensor operating status: %d\n", sensorStatus);

  // AHT21センサーから温度と湿度を取得
  float rawTemperature = AHT21.readTemperature();
  float rawHumidity = AHT21.readHumidity();

  // 温湿度補正
  float temperature = rawTemperature + TEMPERATURE_CORRECTION;
  float humidity = recalculateHumidity(rawTemperature, rawHumidity);
  ENS160.setTempAndHum(temperature, humidity);

  gAQI = ENS160.getAQI();
  gTVOC = ENS160.getTVOC();
  gECO2 = ENS160.getECO2();

  Serial.printf("AQI: %d\n", gAQI);
  Serial.printf("TVOC: %d\n", gTVOC);
  Serial.printf("eCO2: %d\n", gECO2);
  Serial.printf("temperature: %f\n", temperature);
  Serial.printf("humidity: %f\n", humidity);
  Serial.println();

  delay(10000);
}

使ってみた感想

前に作ったキッチンの換気扇を自動で ON/OFF するデバイスの温湿度センサー DHT11 をこの ENS160 に置き換えたのだけど、今のところいい感じに動いている。以前は湿度が急激に増加したらON、そこから一定値下がったらOFFという単純な制御で煮物系や鍋でお湯を沸かしたりする場合には期待通りなのだけど、炒め物系の料理をする場合に反応が悪い(もしくは全く反応しない)という問題があった。今回、空気質センサーに交換して AQI の値によって ON/OFF するようにしたので、そのような問題も発生しなくなった。

|600

おまけ: eCO2 値の NDIR 方式センサーとの比較

ENS160 が返す eCO2 の値を NDIR(非分散型赤外線)方式センサーと比較してみた。細かな部分で違いはあるものの、大方において似通った値を示していて換気の目安にするくらいの用途なら問題なく使えそうだと感じた。

|600


脚注

Footnotes

  1. 飽和水蒸気量 - Wikipedia