AM2302 を使った温湿度計

AVRは内蔵発振8MでC言語でカウントさせみる
while (SDA1){cnt++;}

SDA端子が「H」の間カウントすると、1カウント 約1uSになった
resuponse signal が約78 (80uS)
24〜25 (23uS)

ほぼ満足できる数値で測定することができた

0−1に変換すると 下記になる

秋月電子に行って、温湿度素子を物色すると、各種みつかる

AM2320
AM2302 (DHT11)
HR202L

AM2320は 別紙で掲載している、I2C通信コントロールである

AM2302(DHT11)は大きいので性能が良いのか購入してみた。
通信ラインは1本しかないのでどのよにコントロールするの
だろう??

26uSと70uSの波形を判定する方法は、AVRのパルス幅をハード的に測定する方法がある
それを、DATA{n}に取り込んで、
20us〜30us を 「0」
60us〜80uS を 「1」 と判定すればよい

今回は簡単に、カウントで判定してみよう。

ーーーーーーーーーーーーーーーーーー

cnt=0;n1=1;ans=0;datn=0;
while(1){
     while (SDA1){cnt++;}
     r_data[n1++]=cnt
     ;cnt=0;
     while (SDA0){ans++;}
     datn++;
     if(datn == 42){break;}
     }
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー       

I2Cコントロール
7SEG 回路図

C言語の場合は表記は簡単である 湿度= 湿度H×256+湿度L
                      温度= 温度H×256+温度L


LCDは 湿度= 51.0%  温度=17.3℃

26uSと70uSが出ているのが確認できる
グラフ用紙に移すと下記のようになった。

ATmega328 を使い、表示器は液晶のSC2004を使う
PC0端子に 温湿度センサーAM2302を接続する

回路図
実験回路

一応、マニュアルをダウンロードすることができる。
ただし、英語である。(全く読めない)

@ 電源、ASDA(通信ライン)  BNC  CGND

1ms以上 Start signal落とすと、続けて 80uSのresponse signalが出てくる、
その後 40ビットの温湿度データが出てくる

温湿度計を作ってみよう

35mmの大きさの7SEG LEDが 4個 あったのでこれを使う事にした
テスターで測ると、カソードコモンである
制御するには、TD62783 を使う事にした。


取得した43ビットのデータを 0−1に変換する
35uS以上なら 「1」 以下なら 「0」を w_data[n1]に入れていく


// 0-1変換-----
for (datn=0;datn<43;datn++){
                 if(r_data[n1] >= 35){w_data[n1]=1;}
                 else{w_data[n1]=0;}
                 n1=n1+1;
                 }


w_data[n1]を 8ビットのデータに変換する
下記は 湿度Hデータに変換している

n1=3;humH=0;humL=0;tempH=0;tempL=0;
for(i=0;i<8;i++){
         humH=humH << 1;
        if(w_data[n1++] == 1){humH++;}
         }

回路は簡単である
AVRに4行20キャラの液晶表示器2004
を接続する
SC2004はメルカリで800円程度で販売されている

PC0 を出力にして 2ms Lowに落として
オシロスコープで端子をみる。

左の写真のようにデータがAM2302から出てくるのが
確認できる

実際のデータ

さて、データを取り出す方法をみてみると、
SDAラインは双方向になっており、 通常のH状態から 800uS以上Lowに落とすことで、
その後、湿度Hデータ、湿度Lデータ、温度Hデータ、温度Lデータ、パリティ 
8ビット×5 =40ビットのデータが続けて出力されるようだ。

SDAに接続したAVRマイコンのポートを出力にして、1ms程度 Lowに落とし
すぐに、入力に切り替えて、40ビットを受信する

26uS =0  70uS=1 になっているようだ