目次
第4章 ESP32に湿度センサHR202Lを直結(RC回路不要)
湿度センサAOSONG HR202LをESP32 の GPIO (33と32)に接続するだけ(外付け部品無し)で湿度を測定してみました。ESP32内蔵のプルアップ抵抗の利用と、平均値を利用するとこで、外付け部品を無くし、さらに230日分、15万サンプルの実績データから変換式を作成しました。
湿度センサHR202L を ESP32マイコンに直結
湿度センサAOSONG HR202Lを以下の回路図のように直結して湿度を測定します。ハードウェアはこれだけです。超簡単です。
ただし、この回路はメーカーが意図した使い方ではありません。また、必ず、後述のソフトウェアを書き込んでから接続してください。
この回路で測定するためには工夫とデータが必要でした。
とはいえ、ボクが行った工夫やデータは、ソフトウェア化することで、誰でも簡単に再現させることが出来ます。
まずは、今回のために取得したデータの話から始めます。
230日分、15万サンプルの実績データ
下図は、今回、取得した230日分、15万サンプルの温度(横軸)と相対湿度(縦軸)の基準データです。基準データとは、HR202Lとは別に準備した基準用湿度センサ(ここではSENSIRION SHT31)を使って測定したデータです。
また、上記の基準データと同時にHR202LのセンサのADC値も測定しました。下図はHR202LのセンサADC値(横軸)と、基準用の湿度センサの湿度の測定結果(縦軸)です。ただし、湿度値はHR202Lの温度係数(第1章で説明)を考慮し、環境温度が0℃のときに得られる湿度値に補正したものです。
このグラフで察しがつくと思いますが、HR202LのセンサADC値(横軸)と、230日分の湿度値の基準データ(縦軸)の関係を数式化することで、HR202L単体で湿度値を得ることが出来るようになります。赤線は、今回、ソフトウェア化した近似式です。
HR202Lセンサ値データ取得方法
センサADC値データの取得方法について説明します。グラフ2の横軸のセンサ値データも同じ方法で取得しました。
センサADC値データは、ソフトウェアの制御にてHR202Lの片側の端子をESP32マイコン内蔵プルアップ抵抗に接続し、39μs(マイクロ秒)後にADCで電圧値を取得します。取得した電圧値はHR202Lのインピーダンスと内蔵プルアップ抵抗によって分圧された電圧となり、湿度に応じたHR202Lのインピーダンスに応じた値です。
ESP32内蔵のADコンバータは12ビットですが、1サンプルを測定するのに、8回×2端子=16回の測定を行い疑似的に16ビット相当のセンサ値(0~65520)が得られるようにしました。測定のたびに、HR202Lの電圧を十分に放電するために50msの待ち時間が必要なので、1サンプルの取得に合計0.8秒の待ち時間を要します。
なお、湿度の算出には環境温度の取得も必要ですが、HR202Lには温度センサが含まれていないので、ESP32内蔵の温度センサを使用しました。内蔵温度センサは、動作環境に合わせて、マイコンの自己発熱分を減算する必要があります。
センサADC値から湿度を算出するプログラム
センサ値と同時に測定した基準データから、湿度値を取得するための関数hr202_getHum()を作成しました。
プログラムを以下に示します。本関数内のhr202_getTempは内蔵温度センサから温度値を取得する関数、hr202_getVal(int us)は前節のセンサADC値データを取得する関数です。hr202_getValの引数usには、測定までの充電時間39μsを与えます。
float hr202_getHum(){ float hum_avr = 0.; for(int i=0; i < 8; i++){ float temp = hr202_getTemp(); // 温度を取得 int hr202_val =(int)hr202_getVal(39); // 湿度センサADC値を取得 float hum; if(hr202_val < 4096){ hum = -2.999442e-3 * hr202_val + 83.0; }else if(hr202_val < 5495){ hum = -2.972147e-3 * hr202_val + 75.0; }else if(hr202_val < 19152){ hum = -4.241396e-4 * hr202_val + 61.0; }else{ hum = -1.525879e-4 * hr202_val + 55.8; } hum += 10. - temp / 2.15; hum_avr += hum; } return hum_avr / 8; }
エクセルで近似式をもとめる方法もありますが、以下の2つの理由から、今回はあえて1次式の組み合わせをグラフから手作業で作成しました(グラフ2の赤線)。
一つ目の理由は、エクセルで15万件のデータの近似式を求めようとすると、設定のたびに3時間くらいの計算時間が必要であったためです。グラフの色や表示範囲の変更、近似式の次数やADCの範囲を超えた値の処理方法の検討など、1つ1つに3時間が必要で、自動計算をOFFにしていても、あっという間に1日が過ぎてしまい、エクセルの利用を断念しました。
二つ目の理由は、ADCから得られたセンサADC値データが湿度の上昇とともに減少する(傾きが負)だけでなく、一部、上昇する(傾きが正の)区間があったためです。取得したサンプルを見ても、値の小さい部分で少し左側にうねっている様子が見えると思います(湿度68%付近)。つまり、湿度68%からADC値が下がったときに、湿度が上がったのか下がったのかが簡単に判断できないため、少し誤差は増大しますが、傾きを常に負にするようにしました。
AOSONG HR202L 用の湿度値を取得するプログラム
Arduino IDE用のプログラムを、下記に公開しました。
https://github.com/bokunimowakaru/hr202l/blob/master/hr202l_woExRC/hr202l_woExRC.ino
プログラム冒頭の変数_hr202_temp_offsetには、ESP32マイコン内蔵の温度センサの補正値を代入します。湿度センサHR202Lは、プログラムをESP32へ書き込んでから接続してください。
実行結果
以下は、測定結果の一例です。実行すると約12秒間隔で、測定値がシリアル出力されます。
#温度が変化しないのは、ESP32ライブラリの不具合で、Wi-Fi動作中であれば変化します。
Temp = 33.3, Humi = 50.2 Temp = 33.3, Humi = 50.3 Temp = 33.3, Humi = 50.2
検証
最後に、HR202Lを接続した湿度センサと、基準となるSHT31を使った湿度センサを比較することで、簡単な検証を行いました。湿度60~70%付近で乖離する傾向がありますが、概ね湿度の目安値を示していることが分かりました。
考察
グラフ1の温度と湿度の散布図には、大きく3つの傾向がみられます。
第1群は、左方の、ややサンプル数の少ないグループです。これは実験的に屋外に設置したときの測定結果ですが、グラフ2には出てこず、温度補正によって作成した関数に包含されたことが分かります。
第2群は、中央の冬季のデータです。エアコンなどで室内の温度が上がると湿度が下がる傾向がみられます。また温度幅が広いことも特長の一つです。
第3群は、右方の夏季のデータです。温度幅は狭く、湿度幅が広い傾向があり、またグラフからは温度と湿度との間の相関は少ないように見受けられます。
なお、今回は、HR202L、ESP32ともに1台で検証しましたが、どちらにも特性のばらつきがあるので、必ずしも本ブログと同等の精度が得られるとは限りません。
次回・第5章
昨年12月に第1章を公開し、今回は、第4章となります。最後の第5章は、実用化(といっても精度は荒い)に向けて取り組もうと思います。
また、半年か長いと1年後になるかもしれませんが、TwiterとFacebookで通知するので、この機会にぜひ登録ください。
https://www.facebook.com/wataru.kunino
ご注意
湿度センサHR202Lに直流電圧をかけると、センサに塗布された高分子感湿剤が劣化してしまいます。製作時や、他のファームウェアが書かれているときは、センサを接続しないでください。また、関数hr202_getValの引数usには、充電時間75μs以上を与えないでください。
本章のプログラムは、簡易的な方法で湿度の目安値を測定するために開発したものであり、デバイスの本来の性能を発揮することは出来ません。正確な測定が必要な場合は、製品のデータシートにしたがった制御を行ってください。
以前の投稿は、こちらです。
第1章
第2章
第3章
by bokunimo.net
「AOSONG HR202L をESP32 に直結するだけ超簡単。 実績サンプル15万値を利用して作成した湿度測定方法」への1件の返信
[…] […]