温湿計とLEDを連携してみよう ~AM2320+LED by C~

温湿計とLEDを連携してみよう ~AM2320+LED by C~

はじめに

今回は、温湿度計:AM2320で計測した値をもとにLEDを点灯させていきます。
下記2つの内容を組み合わせて行います。わからない部分は参照してください。
基本的にDHT11版と同じです。


用意するもの
Raspberry Pi Raspberry Pi 4
AM2320AM2320
LED3mm赤色LED 70° OSR5JA3Z74A
抵抗カーボン抵抗 1/2W 5.1kΩ(100本入)
ジャンパーケーブルジャンパーケーブル
ブレッドボードブレッドボード

方針

AM2320で測定した温度が一定値を超えたときにLEDが点灯、下回った時に消灯するようにします。
温度のチェックは30秒毎に行うことにします。温度は室温を目安に設定してください。

機器の接続

機器の接続は下図のようにしました。
18番にAM2320の測定データピン、23番にLEDのプラスを接続しています。

実機だとこのようになります。
接続が増えるのでぐちゃぐちゃです。

プログラム・実行

温湿度を計測する処理が長いので省略してます。
全体は本記事一番末尾に記載します。

#include <stdio.h>
#include <time.h>
#include <wiringPi.h>
#include <math.h>

//AM2320 parameter
・
・
・

int main()
{
    //START
    ・
  ・温湿度を計測する処理
  ・
    
     
    pinMode(23 , OUTPUT); //GPIO23のモードをOUTに設定

    if ( tem >= 24 ){  //24度をターゲット
        digitalWrite(23 , HIGH);
    }else{
        digitalWrite(23 , LOW);
    }

    return 0;
}


記述時の我が家の室温が22度程度でしたので24度を超えた場合にLEDが点灯するようにしました。
温湿度計を指で温めれば高い温度を出すことができます。
規定温度を超えるまで指で温めればLEDが点灯するはずです。指を話せばそのうち元の温度に戻りますのでLEDが消灯します。

おわりに

室温に対応してLEDを点灯することができました。
DHT11となにも変わりなく、自宅の測定でLEDを光らせるという目的であればわざわざAM2320を買う必要ななさそうです。
性能さがどのくらい出ているのかもいまいちわからなかったり・・・。

温湿度の測定、LEDとの連携ができたので他の機器との連携も簡単に行えると思います。
7セグメントと連携して温度、湿度を表示したりと。実際に箱などを作って温湿度計を作ってみるのも面白いかなと考えています。



付録
#include <stdio.h>
#include <time.h>
#include <wiringPi.h>
#include <math.h>

//AM2320 parameter
#define AM2320_DATAPIN 18
#define AM2320_START_SIG_LOW 1
#define AM2320_START_PullUp 20
#define AM2320_WAITRES_LOW 75
#define AM2320_WAITRES_HIGH 75
#define AM2320_DATAWAIT_LOW 48
#define AM2320_BITZERO 22
#define AM2320_BITONE 68
#define AM2320_END 45

int main()
{

    //START
    //SetUp
 	int AM2320_DATA[40]= {0}; 
    wiringPiSetupGpio();
    pinMode(AM2320_DATAPIN , OUTPUT);
    
    digitalWrite(AM2320_DATAPIN , HIGH);
    delay(2000);
    
    //START OUTPUT LOW >1ms
    digitalWrite(AM2320_DATAPIN , LOW);
    delay(AM2320_START_SIG_LOW);

    //START PUll up
    digitalWrite(AM2320_DATAPIN , HIGH);
    delayMicroseconds(AM2320_START_PullUp);
    
    //Response LOW SIG
    pinMode(AM2320_DATAPIN , INPUT);
    for ( int i = 0 ; i < AM2320_WAITRES_LOW ; i++ ){
        if (digitalRead(AM2320_DATAPIN) == HIGH){
            break;
        }
        delayMicroseconds(1);   
    }
    
    //Response HIGH SIG
    delayMicroseconds(AM2320_WAITRES_HIGH);
    for ( int i = 0 ; i < AM2320_WAITRES_HIGH ; i++ ){
        if (digitalRead(AM2320_DATAPIN) == LOW){
            break;
        }
        delayMicroseconds(1);
    }
    
    //DATA Recieve
    for ( int i = 0 ; i < 40 ; i++){
        //start bit wait
        delayMicroseconds(AM2320_DATAWAIT_LOW);
        for ( int j = 0 ; j < AM2320_DATAWAIT_LOW ; j++){
            if(digitalRead(AM2320_DATAPIN) == HIGH){
                break;
            }
            delayMicroseconds(1);
        }
        for ( int j = 0 ; j < 255 ; j++){
            if (digitalRead(AM2320_DATAPIN) == LOW){
                if ( j  < AM2320_BITONE ){
                    AM2320_DATA[i] = 0;
                } else {
                    AM2320_DATA[i] = 1;
                }
                break;
            }
            delayMicroseconds(1);
        }
    }
    
    //End process
    delayMicroseconds(AM2320_END);
    digitalWrite(AM2320_DATAPIN , HIGH);
    
    //data check
    int dec[4] = {1,2,4,8};
    float dt[10] = {0};
    int hex[4] = {1,16,256,1536};
    for ( int i = 0 , j = 3 ,k = 0 , l = 3 ; i < 40 ; i++ , j--){
        if (AM2320_DATA[i] == 1 ){
            dt[k] += dec[j];
        }
        if ( j < 0 ){
            dt[k] = dt[k] * hex[l];
            l -= 1;
            if ( l < 0){
                l = 3 ;
            }
            j = 3;
            k += 1;
        }
    }
    float hum = (dt[0] + dt[1] + dt[2] + dt[3]) / 10 ;
    float tem = (dt[5] + dt[6] + dt[7]) / 10 ; 
    
    if (dt[4] == 1536 ){
        tem = tem * -1   ;
    }
    printf( "temperature %d.%d  humdity %d.%d  \n" , tem , hum );
    
    pinMode(23 , OUTPUT); //GPIO23のモードをOUTに設定

    if ( tem >= 24 ){  //dt[2]:温度の整数部分 dt[3]:温度の少数部分
        digitalWrite(23 , HIGH);
    }else{
        digitalWrite(23 , LOW);
    }
    retrun 0   
}


タイトルとURLをコピーしました