반응형
온도와 습도를 측정하고 이를 이용하여 제어하는 기술은 많은 분야에서 이용하고 있다. 아날로그 출력의 온습도 센서를 사용하여 마이크로컨트롤러에서 응용하기 위해서는 부가적인 회로나 AD컨버터 회로가 별도로 필요한데 DHT22/AM2302 온습도 센서는 4.7KΩ~10KΩ의 풀업저항만 준비하면 되므로 실습이 간편하다.
라즈베리파이 스마트 홈 실습 과정 전체 포스팅 리스트
라즈베리파이4 스마트홈 액츄에이터 디지털 도어록 실습 8
여기서 사용되는 온습도 센서는 고정밀 디지털 온습도 센서 모듈 DHT22/AM2302를 사용하기로 한다.
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 온습도 센서의 통신방법, 프로토콜에 대한 상세한 내용은 데이터 북을 참조한다.
아래 데이터북을 올리니 참고바랍니다.
온도 습도 센서 연결 회로도
아래는 온습도 센서 데이터를 읽어오는 소스이다. 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
반응형
'개발자 > 라즈베리파이4' 카테고리의 다른 글
Raspberrypi MCP3208 ADC 전류 센서 연결도 (1) | 2023.05.19 |
---|---|
라즈베리파이4 스마트홈 가스타이머 실습 9 (0) | 2023.05.18 |
라즈베리파이4 스마트홈 액츄에이터 디지털 도어록 실습 8 (1) | 2023.05.17 |
라즈베리파이4 스마트홈 인체감지 모션센서 코드 7 (0) | 2023.05.16 |
스마트홈 서버 프로그램 데이터 베이스 에러 해결 (1) | 2023.05.12 |
라즈베리파이4 스마트홈 조도센서 코드 5 (0) | 2023.05.12 |
라즈베리파이4 스마트홈 소리센서 코드 4 (0) | 2023.05.11 |
라즈베리파이4 스마트홈 가스센서 코드 3 (4) | 2023.05.10 |
더욱 좋은 정보를 제공하겠습니다.~ ^^