Autor Tema: Lampara de acuario con 5 cnales de LEDs para el dia y un canal para la noche  (Leído 2441 veces)

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

Desconectado Arkaedus

  • PIC10
  • *
  • Mensajes: 25
Hola a todos pues estoy haciendo este proyectito ara un acuariete que tengo pequeñito de 80 litros. El proyecto esta realizado en PIC CCS Compiler y en Proteus 7.7 SP2

De momento ya tengo el programador y el sensor de temperatura que controla los ventiladores y los enciendo al sobrepasar un umbral de temperatura.

Ahora necesito un poco de ayuda e iluminación en la programacion de los 5 canales diarios, os voy a exponer lo que quiero hacer:


//CONEXIONES DEL ENCENDIDO/////////////////////////////////////////////////////////

Usaré 6 pines del puerto D del D0 al D5 para encender los LEDs.

#define   PIN_ENCENDIDO   PIN_D0
#define   PIN_FASE_1      PIN_D1
#define   PIN_FASE_2      PIN_D2
#define   PIN_FASE_3      PIN_D3
#define   PIN_FASE_4      PIN_D4
#define   PIN_FASE_5      PIN_D5

El primero de ellos, PIN_ENCENDIDO, corresponde al canal de noche el resto sólo se encenderán durante el dia

La cuestión es que tengo que hacer que esto funciones mientras funciona el programador y según las horas y minutos que se programen.


Aqui pongo un ejemplo de ubna programacion pero si se programan menos horas las zonas horarias deben acoplarse a las horas que se pongan en el programador.

IMAGEN DE COMO DEBERIAN ENCENDERSE LAS FASES

Ahora lo que quiero hacer es que se encienda tal y como  explico, más adelante quizás meta unos PWM que es lo que signica el escalon rojo de los extremos del dia y de la noche

Esta es la función que controla el encendido:



//CONTROL ENCENDIDO///////////////////////////////////////////////////////////////////////////////
void actualiza_encendido()
{
   //Tiempo actual >= tiempo de inicio?
   if (comp_tiempos(hora, min, config_hora_inicio[dia_sem], config_minuto_inicio[dia_sem]))
   {
      //Tiempo fin > Tiempo actual? -> !(Tiempo actual >= tiempo fin)?
      if (!(comp_tiempos(hora, min, config_hora_fin[dia_sem], config_minuto_fin[dia_sem])))
      {
         output_low(PIN_ENCENDIDO);

        //Aqui supongo que va el codigo para encender los diferentes pines del dia que son del D1 al D5

         return;
      }
   }  
   output_high(PIN_ENCENDIDO);
}
//-----------------------------------------------------------------------------

De momento solo se eniende o apaga el pin de noche


Esto es la pantalla que en el LCD se introducen los datos para lo programación de encendio, cada dia de la semana tiene una programacion horaria distinta guardada en su memoria EEPROM

//-------------------------            
            

         //PANTALLA DE CONFIGURACION
         case 1:    
        
    
            switch (config_cursor_actual)
            {
               //CURSOR EN DIA DE LA SEMANA            
               case 0:
                  if (puls_up_fs && comprobar_datos_config())
                  {
                     if (++config_dia_actual == 7) config_dia_actual = 0;
                  }
                  if (puls_down_fs && comprobar_datos_config())
                  {
                     if (--config_dia_actual == -1) config_dia_actual = 6;                    
                  }
               //-------------------------                  
                  break;                  
                
               //CURSOR EN DECENAS HORA INICIO                  
               case 1:
                  if (puls_up_fs)
                  {
                     inc_2bcd(&config_hora_inicio[config_dia_actual],
                              LIMIT_HORAS_INC, 1);
                  }
                  if (puls_down_fs)
                  {
                     dec_2bcd(&config_hora_inicio[config_dia_actual],
                              LIMIT_HORAS_DEC, 1);
                  }
               //-------------------------
                  break;
                  
               //CURSOR EN UNIDADES HORA INICIO              
               case 2:    
                  if (puls_up_fs)
                  {
                     inc_2bcd(&config_hora_inicio[config_dia_actual],
                              LIMIT_HORAS_INC, 0);
                  }
                  if (puls_down_fs)
                  {
                     dec_2bcd(&config_hora_inicio[config_dia_actual],
                              LIMIT_HORAS_DEC, 0);
                  }              
               //-------------------------
                  break;
                  
               //CURSOR EN DECENAS MINUTOS INICIO                  
               case 3:
                  if (puls_up_fs){
                     if (inc_2bcd(&config_minuto_inicio[config_dia_actual],
                                  LIMIT_MINS_INC, 1))
                     {
                        inc_2bcd(&config_hora_inicio[config_dia_actual],
                                 LIMIT_HORAS_INC, 0);
                     }
                  }
                  if (puls_down_fs){
                     if (dec_2bcd(&config_minuto_inicio[config_dia_actual],
                                  LIMIT_MINS_DEC, 1))
                     {
                        dec_2bcd(&config_hora_inicio[config_dia_actual],
                                 LIMIT_HORAS_DEC, 0);
                     }
                  }
               //-------------------------
                  break;
                  
               //CURSOR EN UNIDADES MINUTOS INICIO                  
               case 4:
                  if (puls_up_fs){
                     if (inc_2bcd(&config_minuto_inicio[config_dia_actual],
                                  LIMIT_MINS_INC, 0))
                     {
                        inc_2bcd(&config_hora_inicio[config_dia_actual],
                                 LIMIT_HORAS_INC, 0);
                     }
                  }
                  if (puls_down_fs){
                     if (dec_2bcd(&config_minuto_inicio[config_dia_actual],
                                  LIMIT_MINS_DEC, 0))
                     {
                        dec_2bcd(&config_hora_inicio[config_dia_actual],
                                 LIMIT_HORAS_DEC, 0);
                     }
                  }        
               //-------------------------
                  break;
              
            
            
             //CURSOR EN DECENAS HORA FIN                
               case 5:
                  if (puls_up_fs)
                  {
                     inc_2bcd(&config_hora_fin[config_dia_actual],
                              LIMIT_HORAS_INC, 1);
                  }
                  if (puls_down_fs)
                  {
                     dec_2bcd(&config_hora_fin[config_dia_actual],
                              LIMIT_HORAS_DEC, 1);
                  }
               //-------------------------
                  break;
                  
               //CURSOR EN UNIDADES HORA FIN              
               case 6:    
                  if (puls_up_fs)
                  {
                     inc_2bcd(&config_hora_fin[config_dia_actual],
                              LIMIT_HORAS_INC, 0);
                  }
                  if (puls_down_fs)
                  {
                     dec_2bcd(&config_hora_fin[config_dia_actual],
                              LIMIT_HORAS_DEC, 0);
                  }              
               //-------------------------
                  break;
                  
               //CURSOR EN DECENAS MINUTOS FIN                  
               case 7:
                  if (puls_up_fs){
                     if (inc_2bcd(&config_minuto_fin[config_dia_actual],
                                  LIMIT_MINS_INC, 1))
                     {
                        inc_2bcd(&config_hora_fin[config_dia_actual],
                                 LIMIT_HORAS_INC, 0);
                     }
                  }
                  if (puls_down_fs){
                     if (dec_2bcd(&config_minuto_fin[config_dia_actual],
                                  LIMIT_MINS_DEC, 1))
                     {
                        dec_2bcd(&config_hora_fin[config_dia_actual],
                                 LIMIT_HORAS_DEC, 0);
                     }
                  }
               //-------------------------
                  break;
                  
               //CURSOR EN UNIDADES MINUTOS FIN                  
               case 8:
                  if (puls_up_fs){
                     if (inc_2bcd(&config_minuto_fin[config_dia_actual],
                                  LIMIT_MINS_INC, 0))
                     {
                        inc_2bcd(&config_hora_fin[config_dia_actual],
                                 LIMIT_HORAS_INC, 0);
                     }
                  }
                  if (puls_down_fs){
                     if (dec_2bcd(&config_minuto_fin[config_dia_actual],
                                  LIMIT_MINS_DEC, 0))
                     {
                        dec_2bcd(&config_hora_fin[config_dia_actual],
                                 LIMIT_HORAS_DEC, 0);
                     }
                  }        
               //-------------------------
                  break;
            

            }
            
            if (puls_right_fs)
            {
               //Mover Cursor a la derecha y dar la vuelta
               //if (++config_cursor_actual == 9) config_cursor_actual = 0;

               //Volver a pantalla de info si se sale por la derecha
               //config_cursor_actual = 0;
               //pantalla_actual = 0;      
              
               //Mover Cursor a la derecha
               if (++config_cursor_actual == 9)
               {
                  //Volver a pantalla de info si se sale por la derecha
                  if (comprobar_datos_config())
                  {
                     pantalla_actual = 0;
                     config_cursor_actual = 0;
                     actualizar_pantalla();
                     guardar_eeprom();
                  }
                  else  config_cursor_actual = 8;
                    
               }
            }
            
            if (puls_left_fs)
            {
               //Mover Cursor a la izquierda y dar la vuelta
               //if (--config_cursor_actual == -1) config_cursor_actual = 8;
              
               //Volver a pantalla de info si se sale por la izquierda
               //config_cursor_actual = 0;
               //pantalla_actual = 0;
            
               //Mover Cursor a la izquierda
               if (--config_cursor_actual == -1)
               {
                  //Volver a pantalla de info si se sale por la izquierda
                  if (comprobar_datos_config())
                  {
                     pantalla_actual = 0;
                     actualizar_pantalla();
                     guardar_eeprom();
                  }
                  config_cursor_actual = 0;
               }
            }
            
            if (pantalla_actual != 0 && (puls_right_fs || puls_left_fs))
            {
               actualizar_cursor_pantalla();  
            }    
            
//-------------------------  


Los datos de las horas y minutos tanto de inicio como de fin son en BCD y ahi esta la cuestión.

Debo pasarlo a enteros para poder trabajar con ellos y luego convertirlos de nuevo a BCD para programar el encendido de las diferentes fases diarias?

Aquí es donde estoy perdido y necesito ayuda he intentado hacerlo pero no he logrado nada.


Un saludo



PD: Adjunto los archivos del proyecto en una carpeta .rar (Incluidos el codigo C, hex y el diseño de proteus)
« Última modificación: 14 de Junio de 2015, 06:14:03 por Arkaedus »

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Lampara de acuario con 5 cnales de LEDs para el dia y un canal para la noche
« Respuesta #1 en: 14 de Junio de 2015, 16:37:17 »
No entiendo como pensas tener la hora, lo cual necesitarias de un RTC con bateria como minimo. Sino apenas un pequeño corte de luz y tu horario fallaria o tendrias que cargarlo nuevamente.

Por otra parte el PIC es confiable para seguirle el ritmo a un horario (si es que usas un timer para eso y un buen cristal). usando un cristal de 32.768Hz en uno de los timers. Que creo que seria lo correcto para esa aplicacion y no usar el interno u el otro cristal como referencia de tiempo que dificulta conseguir un punto exacto. Dependiendo del PIC que sea podes usar el modulo CCP y que te genere una interrupcion cada segundo asi aumentas el valor del segundero y calculas todo lo demas, todo eso en formato entero. Pero no vas a poder mantener el horario ya que no posee bateria.

Si lo mostras en el LCD ahi si lo pasas a BCD para mostrarlo.o con CCS tenes el printf si usas su libreria de LCD. Asi ni siquiera te molestas haciendo el codigo de BCD/entero

Ojo con guardar continuamente en la EEPROM, ya que tenes un limite de escrituras.

Eso es lo que yo haria si tuviera que manejarme con tiempos. Luego de ahi es comparar y activar o no las salidas.



Por un momento crei que preguntabas como pasar de BCD a entero y viceversa, asi que lo dejo por las dudas.
--------------------------

Queres pasar un horario en BCD a entero ?

Entero es el registro a almacenar
Decena, valor de la decena de hora,minuto,segundo,etc
Unidad, valor de la unidad de hora,minuto,segundo,etc

Entero = Decimal*10 + Unidad;

Para pasarlo a BCD nuevamente

Decena = Entero/10;
Unidad = Entero - (10*Decena);
o
Unidad = Entero % 10;  //Resto al dividirlo por 10.


Desconectado Arkaedus

  • PIC10
  • *
  • Mensajes: 25
Re: Lampara de acuario con 5 cnales de LEDs para el dia y un canal para la noche
« Respuesta #2 en: 17 de Junio de 2015, 14:37:01 »
Lo que quiero hacer es encender diferentes pines segun la hoa que se haya programado por ejemplo si programo de 10:00 a 22:00, con lo que el ciclod e encendio de luces es de 12 horas

que a las 10:00 se encienda el pin 1 (por ejemplo D1 del pic) y este debe estar encendido durante 1 hora (1/12 parte del tiempo de luces encendido)

pero por ejemplo si programo que se encienda a las 10:00 y se apague a las 18:00, el ciclo de luces seria de 8 horas.

con lo que el pin 1 (D1) deberia estar encendido 40 minutos (que equivale a 1/12 parte de las horas programadas)



Eso es a lo que em refería que no sé como hacerlo.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Lampara de acuario con 5 cnales de LEDs para el dia y un canal para la noche
« Respuesta #3 en: 17 de Junio de 2015, 18:39:06 »
Justamente a eso me referia... necesitas un RTC , o externo o crearlo con el PIC. Ya comente cuales son los problemas de crear un RTC con el PIC.

Caso de hacerlo interno con un timer:

Cada segundo deberias tener una interrupcion ( o tal ves menos ) y ahi comparas con los valores de hora,minuto y segundos.

Caso de hacerlo con RTC externo:

Aca tenes 2 formas, si son pocos horarios podes utilizar la alarma que vienen en los RTC, estos te avisan por un pin cuando se llego a la hora programada.
La otra es preguntar a cada rato la hora o cada tanto y asi activar las salidas.


Por si no quedo muy claro, lo que se busca es tener una base de tiempos.

Desconectado juaperser1

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 2980
Re: Lampara de acuario con 5 cnales de LEDs para el dia y un canal para la noche
« Respuesta #4 en: 17 de Junio de 2015, 18:46:52 »
Hola arkaedus, que micro quieres utilizar? hay microcontroladores de PIC que tienen un RTC interno y solo deberas poner el cristal de 32,768KHz.

lo digo por si no quieres poner un integrado mas, para llevar una cuenta de tiempos grandes minutos, horas, dias..., vas a tener que poner un RTC si o si
un saludo

Desconectado Arkaedus

  • PIC10
  • *
  • Mensajes: 25
Re: Lampara de acuario con 5 cnales de LEDs para el dia y un canal para la noche
« Respuesta #5 en: 17 de Junio de 2015, 19:12:32 »
Tengo algo hecho pero como peudo poner imagenes para enseñarlo?

La cuestión es que lño que he hecho tengo un pequeño, quizas gran problema y enecsito ayuda pero queiro ponerlo en imagenes que se peudan ver a simple vista en un mensaje como este. Y compartiria el codigo y el archivo para simular en proteus

Desconectado juaperser1

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 2980
Re: Lampara de acuario con 5 cnales de LEDs para el dia y un canal para la noche
« Respuesta #6 en: 17 de Junio de 2015, 19:16:50 »
Cuando escribes un mensaje abajo del recuadro de escritura tienes "opciones adicionales" hay puedes seleccionar un archivo para subirlo.

Un saludo.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Lampara de acuario con 5 cnales de LEDs para el dia y un canal para la noche
« Respuesta #7 en: 17 de Junio de 2015, 20:24:33 »
Casi siempre el TMR1 admite un cristal de 32k, pero ante un corte de luz va a estar programando a cada rato la hora.