질문게시판 > 답변 : 아두이노 질문이요!

인기검색어 > 아두이노 센서 ATMEGA128

최신글 질문게시판 동영상강좌 가입하기

▼ BASIC4MCU 후원업체 신제품 정보 ▼

▲ BASIC4MCU 후원업체 신제품 정보 ▲

BASIC4MCU > 질문게시판

답변 : 아두이노 질문이요!

페이지 정보

작성자 master 작성일18-12-09 20:32 조회4,127회 댓글0건

본문

 if ((micros() - t) > 40) bits[idx] |= (1 << cnt);
  if (cnt == 0)   // next byte?
  {
   cnt = 7;    // restart at MSB
   idx++;      // next byte!
  }
  else cnt--;
 }

 humidity    = bits[0]; 
 temperature = bits[2];

 

제가 이걸 봤는데 여기보니 여기서 온도값이랑 습도값을 받더라구요.

근데 궁금한게..

bits[0]이 1<<7 ~ 1<<0 값을 다 더해서 습도값이고

bits[2]이 1<<7 ~ 1<<0 값을 다 더해서 온도값이잖아요.

근데 이러면 값이 똑같아지지않나요? 온도 습도 채널 잡은 것도 아니고...

왜 어떻게 온도 습도 값이 정해지나요 ㅠㅠ 

 

//

 

// MCU BASIC: https://www.basic4mcu.com
// DateTime : 2018-12-09 오후 8:25:23
// by Ok-Hyun Park
//
//    FILE: dht.cpp
//  AUTHOR: Rob Tillaart
// VERSION: 0.1.07
// PURPOSE: DHT Temperature&Humidity Sensor library for Arduino
//     URL: http: //arduino.cc/playground/Main/DHTLib
// HISTORY:
// 0.1.07 added support for DHT21
// 0.1.06 minimize footprint(2012-12-27)
// 0.1.05 fixed negative temperature bug(thanks to Roseman)
// 0.1.04 improved readability of code using DHTLIB_OK in code
// 0.1.03 added error values for temp and humidity when read failed
// 0.1.02 added error codes
// 0.1.01 added support for Arduino 1.0,fixed typos(31/12/2011)
// 0.1.0 by Rob Tillaart(01/04/2011)
// inspired by DHT11 library
// Released to the public domain
//
#include "dht.h"
#define TIMEOUT 10000
// // // // // // // // // // // // // // // // // // // // // // // // // ///
// PUBLIC
// return values:
// DHTLIB_OK
// DHTLIB_ERROR_CHECKSUM
// DHTLIB_ERROR_TIMEOUT
int dht:: read11(uint8_t pin){
  // READ VALUES
  int rv=read(pin);
  if(rv!=DHTLIB_OK){
    humidity   =DHTLIB_INVALID_VALUE// invalid value,or is NaN prefered?
    temperature=DHTLIB_INVALID_VALUE// invalid value
    return rv;
  }
  // CONVERT AND STORE
  humidity   =bits[0]; // bit[1]==0;
  temperature=bits[2]; // bits[3]==0;
  // TEST CHECKSUM
  // bits[1]&&bits[3]both 0
  uint8_t sum=bits[0]+bits[2];
  if(bits[4]!=sum)return DHTLIB_ERROR_CHECKSUM;
  return DHTLIB_OK;
}
// return values:
// DHTLIB_OK
// DHTLIB_ERROR_CHECKSUM
// DHTLIB_ERROR_TIMEOUT
int dht:: read21(uint8_t pin){
  return read22(pin); // dataformat identical to DHT22
}
// return values:
// DHTLIB_OK
// DHTLIB_ERROR_CHECKSUM
// DHTLIB_ERROR_TIMEOUT
int dht:: read22(uint8_t pin){
  // READ VALUES
  int rv=read(pin);
  if(rv!=DHTLIB_OK){
    humidity   =DHTLIB_INVALID_VALUE// invalid value,or is NaN prefered?
    temperature=DHTLIB_INVALID_VALUE// invalid value
    return rv;                        // propagate error value
  }
  // CONVERT AND STORE
  humidity=word(bits[0],bits[1])*0.1;
  if(bits[2]&0x80){ temperature=-0.1*word(bits[2]&0x7F,bits[3]); } // negative temperature
  else            { temperature0.1*word(bits[2],bits[3]); }
  // TEST CHECKSUM
  uint8_t sum=bits[0]+bits[1]+bits[2]+bits[3];
  if(bits[4]!=sum)return DHTLIB_ERROR_CHECKSUM;
  return DHTLIB_OK;
}
// // // // // // // // // // // // // // // // // // // // // // // // // ///
// PRIVATE
// return values:
// DHTLIB_OK
// DHTLIB_ERROR_TIMEOUT
int dht:: read(uint8_t pin){
  // INIT BUFFERVAR TO RECEIVE DATA
  uint8_t cnt=7;
  uint8_t idx=0;
  // EMPTY BUFFER
  for(uint8_t i=0i<5i++)bits[i]=0;
  // REQUEST SAMPLE
  pinMode(pin,OUTPUT);
  digitalWrite(pin,LOW ); delay(20);
  digitalWrite(pin,HIGH); delayMicroseconds(40);
  pinMode(pin,INPUT);
  // GET ACKNOWLEDGE or TIMEOUT
  unsigned int loopCnt=TIMEOUT;
  while(digitalRead(pin)==LOW){ if(loopCnt--==0)return DHTLIB_ERROR_TIMEOUT; }
  loopCnt=TIMEOUT;
  while(digitalRead(pin)==HIGH){ if(loopCnt--==0)return DHTLIB_ERROR_TIMEOUT; }
  // READ THE OUTPUT-40 BITS=>5 BYTES
  for(uint8_t i=0;i<40;i++){
    loopCnt=TIMEOUT;
    while(digitalRead(pin)==LOW){ if(loopCnt--==0)return DHTLIB_ERROR_TIMEOUT; }
    unsigned long t=micros();
    loopCnt=TIMEOUT;
    while(digitalRead(pin)==HIGH){ if(loopCnt--==0)return DHTLIB_ERROR_TIMEOUT; }
    if((micros()-t)>40)bits[idx]|=(1<<cnt);
    if(cnt==0){ cnt=7idx++; } // next byte?
    else      { cnt--; }
  }
  return DHTLIB_OK;
}
// END OF FILE

 

dht 라이브러리 질문이군요

 

  // READ THE OUTPUT-40 BITS=>5 BYTES
  for(uint8_t i=0;i<40;i++){
    loopCnt=TIMEOUT;
    while(digitalRead(pin)==LOW){ if(loopCnt--==0)return DHTLIB_ERROR_TIMEOUT; }
    unsigned long t=micros();
    loopCnt=TIMEOUT;
    while(digitalRead(pin)==HIGH){ if(loopCnt--==0)return DHTLIB_ERROR_TIMEOUT; }
    if((micros()-t)>40)bits[idx]|=(1<<cnt);
    if(cnt==0){ cnt=7idx++; } // next byte?
    else      { cnt--; }
  }
  return DHTLIB_OK;

 

주석에 40비트를 읽어서 5바이트로 저장하는 코드라고 적혀있습니다.

 

 

  // READ THE OUTPUT-40 BITS=>5 BYTES
  for(uint8_t i=0;i<40;i++){
    while(digitalRead(pin)==LOW); // 0인 동안 기다리고
    unsigned long t=micros();     // high가 된 순간
    loopCnt=TIMEOUT;
    while(digitalRead(pin)==HIGH);          // HIGH인 동안 기다린 후
    if((micros()-t)>40)bits[idx]|=(1<<cnt); // HIGH가 된 순간부터 40ms 이상이면 비트 set  
    if(--cnt<0){ cnt=7idx++; }            // next byte?
  }
  return DHTLIB_OK;

조금 수정하면 이렇게 됩니다.

 

 

 

[PDF] 

DHT11 Humidity & Temperature Sensor - Mouser Electronics

https://www.mouser.com/ds/2/758/DHT11-Technical-Data-Sheet-Translated-Version-1143054.pdf

 

데이터시트 5페이지에 보면 아래와 같은 내용이 나와 있습니다.

 

Data consists of decimal and integral parts
A complete data transmission is 40bitand the sensor sends higher data bit first.
//
Data format:
    8bit integral RH data + 8bit decimal RH data + 8bit integral T data  + 8bit decimal T data + 8bit check sum
//
If the data transmission is rightthe check-sum should be the last 8bit of "8bit integral RH data + 8bit decimal RH data + 8bit integral T data + 8bit decimal T data".

40비트(5바이트) 구성은 습도 2바이트 + 온도 2바이트 + 첵섬 입니다.

 

// 

  if((micros()-t)>40)bits[idx]|=(1<<cnt); // 40ms 이상이면 cnt 비트에 1을 채움
else bits[idx]&=~(1<<cnt);  // 40ms 이하면 cnt 비트에 0을 채움

else 문이 빠져있는 형태인데요

처음에 배열을 미리 0으로 clear 시켜놨기 때문에 else를 생략할 수 있습니다.

 

  // EMPTY BUFFER

  for(uint8_t i=0i<5i++)bits[i]=0; 

 

  • BASIC4MCU 작성글 SNS에 공유하기
  • 페이스북으로 보내기
  • 트위터로 보내기
  • 구글플러스로 보내기
  • 카카오톡으로 보내기

댓글 : 0

조회수 : 4,127

등록된 댓글이 없습니다.

게시물 검색

BASIC4MCU > 질문게시판 목록

제목 날짜
공지 MCU, AVR, 아두이노 등 전자공학에 관련된 질문은… 스태프  19-01-15
공지 사이트 이용 안내 댓글[25] master  17-10-29
질문 Atmega IO핀 출력 상태 질문이요.. 댓글[3] chelsea 새글 13:32
답변 답변 : Atmega IO핀 출력 상태 질문이요.. 댓글[6] master 새글 14:34
질문 아두이노 센서 쉴드 v5.0 과 음성인식 모듈(V2)통… 댓글[6] 첨부파일AutoSun 새글 22-07-05
질문 초음파 센서를 사용한 dc모터 제어에 관해 질문 있습니… 첨부파일뉴비에오 새글 22-07-04
답변 답변 : 초음파 센서를 사용한 dc모터 제어에 관해 질… 댓글[2] master 새글 22-07-05
질문 아두이노 Sensor Shield 5.0 시리얼 통신 … 댓글[2] AutoSun  22-07-04
질문 Atmega 코드 좀 봐주세요. 댓글[1] 첨부파일chelsea  22-07-04
질문 아두이노 while문 탈출 질문 yhj2644  22-07-01
답변 답변 : 아두이노 while문 탈출 질문 댓글[8] master  22-07-01
질문 ESP32-C3 리튬폴리머 ADC 전압 체크 관련 문의… 댓글[3] cansad  22-06-30
질문 ESP32-C3 리튬폴리머 ADC 전압 체크 관련 문의 댓글[3] cansad  22-06-30
질문 빵판없이 디스플레이 넣을 수 있을까요? 댓글[2] 첨부파일오소로롯  22-06-29
질문 라즈베리파이4 신형 선택문제 댓글[1] maximum  22-06-26
질문 음전압 ADC 댓글[2] 412904  22-06-26
질문 아두이노 센서값 출력 질문입니다! 댓글[1] 아궁2  22-06-24
질문 ATmega128, ATmega28 RS232통신 첨부파일Moon4201  22-06-24
답변 답변 : ATmega128, ATmega28 RS232… 댓글[1] master  22-06-25
질문 서보모터, 온습도센서 코드 질문 댓글[2] 첨부파일kshdlfaldfh  22-06-22
답변 답변 : 서보모터, 온습도센서 코드 질문 댓글[15] master  22-06-22
질문 steppermulti5 질문 응애  22-06-21
답변 답변 : steppermulti5 질문 댓글[1] master  22-06-22
질문 atmega128 avr usart 질문 snoflak  22-06-21
답변 답변 : atmega128 avr usart 질문 댓글[5] master  22-06-21
질문 사용자 정의 함수 변환 하는 방법 댓글[2] 첨부파일da0800  22-06-21
질문 atmega128 댓글[1] 양의노래  22-06-20
질문 아두이노 동시동작 재질문 댓글[9] 첨부파일죠르디  22-06-20
질문 초음파센서로 dc모터 제어하기 댓글[1] 첨부파일난쟁2  22-06-20
질문 아두이노 동시동작 댓글[7] 죠르디  22-06-19
게시물 검색


Privacy Policy
MCU BASIC ⓒ 2017
PC버전