온도 및 습도 측정은 가정 자동화, 환경 모니터링, 기상 관측소 등과 같은 많은 응용 분야에서 종종 유용합니다. LM35 옆에 가장 널리 사용되는 온도 센서는 DHT11입니다. 이전에 Arduino와 Raspberry와 인터페이스하여 많은 DHT11 프로젝트를 구축했습니다. Pi 및 기타 여러 개발 보드. 이 기사에서는이 DHT11을 8 비트 PIC 마이크로 컨트롤러 인 PIC16F87A와 인터페이스하는 방법을 알아 봅니다. 이 마이크로 컨트롤러를 사용하여 DHT11을 사용하여 온도 및 습도 값 을 읽고 이를 LCD 디스플레이에 표시합니다. PIC 마이크로 컨트롤러를 완전히 처음 사용하는 경우 PIC 튜토리얼 시리즈를 사용하여 PIC 마이크로 컨트롤러를 프로그래밍하고 사용하는 방법을 배울 수 있습니다. 시작해 보겠습니다.
DHT11 – 사양 및 작동
DHT11 센서는 모듈 형태 또는 센서 형태로 제공됩니다. 이 튜토리얼에서 우리는 센서를 사용하고 있는데, 둘 사이의 유일한 차이점은 모듈 형태의 센서에는 센서의 출력 핀에 연결된 필터 커패시터와 풀업 저항이 있다는 것입니다. 따라서 모듈을 사용하는 경우 외부에서 추가 할 필요가 없습니다. 센서 형태의 DHT11은 아래와 같습니다.
DHT11 센서는 파란색 또는 흰색 케이스와 함께 제공됩니다. 이 케이스 안에는 상대 습도와 온도를 감지하는 데 도움 이되는 두 가지 중요한 구성 요소 가 있습니다. 첫 번째 구성 요소는 한 쌍의 전극입니다. 이 두 전극 사이의 전기 저항은 수분 유지 기판에 의해 결정됩니다. 따라서 측정 된 저항은 환경의 상대 습도에 반비례합니다. 상대 습도가 높을수록 저항 값이 낮아지고 그 반대의 경우도 마찬가지입니다. 또한 상대 습도는 실제 습도와 다릅니다. 상대 습도는 공기 중 온도에 대한 공기 중 수분 함량을 측정합니다.
다른 구성 요소는 표면 장착 NTC 서미스터 입니다. NTC라는 용어는 음의 온도 계수를 나타내며 온도가 증가하면 저항 값이 감소합니다. 센서의 출력은 공장에서 보정되어 있으므로 프로그래머로서 센서 보정에 대해 걱정할 필요가 없습니다. 1-Wire 통신에 의해 주어진 센서의 출력,이 센서 의 핀과 연결 다이어그램을 보자.
이 제품은 4 핀 단일 행 패키지로 제공됩니다. 첫 번째 핀은 VDD를 통해 연결되고 네 번째 핀은 GND를 통해 연결됩니다. 두 번째 핀은 통신 목적으로 사용되는 데이터 핀입니다. 이 데이터 핀에는 5k의 풀업 저항이 필요합니다. 그러나 4.7k ~ 10k와 같은 다른 풀업 저항도 사용할 수 있습니다. 세 번째 핀은 아무것도 연결되어 있지 않습니다. 따라서 무시됩니다.
데이터 시트는 아래 표에서 볼 수있는 인터페이스 정보와 기술 사양을 제공합니다.
위의 표는 온도 및 습도 측정 범위와 정확도를 보여 줍니다. +/- 2 도의 정확도로 섭씨 0-50 도의 온도와 +/- 5 % RH의 정확도로 20-90 % RH의 상대 습도를 측정 할 수 있습니다. 세부 사양은 아래 표에서 볼 수 있습니다.
DHT11 센서와 통신
앞서 언급했듯이 PIC 로 DHT11 에서 데이터를 읽으려면 PIC 단선 통신 프로토콜 을 사용해야 합니다. 이를 수행하는 방법에 대한 자세한 내용 은 데이터 시트에서 찾을 수있는 DHT 11 의 인터페이스 다이어그램 에서 이해할 수 있으며, 동일한 내용이 아래에 나와 있습니다.
DHT11 은 통신을 시작하기 위해 MCU 의 시작 신호 가 필요합니다. 따라서 MCU가 DHT11 센서에 시작 신호를 보내 온도 및 습도 값을 전송하도록 요청할 때마다. 시작 신호가 완료되면 DHT11은 온도 및 습도 정보가 포함 된 응답 신호 를 보냅니다. 데이터 통신은 단일 버스 데이터 통신 프로토콜에 의해 수행됩니다. 전체 데이터 길이는 40 비트이며 센서는 더 높은 데이터 비트를 먼저 보냅니다.
풀업 저항으로 인해 데이터 라인은 유휴 모드 동안 항상 VCC 레벨로 유지됩니다. MCU는 18ms의 최소 스팬 동안이 전압을 하이에서 로우로 풀다운해야합니다. 이 시간 동안 DHT11 센서는 시작 신호를 감지하고 마이크로 컨트롤러는 데이터 라인을 20-40us 동안 하이로 만듭니다. 이 20-40us 시간을 DHT11이 응답을 시작하는 대기 기간이라고합니다. 이 대기 시간이 지나면 DHT11은 데이터를 마이크로 컨트롤러 장치로 보냅니다.
DHT11 센서 데이터 형식
데이터는 함께 결합 된 소수 부분과 정수 부분으로 구성됩니다. 센서는 아래 데이터 형식을 따릅니다.
8 비트 적분 RH 데이터 + 8 비트 십진 RH 데이터 + 8 비트 적분 T 데이터 + 8 비트 십진 T 데이터 + 8 비트 체크섬.
수신 된 데이터로 체크섬 값 을 확인하여 데이터를 확인할 수 있습니다. 모든 것이 적절하고 센서가 적절한 데이터를 전송했다면 체크섬은 “8 비트 적분 RH 데이터 +8 비트 십진 RH 데이터 +8 비트 적분 T 데이터 +8 비트 십진 T 데이터” 의 합이되어야하기 때문 입니다.
필수 구성 요소
이 프로젝트에는 다음이 필요합니다.
- PIC 마이크로 컨트롤러 (8 비트) 프로그래밍 설정.
- 브레드 보드
- 5V 500mA 전원 공급 장치.
- 4.7k 저항기 2pcs
- 1k 저항
- PIC16F877A
- 20mHz 크리스탈
- 33pF 커패시터 2 개
- 16x2 문자 LCD
- DHT11 센서
- 점퍼 와이어
개략도
DHT11과 PIC16F877A 를 연결하는 회로도 는 아래와 같습니다.
16x2 LCD를 사용하여 DHT11에서 측정 한 온도 및 습도 값을 표시했습니다. LCD는 4 선 모드로 인터페이스되며 센서와 LCD는 모두 5V 외부 전원 공급 장치로 전원이 공급됩니다. 필요한 모든 연결을 만들기 위해 브레드 보드를 사용했으며 외부 5V 어댑터를 사용했습니다. 이 브레드 보드 전원 공급 장치 보드를 사용하여 5V로 보드에 전원을 공급할 수도 있습니다.
회로가 준비되면이 페이지 하단에 제공된 코드를 업로드하기 만하면 아래와 같이 온도 및 습도를 읽을 수 있습니다. 코드가 어떻게 작성되었고 어떻게 작동하는지 알고 싶다면 더 읽어보세요. 또한 이 페이지 하단에 제공된 비디오에서이 프로젝트 의 전체 작업을 찾을 수 있습니다.
PIC MPLABX 코드 설명이있는 DHT11
이 코드는 MPLABX IDE를 사용하여 작성되었으며 Microchip 자체에서 제공하는 XC8 컴파일러를 사용하여 컴파일되었으며 무료로 다운로드하여 사용할 수 있습니다. 프로그래밍의 기본 사항을 이해하려면 기본 자습서를 참조하십시오. DHT11 센서와 통신하는 데 필요한 세 가지 중요한 기능 만 아래에서 설명합니다. 기능은 다음과 같습니다.
무효 dht11_init (); 무효 find_response (); char read_dht11 ();
첫 번째 기능은 dht11로 시작 신호에 사용됩니다. 앞서 논의했듯이 DHT11과의 모든 통신은 시작 신호로 시작됩니다. 여기서는 처음에 핀 방향이 변경되어 마이크로 컨트롤러의 출력으로 데이터 핀을 구성합니다. 그런 다음 데이터 라인이 낮아지고 18mS를 계속 기다립니다. 그 후 다시 마이크로 컨트롤러가 라인을 높이고 최대 30us를 기다립니다. 그 대기 시간이 지나면 데이터 핀이 데이터를 수신하기 위해 마이크로 컨트롤러에 대한 입력으로 설정됩니다.
무효 dht11_init () { DHT11_Data_Pin_Direction = 0; // RD0을 출력으로 구성 DHT11_Data_Pin = 0; // RD0은 센서에 0을 보냅니다 . __delay_ms (18); DHT11_Data_Pin = 1; // RD0은 센서에 1을 보냅니다 . __delay_us (30); DHT11_Data_Pin_Direction = 1; // RD0을 입력으로 구성 }
다음 기능은 데이터 핀 상태에 따라 체크 비트를 설정하는 데 사용됩니다. DHT11 센서의 응답 을 감지하는 데 사용됩니다.
void find_response () { Check_bit = 0; __delay_us (40); if (DHT11_Data_Pin == 0) { __delay_us (80); if (DHT11_Data_Pin == 1) { Check_bit = 1; } __delay_us (50);} }
마지막으로 dht11 읽기 기능; 여기서 데이터는 데이터 핀 상태에 따라 비트 시프트 연산을 사용하여 반환되는 8 비트 형식으로 읽혀집니다.
char read_dht11 () { char 데이터, for_count; for (for_count = 0; for_count <8; for_count ++) { while (! DHT11_Data_Pin); __delay_us (30); if (DHT11_Data_Pin == 0) { data & = ~ (1 << (7-for_count)); // 비트 지우기 (7-b) } else { data- = (1 << (7-for_count)); // 비트 (7-b) 설정 while (DHT11_Data_Pin); } } 반환 데이터; }
그 후 모든 것이 주요 기능으로 수행됩니다. 먼저 LCD가 초기화되고 LCD 핀 포트 방향이 출력으로 설정된 곳에서 시스템 초기화가 수행됩니다. 응용 프로그램은 기본 기능 내에서 실행됩니다.
void main () { system_init (); while (1) { __delay_ms (800); dht11_init (); find_response (); if (Check_bit == 1) { RH_byte_1 = read_dht11 (); RH_byte_2 = read_dht11 (); Temp_byte_1 = read_dht11 (); Temp_byte_2 = read_dht11 (); 합계 = read_dht11 (); if (합산 == ((RH_byte_1 + RH_byte_2 + Temp_byte_1 + Temp_byte_2) & 0XFF)) { 습도 = Temp_byte_1; RH = RH_byte_1; lcd_com (0x80); lcd_puts ("온도:"); // lcd_puts (""); lcd_data (48 + ((습도 / 10) % 10)); lcd_data (48 + (습도 % 10)); lcd_data (0xDF); lcd_puts ("C"); lcd_com (0xC0); lcd_puts ("습도:"); // lcd_puts (""); lcd_data (48 + ((RH / 10) % 10)); lcd_data (48 + (RH % 10)); lcd_puts ("%"); } else { lcd_puts ("체크섬 오류"); } } else { clear_screen (); lcd_com (0x80); lcd_puts ("오류 !!!"); lcd_com (0xC0); lcd_puts ("응답 없음."); } __delay_ms (1000); } }
DHT11 센서와의 통신 은 시작 신호가 센서에 제출되는 while 루프 내에서 수행됩니다. 그 후 find_response 함수가 트리거됩니다. 경우 Check_bit이 다음 1 추가적인 통신 그렇지 않으면 LCD는 오류 대화 상자가 표시됩니다 실시한다.
40bit 데이터에 따라 read_dht11 은 5 회 (5 회 x 8bit) 호출되어 데이터 시트에 제공된 데이터 형식에 따라 데이터를 저장합니다. 검사 상태도 체크 하고 오류가 발견되는 경우, 또한 LCD에 통지합니다. 마지막으로 데이터는 변환되어 16x2 문자 LCD로 전송됩니다.
이 PIC 온도 및 습도 측정에 대한 전체 코드는 여기에서 다운로드 할 수 있습니다. 또한 아래 제공된 데모 비디오를 확인하십시오.
프로젝트를 이해하고 유용한 것을 만드는 것을 즐겼기를 바랍니다. 질문이 있으시면 아래 댓글 섹션에 남겨 주시거나 다른 기술 질문에 대한 포럼을 사용하십시오.