DHT22 온습도 센서를 라즈베리 파이에 연결해보자.
PIN 맵을 살펴보면 아래 그림과 같다.
1번은 +5V 에 연결하고, GND 는 GND 에 연결한다. 2번 데이터 핀은 GPIO 어디에나 연결 가능하다. wiringPi 핀번호와 소프트웨어에서 핀 번호를 일치시켜 주면 된다.
테스트는 VCC 1번 핀과 데이터 핀 2번 핀 사이에 10K 저항을 달지 않고 테스트 했는데 이상없이 데이터가 잘 나온다.
DHT22 센서의 간단한 사양은 아래와 같다.
DHT22 MODULE
Power: DC 3~5V
Pins: G (GND) – V (VCC) – D (Data)
Humidity Measurement: 0~100% humidity reading with 2~5% accuracy
Temperature Measurement: -40~125°C temperature reading with ±0.5°C accuracy
Should not measure more than once in every two seconds
연결은 다음과 같이 연결한다
nano 에디터를 사용해서 소스코드를 입력한다
$nano dht22temp.c
소스코드는 아래와 같다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 | /* * dht.c: * read temperature and humidity from DHT11 or DHT22 sensor */ #include <wiringPi.h> #include <stdio.h> #include <stdlib.h> #include <stdint.h> #define MAX_TIMINGS 85 #define DHT_PIN 11 /* GPIO-22 */ int data[5] = { 0, 0, 0, 0, 0 }; void read_dht_data() { uint8_t laststate = HIGH; uint8_t counter = 0; uint8_t j = 0, i; data[0] = data[1] = data[2] = data[3] = data[4] = 0; /* pull pin down for 18 milliseconds */ pinMode( DHT_PIN, OUTPUT ); digitalWrite( DHT_PIN, LOW ); delay( 18 ); /* prepare to read the pin */ pinMode( DHT_PIN, INPUT ); /* detect change and read data */ for ( i = 0; i < MAX_TIMINGS; i++ ) { counter = 0; while ( digitalRead( DHT_PIN ) == laststate ) { counter++; delayMicroseconds( 1 ); if ( counter == 255 ) { break; } } laststate = digitalRead( DHT_PIN ); if ( counter == 255 ) break; /* ignore first 3 transitions */ if ( (i >= 4) && (i % 2 == 0) ) { /* shove each bit into the storage bytes */ data[j / 8] <<= 1; if ( counter > 16 ) data[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) && (data[4] == ( (data[0] + data[1] + data[2] + data[3]) & 0xFF) ) ) { float h = (float)((data[0] << 8) + data[1]) / 10; if ( h > 100 ) { h = data[0]; // for DHT11 } float c = (float)(((data[2] & 0x7F) << 8) + data[3]) / 10; if ( c > 125 ) { c = data[2]; // for DHT11 } if ( data[2] & 0x80 ) { c = -c; } float f = c * 1.8f + 32; printf( "Humidity = %.1f %% Temperature = %.1f *C (%.1f *F)\n", h, c, f ); }else { printf( "Data not good, skip\n" ); } } int main( void ) { printf( "Raspberry Pi DHT11/DHT22 temperature/humidity test\n" ); if ( wiringPiSetup() == -1 ) exit( 1 ); while ( 1 ) { read_dht_data(); delay( 2000 ); /* wait 2 seconds before next read */ } return(0); } | cs |
컴파일 명령
$ gcc -o dht22temp dht22temp.c -lwiringPi
실행을 하면 결과가 잘 나온다.
$sudo ./dht22temp
Raspberry Pi DHT11/DHT22 temperature/humidity test
Humidity = 77.3 % Temperature = 31.3 *C (88.3 *F)
Humidity = 25.7 % Temperature = 28.6 *C (83.5 *F)
Humidity = 25.7 % Temperature = 28.6 *C (83.5 *F)
Humidity = 25.7 % Temperature = 28.6 *C (83.5 *F)
Data not good, skip
Humidity = 25.7 % Temperature = 28.6 *C (83.5 *F)
한가지 의문점은 DHT11 과 DHT22 온습도 센서의 소스코드가 같은것인지 의문점.
코드와 이미지 출처
1. http://www.uugear.com/portfolio/read-dht1122-temperature-humidity-sensor-from-raspberry-pi/
2. http://webnautes.tistory.com/990
'개발자 > Raspberry Pi' 카테고리의 다른 글
라즈베리 파이 LoRa 통신 모듈 테스트 남은 일들 (2) | 2016.12.20 |
---|---|
ctrl-c 프로세스 종료시 주의할 점과 SIGINT 시그널 사용법 (0) | 2016.12.08 |
sudo kill -9 pid 로 발생하는 메세지 처리, kill 메세지 처리 (0) | 2016.12.08 |
랜케이블 하나로 가장 빠르게 라즈베리파이와 접속하는 방법 (1) | 2016.11.30 |
라즈베리파이 DHT11 온도 습도 센서 사용하기, LCD 에 온도와 습도를 출력 (17) | 2016.10.24 |
라즈베리파이 LCD 1602 사용하기 16x2 LCD Hello World using C (2) | 2016.10.20 |
파이썬 프로그래밍의 기초 (0) | 2016.10.08 |
KT 제공 IoT Makers 에 연동시 컴파일 오류 (0) | 2016.09.27 |
더욱 좋은 정보를 제공하겠습니다.~ ^^