DHT11 온습도 센서 모듈
1번pin : 전원(3.3V~5V)
2번pin : 데이터선(시리얼 양방향)
3번pin : GND(접지)
👉 MCU가 start 신호를 보내서 센서한테 데이터를 읽어올테니 준비 완료 상태일 때 low level, high level 신호를 발생시켜 보내라는 의미
AM2302 모듈 : 센서가 MCU의 동작을 waiting하고 있었으면 이 신호를 만들어내도록 센서를 하드웨어적으로 만들어낸 것
MCU는 160us 동안 기다렸다가 다음 클럭부터 습도 배열 16비트, 온도 배열 16비트 생성
- 40비트의 온습도 데이터에서 0의 신호 포멧 (평균 77us)
- 40비트의 온습도 데이터에서 1의 신호 포멧 (평균 120us)
👉 Low 신호의 시간은 50us로 동일
But, 첫 번째 데이터 비트를 보내는 High 신호를 가지고 0과 1을 구분#define MAXTIMINGS 85 // level이 바뀐 횟수(1,0이 바뀐 횟수) pinMode(pin, OUTPUT); // digitalWrite(pin,LOW) pinMode(pin, INTPUT); // digitalRead(pin)
transition이 발생할 때 마다 i++된다.
if((i>=4) && (i%2==0))
i<4 일땐 센서 준비로 유효하지 않은 데이터이다.
i가 짝수일 때만 HighLevel로 0 or 1인지 확인하는 것은 시간을 측정하여 데이터를 저장한다.
dht22_dat[j/8] << =1;
j값이 0~7 : 습도 정수 데이터(8bit)
8~15 : 습도 소수점 데이터(8bit)
16~23 : 온도 정수 데이터(8bit)
24~31 : 온도 소수점 데이터(8bit)
32~39 : 패러티 비트(8bit)
if((j>=40) && (dht22_dat[4] == ((dht22_dat[0] + ... + dht22_dat[3]) & 0xFF)))
40bit 이후이고 패러티 비트(dht22_dat[4])는 온습도 데이터를 모두 합한 값일 때 온습도 값을 계산.