Autor Tema: Refrigeración Acuario tropial. Ctrol temperatura  (Leído 4132 veces)

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

Desconectado freshdesing

  • Colaborador
  • PIC12
  • *****
  • Mensajes: 88
Refrigeración Acuario tropial. Ctrol temperatura
« en: 26 de Julio de 2007, 14:15:23 »
Aquí pongo mi primer programa en C para pic. Próximamente subiré los esquemáticos y las PCB.
Un saludo.

Si alguien ve que se puede mejorar algo,o hay algún fallo, bienvenida sea la critica.

Jose Antonio

Código: [Seleccionar]
//**************************************************
//*                                                *
//* Control de temperatura para acuario tropical   *
//*                                                *
//* mediante refrigeración con agua a 2ºC          *
//*                                                *
//* Por Jose Antonio                               *
//*                                                *
//* freshdesing (17/07/07)                         *
//*                                                *
//**************************************************


// DESCRIPCIÓN:

//    Consiste en un sistema para regular la temperatura de un acuario de agua
// tropical, queremos que en verano no sobrepaso los 28ºC. Mediante el PIC
// controlams que la temperatura este dentro de este rango, y cuando lo
// sobrepasa activamos una bomba de recirculación que hace circular el agua del
// acuario sobre una nevera con agua con hielo (aprox 2ºC). El sistema se
// cuando se llega a los 27ºC.
//    También dispone de un pulsador, mediante el cual podemos ver la
// temperatura de la habitación.
//    Mediante otro pulsador, podemos parar la bomba del filtro para que la
// comida no caiga tan rápido al fondo.

// FUNCIONES:
// captura: Captura el dato del adc del pic, según el canal que este
//    seleccionado
// representar: representamos las decenas,unidades y decimas en 3 displays de
//    7 segmentos.
// control_temp: Cada cierto tiempo vemos si hemos pasado los 28º para activar
//    la bomba de recirculación. Asi si hemos llegado a los 27º para
//    desactivarla.
// muestreo5seg: intervalo de 5 segundos para actualizar el valor adc y para
//    ver el valor de la temperatura.
// control_timer1: Interrupción el timer1, en el que controlamos tiempos.




  #include "16F876.h"

  #device adc=10  //ADC DE 10 BITS

  #fuses NOLVP,XT,NOWDT,NOPROTECT,PUT

  #use delay (clock=4000000)

  #use fast_io(A)

  #use fast_io(B)

  #use fast_io(C)

  #byte port_a = 0x05

  #byte port_b = 0x06

  #byte port_c = 0x07

  //#define ch_acuario 0;

  //#define ch_ambiente ;

  int decenas,unidades,decimas,contador=0,canal=0,cont_ch=0,flag_ch=0,flag_filtro=0; //variables globales

  float acuario=0,ambiente=0;

  int16 cont_filtro=0;

  setup_adc_ports (0x84); //RA3,RA1,RA0 Analog

  setup_adc(ADC_CLOCK_INTERNAL);




//Función que captura el valor del ADC y lo almacena en temperatura, y a su vez
//en unidades y decenas
void captura(void)
{
      double  lectura_adc;
     
     

      if(canal==0){

         set_adc_channel(0);  //seleccionamos canal AN0

         delay_ms(5);

         lectura_adc = read_adc(); //leemos el canal correspondiente

         acuario=lectura_adc*50.0/1023.0;

         decenas=(int) acuario/10;

         unidades=(int) acuario-(decenas*10);
         
         decimas=(int) (acuario*10-(decenas*100+unidades*10));
      }

      if(canal==1){

         set_adc_channel(1);  //seleccionamos canal AN1

         delay_ms(5);

         lectura_adc = read_adc(); //leemos el canal correspondiente

         ambiente=lectura_adc*50.0/1023.0;

         decenas=(int) ambiente/10;

         unidades=(int) ambiente-(decenas*10);
         
         decimas=(int) (ambiente*10-(decenas*100+unidades*10));
      }
}






//Función que refresca los displays y lo saca en BCD
void representar(void)
{

   output_bit(PIN_C0,Bit_test(decimas,0));
   output_bit(PIN_C1,Bit_test(decimas,1));
   output_bit(PIN_C2,Bit_test(decimas,2));
   output_bit(PIN_C3,Bit_test(decimas,3));
   output_bit(PIN_C4,0);//activamos el led correspondiente de decenas
   delay_ms(7);
   output_bit(PIN_C4,1);//desactivamos el led correspondiente de unidades

   output_bit(PIN_C0,Bit_test(unidades,0));
   output_bit(PIN_C1,Bit_test(unidades,1));
   output_bit(PIN_C2,Bit_test(unidades,2));
   output_bit(PIN_C3,Bit_test(unidades,3));
   output_bit(PIN_C5,0);//activamos el led correspondiente de decenas
   delay_ms(7);
   output_bit(PIN_C5,1);//desactivamos el led correspondiente de unidades


   output_bit(PIN_C0,Bit_test(decenas,0));
   output_bit(PIN_C1,Bit_test(decenas,1));
   output_bit(PIN_C2,Bit_test(decenas,2));
   output_bit(PIN_C3,Bit_test(decenas,3));
   output_bit(PIN_C6,0);//activamos el led correspondiente de decenas
   delay_ms(7);
   output_bit(PIN_C6,1);//desactivamos el led correspondiente de decenas

}



//Subrutina de control de temperatura
void control_temp(void)
{
   if(acuario>=28){
      output_bit(PIN_B2,1);//si superamos 28º activamos al bomba
   }                        //Activa en alta. Rele NA.
   if(acuario<=27){
      output_bit(PIN_B2,0);//si bajamos de 27º desactivamos al bomba
   }                        //Activa en alta. Rele NA.
}





//Subrutina de muestreo cada 5 segundos

void muestreo5seg(void)
{//************poner cada 5 seungdos o cada 30 segundos

      captura(); //capturamos adc
      if(canal==0){control_temp();}//vemos como esta la temperatura
      contador=0;

}




//Subrutina de interrución del TMR1
#INT_TIMER1
control_timer1()
{
      output_bit(pin_b1,!input(pin_b1)); //Parpadeo de Led Status

      contador++;


      if((cont_filtro==10) && (flag_filtro==1))
         {
         output_bit(pin_b3,0);

         flag_filtro=0;
         }
      else
         {
         cont_filtro++;
         }


      if((cont_ch==10) && (flag_ch==1))
         {
         canal=0;//ponemso el canal0

         flag_ch=0;
         }
      else
         {
         cont_ch++;
         }



}



void main(void)
{
   disable_interrupts(GLOBAL);
   set_tris_a(0xFF);       // RA0,RA1 y RA3 como entradas analogicas
                           // RA0--> TEMPERATURA ACUARIO
                           // RA1--> TEMPERATURA AMBIENTE

   port_b_pullups(false);   // Resistencias de polarización del puerto B

   set_tris_b(0xF1);       // RB7:4, RB0 ENTRADAS, RB3:1 SALIDAS
                           // RB7--> SELECCIONAR Tª ACUARIO/Tª AMBIENTE
                           // RB6--> PARA FILTRO DURANTE 5 MINUTOS
                           //        Activo en alta y NC
                           // RB5-->
                           // RB2--> SALIDA BOMBA
                           // RB1--> STATUS



   set_tris_c(0x00);       // Puerto C entero como salida para display
                           // RC0:3--> A0:A3 salida BCD para displays
                           // RC4--> Control display Unidades
                           // RC5--> Control display Decenas


   setup_adc_ports(AN0_AN1_AN3);
   setup_adc(ADC_CLOCK_INTERNAL);
   setup_timer_1(T1_INTERNAL|T1_DIV_BY_8);
   enable_interrupts(INT_TIMER1);
   //enable_interrupts(INT_RB);
   enable_interrupts(GLOBAL);



   output_bit(PIN_C4,1);//desactivamos led decimas
   output_bit(PIN_C5,1);//desactivamos led unidades
   output_bit(PIN_C6,1);//desactivamos led decenas
   contador=0;
   output_bit(PIN_B2,0);//Bomba apagada
   output_bit(PIN_B3,0);//Bomba apagada

      while(1) {

         if(!input(pin_b7))
         {
            canal=1;
            cont_ch=0;
            flag_ch=1;
         }

         if(!input(pin_b6))
         {
            output_bit(pin_b3,1);//paramos el filtro durante 10 minutos
            flag_filtro=1;
            cont_filtro=0;
         }

         //Capturamos los datos en la interrupción del timer1
         representar();

         if(contador==5){muestreo5seg();}

      } // fin while


}

Desconectado vszener

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2395
Re: Refrigeración Acuario tropial. Ctrol temperatura
« Respuesta #1 en: 26 de Julio de 2007, 16:52:15 »
Buenas!!! Gracias por el aporte, sólo una cuestión, la configuración de los pines y periféricos del pic, deben ir en el main, me refiero a estas dos sentencias:

Código: C
  1. setup_adc_ports (0x84); //RA3,RA1,RA0 Analog
  2. setup_adc(ADC_CLOCK_INTERNAL);


Suerte!!! ;)
· Nos vemos en los bares!!!!!
· Mi Blog: Aqueronte

Desconectado Azicuetano

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1020
    • Aplicaciones Electrónicas en Alicante.
Re: Refrigeración Acuario tropial. Ctrol temperatura
« Respuesta #2 en: 27 de Julio de 2007, 03:40:01 »
Muy buen proyecto freshdesing!

Yo le añadiría el WDT y una alarma, por si la temperatura aumenta demasiado a causa de un fallo, que no esté encendida la bomba 1 mes  :D

También te recomiendo una prueba que te dará muchísima información. Haz una modificación en el programa para que te active y desactive la bomba cada segundo (más o menos) así podrás ver la eficiencia de tu circuito impreso. Si se tira 8 o 9 horas funcionando bien... te quedarás mucho más tranquilo sabiendo que a tus pececitos no se les van a congelar las aletas  :mrgreen:


Un saludo desde Alicante.


Desconectado freshdesing

  • Colaborador
  • PIC12
  • *****
  • Mensajes: 88
Re: Refrigeración Acuario tropial. Ctrol temperatura
« Respuesta #3 en: 27 de Julio de 2007, 06:13:18 »
Gracias por las sugerencias. La configuración del ADC la tenía duplicada.  :?

Azicuetano ahora mismo estoy con el eagle haciendo la pcb, en cuanto la termine la probaré un rato. Pero lo malo de esto es que hay que ir a ponerle hielo a la nevera de vez en cuando  :( Pero lo testearé.



Una dudal. Tal y como está el programa, si activo las interrupciones RB, se quede colgado aún sin poner nada en la llamada a la interrupción de RB:

Código: [Seleccionar]
//Subrutina de interrución RB7:4
#INT_RB
void control_RB(void)
{

      //output_bit(pin_b3,!input(pin_b3));

  // if(input(pin_b7==0)){

  //    canal=1;//ponemos el canal uno durante 30 segundos

  //    cont_ch=0;//inicializamos el contador

  //    flag_ch=1;//activamos el flag
  // }

 //  if(input(pin_b6==0)){

 //     output_bit(pin_b3,1);//paramos el filtro durante 10 minutos

 //     cont_filtro=0;
 // }

}

Con esto así que solo entre y salga sin hacer nada, y activando "enable_interrupts(INT_RB);" se qeuda colgado... a por eso puse lo de comprobar las patitas en el while(1).

Azicuetano, sobre el WDT, cuando compilo, ¿el solo se encarga de refrescarlo de vez en cuando, no? Es que como no lo sabía lo ponía quitado...

Bueno gracias.

Desconectado Azicuetano

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1020
    • Aplicaciones Electrónicas en Alicante.
Re: Refrigeración Acuario tropial. Ctrol temperatura
« Respuesta #4 en: 30 de Julio de 2007, 03:27:41 »
Hola freshdesing!

En primer lugar tendrias que activar el fuse correspondiente (WDT->Watch Dog Timer).

Código: [Seleccionar]
#fuses NOLVP,XT,WDT,NOPROTECT,PUT,BROWNOUT
Puedes mirar este post en el que aparece como el colega DarkVect le pone el WDT a un programa que ya tenia acabado. Si te lias o algo avisa y te lo explico yo.

http://www.todopic.com.ar/foros/index.php?topic=16135.0

Otra cosa, lo que comentas de la interrupción es un tanto extraño, tendría que mirarlo con detenimiento, pero... así a bote pronto veo que pones:

Código: [Seleccionar]
if(input(pin_b7==0))
Y sería:

Código: [Seleccionar]
if(input(pin_b7)==0)
No creo que sea por eso, puesto que, dices que aunque la rutina de interrupción la tengas sin nada se cuelga, pero bueno, eso se haría así.

Ya nos comentas!


Un saludo desde Alicante.

Desconectado freshdesing

  • Colaborador
  • PIC12
  • *****
  • Mensajes: 88
Re: Refrigeración Acuario tropial. Ctrol temperatura
« Respuesta #5 en: 30 de Julio de 2007, 05:52:54 »
Lo he estado mirando... y es verdad que estaba mal. Ahora la he puesto así y funciona perfectamente:
Código: [Seleccionar]
#INT_RB

void interrup_RB(void)
{
   if(!input(pin_b7))
      {
      canal=1;
      cont_ch=0;
      flag_ch=1;
      }

   if(!input(pin_b6))
      {
      output_bit(pin_b3,1);//paramos el filtro durante 10 minutos
      flag_filtro=1;
      cont_filtro=0;
      }

}

Gracias.
Voy a mirar lo del WDT que si que es importante.

Desconectado freshdesing

  • Colaborador
  • PIC12
  • *****
  • Mensajes: 88
Añadido esquemático
« Respuesta #6 en: 30 de Julio de 2007, 11:34:48 »
Adjunto esquemático, a falta de ponerle una alarma como sugirió Azicuetano.

Próximamente adjunto el PCB y esquemático en eagle.
Si alguien ve algún error o alguna mejora...

un saludo.
« Última modificación: 30 de Julio de 2007, 11:47:51 por freshdesing »

Desconectado Azicuetano

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1020
    • Aplicaciones Electrónicas en Alicante.
Re: Refrigeración Acuario tropial. Ctrol temperatura
« Respuesta #7 en: 30 de Julio de 2007, 17:49:41 »
Hola freshdesing!

Me gusta tú diseño, se te ha quedado muy bien!

Yo soy muy gandul y... en lugar de utilizar 7 pines del PIC para los displays de 7 segmentos, lo que hubiera hecho es (puesto que te sobran) utilizar 10 pines y ahorrarme el 74LS47N y el 74AC14N. De todas formas, siempre es muy importante ahorrar pines y con tú diseño los ahorras, osea que, lo tuyo está muy bien.

Es bien sabido que... basta que acabes tú diseño para que 3 o 4 colegas te pidan otro cacharro para sus peceras. Una buena forma de ahorrar pasta en futuros diseños es utilizar el PIC16F913.

PIC16F876 -> 3.40 $
PIC16F913 -> 1.68 $

Además, este tiene oscilador interno (puedes ahcer que trabaje a 8 Mhz y sin cristal!!!) jejej esto es una maravilla. Así ya no tienes que agujerear ni soldar el cristal ni los condensadores  :D :D pero que gandul que soy!!

Sólo decirte que tengas cuidado a la hora de rutear tu placa. Los relés conmutan cargas de 220V y eso te puede meter un ruido que no veas. Mi recomendación es que no pongas el plano de masa cerca de los relés. Mira esta imágen, aquí se ve mejor la idea que quiero transmitir:

http://www.todopic.com.ar/foros/index.php?topic=16783.msg124983#msg124983

En la esquina inferior izquierda se ven los relés y fíjate como el plano de masa lo tengo alejado de los mismos. Si se te ocure ponerlo debajo o... rutear alguna pista por debajo de los relés te aseguro que tu PIC hará unas paranoias asombrosas cada vez que conmutes los relés  :D

Bueno, ya sólo queda darte las gracias por compartir el proyecto con la familia TODOPIC. Seguro que más de uno aprenderá un montón (yo incluido).


Un saludo desde Alicante!!

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: Refrigeración Acuario tropial. Ctrol temperatura
« Respuesta #8 en: 31 de Julio de 2007, 08:45:34 »
Efectivamente como dice Azicuetano te ahorrarías bastante si enganchas directamente los displays de 7 segmentos al PIC.
Si te sirve de algo, hace unos días colgué un artículo sobre este tema en mi página, con una librería y ejemplo de uso en 16F876 para manejar hasta 4 displays de 7 segmentos.
Si quieres verlo, está en: Jugando con displays de 7 segmentos

Desconectado Lorenzo

  • PIC16
  • ***
  • Mensajes: 110
Re: Refrigeración Acuario tropial. Ctrol temperatura
« Respuesta #9 en: 07 de Agosto de 2007, 14:44:28 »
Hola, me gustaría que me indicaras cómo vas a tomar la temperatura del agua. ¿Cómo vas a hacer el contacto con el agua?
Gracias y saludos.

Desconectado freshdesing

  • Colaborador
  • PIC12
  • *****
  • Mensajes: 88
Re: Refrigeración Acuario tropial. Ctrol temperatura
« Respuesta #10 en: 03 de Septiembre de 2007, 11:43:41 »
Siento el abandono del proyecto... pero ya estoy de vuelta, y compaginadolo con el trabajo seguiré con él.

Y tendré en cuenta todas las sugerencias aportadas, que me parecen muy interesantes.

Un saludo.