- Componentes necesarios: -
- Sensor de temperatura DS18B20:
- Diagrama de circuito:-
- Pasos o flujo de código: -
- Explicación del código:
- Obtención de datos del sensor de temperatura DS18B20:
Generalmente, el sensor de temperatura LM35 se usa con microcontroladores para medir la temperatura porque es barato y fácilmente disponible. Pero LM35 da valores analógicos y necesitamos convertirlos en digitales usando ADC (Conversor analógico a digital). Pero hoy estamos usando el sensor de temperatura DS18B20 en el que no necesitamos una conversión ADC para obtener la temperatura. Aquí usaremos el microcontrolador PIC con DS18B20 para medir la temperatura.
Entonces, aquí estamos construyendo un termómetro con la siguiente especificación usando la unidad de microcontrolador PIC16F877A de microchip.
- Mostrará el rango completo de temperatura de -55 grados a +125 grados.
- Solo mostrará la temperatura si la temperatura cambia + / -.2 grados.
Componentes necesarios: -
- Pic16F877A - Paquete PDIP40
- Tabla de pan
- Pickit-3
- Adaptador de 5V
- LCD JHD162A
- Sensor de temperatura DS18b20
- Cables para conectar periféricos.
- Resistencias 4.7k - 2 piezas
- Bote de 10k
- Cristal de 20 MHz
- 2 condensadores cerámicos de 33pF
Sensor de temperatura DS18B20:
DS18B20 es un sensor excelente para detectar con precisión la temperatura. Este sensor proporciona una resolución de 9 bits a 12 bits en la detección de temperatura. Este sensor se comunica con un solo cable y no necesita ningún ADC para adquirir temperaturas analógicas y convertirlas en digital.
La especificación del sensor es: -
- Mide temperaturas de -55 ° C a + 125 ° C (-67 ° F a + 257 ° F)
- ± 0,5 ° C Precisión de -10 ° C a + 85 ° C
- Resolución programable de 9 bits a 12 bits
- No se requieren componentes externos
- El sensor utiliza la interfaz 1-Wire®
Si miramos la imagen de pinout anterior de la hoja de datos, podemos ver que el sensor se ve exactamente igual que el paquete BC547 o BC557, TO-92. El primer pin es Tierra, el segundo pin es DQ o los datos y el tercer pin es VCC.
A continuación se muestra la especificación eléctrica de la hoja de datos que será necesaria para nuestro diseño. La tensión de alimentación nominal para el sensor es de + 3,0 V a + 5,5 V. También es necesario aumentar el voltaje de suministro que es el mismo que el voltaje de suministro indicado anteriormente.
Además, hay un margen de precisión que es de + -0,5 grados Celsius para el rango de -10 grados C a +85 grados Celsius, y la precisión cambia para el margen de rango completo, que es + -2 grados para -55 grados a + Rango de 125 grados.
Si volvemos a mirar la hoja de datos, veremos la especificación de conexión del sensor. Podemos conectar el sensor en modo de energía parásita donde se necesitan dos cables, DATA y GND, o podemos conectar el sensor usando una fuente de alimentación externa, donde se necesitan tres cables separados. Usaremos la segunda configuración.
Como ahora estamos familiarizados con las clasificaciones de potencia del sensor y las áreas relacionadas con la conexión, ahora podemos concentrarnos en hacer el esquema.
Diagrama de circuito:-
Si vemos el diagrama del circuito veremos que: -
La pantalla LCD de 16x2 caracteres está conectada a través del microcontrolador PIC16F877A, en el que RB0, RB1, RB2 están conectados al pin LCD RS, R / W y E. Y RB4, RB5, RB6 y RB7 están conectados a través de los 4 pines D4, D5, D6 de LCD, D7. La pantalla LCD está conectada en modo de 4 bits o modo nibble.
Un oscilador de cristal de 20MHz con dos condensadores cerámicos de 33pF está conectado a través de los pines OSC1 y OSC2. Proporcionará una frecuencia de reloj constante de 20 Mhz al microcontrolador.
DS18B20 también está conectado según la configuración de pines y con una resistencia pull up de 4.7k como se discutió anteriormente. He conectado todo esto en el tablero.
Si es nuevo en el microcontrolador PIC, siga nuestros Tutoriales del microcontrolador PIC que indican cómo comenzar con el microcontrolador PIC.
Pasos o flujo de código: -
- Establezca las configuraciones del microcontrolador que incluyen la configuración del oscilador.
- Configure el puerto deseado para LCD, incluido el registro TRIS.
- Cada ciclo con el sensor ds18b20 comienza con reset, por lo que reiniciaremos el ds18b20 y esperaremos el pulso de presencia.
- Escriba el scratchpad y configure la resolución del sensor de 12 bits.
- Omita la lectura de ROM seguida de un pulso de reinicio.
- Envíe el comando de conversión de temperatura.
- Lea la temperatura del bloc de notas.
- Verifique el valor de temperatura ya sea negativo o positivo.
- Imprime la temperatura en una pantalla LCD de 16x2.
- Espere a que la temperatura cambie de +/-. 20 grados Celsius.
Explicación del código:
El código completo para este termómetro digital se proporciona al final de este tutorial con un video de demostración. Necesitará algunos archivos de encabezado para ejecutar este programa que puede descargar desde aquí.
Primero, necesitamos establecer los bits de configuración en el microcontrolador pic y luego comenzar con la función principal void .
A continuación, debajo de cuatro líneas se utilizan para incluyendo el archivo de cabecera de la biblioteca, lcd.h y ds18b20.h . Y xc.h es para el archivo de encabezado del microcontrolador.
#incluir
Estas definiciones se utilizan para enviar comandos al sensor de temperatura. Los comandos se enumeran en la hoja de datos del sensor.
#define skip_rom 0xCC #define convert_temp 0x44 #define write_scratchpad 0x4E #define resolution_12bit 0x7F #define read_scratchpad 0xBE
Esta Tabla 3 de la hoja de datos del sensor muestra todos los comandos en los que se utilizan macros para enviar los comandos respectivos.
La temperatura solo se mostrará en la pantalla si la temperatura cambia +/- .20 grados. Podemos cambiar esta brecha de temperatura de esta macro temp_gap . Al cambiar el valor de esta macro, se cambiará la especificación.
Otras dos variables de flotación utilizadas para almacenar los datos de temperatura mostrados y diferenciarlos con la diferencia de temperatura
#define temp_gap 20 float pre_val = 0, aft_val = 0;
En la función void main () , lcd_init () ; es una función para inicializar la pantalla LCD. Esta función lcd_init () se llama desde la biblioteca lcd.h.
Los registros TRIS se utilizan para seleccionar pines de E / S como entrada o salida. Se utilizan dos variables cortas sin firmar TempL y TempH para almacenar los datos de resolución de 12 bits del sensor de temperatura.
void principal (vacío) {TRISD = 0xFF; TRISA = 0x00; TRISB = 0x00; //TRISDbits_t.TRISD6 = 1; TempL corto sin firmar, TempH; unsigned int t, t2; flotador diferencia1 = 0, diferencia2 = 0; lcd_init ();
Veamos el ciclo while, aquí estamos dividiendo el ciclo while (1) en pequeños trozos.
Esas líneas se utilizan para detectar que el sensor de temperatura está conectado o no.
while (ow_reset ()) {lcd_com (0x80); lcd_puts ("Por favor, conecte"); lcd_com (0xC0); lcd_puts ("Sonda de detección de temperatura"); }
Al usar este segmento de código, inicializamos el sensor y enviamos el comando para convertir la temperatura.
lcd_puts (""); ow_reset (); write_byte (write_scratchpad); write_byte (0); write_byte (0); write_byte (resolución_12bit); // Resolución de 12 bits ow_reset (); escribir_byte (saltar_rom); write_byte (convert_temp);
Este código es para almacenar los datos de temperatura de 12 bits en dos variables cortas sin firmar.
while (leer_byte () == 0xff); __delay_ms (500); ow_reset (); escribir_byte (saltar_rom); write_byte (read_scratchpad); TempL = read_byte (); TempH = read_byte ();
Luego, si verifica el código completo a continuación, hemos creado la condición if-else para averiguar el signo de temperatura si es positivo o negativo.
Al usar el código de declaración If , manipulamos los datos y vemos si la temperatura es negativa o no y determinamos que los cambios de temperatura están en el rango de +/-.20 grados o no. Y en otra parte verificamos si la temperatura es positiva o no y la detección de cambios de temperatura.
código
Obtención de datos del sensor de temperatura DS18B20:
Veamos el intervalo de tiempo de la interfaz 1-Wire®. Estamos usando 20Mhz Crystal. Si miramos dentro del archivo ds18b20.c, veremos
#define _XTAL_FREQ 20000000
Esta definición se utiliza para la rutina de retardo del compilador XC8. 20Mhz se establece como frecuencia de cristal.
Hicimos cinco funciones
- ow_reset
- read_bit
- read_byte
- write_bit
- write_byte
El protocolo 1-Wire ® necesita ranuras estrictas relacionadas con la sincronización para comunicarse. Dentro de la hoja de datos, obtendremos información perfecta relacionada con la franja horaria.
Dentro de la siguiente función creamos el intervalo de tiempo exacto. Es importante crear el retardo exacto para mantener y soltar y controlar el bit TRIS del puerto del sensor respectivo.
carácter sin firmar ow_reset (void) {DQ_TRIS = 0; // Tris = 0 (salida) DQ = 0; // establece el número de pin en bajo (0) __delay_us (480); // 1 cable requiere tiempo de retardo DQ_TRIS = 1; // Tris = 1 (entrada) __delay_us (60); // 1 cable requiere tiempo de retardo if (DQ == 0) // si hay presencia pluse {__delay_us (480); return 0; // devuelve 0 (1 cable es presencia)} else {__delay_us (480); return 1; // devuelve 1 (1 hilo NO es presencia)}} // 0 = presencia, 1 = sin parte
Ahora, según la descripción de la franja horaria que se muestra a continuación utilizada en lectura y escritura, creamos la función de lectura y escritura respectivamente.
unsigned char read_bit (void) {unsigned char i; DQ_TRIS = 1; DQ = 0; // baja DQ para iniciar el intervalo de tiempo DQ_TRIS = 1; DQ = 1; // luego regresa alto para (i = 0; i <3; i ++); // retrasar 15us desde el inicio del intervalo de tiempo return (DQ); // valor de retorno de la línea DQ} void write_bit (char bitval) {DQ_TRIS = 0; DQ = 0; // tira DQ bajo para iniciar el intervalo de tiempo if (bitval == 1) DQ = 1; // devuelve DQ alto si escribe 1 __delay_us (5); // mantener el valor para el resto del intervalo de tiempo DQ_TRIS = 1; DQ = 1; } // Delay proporciona 16us por bucle, más 24us. Por lo tanto, delay (5) = 104us
Además cheque toda la cabecera relacionada y archivos.c aquí.
Así es como podemos usar el sensor DS18B20 para obtener la temperatura con el microcontrolador PIC.
Si desea construir un termómetro digital simple con LM35, consulte los siguientes proyectos con otros microcontroladores:
- Medición de temperatura ambiente con Raspberry Pi
- Termómetro digital con Arduino y LM35
- Termómetro digital con LM35 y 8051
- Medición de temperatura con microcontrolador LM35 y AVR