Autor Tema: Consulta termometro con led rgb  (Leído 5192 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado D3L05

  • PIC10
  • *
  • Mensajes: 38
    • Zeoz
Consulta termometro con led rgb
« en: 18 de Marzo de 2008, 17:37:19 »
hola, antes que nada perdon si posteo en el foro incorrecto.

tengo la idea de realizar un proyecto que seria un termometro con un LM35 que al variar la temperatura sensada variaria el color de un led RGB, mi consulta es que pic me conviene usar, vi muchos post sobre este tema pero en su mayoria usan un display para mostrar los datos, yo como no lo voy a usar tengo la duda si necesito un pic q tenga ADC incorporado o si podria hacerlo con algun 16f84 o similar, la verdad que soy nuevo en el tema perdon si estoy preguntando cosas sin sentido, espero que alguien me saque la duda, muchas gracias!
« Última modificación: 18 de Marzo de 2008, 23:17:12 por D3L05 »
Zeoz" border="0

Desconectado aitopes

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5100
    • uControl
Re: Consulta
« Respuesta #1 en: 18 de Marzo de 2008, 18:21:06 »
Hola!
Dado que ese sensor es analogico, forzosamente vas a tener que digitalizarlo para poder mostrar el valor. O usas un PIC con ADC o bien un ADC externo (a mi me gusta mas la primer opcion).

Saludos!
PD: Podrias cambiar el titulo al post, poner algo mas acorde al tema, para que obtengas mas y mejores respuestas.
Si cualquier habilidad que aprende un niño será obsoleta antes de que la use, entonces, ¿qué es lo que tiene que aprender? La respuesta es obvia:
La única habilidad competitiva a largo plazo es la habilidad para aprender
“. Seymour Papert

Desconectado D3L05

  • PIC10
  • *
  • Mensajes: 38
    • Zeoz
Re: Consulta termometro c/ led rgb
« Respuesta #2 en: 18 de Marzo de 2008, 21:00:18 »
gracias por responder,
si no queda otra lo mejor seria usar por ejemplo un pic 16f877 no?
la idea es minimizar lo mas posible el tamaño del circuito y asi tambien el costo...

ya que estoy molesto un poco mas...aguien me podria orientar con el codigo en asm? el problema no es leer los datos del lm35 sino con esos datos pasarselos a cada pata del led para generar el color q quiero.

gracias de ante mano!!
Zeoz" border="0

Desconectado jfh900

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3595
Re: Consulta termometro c/ led rgb
« Respuesta #3 en: 18 de Marzo de 2008, 21:05:15 »
Puedes utilizar un PIC16F88, es mas barato que el PIC16F84 y tiene ADC y I2C.

Un saludo
* Cuando hables, procura que tus palabras sean mejores que el silencio.
* 'Todos somos ignorantes, lo que ocurre es que no todos ignoramos las mismas cosas.' Albert Einstein.
* No hay nada peor que un experto para evitar el progreso en un campo
* "La vida es como una novela. No importa que sea larga, sino que esté bien narrada" Seneca
* La vida no se vive por las veces que respiras, sino por los momentos que dejan sin aliento.
* Dios dijo: ∇·E=ρ/ε0 ; ∇·B=0 ; ∇xE=-dB/dt ; ∇xB= μ0ε0dE/dt..y la luz se hizo..!!..

Desde España Jesús

Desconectado El_Guitre

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1046
Re: Consulta termometro con led rgb
« Respuesta #4 en: 19 de Marzo de 2008, 07:29:59 »
Si lo que queres es un tamaño reducido podes usar un 12F615, es de 8 pines, tiene ADC, SPI, I2C. Saludos.

Desconectado D3L05

  • PIC10
  • *
  • Mensajes: 38
    • Zeoz
Re: Consulta termometro con led rgb
« Respuesta #5 en: 20 de Marzo de 2008, 22:18:16 »
Hola,
despues de mirar muuuuchos ejemplos del foro y otras paginas mas o menos voy encaminado, pero como es mi primer proyecto debe tener miles de errores (y no me debo dar cuenta de casi ninguno)

les adjunto la simulacion en proteus para ver si alguien me puede ayudar.

este es el prog:

Código: [Seleccionar]
#include <18F4520.h>
#device adc=8

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES WDT128                   //Watch Dog Timer uses 1:128 Postscale
#FUSES INTRC                    //Internal RC Osc
#FUSES NOPROTECT                //Code not protected from reading
#FUSES BROWNOUT                 //Reset when brownout detected
#FUSES BORV25                   //Brownout reset at 2.5V
#FUSES PUT                      //Power Up Timer
#FUSES NOCPD                    //No EE protection
#FUSES STVREN                   //Stack full/underflow will cause reset
#FUSES NODEBUG                  //No Debug mode for ICD
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOWRT                    //Program memory not write protected
#FUSES NOWRTD                   //Data EEPROM not write protected
#FUSES IESO                     //Internal External Switch Over mode enabled
#FUSES FCMEN                    //Fail-safe clock monitor enabled
#FUSES NOPBADEN                 //PORTB pins are configured as digital I/O on RESET
#FUSES NOWRTC                   //configuration not registers write protected
#FUSES NOWRTB                   //Boot block not write protected
#FUSES NOEBTR                   //Memory not protected from table reads
#FUSES NOEBTRB                  //Boot block not protected from table reads
#FUSES NOCPB                    //No Boot Block code protection
#FUSES LPT1OSC                  //Timer1 configured for low-power operation
#FUSES NOMCLR                   //Master Clear pin used for I/O
#FUSES NOXINST                  //Extended set extension and Indexed Addressing mode disabled (Legacy mode)

#use delay(clock=8000000)


#byte PORTB=0xF81

#bit  LedRojo        =     PORTB.0
#bit  LedVerde       =     PORTB.1
#bit  LedAzul        =     PORTB.2

#include "lcd.c"


int8 Rojo,Azul, Ticks;


#int_Timer0
void ActivaLed() {
   Ticks++;

   if (Ticks==0) {
      LedAzul=1;
      LedRojo=1;
   };
   if (Ticks==Rojo)
         LedRojo=0;
   if (Ticks==Azul)
         LedAzul=0;
   set_timer0(31);
}



void main() {

   int analogico;
   int dato_anterior;
   lcd_init();   

   setup_port_a(AN0|VSS_VREF);            //Seteamos el puerto analógico
   setup_adc(ADC_CLOCK_INTERNAL);
   set_adc_channel(0);
     
   setup_adc_ports(AN0_ANALOG);
   
   setup_psp(PSP_DISABLED);
   setup_spi(FALSE);
   setup_wdt(WDT_OFF);
   setup_timer_0( RTCC_8_BIT|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
  //setup_timer_2(T2_DIV_BY_16, 127, 1);
   setup_timer_3(T3_DISABLED|T3_DIV_BY_1);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(VREF_LOW|-2);
   setup_low_volt_detect(FALSE);
   setup_oscillator(OSC_8MHZ);

   set_tris_b(0);

   Rojo=0;
   Azul=0;
   Ticks=0;

   enable_interrupts(INT_TIMER0);
   enable_interrupts (GLOBAL);
     
   lcd_gotoxy(1, 2);
   lcd_putc("Temp:"); 

   dato_anterior = 0;
   analogico = read_adc();
   Azul = 255 - analogico*2.5;
   Rojo = analogico*2.5;
   while (1) {
      analogico = read_adc();
      lcd_gotoxy(1, 1);
      printf (lcd_putc,"R = %u, A = %u \n\r\n\r",Rojo,Azul);
      lcd_gotoxy(6, 2);
      lcd_putc("       ");
      lcd_gotoxy(6, 2);
      printf(lcd_putc," %d ºC", analogico);   //Mostramos el valor de la temperatura en el LCD
      if(analogico != dato_anterior){
      Azul = 255 - analogico*2.5;
      Rojo = analogico*2.5;
      dato_anterior = analogico;
      }
     
   };

}


use el PIC18F4520 xq lo hice sobre un programa q baje de la pagina micropic, mi idea seria luego mudarlo a otro pic de menos tamaño.
La idea es q el pic toma la temperatura entregada por el LM35 (en una escala de 0 a 100 Cº) y la multiplica por 2.5 para obtener los valores para el color azul y el color rojo asi ir variando de azul a rojo a medida q sube la temperatura.
el primer problema q tengo en la simulacion es el dato q me muestra el LM35 y el dato q se lee el LM35 simulado en otra aplicacion anda bien en esta no se porque tiene un defasaje.

y otro problema es el flikeo q hacen los leds y el lcd, supongo q tendre algun problema con el clock del pic o con el timer en el prog, la verdad q no entiendo mucho, si alguien me podria dar una mano se lo agradeceria.

muchas gracias de ante mano!

German.
Zeoz" border="0

Desconectado D3L05

  • PIC10
  • *
  • Mensajes: 38
    • Zeoz
Re: Consulta termometro con led rgb
« Respuesta #6 en: 21 de Marzo de 2008, 22:46:55 »
He solucionado varios de mis problemas, ahora estoy usando un PIC12F675

este es el prog:

Código: [Seleccionar]
#include <12F675.h> 
#device  adc=10         // Resolución 10 BITS
#fuses INTRC_IO,NOWDT,NOPUT,NOPROTECT,NOCPD,NOMCLR
#use delay(clock=20000000) // Oscilador a 20 Mhz

#define LR pin_a4
#define LA pin_a5

float  adc=0x00;
float  grados=0;
float  anterior=0;
int8 R,A,T;

#INT_AD
void AD_isr()
{
      set_adc_channel(0);
      delay_ms(1);
      adc=Read_ADC(ADC_READ_ONLY);
      delay_ms(1);
      Read_ADC(ADC_START_ONLY);   //inicia nueva conversion.
 
}
 #int_Timer0
void ActivaLed() {
 T++;

   if (T==0) {
      output_high(LA);
      output_high(LR);
   };
   if (T==R)
          output_low(LR);
   if (T==A)
         output_low(LA);
   set_timer0(31);
}
void asigna(void){
if(grados != anterior){
   R = grados*2.5;
   A = 255-R;
   anterior = grados;
   }
}
void visualiza(void){
 disable_interrupts(int_ad); 
 grados = (float) ((adc * 5000) / 1023  );
 grados = grados /10;
 asigna();
 enable_interrupts(int_ad);
}

void main()
{
   T=0;
   R=0;
   A=0;
   set_tris_a( 0b11001111 ); // GP4, GP5 salidas
   output_high( PIN_A5 );
   setup_adc(ADC_CLOCK_INTERNAL);
   setup_adc_ports(AN0_ANALOG);
   setup_timer_0( RTCC_8_BIT|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(VREF_LOW|-2);


   enable_interrupts(int_ad);
   enable_interrupts(INT_TIMER0);
   enable_interrupts(global);
   Read_ADC(ADC_START_ONLY); // Inicia el CAD por int.
    do { 
    visualiza();
  } while (TRUE);
}

y adjunto la simulacion.

lo que noto q en la simulacion es muy lento el pestaneo de los leds no se si esto sera asi una vez montado en el pic, estoy usando un clock de 20Mhz, por favor si alguien me puede dar una mano, muchas gracias...
Zeoz" border="0


 

anything