Skip to main content

湿度と温度に依存する SGP41(生データ)測定の補正

note

この文書は AI によって翻訳されています。内容に不正確な点や改善すべき点がございましたら、文書下部のコメント欄または以下の Issue ページにてご報告ください。
https://github.com/Seeed-Studio/wiki-documents/issues

湿度と温度に依存する SGP41(生データ)測定の補正

概要(このプロジェクトを始める方法)

まず、Grove - スマート空気質センサー (SGP41)Grove - AHT20 I2C 工業用温湿度センサー のドキュメントを読みました。

SGP41 データシート (PDF) のセクション 3.2(生信号測定)によると、SGP41 の測定値は湿度と温度に依存するため、一貫したデータを得るには補正を適用する必要があります。具体的には、AHT20(または他のセンサー)から相対湿度と温度を読み取り、ティック値を計算して sgp41_measure_raw_signals 関数に渡します。

理論テスト

ページ 15 の表 11(I2C 測定コマンドの説明)には、ティック値を計算するための公式が記載されています:

RHticks = RH% × 65535 / 100
Tticks = (T°C + 45) × 65535 / 175

デフォルト値の 25°C と 50% の相対湿度を使用して検証します:

50 × 65535 / 100 = 32767.5 = 0x8000(16進数、四捨五入)
(25 + 45) × 65535 / 175 = 26214 = 0x6666(16進数)

結果は、Grove - スマート空気質センサー (SGP41) で使用されているプログラムおよび SGP41 データシート (PDF) の表 11 に定義されている定数と一致します。

C 言語での同様のコード:

        int h_ticks = humi * 0xFFFF;
int t_ticks = (temp + 45) * 0xFFFF / 175;

プログラム内の 'humi' は 0 から 1 の間の値であるため、100 での除算とそれ以前の乗算は削除されています。

ハードウェア準備

私は Seeeduino Nano を制御ボードとして使用し、Grove - スマート空気質センサー (SGP41) と Grove - AHT20 I2C 工業用温湿度センサーを使用して実現しました。

Seeeduino NanoGrove - AHT20 温湿度センサーGrove - スマート空気質センサー (SGP41)Grove - ブランチケーブル

ソフトウェアの準備

必要な複数のライブラリがあり、次のステップで説明します。

はじめに

note

Arduinoを初めて使用する場合は、開始する前にArduinoの使い方をご覧になることを強くお勧めします。

1. Arduino Nanoとの接続

note

USBケーブルを優しく差し込んでください。そうしないとポートが損傷する可能性があります。内部に4本のワイヤーがあるUSBケーブルを使用してください。2本のワイヤーしかないケーブルではデータを転送できません。お持ちのケーブルが不明な場合は、こちらをクリックして購入できます。

  • ステップ 1. Grove - Branch CableをSeeeduino NanoのI2Cポートに接続します。

  • ステップ 2. Grove - Branch CableをI2C Grove AHT20センサーモジュールに接続します。

  • ステップ 3. Grove - Branch CableをI2C Grove SGP41センサーモジュールに接続します。

  • ステップ 4. SeeeduinoをUSBケーブルを介してPCに接続します。

Seeeduino_SGP41_AHT20

2. 必要なライブラリをダウンロードしてArduinoに追加

3. コードをアップロードして結果を確認

  • ステップ 1. デモをアップロードします。コードのアップロード方法がわからない場合は、コードのアップロード方法を確認してください。
// GROVE-AHT20+SGP41用ARDUINOデモ
//
#include <Wire.h>
#include "AHT20.h"
#include <Arduino.h>
#include <SensirionI2CSgp41.h>

SensirionI2CSgp41 sgp41;

// NOxコンディショニングに必要な時間(秒単位)
uint16_t conditioning_s = 10;

AHT20 AHT;

void setup() {
Serial.begin(115200);
while (!Serial) {
delay(100);
}

Wire.begin();

uint16_t error;
char errorMessage[256];

sgp41.begin(Wire);

uint16_t serialNumber[3];
uint8_t serialNumberSize = 3;

error = sgp41.getSerialNumber(serialNumber, serialNumberSize);

if (error) {
Serial.print("getSerialNumber()の実行中にエラーが発生しました: ");
errorToString(error, errorMessage, 256);
Serial.println(errorMessage);
} else {
Serial.print("シリアル番号:");
Serial.print("0x");
for (size_t i = 0; i < serialNumberSize; i++) {
uint16_t value = serialNumber[i];
Serial.print(value < 4096 ? "0" : "");
Serial.print(value < 256 ? "0" : "");
Serial.print(value < 16 ? "0" : "");
Serial.print(value, HEX);
}
Serial.println();
}

uint16_t testResult;
error = sgp41.executeSelfTest(testResult);
if (error) {
Serial.print("executeSelfTest()の実行中にエラーが発生しました: ");
errorToString(error, errorMessage, 256);
Serial.println(errorMessage);
} else if (testResult != 0xD400) {
Serial.print("executeSelfTestがエラーで失敗しました: ");
Serial.println(testResult);
}
AHT.begin();
}

uint16_t read_sgp41(uint16_t rh, uint16_t t) {
uint16_t error;
char errorMessage[256];
uint16_t srawVoc = 0;
uint16_t srawNox = 0;

delay(1000);

if (conditioning_s > 0) {
// NOxコンディショニング中(10秒間)、SRAW NOxは0のまま
error = sgp41.executeConditioning(rh, t, srawVoc);
conditioning_s--;
} else {
// 測定を読み取る
error = sgp41.measureRawSignals(rh, t, srawVoc, srawNox);
}

if (error) {
Serial.print("measureRawSignals()の実行中にエラーが発生しました: ");
errorToString(error, errorMessage, 256);
Serial.println(errorMessage);
} else {
Serial.print("RH ticks: ");
Serial.print(rh);
Serial.print("\t");
Serial.print("T ticks: ");
Serial.print(t);
Serial.print("\t");
Serial.print("SRAW_VOC: ");
Serial.print(srawVoc);
Serial.print("\t");
Serial.print("SRAW_NOx: ");
Serial.println(srawNox);
}
return error;
}

void loop()
{
float humi, temp;

int ret = AHT.getSensor(&humi, &temp);

if(ret) // データ取得成功
{
Serial.print("湿度: ");
Serial.print(humi*100);
Serial.print("%\t 温度: ");
Serial.print(temp);
Serial.print("\t");
// T-ticks = (T/°C + 45) × 65535 / 175
// H-ticks = RH/% × 65535 / 100
int h_ticks = humi * 0xFFFF;
int t_ticks = (temp + 45) * 0xFFFF / 175;
read_sgp41(h_ticks, t_ticks);
}
else // データ取得失敗
{
Serial.println("AHT20からデータ取得失敗");
}

delay(100);
}

// ファイル終了
  • ステップ 2. Arduino IDE の シリアルモニター を開くには、ツール -> シリアルモニター をクリックしてください。

シリアルコンソール出力

最初の10個の SRAW_NOx 値はコンディショニングのためゼロであることに注意してください。

リソース

✨ コントリビュータープロジェクト

技術サポート & 製品ディスカッション

弊社製品をお選びいただきありがとうございます!製品の使用体験がスムーズになるよう、さまざまなサポートを提供しています。異なる好みやニーズに対応するため、いくつかのコミュニケーションチャネルを用意しています。

Loading Comments...