Advertisement
Electgpl

PIC - Estación Externa V1 - 883

Aug 19th, 2017
115
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 10.58 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 comunicacion ASK OOK UHF sobre UART Invertido a 600bps
  6. //*********************************************************************************************************
  7. #include <16F883.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_C6,rcv=PIN_C7,bits=8)    //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_B0                                            //Pin del bus de un hilo para el DHT11
  27. unsigned int trama[5];                                         //Vector donde se alojan los datos
  28. //*********************************************************************************************************
  29. // Funcion de recepcio de Byte
  30. // Lee el valor leido en la trama y lo separa realizando shift
  31. // Retorna el valor en forma de byte, es utilizado en la funcion recibeDato()
  32. //*********************************************************************************************************
  33. unsigned int recibeByte(){                                     //Funcion 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.    for(i=0; i<8; i++){                                         //Iteracion para recepcion de bits
  37.       valorLeido <<= 1;                                        //Registro de desplazamiento de bits
  38.       while(!input(DATA));                                     //Espera a DATA = 0
  39.       delay_us(30);                                            //Demora de 30us (Del Datasheet)
  40.       if(input(DATA)){                                         //Pregunta si DATA = 1
  41.           valorLeido |= 1;                                     //Realiza toggle del valor leido
  42.       }
  43.       while(input(DATA));                                      //Espera a DATA = 1
  44.    }
  45.    return valorLeido;                                          //Retorna el valor leido
  46. }
  47. //*********************************************************************************************************
  48. // Funcion de recepcion de dato para el DHT11
  49. // Recive los valores de temperatura y humedad (parte entera y decimales por separado)
  50. // Recive el checksum enviado por el DHT11 y lo compara con el leido en el programa
  51. //*********************************************************************************************************
  52. unsigned int recibeDato(){                                     //Funcion que recibe el Dato
  53.    int validacion = 0;                                         //Variable de Validacion
  54.    int checksum = 0;                                           //Variable de deteccion de cambios de secuencia
  55.    int8 j=0;                                                   //Variable para el lazo for
  56.    output_high(DATA);                                          //Set DATA = 1  
  57.    output_low(DATA);                                           //Set DATA = 0
  58.    delay_ms(18);                                               //Demora de 18ms (Del Datasheet)
  59.    output_high(DATA);                                          //Set DATA = 1
  60.    delay_us(25);                                               //Demora de 25ms (Del Datasheet)
  61.    validacion = input(DATA);                                   //Mueve valor de DATA a Validacion
  62.    delay_us(80);                                               //Espera 80us (Del Datasheet)
  63.    validacion = input(DATA);                                   //Mueve valor de DATA a Validacion
  64.    if(!validacion){                                            //Si Validacion = 0, Error de secuencia
  65.       printf( "Error en Checksum \r");                         //Muestra leyenda de error
  66.    }
  67.    delay_us(80);                                               //Espera 80us (Del Datasheet)
  68.    for(j=0; j<5; j++){                                         //Lazo de carga de bytes de datos
  69.        trama[j] = recibeByte();                                //Carga del vector de datos
  70.    }
  71.    output_high(DATA);                                          //Set DATA = 1
  72.    for(j=0; j<4; j++){                                         //Lazo de carga de bytes de verificacion
  73.        checksum += trama[j];                                   //Carga de bytes de verificacion
  74.    }
  75.    if(checksum == trama[4]){                                   //Si la secuencia de verificacion es correcta
  76.       return 0;                                                //Se retorna 0 y se realiza la lectura
  77.    }
  78. }
  79. //*********************************************************************************************************
  80. // Funcion que realiza la lectura del sensor LDR y acondiciona el valor
  81. //*********************************************************************************************************
  82. static int8 lecturaLDR(void){                                  //Funcion que realiza la lectura del ADC para el LDR
  83.    set_adc_channel(0);                                         //Selecciona canal ADC 0 y comienza la medición
  84.    delay_us(10);                                               //Delay propuesto por datasheet para conversión ADC
  85.    return((3*read_adc()-147)/10);                              //Retorna el valor del ADC canal 0
  86. }
  87. //*********************************************************************************************************
  88. // Funcion que realiza el parse de datos y armado del payload para enviar por UART
  89. //*********************************************************************************************************
  90. #define HEADER 200                                             //Definición de valor Header para el payload
  91. static char payload[5];                                        //Variable donde se aloja el payload
  92. void enivaRF(void){                                            //Declaración de función para enviar datos
  93.    payload[0]=HEADER;                                          //Carga el Header en byte 0 del payload
  94.    payload[4]=payload[1]+payload[2]+payload[3];                //Realiza suma de los datos y lo carga en el byte 4 del payload
  95.    putc(payload[0]);                                           //Envía el byte 0 del payload por UART
  96.    delay_ms(50);                                               //Delay de espera entre bytes enviados por UART
  97.    putc(payload[1]);                                           //Envía el byte 1 del payload por UART
  98.    delay_ms(50);                                               //Delay de espera entre bytes enviados por UART
  99.    putc(payload[2]);                                           //Envía el byte 2 del payload por UART
  100.    delay_ms(50);                                               //Delay de espera entre bytes enviados por UART
  101.    putc(payload[3]);                                           //Envía el byte 3 del payload por UART
  102.    delay_ms(50);                                               //Delay de espera entre bytes enviados por UART
  103.    putc(payload[4]);                                           //Envía el byte 4 del payload por UART
  104.    delay_ms(50);                                               //Delay de espera entre bytes enviados por UART
  105.    printf("\r");                                               //Envía caracter de retorno de linea como final de payload
  106. }
  107. //*********************************************************************************************************
  108. // Programa principal, Realiza la lectura de DHT11, lectura del LDR y Envia los datos por UART
  109. // Realiza el timer de Sleep y WakeUp
  110. //*********************************************************************************************************
  111. void main(){                                                   //Función principal
  112.    static int8 timer=0;                                        //Definicion de variable para el timer
  113.    setup_adc_ports(sAN0|VSS_VDD);                              //Configuración de canales ADC
  114.    setup_adc(ADC_CLOCK_DIV_2);                                 //Configuración de velocidad de conversión de ADC
  115.    while(true){                                                //Loop principal repetitivo
  116.       if(timer>10){                                            //Cantidad de iteraciones del timer
  117.          if(recibeDato()==0){                                  //Consulta si hay dato en la entrada del DHT11
  118.             payload[1]=trama[2];                               //Carga el valor de temperatura DHT en byte 1 del payload
  119.             payload[2]=trama[0];                               //Carga el valor de humedad DHT en byte 2 del payload
  120.             payload[3]=lecturaLDR();                           //Carga el valor de luminosidad en el byte 3 del payload
  121.             enivaRF();                                         //Llamado a la función que envía datos
  122.          }
  123.          timer=0;                                              //Inicializa timer
  124.       }else{                                                   //Mientras que el timer sea menor que limite
  125.          delay_ms(2304);                                       //Delay del timer de sleep*
  126.          timer++;                                              //Incrementa el timer
  127.       }
  128.    }
  129. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement