AOSONG HR202L で湿度測定

第3章 ESP32に湿度センサAOSONG HR202Lを接続し、温度と湿度を測定する

60円(AliExpress)から200円(秋月)程度で販売されている、とても安価な湿度センサ。扱いにくいせいか、あまり製作記事が見当たらなかったので、この湿度センサを使って湿度を測ってみました。


5章くらいまで書こうと思っていますが、ここで、一旦、目的である湿度を求めてしまいます。


AOSONG HR202L を ESP32マイコンに接続する

回路図を以下に示します。データシートの回路を基にしていますが、コンデンサを省略しました。プログラムで16周期分を測定することにより、測定値を安定化します。

ESP32マイコンのIO32とIO33の 3.3Vデジタル出力 から、それぞれLow、Highの4パターンを、下図のように変化させることで、 最大振幅6.6V、AC電圧1.65VのAC波形を出力します。定格のAC 1.5Vを 少しだけ 超えるので、気になる方はパルス幅で調整してください。

また、上図「ADC」の位置、すなわちIO32がLow、IO33がHighのときに、アナログ入力のIO34を用いて、10kΩの抵抗の両端の電圧を取得します。

湿度値の算出方法

取得した電圧値によって、10kΩに流れる電流が分かるので、センサの抵抗値は、以下の関数で求まります。変数vは電圧(V)、戻り値が抵抗値(kΩ)です。

 float volt2imp(float v){
     return 33. / v -10.;
 }

センサの抵抗値を、第2章で求めた以下の式に代入すると、0℃における湿度が求まります。

 float imp2hum0(float i){
     return -5.897e-4 * powf(i,3) + 6.716e-2 * powf(i,2) - 4.019 * i + 1.187e2;
 }

現在の温度 temp() における湿度を求めるには、第1章で求めた以下の係数を使用します。後述のプログラムでは、ESP32マイコン内蔵の温度センサから温度を取得します。

 float shift2hum(float hum0){
     return hum0 - temp() / 2.15;
 }

AOSONG HR202L 用の湿度値を取得するプログラム

Arduino IDE用のプログラムは、以下の通りです。

https://github.com/bokunimowakaru/hr202l/blob/master/hr202l/hr202l.ino

(抜粋) 
#define TEMP_ADJ 33
 uint8_t PIN_A1;
 uint8_t PIN_A2;
 uint8_t PIN_AIN;

 uint16_t getVal(){
     uint16_t val=0;
     for(int t=0;t<16;t++){
         delayMicroseconds(247);
         digitalWrite(PIN_A2,LOW);
         delayMicroseconds(247);
         digitalWrite(PIN_A1,LOW);
         delayMicroseconds(247);
         digitalWrite(PIN_A2,HIGH);
         val += analogRead(PIN_AIN);
         delayMicroseconds(237);
         digitalWrite(PIN_A1,HIGH);
     }
     return val;
 }

 float getHum(){
     for(int i=0;i<62;i++) getVal();
     uint16_t val2 = getVal();
     float volt = (float)val2 / 16. / 4095. * 3.5;
     float imp = 33. / volt -10.;
     float i = 10 * log10f( imp );
     float hum0 = -5.897e-4 * powf(i,3) + 6.716e-2 * powf(i,2) - 4.019 * i + 1.187e2;
     float hum = hum0 - (temperatureRead() - (float)TEMP_ADJ) / 2.15;
     return hum;
 }

 void Setup(uint8_t PIN_A1, uint8_t PIN_A2, uint8_t PIN_AIN){
     PIN_A1=PIN_A1;
     PIN_A2=PIN_A2;
     PIN_AIN=PIN_AIN;
     pinMode(PIN_A1,OUTPUT);
     pinMode(PIN_A2,OUTPUT);
     digitalWrite(PIN_A1,HIGH);
     digitalWrite(PIN_A2,HIGH);
     pinMode(PIN_AIN,INPUT);
     analogSetPinAttenuation(PIN_AIN,ADC_11db);
     for(int t=0;t<10;t++) delay(1);
 }

 void setup(){
     Serial.begin(115200);
     Setup(32,33,34);
 }

 void loop(){
     float temp = temperatureRead() - (float)TEMP_ADJ;
     float hum = getHum();
     Serial.print("Temp = ");
     Serial.print(temp,1);
     Serial.print(", Humi = ");
     Serial.println(hum,1);
     delay(5000);
 }

関数getValの部分でACを出力しています。約250μsごとにデジタル出力を切り替えているのが分かるでしょう。247や237としているのは、IO出力処理やアナログ入力処理に要した時間を250μsから減算しているためです。ESP32マイコンの動作周波数は160MHzに設定しました。

実行結果

以下は、測定結果の一例です。実行すると約6秒間隔で、測定値がシリアル出力されます。

湿度センサ HR202L を取り付けていない状態だとnanが得られます。センサを取り付けると、徐々に湿度が低下してゆき、1分ほどで安定します。
#温度が変化しないのは、ESP32ライブラリの不具合と思われます(Wi-Fi動作中は温度値が変化します)。

 Temp = 20.3, Humi = nan
 Temp = 20.3, Humi = 62.4
 Temp = 20.3, Humi = 62.3
 Temp = 20.3, Humi = 61.8
 Temp = 20.3, Humi = 61.2
 Temp = 20.3, Humi = 60.6
 Temp = 20.3, Humi = 59.9
 Temp = 20.3, Humi = 59.4
 Temp = 20.3, Humi = 58.9
 Temp = 20.3, Humi = 58.5
 Temp = 20.3, Humi = 58.2
 Temp = 20.3, Humi = 57.7
 Temp = 20.3, Humi = 57.5
 Temp = 20.3, Humi = 57.2
 Temp = 20.3, Humi = 57.1
 Temp = 20.3, Humi = 56.9

クラウドサービス Ambient へ送信する

測定した温度値と湿度値をクラウドサービスAmbientへ送信してみました。

プログラムは、下記からダウンロードすることが出来ます。

https://github.com/bokunimowakaru/hr202l/tree/master/ht202l_toAmbient

ご注意

センサHR202Lに直流電圧をかけると、センサに塗布された高分子感湿剤が劣化してしまいます。製作時や、他のファームウェアが書かれているときは、センサを接続しないでください。

本ブログでは、簡単に測定するために、温度特性に関わる計算やACを正弦波にする回路、電源電圧や抵抗値を補正する回路など、一部の機能を省いています。デバイスの性能が発揮できていないかもしれません。

あとがき

本当は、正確なセンサとともに、データを解析し、もう少し色んな工夫をしたかったのですが、急ぎの仕事をいただいたので、しばらく保留します。

以前の投稿は、こちらです。

第1章

第2章

by bokunimo.net