Advertisement
Electgpl

PIC - Estación Interna v1 - 883 - HardTestOK

Sep 20th, 2017
122
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 13.92 KB | None | 0 0
  1. //*********************************************************************************************************
  2. // Programa para la estación meteorológica Interna inalámbrica
  3. // El programa recibe Temperatura, Humedad y Luminosidad por interrupción
  4. // El sistema mide Temperatura y Humedad interior
  5. // El enlace se realiza mediante una comunicación ASK OOK UHF sobre UART Invertido a 600bps
  6. // Se muestra medición interna y externa en un LCD de 2x16
  7. //*********************************************************************************************************
  8. #include <16F883.h>                                            //Biblioteca del microcontrolador
  9. #fuses NOMCLR, NOWDT, INTRC_IO                                 //Configuración de fuses
  10. #use delay(int=4000000)                                        //Configuración del clock interno a 4MHz
  11. #use rs232(baud=600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)    //Configuración de UART 600bps 8 N 1
  12. #include <LCD.c>                                               //biblioteca del LCD 2x16
  13. //*********************************************************************************************************
  14. // Variables
  15. //*********************************************************************************************************
  16. #define HEADER 200                                             //Definición de valor Header para el payload
  17. #define DATA PIN_A3                                            //Pin del bus de un hilo para el DHT11
  18. #define STATUS PIN_C0                                          //Pin para analizar el status de la interrupt
  19. static int8 datoInt[2];                                        //Variable donde se alojan los datos internos
  20. static int8 payload[5];                                        //Variable donde se aloja el payload
  21. static int8 datoExt[3];                                        //Variable donde se alojan los datos externos
  22. //*********************************************************************************************************
  23. // Función Interrupción UART que realiza el parse de datos, validación de Header y Checksum
  24. // Si validación y Checksum son validos, carga el vector DATO para ser utilizado
  25. //*********************************************************************************************************
  26. int8 i=0;                                                      //Variable para el contador de bytes de entrada
  27. #int_RDA                                                       //Interrupción por dato en UART
  28. void intser(){                                                 //Función de servicio de interrupción
  29.    payload[i++]=getc();                                        //Guarda byte de entrada en payload. incrementa indice
  30.    if(i>5){                                                    //Si el indice es mayor que 5 se asume que se completa el payload
  31.       if(payload[0]==HEADER){                                  //Validación que el Header sea 200 (seteado en el transmisor)
  32.          if(payload[1]+payload[2]+payload[3]-payload[4]==0){   //Validación de checksum, si datos leídos son igual a checksum
  33.             datoExt[0]=payload[1];                             //Cargamos los datos en el vector
  34.             datoExt[1]=payload[2];                             //Cargamos los datos en el vector
  35.             datoExt[2]=payload[3];                             //Cargamos los datos en el vector
  36.             output_toggle(STATUS);                             //Status de dato recibido OK
  37.          }
  38.       }
  39.       i=0;                                                     //Una vez que se completan los 5 bytes, se reinicia el contador
  40.    }
  41. }
  42. //*********************************************************************************************************
  43. // Trama DHT11 - Segun Datasheet
  44. // ____             ____      ____                                       ___
  45. //     |___________|    |____|    |.....................................|
  46. //     |   18ms    |    |80us|80us|               5x8 bit               |
  47. //     |    PIC    |    |                  DHT11 respuesta              | Fin de
  48. //     |  request  |    |  2x80us, intRH, decRH, intT, decT, checksum   | Trama
  49. // ____          ________
  50. //     |________|        |...                        0 bit
  51. //      <-50us-> <-27us->
  52. // ____          _________________________
  53. //     |________|                         |...       1 bit
  54. //      <-50us-> <---------70us---------->
  55. //*********************************************************************************************************
  56. unsigned int trama[5];                                         //Vector donde se alojan los datos
  57. //*********************************************************************************************************
  58. // Función de recepción de Byte
  59. // Lee el valor leído en la trama y lo separa realizando shift
  60. // Retorna el valor en forma de byte, es utilizado en la función recibeDato()
  61. //*********************************************************************************************************
  62. unsigned int recibeByte(){                                     //Función que recibe un Byte
  63.    unsigned int8 valorLeido = 0;                               //Valor de retorno de la función
  64.    int8 i=0;                                                   //Inicialización del indice
  65.    for(i=0; i<8; i++){                                         //Iteración para recepción de bits
  66.       valorLeido <<= 1;                                        //Registro de desplazamiento de bits
  67.       while(!input(DATA));                                     //Espera a DATA = 0
  68.       delay_us(30);                                            //Demora de 30us (Del Datasheet)
  69.       if(input(DATA)){                                         //Pregunta si DATA = 1
  70.           valorLeido |= 1;                                     //Realiza toggle del valor leido
  71.       }
  72.       while(input(DATA));                                      //Espera a DATA = 1
  73.    }
  74.    return valorLeido;                                          //Retorna el valor leido
  75. }
  76. //*********************************************************************************************************
  77. // Función de recepción de dato para el DHT11
  78. // Recibe los valores de temperatura y humedad (parte entera y decimales por separado)
  79. // Recibe el checksum enviado por el DHT11 y lo compara con el leído en el programa
  80. //*********************************************************************************************************
  81. unsigned int recibeDato(){                                     //Función que recibe el Dato
  82.    int validacion = 0;                                         //Variable de Validación
  83.    int checksum = 0;                                           //Variable de deteccion de cambios de secuencia
  84.    int8 j=0;                                                   //Variable para el lazo for
  85.    output_high(DATA);                                          //Set DATA = 1  
  86.    output_low(DATA);                                           //Set DATA = 0
  87.    delay_ms(18);                                               //Demora de 18ms (Del Datasheet)
  88.    output_high(DATA);                                          //Set DATA = 1
  89.    delay_us(25);                                               //Demora de 25ms (Del Datasheet)
  90.    validacion = input(DATA);                                   //Mueve valor de DATA a Validacion
  91.    delay_us(80);                                               //Espera 80us (Del Datasheet)
  92.    validacion = input(DATA);                                   //Mueve valor de DATA a Validacion
  93.    if(!validacion){                                            //Si Validación = 0, Error de secuencia
  94.       printf( "Error en Checksum \r");                         //Muestra leyenda de error
  95.    }
  96.    delay_us(80);                                               //Espera 80us (Del Datasheet)
  97.    for(j=0; j<5; j++){                                         //Lazo de carga de bytes de datos
  98.        trama[j] = recibeByte();                                //Carga del vector de datos
  99.    }
  100.    output_high(DATA);                                          //Set DATA = 1
  101.    for(j=0; j<4; j++){                                         //Lazo de carga de bytes de verificación
  102.        checksum += trama[j];                                   //Carga de bytes de verificación
  103.    }
  104.    if(checksum == trama[4]){                                   //Si la secuencia de verificación es correcta
  105.       return 0;                                                //Se retorna 0 y se realiza la lectura
  106.    }
  107. }
  108. //*********************************************************************************************************
  109. // Lee DHT11
  110. //*********************************************************************************************************
  111. void leeDHT11(void){                                           //Función que lee el DHT11
  112.    if(recibeDato()==0){                                        //Consulta si hay dato en la entrada del DHT11
  113.       datoInt[0]=trama[2];                                     //Carga el valor de temperatura DHT en byte 1 del payload
  114.       datoInt[1]=trama[0];                                     //Carga el valor de humedad DHT en byte 2 del payload
  115.    }
  116. }
  117. //*********************************************************************************************************
  118. // Saludo de Pantalla
  119. //*********************************************************************************************************
  120. void saludoPantalla(void){                                     //Función que realiza un saludo inicial
  121.    lcd_gotoxy(1,1);                                            //Posiciona el cursor en la pantalla
  122.    printf(lcd_putc," Est.Inalambrica");                        //Imprime mensaje renglón 1
  123.    lcd_gotoxy(1,2);                                            //Posiciona el cursor en la pantalla
  124.    printf(lcd_putc," v1.1  UTN INSPT");                        //Imprime mensaje renglón 2
  125.    delay_ms(2000);                                             //Delay de saludo
  126.    lcd_init();                                                 //Inicializa LCD
  127. }
  128. //*********************************************************************************************************
  129. // Impresion de Pantalla
  130. //*********************************************************************************************************
  131. void impPantalla(void){                                        //Función que imprime pantalla
  132.    lcd_gotoxy(1,2);                                            //Posiciona el cursor en la pantalla
  133.    printf(lcd_putc,"%2u",datoExt[0]);                          //Imprime Temperatura Exterior
  134.    lcd_gotoxy(3,2);                                            //Posiciona el cursor en la pantalla
  135.    lcd_putc(0xDF);                                             //Imprime unidad de medida
  136.    lcd_gotoxy(4,2);                                            //Posiciona el cursor en la pantalla
  137.    lcd_putc("C");                                              //Imprime unidad de medida
  138.    lcd_gotoxy(6,2);                                            //Posiciona el cursor en la pantalla
  139.    printf(lcd_putc,"%2u",datoExt[1]);                          //Imprime Humedad Exterior
  140.    lcd_gotoxy(8,2);                                            //Posiciona el cursor en la pantalla
  141.    lcd_putc("%RH");                                            //Imprime unidad de medida
  142.    lcd_gotoxy(12,2);                                           //Posiciona el cursor en la pantalla
  143.    printf(lcd_putc,"%3u",datoExt[2]);                          //Imprime Luminosidad Exterior
  144.    lcd_gotoxy(15,2);                                           //Posiciona el cursor en la pantalla
  145.    lcd_putc("L");                                              //Imprime unidad de medida
  146.    lcd_gotoxy(3,1);                                            //Posiciona el cursor en la pantalla
  147.    printf(lcd_putc,"%2u",datoInt[0]);                          //Imprime Temperatura Interior
  148.    lcd_gotoxy(5,1);                                            //Posiciona el cursor en la pantalla
  149.    lcd_putc(0xDF);                                             //Imprime unidad de medida
  150.    lcd_gotoxy(6,1);                                            //Posiciona el cursor en la pantalla
  151.    lcd_putc("C");                                              //Imprime unidad de medida
  152.    lcd_gotoxy(10,1);                                           //Posiciona el cursor en la pantalla
  153.    printf(lcd_putc,"%2u",datoInt[1]);                          //Imprime Humedad Exterior
  154.    lcd_gotoxy(12,1);                                           //Posiciona el cursor en la pantalla
  155.    lcd_putc("%RH");                                            //Imprime unidad de medida
  156. }
  157. //*********************************************************************************************************
  158. // Programa principal, Realiza la lectura de DHT11, lectura de batería y recibe los datos por UART
  159. // Lee la temperatura y humedad interna, realiza un pronóstico aproximado
  160. //*********************************************************************************************************
  161. void main(){                                                   //Función principal
  162.    enable_interrupts(global);                                  //Habilita interrupciones globales
  163.    enable_interrupts(int_rda);                                 //Habilita interrupción de dato en UART
  164.    lcd_init();                                                 //Inicializa LCD
  165.    saludoPantalla();                                           //Función de saludo de pantalla
  166.    while(true){                                                //Loop principal infinito
  167.       leeDHT11();                                              //Función que lee DHT11
  168.       delay_ms(2000);                                          //Delay de Actualización
  169.       impPantalla();                                           //Imprime pantalla LCD
  170.       delay_ms(2000);                                          //Delay de Actualizacion
  171.    }
  172. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement