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 FASESAhora 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)