센서를 아두이노에 연결해보고는 너무 허무해서 잠시 공황상태에 빠져 있었습니다. ^^

우선 DTH11에 대해서 알아 봅시다.


센서 제조사 홈페이지에서 우선 기본 적인 사항을 확인해 봅니다.


http://www.waveshare.com/temperature-humidity-sensor.htm

http://www.waveshare.com/wiki/DHT11_Temperature-Humidity_Sensor


아두이노등과 연결하기 위해 PIN 연결에 대한 상세 정보를 확인합니다.






귀찮은 나머지 빵판 없이 바로 연결을 해 봅니다.

GND / 5V / DataPin 8 번과 모듈을 연결~ 

정상적으로 연결되면 모듈의 PWR LED에 사진처럼 불이 들어옵니다.




아래는 DataSheet 자료입니다.

Datasheet에 아래와 같이 데이터 자료 구조와 interface의 signal정보를 찾을 수 있습니다.


http://www.waveshare.com/w/upload/c/c7/DHT11_datasheet.pdf


◎Parity bit data definition 


“8bit humidity integer data + 8bit humidity decimal data +8 bit temperature integer data + 8bit temperature fractional data” 8bit checksum is equal to the results of the last eight. 


Example 1: 40 data is received: 

              0011 0101         0000 0000          0001 1000         0000 0000     0100 1101 

              High humidity 8   Low humidity 8    High temp. 8     Low temp. 8     Parity bit 

Calculate: 0011 0101+0000 0000+0001 1000+0000 0000= 0100 1101 

Received data is correct: Humidity:0011 0101=35H=53%

                               RH Temperature:0001 1000=18H=24℃ 


미리 예제 코드를 돌려서 Probe로 동작하는 pulse를 찍어보니 DataSheet 대로 나오고 있음이 확인 됩니다.



High 신호에 있다가 위의 그림처럼 18ms 시간 동안 Low로 DATA pin을 Host가 내려주다가 다시 High로 올려주면, 모듈단에서 Start signal로 인식이 됩니다. 위의 diagram에서 후반부에 많이 겹쳐 있는 시그널 부분이 40 bit data 전송 구간입니다.




Diagram 신호를 확대해 보면 Host가 start signal을 위해 High로 올려준 신호 이후에, 80us 간격으로 Low와 High signal이 보입니다. 
위의 다이어 그램과 비교해보면 [Host the start of Signal] 과 [Response Signal] 구간입니다.
아래 신호에서 마우스로 표기되어 있는 부분이 실제 데이터 전송의 시작 부분입니다.




0과 1의 구분은 High 로 올라간 신호의 길이를 통해 구분하는 것을 아래 Datasheet를 통해 확인 할 수 있습니다.

위의 diagram의 Data 0 와 Data 1 부분을 보면 실제 정의된 대로 신호가 출력되고 있음을 알 수 있습니다.




모듈 제조사의 홈페이지를 보니 친절하게 예제 소스 코드도 들어 있네요.

Datasheet에 정의된 시그널 대로 처리를 해주어야 값을 제대로 읽어 올 수 있습니다.



컴파일/다운로드 이후 실행 결과를 보고 싶으시다면 Sketch의 Serial Monitor를 통해서도 확인할 수 있습니다.






아래는 테스용 코드로 여기저기서 짜집기한 코드입니다. 

필요하시면 참조하세요.

// sedew810225@gmail.com


const int DHTdataPin = 8;


int temperature = -1;

int humidity = -1;


void setup() {

  Serial.begin(115200);

}


void loop() {


  int ret = readDHT11();

  if (ret != 0){ 

    Serial.println(ret);

  } else {

    Serial.print("Humidity: "); Serial.print(humidity); Serial.println(" %");

    Serial.print("Temperature: "); Serial.print(temperature); Serial.println(" C");

  }

  delay(400);

  

}


int readDHT11(){

  uint8_t recvBuffer[5];

  uint8_t cnt = 7;

  uint8_t idx = 0;

  for (int i=0;i<5;i++) recvBuffer[i] = 0;

  

  // request sample

  pinMode(DHTdataPin, OUTPUT);

  digitalWrite(DHTdataPin, LOW);

  delay(18);

  digitalWrite(DHTdataPin, HIGH);

  delayMicroseconds(40);


  pinMode(DHTdataPin,INPUT);


  unsigned int timeout = 10000;


  // ACK 

  timeout = 10000;

  while(digitalRead(DHTdataPin) == LOW){

    if (timeout==0) return -1;

    timeout--;

  }


  timeout = 10000;

  while(digitalRead(DHTdataPin) == HIGH){

    if (timeout==0) return -2;

    timeout--;

  }


  // Read data for 40 bits 

  for (int i=0;i<40;i++){

    

    timeout = 10000;

    while(digitalRead(DHTdataPin) == LOW){

      if (timeout==0) return -3;

      timeout--;

    }


    unsigned long t = micros();


    timeout = 10000;

    while(digitalRead(DHTdataPin) == HIGH){

      if (timeout==0) return -4;

      timeout--;

    }


    if ( (micros() -t) > 40) recvBuffer[idx] |= (1<<cnt);

    if (cnt==0){

        cnt=7;

        idx++;

    } else cnt--;

   

  }


  humidity = recvBuffer[0];

  temperature = recvBuffer[2];

  uint8_t sum = recvBuffer[0]+recvBuffer[2]; 

  if ( recvBuffer[4] != sum) return -2;

  return 0;

}


반응형




드디어 벼르고 벼르던 ARDUINO와 센서들을 구입하였습니다.

장난 삼아서라도 그냥 만들어 보고 싶던 것을 무작정 만들어보기~


아래 녀석은 ARDUINO 시리즈 중에 Genuino 101 입니다. 

미국에서는 ARDUINO라고 파는데, 그 외의 국가에서는 GENUINO라는 브랜드 명을 사용합니다.



이 보드를 선택하게 된 이유는 중력 센서와 가속도 센서가 포함되어 있기 때문이랍니다.

자세히 보니 BLE도 포함되어 있군요



OPEN-SOURCE는 사랑입니다. ㅎ




좀더 자세한 정보는 아래 Official 링크에서 확인 하실 수 있습니다.

https://www.arduino.cc/en/Main/ArduinoBoard101





기존에 사둔 라즈베리파이와 이 보드를 이용하여 우선 만들어 보고 싶은 프로젝트 1호는

집앞 아파트 계단에 몰래 담배피는 학생들을 잡기 위해 초음파 센서를 붙인 몰카 입니다. 

잡히기만 해봐라~ 부모님과 면담을 기필코 진행해 주리라 !!


아래는 HC-SR04 초음파 센서입니다. 측정거리는 2~400cm, DC 5V/2mA 로 저정도 성능이면 충분히 계단참을 감시할 수 있으리라 ^^: 생각이 듭니다.


이건 16*2 5V LCD 모듈입니다. 간단히 디버그 메세지 등을 뿌려 볼 예정입니다.


아래는 DHT11 온/습도 센서입니다. 영하 측정이 안되어서 아쉽긴 하지만 축사 온도 측정 등의 프로젝트에 활용해 볼 예정입니다. 온도는 0~50도, 습도는 20%~95%까지 측정 가능합니다.


S/W 쟁이라 첨보는 신기한 물건이라 사진을 찍어 보았습니다. 빵판입니다 ^^ Bread-Board로 납땜하기 싫을때 위에 모듈들을 꼽아 쓰는 보드 입니다.



허접하고 기술적으로도 많이 부족하지만 

그래도 뭔가 만들어 본다는 혼자만의 만족감이라고나 할까요 ㅎㅎ


진행사항 있을때마다 조금씩 업데이트 해보도록 하겠습니다.

반응형

+ Recent posts