일반적으로 LM35 온도 센서는 저렴하고 쉽게 구할 수 있기 때문에 온도를 측정하기 위해 마이크로 컨트롤러와 함께 사용됩니다. 그러나 LM35는 아날로그 값을 제공하므로 ADC (Analog to Digital Converter)를 사용하여이를 디지털로 변환해야합니다. 그러나 오늘날 우리는 온도 를 얻기 위해 ADC 변환이 필요하지 않은 DS18B20 온도 센서 를 사용 하고 있습니다. 여기서는 DS18B20과 함께 PIC 마이크로 컨트롤러를 사용하여 온도를 측정합니다.
그래서 여기 에서는 마이크로 칩의 PIC16F877A 마이크로 컨트롤러 장치를 사용하여 다음 사양의 온도계를 구축합니다.
- -55도에서 +125도까지의 전체 온도 범위가 표시됩니다.
- 온도가 +/-.2도 변하는 경우에만 온도를 표시합니다.
필요한 구성 요소:-
- Pic16F877A – PDIP40 패키지
- 브레드 보드
- Pickit-3
- 5V 어댑터
- LCD JHD162A
- DS18b20 온도 센서
- 주변 장치를 연결하는 전선.
- 4.7k 저항기 – 2 개
- 10k 냄비
- 20mHz 크리스탈
- 2 개의 33pF 세라믹 커패시터
DS18B20 온도 센서:
DS18B20은 온도를 정확하게 감지하는 우수한 센서입니다. 이 센서는 온도 감지시 9 ~ 12 비트 분해능을 제공합니다. 이 센서는 단 하나의 와이어로만 통신하며 아날로그 온도를 수집하고 디지털로 변환하는 데 ADC가 필요하지 않습니다.
센서의 사양은 다음과 같습니다.
- -55 ° C ~ + 125 ° C (-67 ° F ~ + 257 ° F)의 온도 측정
- -10 ° C ~ + 85 ° C에서 ± 0.5 ° C 정확도
- 9 비트에서 12 비트까지 프로그래밍 가능한 분해능
- 외부 구성 요소가 필요하지 않음
- 센서는 1-Wire® 인터페이스를 사용합니다.
데이터 시트에서 위의 핀아웃 이미지를 보면 센서가 BC547 또는 BC557 패키지, TO-92와 똑같이 보이는 것을 알 수 있습니다. 첫 번째 핀은 접지, 두 번째 핀은 DQ 또는 데이터이고 세 번째 핀은 VCC입니다.
아래는 설계에 필요한 데이터 시트의 전기 사양입니다. 센서의 정격 공급 전압은 + 3.0V ~ + 5.5V입니다. 또한 위에서 언급 한 공급 전압과 동일한 풀업 공급 전압이 필요합니다.
또한 섭씨 -10도에서 +85도 범위에 대해 섭씨 + -0.5 도의 정확도 마진이 있으며, 전체 범위 마진에 대한 정확도는 -55도에서 +까지의 경우 + -2 도입니다. 125도 범위.
데이터 시트를 다시 보면 센서의 연결 사양을 볼 수 있습니다. 데이터와 GND라는 두 개의 와이어가 필요한 기생 전원 모드에서 센서를 연결 하거나 세 개의 별도 와이어가 필요한 외부 전원 공급 장치를 사용하여 센서를 연결할 수 있습니다. 두 번째 구성을 사용합니다.
이제 센서의 정격 전력 및 연결 관련 영역에 익숙해 졌으므로 이제 회로도 작성에 집중할 수 있습니다.
회로도:-
회로도를 보면 다음을 볼 수 있습니다.
16x2 문자 LCD는 PIC16F877A 마이크로 컨트롤러에 연결되며, 여기서 RB0, RB1, RB2는 LCD 핀 RS, R / W 및 E에 연결됩니다. 그리고 RB4, RB5, RB6 및 RB7은 LCD의 4 핀 D4, D5, D6에 연결됩니다. D7. LCD는 4 비트 모드 또는 니블 모드로 연결됩니다.
33pF의 세라믹 커패시터 2 개가있는 20MHz의 수정 발진기가 OSC1 및 OSC2 핀에 연결됩니다. 마이크로 컨트롤러에 일정한 20Mhz 클록 주파수를 제공합니다.
DS18B20은 또한 핀 구성에 따라 이전에 논의 된 4.7k 풀업 저항으로 연결됩니다. 이 모든 것을 브레드 보드에 연결했습니다.
PIC 마이크로 컨트롤러를 처음 사용하는 경우 PIC 마이크로 컨트롤러 시작하기를 설명하는 PIC 마이크로 컨트롤러 자습서를 따르십시오.
단계 또는 코드 흐름:-
- 오실레이터 구성을 포함하는 마이크로 컨트롤러의 구성을 설정합니다.
- TRIS 레지스터를 포함하여 LCD에 대한 원하는 포트를 설정합니다.
- ds18b20 센서의 모든 사이클은 재설정으로 시작하므로 ds18b20을 재설정하고 존재 펄스를 기다립니다.
- 스크래치 패드를 작성하고 센서의 해상도를 12 비트로 설정합니다.
- ROM 읽기와 리셋 펄스를 건너 뜁니다.
- 온도 변환 명령을 제출하십시오.
- 스크래치 패드에서 온도를 읽습니다.
- 음 또는 양의 온도 값을 확인하십시오.
- 16x2 LCD에 온도를 인쇄합니다.
- +/-. 20 ° C의 온도 변화를 기다립니다.
코드 설명:
이 디지털 온도계에 대한 전체 코드 는 데모 비디오 와 함께이 튜토리얼의 끝에 제공됩니다. 이 프로그램을 실행하려면 여기에서 다운로드 할 수있는 일부 헤더 파일이 필요합니다.
먼저 pic 마이크로 컨트롤러에서 구성 비트를 설정 한 다음 void 주 기능으로 시작해야 합니다.
그런 다음 라이브러리 헤더 파일 인 lcd.h 및 ds18b20.h 를 포함 하기 위해 아래 네 줄이 사용됩니다. 그리고 xc.h는 마이크로 컨트롤러의 헤더 파일입니다.
#포함
이러한 정의는 온도 센서에 명령을 보내는 데 사용됩니다. 명령은 센서의 데이터 시트에 나열되어 있습니다.
#define skip_rom 0xCC #define convert_temp 0x44 #define write_scratchpad 0x4E #define 해상도 _12bit 0x7F #define read_scratchpad 0xBE
센서 데이터 시트의이 표 3은 매크로가 각 명령을 보내는 데 사용되는 모든 명령을 보여줍니다.
온도가 +/- .20 도 변경되는 경우에만 온도가 화면에 표시됩니다. 이 temp_gap 매크로 에서이 온도 차이를 변경할 수 있습니다. 이 매크로에서 값을 변경하면 사양이 변경됩니다.
표시된 온도 데이터를 저장하고 온도 차이로 구분하는 데 사용되는 다른 두 개의 부동 변수
#define temp_gap 20 float pre_val = 0, aft_val = 0;
에서는 무효 메인 () 함수는 lcd_init () ; LCD를 초기화하는 기능입니다. 이 lcd_init () 함수는 lcd.h 라이브러리 에서 호출됩니다.
TRIS 레지스터는 I / O 핀을 입력 또는 출력으로 선택하는 데 사용됩니다. 두 개의 서명되지 않은 짧은 변수 TempL 및 TempH 는 온도 센서의 12 비트 분해능 데이터를 저장하는 데 사용됩니다.
void main (void) {TRISD = 0xFF; TRISA = 0x00; TRISB = 0x00; //TRISDbits_t.TRISD6 = 1; 서명되지 않은 짧은 TempL, TempH; 부호없는 정수 t, t2; float 차이 1 = 0, 차이 2 = 0; lcd_init ();
while 루프를 살펴 보겠습니다. 여기서 while (1) 루프를 작은 덩어리로 나눕니다.
이 라인은 온도 센서가 연결되어 있는지 감지하는 데 사용됩니다.
while (ow_reset ()) {lcd_com (0x80); lcd_puts ("연결하십시오"); lcd_com (0xC0); lcd_puts ("온도 감지 프로브"); }
이 코드 세그먼트를 사용하여 센서를 초기화하고 온도를 변환하는 명령을 보냅니다.
lcd_puts (""); ow_reset (); write_byte (쓰기 _scratchpad); write_byte (0); write_byte (0); write_byte (해상도 _12 비트); // 12 비트 해상도 ow_reset (); write_byte (skip_rom); write_byte (convert_temp);
이 코드는 2 개의 부호없는 짧은 변수에 12 비트 온도 데이터를 저장하기위한 것입니다.
동안 (read_byte () == 0xff); __delay_ms (500); ow_reset (); write_byte (skip_rom); write_byte (read_scratchpad); TempL = read_byte (); TempH = read_byte ();
그런 다음 아래의 전체 코드를 확인하면 온도 기호가 양수인지 음수인지 찾기 위해 if-else 조건을 생성합니다.
If 문 코드 를 사용하여 데이터를 조작하고 온도가 음수인지 아닌지 확인하고 온도 변화가 +/-.20도 범위에 있는지 확인합니다. 그리고 다른 부분에서는 온도가 양수인지 아닌지 확인하고 온도 변화 감지를 확인했습니다.
암호
DS18B20 온도 센서에서 데이터 가져 오기:
1-Wire® 인터페이스의 시간차를 살펴 보겠습니다. 우리는 20Mhz Crystal을 사용하고 있습니다. ds18b20.c 파일을 살펴보면
#define _XTAL_FREQ 20000000
이 정의는 XC8 컴파일러 지연 루틴에 사용됩니다. 20Mhz가 크리스탈 주파수로 설정됩니다.
5 개의 기능을 만들었습니다
- ow_reset
- read_bit
- read_byte
- 쓰기 _ 비트
- 쓰기 _ 바이트
1-Wire ® 프로토콜은 통신을 위해 엄격한 타이밍 관련 슬롯이 필요합니다. 데이터 시트 내에서 완벽한 시간 슬롯 관련 정보를 얻을 수 있습니다.
아래 함수 내에서 정확한 시간 슬롯을 만들었습니다. 홀드 및 릴리스에 대한 정확한 지연을 생성하고 각 센서 포트의 TRIS 비트를 제어하는 것이 중요합니다.
unsigned char ow_reset (void) {DQ_TRIS = 0; // Tris = 0 (출력) DQ = 0; // 핀 번호를 낮음 (0)으로 설정 __delay_us (480); // 1 개의 와이어에는 시간 지연이 필요합니다. DQ_TRIS = 1; // Tris = 1 (입력) __delay_us (60); // 1 와이어에는 시간 지연이 필요합니다. if (DQ == 0) // 존재하는 경우 pluse {__delay_us (480); 반환 0; // return 0 (1-wire is present)} else {__delay_us (480); 반환 1; // return 1 (1-wire is not present)}} // 0 = 존재, 1 = 부품 없음
이제 읽기와 쓰기에서 사용되는 아래 타임 슬롯 설명에 따라 각각 읽기 및 쓰기 기능을 생성 했습니다.
unsigned char read_bit (void) {unsigned char i; DQ_TRIS = 1; DQ = 0; // DQ를 낮게 당겨 타임 슬롯을 시작합니다 DQ_TRIS = 1; DQ = 1; // 그런 다음 (i = 0; i <3; i ++); // 타임 슬롯 시작부터 15us 지연 return (DQ); // DQ 라인 값 반환} void write_bit (char bitval) {DQ_TRIS = 0; DQ = 0; // DQ를 낮게 당겨 타임 슬롯을 시작합니다. if (bitval == 1) DQ = 1; // 쓰기 1이면 DQ high를 반환합니다. __delay_us (5); // 나머지 시간 슬롯에 대한 값 유지 DQ_TRIS = 1; DQ = 1; } // Delay는 루프 당 16us와 24us를 제공합니다. 따라서 delay (5) = 104us
또한 모든 검사 관련 헤더와 여기가.c 파일입니다.
이것이 DS18B20 센서를 사용 하여 PIC 마이크로 컨트롤러로 온도를 얻는 방법 입니다.
LM35 로 간단한 디지털 온도계 를 구축하려면 다른 마이크로 컨트롤러로 아래 프로젝트를 확인하십시오.
- Raspberry Pi를 사용한 실내 온도 측정
- Arduino 및 LM35를 사용하는 디지털 온도계
- LM35 및 8051을 사용하는 디지털 온도계
- LM35 및 AVR 마이크로 컨트롤러를 사용한 온도 측정