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;}
}
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
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 になっているようだ