- Componentes necessários: -
- Sensor de temperatura DS18B20:
- Diagrama de circuito:-
- Etapas ou fluxo de código: -
- Explicação do código:
- Obtendo dados do sensor de temperatura DS18B20:
Geralmente, o sensor de temperatura LM35 é usado com microcontroladores para medir a temperatura porque é barato e facilmente disponível. Mas o LM35 fornece valores analógicos e precisamos convertê-los em digitais usando ADC (Analog to Digital Converter). Mas hoje estamos usando o sensor de temperatura DS18B20 no qual não precisamos de uma conversão ADC para obter a temperatura. Aqui usaremos o microcontrolador PIC com DS18B20 para medir a temperatura.
Então, aqui estamos construindo um termômetro com a seguinte especificação usando a unidade de microcontrolador PIC16F877A do microchip.
- Ele mostrará a faixa completa de temperatura de -55 graus a +125 graus.
- Ele só exibirá a temperatura se a temperatura mudar +/- 0,2 graus.
Componentes necessários: -
- Pic16F877A - pacote PDIP40
- Tábua de pão
- Pickit-3
- Adaptador 5V
- LCD JHD162A
- Sensor de temperatura DS18b20
- Fios para conectar periféricos.
- Resistores de 4,7k - 2pcs
- Pote de 10k
- 20mHz Crystal
- 2 pcs capacitores de cerâmica 33pF
Sensor de temperatura DS18B20:
O DS18B20 é um sensor excelente para detectar a temperatura com precisão. Este sensor oferece resolução de 9 a 12 bits no sensor de temperatura. Este sensor se comunica com apenas um fio e não precisa de nenhum ADC para adquirir temperaturas analógicas e convertê-las digitalmente.
A especificação do sensor é: -
- Mede temperaturas de -55 ° C a + 125 ° C (-67 ° F a + 257 ° F)
- ± 0,5 ° C Precisão de -10 ° C a + 85 ° C
- Resolução programável de 9 bits a 12 bits
- Nenhum componente externo necessário
- O sensor usa interface 1-Wire®
Se olharmos a imagem da pinagem acima da folha de dados, podemos ver que o sensor se parece exatamente com o pacote BC547 ou BC557, TO-92. O primeiro pino é aterrado, o segundo pino é DQ ou os dados e o terceiro pino é VCC.
Abaixo está a especificação elétrica da folha de dados que será necessária para o nosso projeto. A tensão de alimentação nominal para o sensor é de + 3,0 V a + 5,5 V. Também é necessário aumentar a tensão de alimentação, que é igual à tensão de alimentação mencionada acima.
Além disso, há uma margem de precisão que é de + -0,5 graus Celsius para a faixa de -10 graus C a +85 graus Celsius, e as mudanças de precisão para a margem da faixa completa, que é + -2 graus para -55 graus a + Faixa de 125 graus.
Se olharmos novamente para a ficha técnica, veremos a especificação de conexão do sensor. Podemos conectar o sensor no modo de alimentação parasita onde dois fios são necessários, DATA e GND, ou podemos conectar o sensor usando uma fonte de alimentação externa, onde três fios separados são necessários. Usaremos a segunda configuração.
Como agora estamos familiarizados com as classificações de potência do sensor e áreas relacionadas à conexão, podemos agora nos concentrar em fazer o esquema.
Diagrama de circuito:-
Se virmos o diagrama do circuito, veremos que: -
O LCD de 16x2 caracteres é conectado ao microcontrolador PIC16F877A, no qual RB0, RB1, RB2 são conectados ao pino RS, R / W e E. do LCD e RB4, RB5, RB6 e RB7 são conectados aos 4 pinos D4, D5, D6 do LCD D7. O LCD está conectado no modo de 4 bits ou modo nibble.
Um oscilador de cristal de 20 MHz com dois capacitores de cerâmica de 33pF é conectado ao pino OSC1 e OSC2. Ele fornecerá freqüência de clock de 20 MHz constante ao microcontrolador.
O DS18B20 também é conectado de acordo com a configuração do pino e com um resistor pull up de 4,7k conforme discutido anteriormente. Eu conectei tudo isso no breadboard.
Se você é novo no Microcontrolador PIC, siga nossos Tutoriais do Microcontrolador PIC, que informam em Introdução ao Microcontrolador PIC.
Etapas ou fluxo de código: -
- Defina as configurações do microcontrolador que incluem a configuração do oscilador.
- Defina a porta desejada para LCD incluindo o registro TRIS.
- Cada ciclo com sensor ds18b20 começa com reset, então iremos resetar o ds18b20 e aguardar o pulso de presença.
- Escreva o scratchpad e defina a resolução do sensor de 12 bits.
- Ignore a leitura da ROM seguida por um pulso de reinicialização.
- Envie o comando de temperatura de conversão.
- Leia a temperatura no bloco de notas.
- Verifique o valor da temperatura se negativo ou positivo.
- Imprima a temperatura no LCD 16x2.
- Aguarde as mudanças de temperatura para +/-. 20 graus Celsius.
Explicação do código:
O código completo para este termômetro digital é fornecido no final deste tutorial com um vídeo de demonstração. Você precisará de alguns arquivos de cabeçalho para executar este programa, os quais podem ser baixados aqui.
Primeiro, precisamos definir os bits de configuração no microcontrolador pic e, em seguida, iniciar com a função void principal .
Em seguida, quatro linhas abaixo são usadas para incluir o arquivo de cabeçalho da biblioteca, lcd.h e ds18b20.h . E xc.h é para o arquivo de cabeçalho do microcontrolador.
#incluir
Essas definições são utilizadas para enviar o comando ao sensor de temperatura. Os comandos estão listados na folha de dados do sensor.
#define skip_rom 0xCC #define convert_temp 0x44 #define write_scratchpad 0x4E #define resolution_12bit 0x7F #define read_scratchpad 0xBE
Esta Tabela 3 da ficha do sensor mostra todos os comandos onde as macros são usadas para enviar os respectivos comandos.
A temperatura só será exibida na tela se a temperatura mudar +/- 0,20 graus. Podemos alterar essa lacuna de temperatura a partir desta macro temp_gap . Ao alterar o valor nesta macro, a especificação será alterada.
Outras duas variáveis flutuantes usadas para armazenar os dados de temperatura exibidos e diferenciá-los com o intervalo de temperatura
#define temp_gap 20 float pre_val = 0, aft_val = 0;
Na função void main () , o lcd_init () ; é uma função para inicializar o LCD. Esta função lcd_init () é chamada da biblioteca lcd.h.
Os registros TRIS são usados para selecionar os pinos de E / S como entrada ou saída. Duas variáveis curtas sem sinal TempL e TempH são usadas para armazenar os dados de resolução de 12 bits do sensor de temperatura.
void main (void) {TRISD = 0xFF; TRISA = 0x00; TRISB = 0x00; //TRISDbits_t.TRISD6 = 1; curto sem sinal TempL, TempH; sem sinal int t, t2; float diferença1 = 0, diferença2 = 0; lcd_init ();
Vamos ver o loop while, aqui estamos quebrando o loop while (1) em pequenos pedaços.
Essas linhas são usadas para detectar se o sensor de temperatura está conectado ou não.
while (ow_reset ()) {lcd_com (0x80); lcd_puts ("Conecte"); lcd_com (0xC0); lcd_puts ("Sonda Temp-Sense"); }
Usando este segmento de código, inicializamos o sensor e enviamos o comando para converter a temperatura.
lcd_puts (""); ow_reset (); write_byte (write_scratchpad); write_byte (0); write_byte (0); write_byte (resolução_12 bits); // resolução de 12 bits ow_reset (); write_byte (skip_rom); write_byte (convert_temp);
Este código é para armazenar os dados de temperatura de 12 bits em duas variáveis curtas sem sinal.
while (read_byte () == 0xff); __delay_ms (500); ow_reset (); write_byte (skip_rom); write_byte (read_scratchpad); TempL = read_byte (); TempH = leitura_byte ();
Então, se você verificar o código completo abaixo, criamos a condição if-else para descobrir se o sinal de temperatura é positivo ou negativo.
Usando o código da instrução If , manipulamos os dados e vemos se a temperatura é negativa ou não e determinamos que as mudanças de temperatura estão na faixa de +/- 0,20 graus ou não. E em outra parte verificamos se a temperatura é positiva ou não e a detecção de mudanças de temperatura.
código
Obtendo dados do sensor de temperatura DS18B20:
Vamos ver o intervalo de tempo da interface 1-Wire®. Estamos usando 20Mhz Crystal. Se olharmos dentro do arquivo ds18b20.c, veremos
#define _XTAL_FREQ 20000000
Esta definição é usada para a rotina de atraso do compilador XC8. 20Mhz é definido como a frequência do cristal.
Fizemos cinco funções
- ow_reset
- read_bit
- read_byte
- write_bit
- write_byte
O protocolo 1-Wire ® precisa de slots estritamente relacionados ao tempo para se comunicar. Dentro da folha de dados, obteremos informações relacionadas ao intervalo de tempo perfeito.
Dentro da função abaixo, criamos o intervalo de tempo exato. É importante criar o atraso exato para segurar e liberar e controlar o bit TRIS da porta do respectivo sensor.
char sem sinal ow_reset (vazio) {DQ_TRIS = 0; // Tris = 0 (saída) DQ = 0; // defina o pino # para baixo (0) __delay_us (480); // 1 fio requer atraso de tempo DQ_TRIS = 1; // Tris = 1 (entrada) __delay_us (60); // 1 fio requer atraso de tempo if (DQ == 0) // se houver uma vantagem de presença {__delay_us (480); return 0; // retorna 0 (1 fio é presença)} else {__delay_us (480); return 1; // retornar 1 (1 fio NÃO é presença)}} // 0 = presença, 1 = nenhuma parte
Agora, de acordo com a descrição do intervalo de tempo abaixo usada em Read e Write, criamos a função de leitura e gravação respectivamente.
unsigned char read_bit (void) {unsigned char i; DQ_TRIS = 1; DQ = 0; // puxa DQ para baixo para iniciar o timeslot DQ_TRIS = 1; DQ = 1; // então retorna alto para (i = 0; i <3; i ++); // atrasar 15us do início do timeslot return (DQ); // valor de retorno da linha DQ} void write_bit (char bitval) {DQ_TRIS = 0; DQ = 0; // puxa DQ para baixo para iniciar o timeslot if (bitval == 1) DQ = 1; // retorna DQ alto se escrever 1 __delay_us (5); // retém o valor para o resto do timeslot DQ_TRIS = 1; DQ = 1; } // O atraso fornece 16us por loop, mais 24us. Portanto, atraso (5) = 104us
Além disso verificação todo o cabeçalho e arquivos.c aqui.
Então é assim que podemos usar o sensor DS18B20 para obter a temperatura com o microcontrolador PIC.
Se você deseja construir um termômetro digital simples com LM35, verifique abaixo os projetos com outros microcontroladores:
- Medição da temperatura ambiente com Raspberry Pi
- Termômetro digital usando Arduino e LM35
- Termômetro digital usando LM35 e 8051
- Medição de temperatura usando LM35 e microcontrolador AVR