Sensor de temperatura y PIC16F877A - practica PDF

Title Sensor de temperatura y PIC16F877A - practica
Course Circuitos Eléctricos
Institution Universidad Tecnológica de Guadalajara
Pages 9
File Size 444 KB
File Type PDF
Total Downloads 89
Total Views 144

Summary

El objetivo de esta práctica es que el sensor DHT11 por medio de dos sensores resistivos es capaz de medir tanto la humedad como la temperatura. Proyectaremos dicha información en un LCD...


Description

Introducción: El DHT11 es un sensor bastante económico que permite realizar mediciones de temperatura y humedad. En esta entrada te presentamos nuestro código en C para leer este sensor y un ejemplo práctico con un PIC16F877A que también debería adaptarse sin problemas a otros micros similares de 8 bits. Nuestro programa se comunica con el sensor y muestra las mediciones en una pantalla LCD.

Objetivo: El objetivo de esta práctica es que el sensor DHT11 por medio de dos sensores resistivos es capaz de medir tanto la humedad como la temperatura. Proyectaremos dicha información en un LCD:

Herramientas utilizadas:

Herramientas utilizadas: PIC16F877A

figura 1. 1 Microcontrolador PIC16F877A, PROTEUS 8.5

SENSOR DE TEMPERATURA Y HUMEDAD

figura 1. 2 DTH11 sensor de temperatura y humedad, PROTEUS 8.5

LCD DE 16x2

figura 1. 3 LM016L LCD de 16x2, PROTEUS 8.5

CRISTAL

figura 1. 4 de 8MHz, PROTEUS 8.5

figura 1. 5 Editar la frecuencia del cristal, PROTEUS 8.5

Un oscilador de cristal es un circuito de oscilador electrónico que utiliza la resonancia mecánica de un cristal vibrante de material piezoeléctrico para crear una señal eléctrica con una frecuencia precisa. Utilizaremos un cristal de 8MHz.

figura 1. 6 Capacitor 02013A220JAT2A de 22pF, PROTEUS 8.5

Vamos a utilizar dos capacitores cerámicos 02013A220JAT2A, su capacitancia es de 22pF con una tolerancia de ±5 %

POTENCIOMETRO DE 10K

figura 1. 7 Potenciometro de 10k, PROTEUS 8.5

CIRCUITO COMPLETO:

figura 1. 8 circuito completo, PROTEUS 8.5

CODIGO:

//Define los pines que se van a utilizar //del pb0 al pb6 #define LCD_RS_PIN PIN_B0 #define LCD_RW_PIN PIN_B1 #define LCD_ENABLE_PIN PIN_B2 #define LCD_DATA4 PIN_B3 #define LCD_DATA5 PIN_B4 #define LCD_DATA6 PIN_B5 #define LCD_DATA7 PIN_B6

#include //incluye la libreria del pic #fuses HS,NOWDT,NOPROTECT,NOLVP #use delay(clock = 8000000) #include //incluye la libreria del lcd #use fast_io(D) #BIT Data_Pin = 0x08.0 #BIT Data_Pin_Direction = 0x88.0 // Connection pin between DHT11 and mcu

char message1[] = "Temp = 00.0 C "; //define una cadena como arreglo de char´s char message2[] = "RH = 00.0 % "; //define una cadena como arreglo de char´s short Time_out; //Define las variables que vamos a utilizar unsigned int8 T_byte1, T_byte2, RH_byte1, RH_byte2, CheckSum ;

void start_signal(){ Data_Pin_Direction=0; //salida Data_Pin = 0;

//salida

delay_ms(25);

//baja voltaje por 25 ms

Data_Pin = 1;

//entrada

delay_us(30);

//sube voltaje por 30 us

Data_Pin_Direction =1;

} short check_response(){ delay_us(40); if(!Data_Pin){

// Lea y pruebe si el pin de conexión está bajo.

delay_us(80); if(Data_Pin){

// Lea y pruebe si el pin de conexión está alto.

delay_us(50); return 1; } } } unsigned int8 Read_Data(){ unsigned int8 i, k, _data = 0;

// k se usa para contar 1 bit de duración de lectura

if(Time_out) break; for(i = 0; i < 8; i++){ k = 0; while(!Data_Pin){

// Espera hasta que el pin DHT11 se levante

k++; if(k > 100){ Time_out = 1; break; } delay_us(1); } delay_us(30); if(!Data_Pin) bit_clear(_data, (7 - i));

// limpia bit (7 - i)

else{ bit_set(_data, (7 - i));

while(Data_Pin){ k++;

// Establecer bit (7 - i)

//Espera hasta que el pin DHT11 se agote

if(k > 100){ Time_out = 1; break; } delay_us(1);} } } return _data; } void main(){ lcd_init(); lcd_putc('\f');

// inicializa el modulo lcd // limpia lcd

while(TRUE){ delay_ms(1000); Time_out = 0; Start_signal(); if(check_response()){

// Si hay una respuesta del sensor.

RH_byte1 = Read_Data();

// lea RH byte1

RH_byte2 = Read_Data();

// lea RH byte2

T_byte1 = Read_Data();

// lea T byte1

T_byte2 = Read_Data();

// lea T byte2

Checksum = Read_Data(); if(Time_out){ lcd_putc('\f'); lcd_gotoxy(5, 1); lcd_putc("Time out!");

// lea checksum // Si la lectura lleva mucho tiempo // limpia el lcd // se posiciona en la columna 5 fila 1 //imprime Time out!

} else{ if(CheckSum == ((RH_Byte1 + RH_Byte2 + T_Byte1 + T_Byte2) & 0xFF)){ message1[7] = T_Byte1/10 + 48; message1[8] = T_Byte1%10 + 48; message1[10] = T_Byte2/10 + 48;

message2[7] = RH_Byte1/10 + 48; message2[8] = RH_Byte1%10 + 48; message2[10] = RH_Byte2/10 + 48; message1[11] = 223; // Degree symbol lcd_putc('\f'); lcd_gotoxy(1, 1);

// va a la columna 1 fila 1

printf(lcd_putc, message1); lcd_gotoxy(1, 2);

// imprime mensaje 1 // va a la columna 1 fila 2

printf(lcd_putc, message2);

// imprime mensaje 2

} else{ lcd_putc('\f');

// limpia el lcd

lcd_gotoxy(1, 1);

// va a la columna 1 fila 1

lcd_putc("Checksum Error!"); } } } else { lcd_putc('\f'); lcd_gotoxy(3, 1); lcd_putc("No response"); lcd_gotoxy(1, 2); lcd_putc("from the sensor"); }

} }

PRUEBAS:

// limpia el lcd // va a la columna 3 fila 1 //imprime error // va a la columna 1 fila 2

figura 1. 9 prueba del circuito, PROTEUS 8.5

CONCLUSIONES: Este sistema de control puede tener muchas aplicaciones, para llevar el control de la humedad y temperatura de algún lugar. Teniendo en cuenta que los parámetros temperatura y humedad son claves para la conservación de materiales, consumibles, etc., Los posibles usos que podría nuestro dispositivo controlar:   

Conservación de obras de arte Cultivo de semillas Conservación de frutas y verduras, etc...


Similar Free PDFs