본문 바로가기

개발자/라즈베리파이4

라즈베리파이4 스마트홈 온도 습도센서 코드 6

반응형

 

온도와 습도를 측정하고 이를 이용하여 제어하는 기술은 많은 분야에서 이용하고 있다. 아날로그 출력의 온습도 센서를 사용하여 마이크로컨트롤러에서 응용하기 위해서는 부가적인 회로나 AD컨버터 회로가 별도로 필요한데 DHT22/AM2302 온습도 센서는 4.7KΩ~10KΩ의 풀업저항만 준비하면 되므로 실습이 간편하다.

 

 

라즈베리파이 스마트 홈 실습 과정 전체 포스팅 리스트 

 

라즈베리파이4 스마트홈 제품 특징 1

라즈베리파이4 스마트홈 불꽃 센서 코드 2

라즈베리파이4 스마트홈 가스센서 코드 3

라즈베리파이4 스마트홈 소리센서 코드 4

라즈베리파이4 스마트홈 조도센서 코드 5

라즈베리파이4 스마트홈 온도 습도센서 코드 6

라즈베리파이4 스마트홈 인체감지 모션센서 코드 7

라즈베리파이4 스마트홈 액츄에이터 디지털 도어록 실습 8

라즈베리파이4 스마트홈 가스타이머 실습 9

라즈베리파이4 스마트홈 전동볼밸브 실습 10

라즈베리파이4 스마트홈 RFID 실습 11

라즈베리파이4 스마트홈 RGB LED 실습 12

라즈베리파이4 스마트홈 카메라 실습 13

라즈베리파이4 스마트홈 조명 LED bar 실습 14

라즈베리파이4 스마트홈 서버 프로그램 실습 15

라즈베리파이4 스마트홈 안드로이드 앱 설명 16

 

 

여기서 사용되는 온습도 센서는 고정밀 디지털 온습도 센서 모듈 DHT22/AM2302를 사용하기로 한다.

 

 

온도 습도센서 DHT22 핀

 

 

DHT22/AM2302 센서의 주요 특징을 아래 표로 나타내었다. 

 

특징 전기적 특성
1. 모델명 : AM2302 
2. 정밀도 및 해상도 : 0.1 
3. 습도 측정 범위 : 0-100%RH 
4. 온도 측정 범위 : -40~80 
5. 습도 측정 오차 : ±2%RH 
6. 온도 측정 오차 : ±0.5
7. 저전력소모 
8. 부가회로가 불필요
- 사용 전압 : 3.3-6V DC
- 싱글핀 디지털 데이터 출력
- 측정 응답 시간 : min 2
- 측정 조건 VDD = 5V , T = 25
- Pin Connection
Pin 1 – 전원 VCC 3.5~5.5V DC
Pin 2 - DATA (시리얼 양방향)
Pin 3 – 사용안함(No Connection)
Pin 4 - GND

 

 

요즘에는 신호 증폭, ADC, 보정, 통신 등의 회로를 내장하고 온도, 습도를 동시에 측정할 수 있는 센서들이 나오고 있다. DHT22/AM2302은 DHT11과 사용법이 비슷하나 DHT11에 비해 정밀도가 높고 응답시간이 빠른 장점이 있다. DHT22/AM2302 온습도 센서의 통신방법, 프로토콜에 대한 상세한 내용은 데이터 북을 참조한다.

 

아래 데이터북을 올리니 참고바랍니다.

 

DHT22.pdf
0.88MB

 

 

 

 

온도 습도 센서 DHT22 연결

 

 

온도 습도 센서 연결 회로도

 

온습도 센서의 연결

 

아래는 온습도 센서 데이터를 읽어오는 소스이다. nano 편집기를 이용해 소스를 입력한다. home-humitemp.c  

 

/*
 *      dht22.c:
 *	Simple test program to test the wiringPi functions
 *	Based on the existing dht11.c
 *	Amended by technion@lolware.net
 */

#include <wiringPi.h>

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <sys/types.h>
#include <unistd.h>

#define MAXTIMINGS 85
static int DHTPIN = 21;
static int dht22_dat[5] = {0,0,0,0,0};

static uint8_t sizecvt(const int read)
{
  /* digitalRead() and friends from wiringpi are defined as returning a value
  < 256. However, they are returned as int() types. This is a safety function */

  if (read > 255 || read < 0)
  {
    printf("Invalid data from wiringPi library\n");
    exit(EXIT_FAILURE);
  }
  return (uint8_t)read;
}

static int read_dht22_dat()
{
  uint8_t laststate = HIGH;
  uint8_t counter = 0;
  uint8_t j = 0, i;

  dht22_dat[0] = dht22_dat[1] = dht22_dat[2] = dht22_dat[3] = dht22_dat[4] = 0;

  // pull pin down for 18 milliseconds
  pinMode(DHTPIN, OUTPUT);
  digitalWrite(DHTPIN, HIGH);
  delay(10);
  digitalWrite(DHTPIN, LOW);
  delay(18);
  // then pull it up for 40 microseconds
  digitalWrite(DHTPIN, HIGH);
  delayMicroseconds(40); 
  // prepare to read the pin
  pinMode(DHTPIN, INPUT);

  // detect change and read data
  for ( i=0; i< MAXTIMINGS; i++) {
    counter = 0;
    while (sizecvt(digitalRead(DHTPIN)) == laststate) {
      counter++;
      delayMicroseconds(1);
      if (counter == 255) {
        break;
      }
    }
    laststate = sizecvt(digitalRead(DHTPIN));

    if (counter == 255) break;

    // ignore first 3 transitions
    if ((i >= 4) && (i%2 == 0)) {
      // shove each bit into the storage bytes
      dht22_dat[j/8] <<= 1;
      if (counter > 16)
        dht22_dat[j/8] |= 1;
      j++;
    }
  }

  // check we read 40 bits (8bit x 5 ) + verify checksum in the last byte
  // print it out if data is good
  if ((j >= 40) && 
      (dht22_dat[4] == ((dht22_dat[0] + dht22_dat[1] + dht22_dat[2] + dht22_dat[3]) & 0xFF)) ) {
        float t, h;
        h = (float)dht22_dat[0] * 256 + (float)dht22_dat[1];
        h /= 10;
        t = (float)(dht22_dat[2] & 0x7F)* 256 + (float)dht22_dat[3];
        t /= 10.0;
        if ((dht22_dat[2] & 0x80) != 0)  t *= -1;


    printf("Humidity = %.2f %% Temperature = %.2f *C \n", h, t );
    return 1;
  }
  else
  {
    printf("Data not good, skip\n");
    return 0;
  }
}

//int main (int argc, char *argv[])
int main (void)
{
  
  if (wiringPiSetup() == -1)
    exit(EXIT_FAILURE) ;
	
  if (setuid(getuid()) < 0)
  {
    perror("Dropping privileges failed\n");
    exit(EXIT_FAILURE);
  }

  while (read_dht22_dat() == 0) 
  {
     delay(1000); // wait 1sec to refresh
  }


  return 0 ;
}

 

컴파일 명령

 

$gcc -0 home-humitemp humitemp.c -l wirlingPi

 

실행 명령과 결과

 

pi@raspberrypi ~/smarthome $ sudo ./home-humitemp
Humidity = 54.40 % Temperature = 25.10 *C
pi@raspberrypi ~/smarthome $ sudo ./home-humitemp
Humidity = 56.10 % Temperature = 25.20 *C
pi@raspberrypi ~/smarthome $$sudo ./dht22 11
Humidity = 17.30 % Temperature = 25.00 *C

 

 

반응형

더욱 좋은 정보를 제공하겠습니다.~ ^^