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

「AOSONG HR202L で湿度測定」への2件のフィードバック

  1. 国野 様
    以前、イノシシの罠について、ichigosoda + sakura.io + node-red–ambient の構築に大変お世話になりました。ありがとうございます。

    今回、畑のハウス内の温湿度を測定したいのですが、どうしてもデータが最初のデータだけ送信し、湿度が送信されません。ambient側に は届いているとは思いますが、d1,d2の区別がつかないのだと思います。
    環境は、ichigosoda + sakura.io + mode-redです。プログラムは,国野様の「2018/7/7 安価で高性能な
    温湿度センサーSi7021をichigojamに接続」の中の1~240行のプログラムです。
    なぜかerrorがでますので、途中行の STOPを削除して、RUNさせました。
    221行に   IOT.OUT A/10
    222行に  IOT。OUT B
    を追加しました。

    温度と湿度をd1,d2に分けて送信しょうといろいろ試みましたが、なんともなりません、ichigojam +mixjuice
    の場合を参考にいろいろ試みましたがだめでした。
    ambient には、温度だけ表示されます。
    モニター画面は、温度、湿度とも表示されています。

    このコメント欄に全く整合しない内容で申し訳ありせんません。
    どのようにすれば、d1,d2として送信できるでしょうか、教えてえたいただけませんか。
    お願い致します。

    1. ご無沙汰しています。
      エラーについては、IchigoJam BASICのバージョンの違いによるものだと思います。
      また、IoT.OUTは、基本的には1値だけを送信するコマンドです。
      残念ながら、コメントいただいた方法では2値を送信することは出来ません。
      複数の値を送信したい場合は、下記の情報などをご覧ください。
      https://bokunimo.net/blog/ichigojam/491/
      https://fukuno.jig.jp/2490

      また、Node-RED上でも複数値を処理する必要が出てきます。
      今のところ、残念ながら、sakura.ioでの複数値の処理には、少し手間がかかると思います(MixJuiceほど、簡単ではありません)。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です