로그인회원등록 내글장바구니주문조회현재접속자
 상품 검색








 게시판 검색





 
 
회원등록 비번분실


온라인 입금계좌
ㆍ기업은행
ㆍ219-043192-01-028
ㆍ이건영

      거래은행 바로가기
 
 Sensor Applications
아듀이노 응용소스
작성자 avrtools™        
작성일 2016/02/12
첨부#1 DHT-sensor-library-master.zip (7KB) (Down:391)
첨부#2 DHT22-_AM2302.pdf (407KB) (Down:70)
ㆍ추천: 0  ㆍ조회: 280   
  Arduino 온습도 센서 DHT-22
아두이노 온습도 센서 DHT-22  
참조 : 전자식 온도계 DHT-11 센서 모듈

온습도 센서 DHT11을 2/4에 구입했는데, 명절 연휴라 그런지 2/12 오늘에야 도착이 됬다.
DHT11 수입판매 가격은 4,500~5,500원 정도, Aliexpress.com에서는 USD 0.9~1.2다. 
DHT22 수입판매 가격은 7,500~8,500원 정도, 원산지는 USD 2.0~3.5다.

온도와 습도를 아듀이노의 LCD에 표시하는 전자식 온도계를 만들어 보자.
 
  

DHT-11 규격
전원 3.5 ~ 5.5V
습도 20-90% RH ±5%
온도 0-50 ℃ ±2℃
4 핀 1줄

DHT-22 규격
전원 3.3 ~ 5.5V
습도 0-100% RH ±2%
온도 0-100℃ ±0.5℃
4 핀 1줄

필요 부품
아두이노 Uno 호환 기판
DHT-11 혹은 DHT-22 온도-습도 센서
문자 LCD 16 자×2 줄
10K 기판용 가변저항
빵판과 몇개의 점퍼선
 
센서를 기판에 장착한 모듈
  
3핀 커넥터와 데이터 풀업-저항 10K, 전원측 잠음 결합방지 MLCC 104다. 
 
DHT-11의 구조
   
 
14핀 IC 1개와 몇개의 R, C 그리고 세라믹 습도 센서가 보인다. 사진에는 온도센서가 안보인다.
DHT-11은 작동 전압이 3.5~5.5V로 3V에서 성능보증이 안된다.
안정된 작동이 필요하면 5V로 작동하든지 DHT-22를 사용하는 것이 좋다.
 
LCD
16자×2줄의 문자표시 LCD 모듈은 HD44780 호환품이 필요하다.
부품 상점에서 보통 판매하는 문자 LCD다.
아두이노 기판에서 사용하는 LCD는 4비트와 8비트 모드가 있다,
LCD는 16자 2줄의 4 비트 병렬 모드를 선택했다.

DHT11 온습도계 회로
    
 
DHT11은 1 Wire 인터페이스이므로 D8 핀 1개를 사용한다.
LCD는 4비트 모드로 RS =D2, E =D3, DB4 =D4, DB5 =D5, DB6 =D3, DB7 =D7를 연결한다.
LCD RW 핀은 GND로 직접 연결한다. LCD VEE 핀 3은 명암을 조절하는 저항이다.
D0과 D1은 아두이노 스케치와로 데이터를 보내는 직렬통신 용도는 변경없이 사용한다.  

DHT11 온습도계의 LCD

 
 
DHT22_Test.ino
소스는 D12를 센서입력 핀으로 사용하고 있다.
LCD는 남아 있는 D2~D7의 6개 핀을 나란히 사용하면 연결하기 좋다.
 
첨부파일 #1의 압축을 풀고 DHT22_Test.ino 소스가 들은 폴더 안으로 파일만 복사한다.
아래 그림처럼 3개의 파일이 나란히 들어 있으면 된다.
소스의 폴더 이름도 소스와 같은 DHT22_Test로 만들면 문제가 전혀 없다.
 
 
// 시험 스케치는 DHT 11~2X의 상대습도와 온도를 읽는다.
// 저자 : ladyada

// DHT 센서 연결.
// 센서의 좌측 1번 핀은 +5V 전원으로 연결한다.
// 만일 기판이 3.3V를 사용하면 아두이노 Due에서는 5V 대신 1번 핀 3.3V로 연결한다.
// 센서의 2 번핀은 사용자의 DHT 포트 핀으로 연결한다.
// 센서의 오른쪽 4 번핀은 GND로 연결한다.
// 10 K 저항을 2번 핀과 1번 핀 사이에 연결한다.
   
// DHT 센서 초기화
// 오래된 개정판의 library는 빠르게 처리하기 위해 option 상수로 타이밍을 추출한다.
// 빠르게 처리하는 상수를 조절해서 DHT를 읽는 algorithm은 필요없다.
 
#include "DHT.h"  // DHT library DHT.cpp를 주함수에 포함시킨다.
#define DHTPIN 12     // 센서를 연결하는 핀 번호다.
#define DHTTYPE DHT22   // DHT22는 숫자 22로 대치된다. 부품번호 AM2302, AM2321 이다.
DHT dht(DHTPIN, DHTTYPE);  // 센서의 핀 번호와 센서의 고유번호를 library의 변수에 대입한다.

void setup() {  // 아두이노 스켓치의 평범한 초기화 함수
  Serial.begin(9600);  // 직렬포트를 9600 bps로 설정
  Serial.println("DHT22 Sensor Test !!!");  // 직렬포트로 장치의 제목을 송신한다.
  dht.begin();  // libray의 센서 초기화 함수를 실행한다. (대부분 변수 정의 뿐이다)
}
 
void loop() {  // 주함수 시작, 주함수는 한바퀴 돌고 여기에서 다시 시작한다.
  delay(2000);  // 센서를 읽기위해 2초를 기다린다. (2초 -실행시간)을 대기하면 더 좋다.

  // 약 250 ms 동안 온도와 습도를 읽는다. 센서를 읽는 시간은 구형과 동일한 2 초다.
  float h = dht.readHumidity();  // 습도를 읽는다. h로 저장한다
  float t = dht.readTemperature();  // 온도를 Celsius로 읽는다. 호출 매개변수는 0. t로 저장한다
  float f = dht.readTemperature(true);  // 온도를 Fahrenheit로 읽는다. 호출 매개변수는 1. f로 저장한다. 
 
  // 읽기 실패 혹은 너무 빨리 돌아오는지 확인한다.  
  if (isnan(h) || isnan(t) || isnan(f)) {
    Serial.println("Failed to read from DHT sensor!");  //오류가 있으면 직렬포트로 오류상태를 송신한다.
    return;  // 오류가 없으면 다음 처리로 간다. 
  }  // return이 없어도 다음 처리로 가는데 어째서 return을 하는가?
     // stack 처리기반의 컴파일러는 소스가 batch 형식이라도, 보조함수를 만들어 호출하기 때문인가?
 
  float hif = dht.computeHeatIndex(f, h);   // 체감온도를 계산한다. 초기값은 Fahreheit 이다
  float hic = dht.computeHeatIndex(t, h, false);   // 체감온도를 Celsius로 계산한다. (isFahreheit는 0)
 
  Serial.print("Humidity: "); // 직렬포트로 게산한 값들을 모두 송신한다.
  Serial.print(h);
  Serial.print("% ");

  Serial.print("Temperature: ");
  Serial.print(t);
  Serial.print("*C ");

  Serial.print(f);
  Serial.print("*F ");

  Serial.print("Heat index: ");
  Serial.print(hic);
  Serial.print("*C ");

  Serial.print(hif);
  Serial.println("*F");

  // LCD 표시 함수는 여기에 추가하면 된다.
}  // 주함수 끝.

DHT22 센서의 디버깅
DHT.h에서  #define DHT_DEBUG 앞의 //를 지우고 디버깅을 활성시키면, 센서의 low값이 보인다. 
// Uncomment to enable printing out nice debug messages.
// #define DHT_DEBUG

 
  

 
sys clock으로 몇 cycle로 DHT22 센서가 읽히는지 표시한다.
DHT22 Sensor Test !!!  Max clock cycles: 16000
참조: DHT22 온-습도 센서의 데이터
 
다음 줄은 센서의 low data를 hex 값으로 표시한다.
 DHT22: 1, E3, 0, EE, D2 =? D2
마지막 2개의 값 D2 =? D2는 들어온 첵섬과 검산한 첵섬이 일치하는지 확인한다.

다음 줄은 상대습도(%), 온도(C), 온도(F), Heat Index(C)를 표시한다.
Humidity: 48.20% Temperature: 23.80*C 74.84*F Heat index: 23.49*C 74.29*F

Heat Index란 습도에 따라서 주위온도의 느낌이 틀린정도를 나타낸다.  
체감온도 heat index는 습도가 올라가면 지수 비레하는 특성이 있다.
 
체감온도 HI = -42.379 + 2.04901523*T + 10.14333127*RH - 0 .22475541*T*RH -  0.00683783*T*T
-  0.05481717*RH*RH + 0 .00122874*T*T*RH + 0 .00085282*T*RH*RH -  0.00000199*T*T*RH*RH
참조: Weather Prediction Center
 
온습도 센서를 시험하려고 몇가지 DHT11과 DHT22  library를 시험했지만,

데이터가 흔들거리거나, 오류가 많이 나거나, 나오다 안나오다 하는 경우가 많았다.
이 library는 기능도 많고 auto sync로 읽기속도를 센서에 적응하는 방식이라 매우 좋다.      

기대하는 신호선은 주기적으로 시간이 되면 특정한 레벨로 바뀌어야 하고,
loop counter는 그 레벨에서 시간을 소비하면서 기다린다.
이 loop counter는 2개의 펄스 시간을 상대적으로 비교할 수 있다.(△T)
참조 : Arduino Wiring Pulse

폭 10us 이내로 펄스를 판단하기 위해, AVR 플렛폼의 direct GPIO로 매우 빠르게 포트를 인식한다.
만일 두개의 레벨이 변화없이 20,000 count 보다 크면 결과값은 0으로 fail 상태로 return 된다.

 
센서에서 첫번째로 들어오는 low 신호의 펄스폭이 20,000 count 이내로 기준 count를 추출하는 함수 
  uint8_t portState = level ? _bit : 0;  // 센서가 연결된 사용자의 포트와 핀 번호다.
  while ((*portInputRegister(_port) & _bit) == portState) {  // 센서 핀의 로직이 low인지 빠르게 읽는다.
    if (count++ >= _maxcycles) {  // count를 +1하고 펄스폭이 기준값보다 크면과 시간초과다.
      return 0;
// 시간초과는 0을 가지고 return 한다. 기준시간 본다 작으면 계속 센서를 읽는다
    }
  }
 return count; 
// 기준시간 이내에 펄스가 high로 되면 while 순환을 끝내고 count 값을 가지고 나간다.
// count 값이 0 이면 시간초과이고, count는 40 비트를 수신하는 기준 시간으로 사용한다.

핵심은 library DHT.cpp에서 아두이노의 펄스 길이를 검사하는 방법을 사용했다. 
가장 최근의 아두이노 스케치 버전에서 가능하다. V1.6 이상에서 잘 된다.
DHT의 신호를 꼼꼼하게 살펴보자. 센서는 20ms의 low 펄스를 주면 리셋된다.

센서의 리셋은 첫번째 시작비트로 low와 high가 모두 50%인 펄스폭으로 응답한다.
세서의 시작비트 low가 1ms 시간초과 이내 (20,000 count 이하)로 들어오면 성공이다.
high와 low의 펄스폭을 측정한 count 값으로 40 비트와 쉽게 동기시킬 수 있다.

DHT-11, 22의 신호
데이터 구조는 8 비트의  integral RH + 십진 RH + integral 온도 + 십진 온도 + 첵섬이다.
데이터가 정상이라면 첵섬은 4개의 8 비트 합계와 같아야 한다.

  

DHT11의 응답은 상대 습도와 온도를 8 비트 5개의 데이터로 전송하고 절전모드로 바뀐다.
DHT11은 18ms 이상의 low 신호를 받으면 40us 이내에 절전 모드에서 작동 모드로 바뀐다.
 
센서의 시작비트는 80us의 low와 80us의 high로 동일한 펄스폭이다.
센서에서 80us의 low가 20,000 count 이내로 들어오면 측정된 count 값은 센서와 동기된 것이다.

 
5 바이트 데이터는 2 바이트 상대습도, 2 바이트 온도 값, 1 바이트 첵섬을 전송한다.
각 비트는 50us low 펄스 다음의 high 펄스폭이 26~28us 이면 0, 70us 이면 1 이다.


이 프로그램은 무료 소프트웨어로, 신체와 재산 상의 어떤 위험과 손해를 보상하지 않습니다.
이 프로그램은 GNU 무료 소프트웨어 배포규정을 따릅니다.
Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA
  AVRTOOLS™
   
윗글 ESP8266 Weather Server의 제작
아래글 ESP8266 WiFi 펌웨어 업그레이드
    N         제목    글쓴이 작성일 조회 추천
아듀이노 응용소스 게시판 avrtools™ 2016/02/05 (금) 151 0
25 ESP8266 MQTT Relay Control avrtools™ 2016/03/03 (목) 215 0
24 2 채널 ESP8266 WiFi Switch의 제작 avrtools™ 2016/02/25 (목) 239 0
23 ESP-12E SDK 0.9.5 사용방법 avrtools™ 2016/02/18 (목) 292 0
22 ESP8266 ESP-12E WiFi 센서 서버의 제작 avrtools™ 2016/02/17 (수) 277 0
21 Arduino DS3231 RTC to 5110 LCD avrtools™ 2016/02/16 (화) 343 0
20 ESP8266 Weather Server의 제작 avrtools™ 2016/02/15 (월) 311 0
19 Arduino 온습도 센서 DHT-22 avrtools™ 2016/02/12 (금) 280 0
18 ESP8266 WiFi 펌웨어 업그레이드 avrtools™ 2016/02/11 (목) 474 0
17 Arduion ESP8266 WiFi 설정 방법 avrtools™ 2016/02/10 (수) 378 0
16 Arduino 정전용량식 수분센서의 분석과 제작 avrtools™ 2016/02/07 (일) 234 0
15 Arduino 전극식 수분센서의 분석과 제작 avrtools™ 2016/02/07 (일) 304 0
14 Arduino 정밀 전력계의 ADC avrtools™ 2016/02/02 (화) 396 0
13 Arduino 정밀 전력계의 LPF avrtools™ 2016/02/02 (화) 343 0
12 Ardunio 16비트 ADC Data Logger avrtools™ 2016/01/31 (일) 221 0
11 Arduino AC/DC Power Meter의 제작 avrtools™ 2016/01/29 (금) 361 0
10 Arduino 교류 역율계(power factor)의 제작 avrtools™ 2016/01/29 (금) 309 0
9 Arduino DUE based DDS Synthesizer avrtools™ 2016/01/24 (일) 187 0
8 QTouch ADC 근접검출 스위치 avrtools™ 2016/01/21 (목) 324 0
7 Arduino 음성인식 Speech/Voice Recognition avrtools™ 2013/09/14 (토) 1617 0
6 Arduino Uno로 만드는 3축 CNC avrtools™ 2013/09/10 (화) 2462 0
5 Arduino로 만드는 mySpectral 분광기 avrtools™ 2013/09/04 (수) 2013 0
4 8채널 12비트 ADC MCP3208 오실로스코프 avrtools™ 2012/03/29 (목) 418 0
3 교류저항 (impedance) 측정 AD5933 avrtools™ 2012/03/17 (토) 339 0
2 Arduino DMX512 수신기 제작 avrtools™ 2012/03/15 (목) 3590 0
1 TSL2561 조도 측정기의 제작 avrtools™ 2011/09/11 (일) 2568 0
1

바구니 : 0
 보관함 : 0
오늘뷰 : 0
HOME   |   회사소개   |   제휴안내   |   회사위치   |   서비스이용 약관   |   개인정보 보호정책   |   사이트맵
17015 경기도 용인시 기흥구 동백중앙로16번길 16-25, 508호. 전화 : 031-282-3310
사업자 등록번호 : 697-47-00075 / 대표 : 이건영 / 업태 : 제조업 / 종목 : LED조명, LED전원, 제어장치.
개인정보 관리책임자 : 홈페이지 관리자 . Copyright ⓒ2016 아크레즈 (ACLEDS INC.)
HOME TOP PREVNEXT 0 0 0