#include <18f4550.h>  //incluimos libreria de pic18f4550
#device adc=8        //defnimos que el adc sera de una resolucion de 8 bits
#fuses Hs,NOWDT, XT, PUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP
# use delay(clock=4000000)//definimos un reloj de 4Mhz
#include <stdio.h>
#include <stdlib.h>
#include <string.h>//incluimos libreria para uso de operaciones en memoria
#include <lib_rf2gh4_10_4550.h>//libreria para controlar modulo nrf24l01

#use fast_io(A)
#use fast_io(B)
#use fast_io(C)
#use fast_io(D)
#use fast_io(E)

int hum, temp, ilum;//definimos variables humedad, temperatura e iluminacion
char humedad[3];
char temperatura[3];
char iluminacion[4];
char hum_tx[3];
char temp_tx[3];
char ilum_tx[4];
int8 ret,ret2,j;

#int_ext2
void int_RB2(void)
{
   ret2=RF_RECEIVE();
   if(ret2==0||ret2==1)
   {
      if(RF_DATA[0]=='1')     //si 
      {
         output_high(PIN_D3);
         delay_ms(10);
      }
      if(RF_DATA[0]=='2')     //si 
      {
         output_low(PIN_D3);
         delay_ms(10);
      }
      if(RF_DATA[0]=='3')
      {
         output_high(PIN_D0);
         delay_ms(10);
         output_low(PIN_D1);
      }
      if(RF_DATA[0]=='4')
      {
         output_low(PIN_D1);
         delay_ms(10);
         output_low(PIN_D0);
      }
      if(RF_DATA[0]=='5')
      {
         output_high(PIN_D1);
         delay_ms(10);
         output_low(PIN_D0);
      }
   }
}
void enviar(char string)
{
      *j=0;
      RF_CONFIG_SPI();          // Configurar módulo SPI del PIC.
      RF_CONFIG(0x40,0x01);     // Configurar módulo RF canal y dirección de recepción. Para recibir datos tiene la dirección 0x01.
      RF_ON();                  // Activar el módulo RF.
 
      delay_ms(5);              // Le damos un mínimo de 5 milisegundos para que se ponga en marcha.
      
      for(j=0;j<strlen(string);j++)
      {
        RF_DATA[j]=string[j];
       
      }     
         RF_DIR=0x08;
         ret=RF_SEND();
         delay_ms(10);       
}
void main ()   //inicio de programa principal
{
    setup_spi(SPI_SS_DISABLED);
    setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
    setup_timer_1(T1_DISABLED);
    setup_timer_2(T2_DISABLED,0,1);
    //setup_comparator(NC_NC_NC_NC);
    //setup_vref(FALSE);
    set_tris_d(0b01100000);//configuramos puerto d
    setup_adc(ADC_CLOCK_INTERNAL);//definimos el uso de adc y clock interno
    setup_adc_ports(AN0_TO_AN2); //definos los puertos de entrada analogica
    output_low(PIN_D0);
    delay_ms(10);
    output_low(PIN_D1);
    delay_ms(10);
    output_low(PIN_D2);
    delay_ms(10);
    output_low(PIN_D3);
    delay_ms(10);
    output_low(PIN_D4);
    delay_ms(10);
    while (TRUE)   //entramos en un ciclo infinito
   {
 ///////////////////////////////////HUMEDAD///////////////////////////////////
      set_adc_channel(0);  //inicializamos canal 0 para dato de humedad
      delay_us(100);

      hum=(int)((((float)read_adc())*0.02)+0.01)*20;//leemos dato de humedad y
                                              //realizamos operacion      
      sprintf(humedad,"%d",hum);//convertimos a string el valor entero
      strcat(hum_tx,'H');
      strcat(hum_tx,humedad);
      enviar(hum_tx);
      while(ret==1||ret==2)
      {
         enviar(hum_tx);
      }
///////////////////////////////////////TEMPERATURA///////////////////////////////

      set_adc_channel(1);  //inicializamos canal 1 para dato de temperatura
      delay_us(100);

      temp=(int)(((float)read_adc())*2);//leemos dato de temperatura y
                                   //realizamos operacion
      sprintf(temperatura,"%d",hum);// convertimos a string el valor entero
      strcat(temp_tx,'T');
      strcat(temp_tx,temperatura);
      enviar(temp_tx);
      while(ret==1||ret==2)
      {
         enviar(temp_tx);
      }
      
///////////////////////////////////////ILUMINACION/////////////////////////////// 
 
      set_adc_channel(2);  //inicializamos canal 2 para dato de temperatura
      delay_us(100);

      ilum = (int)((((float)read_adc()+1)*1000)/((int)(15*10*(1024-(float)read_adc()))));
      sprintf(iluminacion,"%d",ilum); //convertimos a string el valor entero
      strcat(ilum_tx,'I');
      strcat(ilum_tx,iluminacion);
      enviar(ilum_tx);
      while(ret==1||ret==2)
      {
         enviar(ilum_tx);
      }
      
      if(input(pin_d5)==1)
      {
        output_high(PIN_D2);
        delay_ms(10);
      }
      if(input(pin_d6)==0)
      {
        output_low(PIN_D2);
        delay_ms(10);
      }
   }
   
}


