Sensor LM35 con PIC18F4550 y Bluetooth

Hola. Intento realizar un pequeño proyecto con un PIC18F4550, en el cual quiero leer por un pin analógico la señal de un LM35, y que muestre los datos obtenidos a través de un módulo Bluetooth hacia un celular u ordenador, y al mismo tiempo que el PIC reciba datos con el Bluetooth y encienda o apague unos leds.

Mi problema es que en la programación del PIC utilizo el comando "getch()" y la señal del sensor la manda hasta que yo envío un dato al getch()

Espero que me puedan ayudar para que me esté enviando los datos del sensor y poder encender o apagar los leds cuando yo le envíe datos. Gracias.

PHP:
#include <18f4550.h>
#use delay(crystal =4MHz)
#include <string.h>

#fuses HS
#fuses NOPROTECT
#fuses NOPUT
#fuses NOWDT
#fuses MCLR

#use rs232(UART1, baud= 9600, xmit=pin_c6, rcv=pin_c7, parity=n, bits=8, stop=1)
#use standard_io(b)
#use standard_io(a)

#define led1   pin_b0
#define led2   pin_b1



char dato;
float temperatura;
long valor;




void main()
{  

   
   while(true)
   {
      
      
            
      dato=getc();

      setup_adc(adc_clock_internal);
      setup_adc_ports(all_analog);
      delay_us(20);
   
      set_adc_channel(0);
      delay_us(50);
      valor=read_adc();
      //temperatura=(0.488758*(float)valor);
      printf("%2.1f\n\r",temperatura);
      delay_ms(2000);
     
      
      switch (dato)
      {
         case 'a': 
            output_high(led1);                   
         break;
         
         case 'b': 
            output_high(led2);           
         break;         
        
         
      }
 
   }
}
 
Última edición por un moderador:
Si estás haciendo la recepción por "poleo", (Polling) debes usar kbhit();
kbhit (stream); retorna un 0 cuando se espera un dato y un 1 cuando se tiene un dato.

Por ejemplo:
Código:
if (kbhit())
{
    dato = getc();
    flag_rx = 1; // Bandera que indica que hay un dato listo en el buffer. (Opcional)
}
Como quiera, te recomiendo que uses la interrupción por recepción. (#INT_RDA)
Es mucho mejor y el PIC que estás usando la tiene, así que aprovecha sus recursos.
 
Última edición:
Sobretodo el delay está enormemente largo, 2 segundos es larguísimo, lo que tienes que hacer es quitarlo y para poder escribir en el display debes refrescar cada 2 segundos ejemplo:

Mi interrupción es de 100 milisegundos.

interrupcion
{
if(inc>= 10)
{
inc=0;
segundos++;
}

inc++;
}


En el main es así:

while(true)
{

if(segundos>=2)
{
// escribe en el display
segundos=0;
}


}
 
Atrás
Arriba