Advertisement
Electgpl

PIC - Estación Externa v1 - 676 - HardTestOK

Sep 20th, 2017
115
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 10.65 KB | None | 0 0
  1. //*********************************************************************************************************
  2. // Programa para la estación meteorológica externa inalámbrica
  3. // El programa envía Temperatura, Humedad y Luminosidad cada 30 segundos
  4. // El sistema entra en bajo consumo cuando mientras no realiza mediciones
  5. // El enlace se realiza mediante una comunicación ASK OOK UHF sobre UART Invertido a 600bps
  6. //*********************************************************************************************************
  7. #include <16F676.h>                                            //Biblioteca del microcontrolador
  8. #fuses NOMCLR, NOWDT, INTRC_IO                                 //Configuración de fuses
  9. #device adc=8                                                  //Configuración del ADC a 8bit
  10. #use delay(int=4000000)                                        //Configuración del clock interno a 4MHz
  11. #use rs232(baud=600,parity=N,xmit=PIN_C5,rcv=PIN_C4,bits=8,invert) //Configuración de UART 600bps 8 N 1
  12. //*********************************************************************************************************
  13. // Trama DHT11 - Segun Datasheet
  14. // ____             ____      ____                                       ___
  15. //     |___________|    |____|    |.....................................|
  16. //     |   18ms    |    |80us|80us|               5x8 bit               |
  17. //     |    PIC    |    |                  DHT11 respuesta              | Fin de
  18. //     |  request  |    |  2x80us, intRH, decRH, intT, decT, checksum   | Trama
  19. // ____          ________
  20. //     |________|        |...                        0 bit
  21. //      <-50us-> <-27us->
  22. // ____          _________________________
  23. //     |________|                         |...       1 bit
  24. //      <-50us-> <---------70us---------->
  25. //*********************************************************************************************************
  26. #define DATA PIN_A1                                            //Pin del bus de un hilo para el DHT11
  27. unsigned int trama[5];                                         //Vector donde se alojan los datos
  28. //*********************************************************************************************************
  29. // Función de recepción de Byte
  30. // Lee el valor leído en la trama y lo separa realizando shift
  31. // Retorna el valor en forma de byte, es utilizado en la función recibeDato()
  32. //*********************************************************************************************************
  33. unsigned int recibeByte(){                                     //Función que recibe un Byte
  34.    unsigned int8 valorLeido=0;                                 //Valor de retorno de la función
  35.    int8 i=0;                                                   //Inicialización del indice
  36.    int16 timeout=0;
  37.    for(i=0;i<8;i++){                                           //Iteracion para recepción de bits
  38.       valorLeido<<=1;                                          //Registro de desplazamiento de bits
  39.       while(input(DATA)==0);                                   //Espera a DATA = 0
  40.       delay_us(30);                                            //Demora de 30us (Del Datasheet)
  41.       if(input(DATA))                                          //Pregunta si DATA = 1
  42.          valorLeido|=1;                                        //Realiza toggle del valor leido
  43.       timeout=0;
  44.       while((input(DATA))&&(timeout++<1000));                  //Espera a DATA = 1 y timeout
  45.    }
  46.    return valorLeido;                                          //Retorna el valor leído
  47. }
  48. //*********************************************************************************************************
  49. // Función de recepción de dato para el DHT11
  50. // Recibe los valores de temperatura y humedad (parte entera y decimales por separado)
  51. // Recibe el checksum enviado por el DHT11 y lo compara con el leído en el programa
  52. //*********************************************************************************************************
  53. unsigned int recibeDato(){                                     //Función que recibe el Dato
  54.    int validacion=0;                                           //Variable de Validación
  55.    int checksum=0;                                             //Variable de detección de cambios de secuencia
  56.    int8 j=0;                                                   //Variable para el lazo for
  57.    output_high(DATA);                                          //Set DATA = 1  
  58.    output_low(DATA);                                           //Set DATA = 0
  59.    delay_ms(18);                                               //Demora de 18ms (Del Datasheet)
  60.    output_high(DATA);                                          //Set DATA = 1
  61.    delay_us(25);                                               //Demora de 25ms (Del Datasheet)
  62.    validacion=input(DATA);                                     //Mueve valor de DATA a Validación
  63.    delay_us(80);                                               //Espera 80us (Del Datasheet)
  64.    validacion=input(DATA);                                     //Mueve valor de DATA a Validación
  65.    if(!validacion){                                            //Si Validación = 0, Error de secuencia
  66.       printf("Error en Checksum \r");                          //Muestra leyenda de error
  67.    }
  68.    delay_us(80);                                               //Espera 80us (Del Datasheet)
  69.    for(j=0;j<5;j++){                                           //Lazo de carga de bytes de datos
  70.        trama[j]=recibeByte();                                  //Carga del vector de datos
  71.    }
  72.    output_high(DATA);                                          //Set DATA = 1
  73.    for(j=0;j<4;j++){                                           //Lazo de carga de bytes de verificación
  74.        checksum+=trama[j];                                     //Carga de bytes de verificación
  75.    }
  76.    if(checksum==trama[4]){                                     //Si la secuencia de verificación es correcta
  77.       return 0;                                                //Se retorna 0 y se realiza la lectura
  78.    }
  79. }
  80. //*********************************************************************************************************
  81. // Función que realiza la lectura del sensor LDR y acondiciona el valor
  82. //*********************************************************************************************************
  83. static int8 lecturaLDR(void){                                  //Función que realiza la lectura del ADC para el LDR
  84.    set_adc_channel(0);                                         //Selecciona canal ADC 0 y comienza la medición
  85.    delay_us(10);                                               //Delay propuesto por datasheet para conversión ADC
  86.    return(read_adc());                                         //Retorna el valor del ADC canal 0
  87. }
  88. //*********************************************************************************************************
  89. // Función que realiza el parse de datos y armado del payload para enviar por UART
  90. //*********************************************************************************************************
  91. #define HEADER 200                                             //Definición de valor Header para el payload
  92. static char payload[5];                                        //Variable donde se aloja el payload
  93. void enivaRF(void){                                            //Declaración de función para enviar datos
  94.    payload[0]=HEADER;                                          //Carga el Header en byte 0 del payload
  95.    payload[4]=payload[1]+payload[2]+payload[3];                //Realiza suma de los tres datos y lo carga en el byte 4 del payload
  96.    putc(payload[0]);                                           //Envía el byte 0 del payload por UART
  97.    delay_ms(50);                                               //Delay de espera entre bytes enviados por UART
  98.    putc(payload[1]);                                           //Envía el byte 1 del payload por UART
  99.    delay_ms(50);                                               //Delay de espera entre bytes enviados por UART
  100.    putc(payload[2]);                                           //Envía el byte 2 del payload por UART
  101.    delay_ms(50);                                               //Delay de espera entre bytes enviados por UART
  102.    putc(payload[3]);                                           //Envía el byte 3 del payload por UART
  103.    delay_ms(50);                                               //Delay de espera entre bytes enviados por UART
  104.    putc(payload[4]);                                           //Envía el byte 4 del payload por UART
  105.    delay_ms(50);                                               //Delay de espera entre bytes enviados por UART
  106.    printf("\r");                                               //Envía caracter de retorno de linea como final de payload
  107. }
  108. //*********************************************************************************************************
  109. // Programa principal, Realiza la lectura de DHT11, lectura del LDR y Envía los datos por UART
  110. // Realiza el timer de Sleep y WakeUp
  111. //*********************************************************************************************************
  112. void main(){                                                   //Función principal
  113.    static int8 timer=0;                                        //Definición de variable para el timer
  114.    setup_adc_ports(sAN0|VSS_VDD);                              //Configuración de canales ADC
  115.    setup_adc(ADC_CLOCK_DIV_2);                                 //Configuración de velocidad de conversión de ADC
  116.    while(true){                                                //Loop principal repetitivo
  117.       if(timer>2){                                             //Cantidad de iteraciones del timer
  118.          if(recibeDato()==0){                                  //Consulta si hay dato en la entrada del DHT11
  119.             payload[1]=trama[2];                               //Carga el valor de temperatura DHT en byte 1 del payload
  120.             payload[2]=trama[0];                               //Carga el valor de humedad DHT en byte 2 del payload
  121.             payload[3]=lecturaLDR();                           //Carga el valor de luminosidad en el byte 3 del payload
  122.             enivaRF();                                         //Llamado a la función que envía datos
  123.          }
  124.          timer=0;                                              //Inicializa timer
  125.       }else{                                                   //Mientras que el timer sea menor que limite
  126.          delay_ms(2304);                                       //Delay del timer de sleep*
  127.          timer++;                                              //Incrementa el timer
  128.       }
  129.    }
  130. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement