目次
第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を正弦波にする回路、電源電圧や抵抗値を補正する回路など、一部の機能を省いています。デバイスの性能が発揮できていないかもしれません。
次の第4章は、こちらです。
第1章
第2章
by bokunimo.net
「AOSONG HR202L で湿度測定」への7件の返信
[…] AOSONG HR202L で湿度測定 投稿者 wataru投稿日: 2019年12月11日2020年11月3日カテゴリー 日記, 未分類 […]
第4章はこちらです。
https://bokunimo.net/blog/esp/903/
[…] AOSONG HR202L で湿度測定 […]
凄いなあ
ありがとうございます。
その後、より簡単な構成での実験を進め、第4章を書くためのデータの取得を終えました。
そのうち記事にしたいと思います。
国野 様
以前、イノシシの罠について、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として送信できるでしょうか、教えてえたいただけませんか。
お願い致します。
ご無沙汰しています。
エラーについては、IchigoJam BASICのバージョンの違いによるものだと思います。
また、IoT.OUTは、基本的には1値だけを送信するコマンドです。
残念ながら、コメントいただいた方法では2値を送信することは出来ません。
複数の値を送信したい場合は、下記の情報などをご覧ください。
https://bokunimo.net/blog/ichigojam/491/
https://fukuno.jig.jp/2490
また、Node-RED上でも複数値を処理する必要が出てきます。
今のところ、残念ながら、sakura.ioでの複数値の処理には、少し手間がかかると思います(MixJuiceほど、簡単ではありません)。