Pages: [1]   Go Down
Author Topic: Como declarar global variable de fecha del RTC ??  (Read 582 times)
0 Members and 1 Guest are viewing this topic.
Spain
Offline Offline
God Member
*****
Karma: 25
Posts: 958
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hola

Tengo una funcion para manejo de la fecha con el DS1307 en el que manejo una variable llamada future (en el codigo que pongo podreis verla):
Code:
// ┌──────────────────────────────────────────────┐
// │  FUNCION Muestra Hora                                                           │
// └──────────────────────────────────────────────┘
void Muestra_hora(){
    Hora_Peninsular();
 
    // Hora real GMT sin los ajustes de +1 o +2 de invierno o verano
    DateTime now = RTC.now();     
   
    // Hora adelantada en funcion de verano o invierno
    DateTime future (now.unixtime() + 3600*adelanto);

    // Muestra la fecha en la columna superior
    lcd.setCursor(0,0);
    lcd.print("Fecha 00-00-0000");
   
    if (future.day() < 10){lcd.setCursor(7,0);} else {lcd.setCursor(6,0);}
    lcd.print(future.day(), DEC);

    if (future.month() < 10){lcd.setCursor(10,0);} else {lcd.setCursor(9,0);}
    lcd.print(future.month(), DEC);

    lcd.setCursor(12,0);
    lcd.print(future.year(), DEC);

    // Muestra la hora en columna inferior
    lcd.setCursor(0,1);
    lcd.print("Hora       00:00");
   
    if (future.hour() < 10){lcd.setCursor(12,1);} else {lcd.setCursor(11,1);}
    lcd.print(future.hour(), DEC);
   
    if (future.minute() < 10){lcd.setCursor(15,1);} else {lcd.setCursor(14,1);}
    lcd.print(future.minute(), DEC);

    delay(900);
    lcd.setCursor(13,1);
    lcd.print(' ');
    delay(100);
}

Esta variable es la que empleo para dejar el reloj del RTC a la hora GMT (UTC) y sumandole una hora mas o dos horas mas (como nos puso el codigo el compañero Curro92) mostrar o calcular funciones de horas.

El problema es que, por ejemplo, hago una llamada a "future.day()"  y al compilar me dice el ide del arduino esto:
   <<future was not declare in this scope>>

Por lo que entiendo que, si no la declaro global, no puede manejarla, y ese es el problema, no se como declarar "future" de forma global y accesible en el programa.

La llamada la hago asi:
Code:
Descompone(future.day());

Siendo descompone una funcion para separar unidades y decenas:
Code:
// ┌──────────────────────────────────────────────┐
// │  FUNCION Descompone a decenas y unidades                                        │
// └──────────────────────────────────────────────┘
void descompone (int valor){
    if(10 - val > 0){
    Unidad = val;
    Decena = 0;
    }
else if(20 - val > 0){
    Unidad = val - 10;
    Decena = 1;
    }
else if(30 - val > 0){
    Unidad = val - 20;
    Decena = 2;
    }
else if(40 - val > 0){
    Unidad = val - 30;
    Decena = 3;
    }
else if(50 - val > 0){
    Unidad = val - 40;
    Decena = 4;
    }
else if(60 - val > 0){
    Unidad = val - 50;
    Decena = 5;
    }
}   

El caso es que cuando llamo a la funcion asi para mostrarla en el lcd, no me da error:
Code:
// ┌──────────────────────────────────────────────┐
// │  FUNCION Muestra Hora                                                           │
// └──────────────────────────────────────────────┘
void Muestra_hora(){
    // Carga la hora nuestra
    Hora_Peninsular();

    // Muestra la fecha en la columna superior
    lcd.setCursor(0,0);
    lcd.print("Fecha 00-00-0000");
   
    if (future.day() < 10){lcd.setCursor(7,0);} else {lcd.setCursor(6,0);}
    lcd.print(future.day(), DEC);

Y aqui ya no se seguir... y solicito vuestra ayuda si es posible.

Un saludo
« Last Edit: August 16, 2011, 02:36:24 pm by Heke » Logged

CUIDADO !! MIS POST NO SON APTOS PARA MENORES. SI ERES MENOR DE 14 AÑOS DEBES DE LEERLOS ACOMPAÑADO DE UN ADULTO

Offline Offline
Edison Member
*
Karma: 23
Posts: 1375
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Haz que la función te devuelva future: DateTime Muestra_hora() y luego en el código return future; para guardarlo en una variable y poder usarlo.

Lo mejor es evitar siempre que sea posible las variables globales, porque ensucian mucho el código.
Logged

Mercadillo electrónico. Kit iniciación a Arduino, shield LCD a color y más cosas!

Spain
Offline Offline
God Member
*****
Karma: 25
Posts: 958
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Muchas Gracias Chiva

He intentado seguir tus indicaciones a lo que he declarado esta funcion para dejar todo en un sitio:
Code:
// ┌────────────────────────────────────────────────────────────────┐
// │  FUNCION Carga la hora con los ajustes de la hora peninsular                    │
// └────────────────────────────────────────────────────────────────┘
DateTime Carga_Hora(){ 
    // Hora real GMT sin los ajustes de +1 o +2 de invierno o verano
    DateTime now = RTC.now();   
 
    // Comprueba si es invierno o verano para adelantar 2 o 1 hora
    if(now.month() == 3 && now.day() > 24 && now.dayOfWeek() == 7)
    {
    if(adelanto == INVIERNO) adelanto = VERANO;
    }

    if(now.month() == 10 && now.day() > 24 && now.dayOfWeek() == 7)
    {
     if(adelanto == VERANO) adelanto = INVIERNO;
    }
 
    // Hora adelantada en funcion de verano o invierno
    DateTime future (now.unixtime() + 3600*adelanto);
 
    return future;
}

Pero ahora el compilador me manda a la cabecera y me dice esto:
'DateTime' does not name a type

Yo creo que me pide de nuevo que sea global, pero no lo entiendo, aqui ya me pierdo.
« Last Edit: August 16, 2011, 03:48:12 pm by Heke » Logged

CUIDADO !! MIS POST NO SON APTOS PARA MENORES. SI ERES MENOR DE 14 AÑOS DEBES DE LEERLOS ACOMPAÑADO DE UN ADULTO

Offline Offline
Edison Member
*
Karma: 23
Posts: 1375
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Pues ahí ya me pillas, como no sea problema de scope con los tipos de datos...
Logged

Mercadillo electrónico. Kit iniciación a Arduino, shield LCD a color y más cosas!

Spain
Offline Offline
God Member
*****
Karma: 25
Posts: 958
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Gracias Chiva, no te preocupes, intentare hacer otra programacion porque la verdad, no consigo saltar este "bache" ni lo entiendo.

Un saludo.
Logged

CUIDADO !! MIS POST NO SON APTOS PARA MENORES. SI ERES MENOR DE 14 AÑOS DEBES DE LEERLOS ACOMPAÑADO DE UN ADULTO

Pages: [1]   Go Up
Jump to: