[SOLUCIONADO] Poner codigo en funcion y bucle

Ahora soy yo el que tiene un problema.
Tengo este código que corresponde a un Reloj de números grandes con LCD 20x4 y funciona correctamente. Es este:

//**************************************************************************************************
//                                 BIG FONT (4-line) LCD CHARACTERS 
//                                   Adrian Jones, February 2015
//
//**************************************************************************************************

// Build 1
//   r1 150214 - initial build with glyphs and big font character table in program memory
//   r2 150227 - added RTC support
//********************************************************************************************
#define build 1
#define revision 2
//********************************************************************************************

#include <avr/pgmspace.h>           
#include <Wire.h> 
#include <LCD.h>                    
#include <LiquidCrystal_I2C.h>      

#define I2C_ADDR  0x27              
#define RS_pin    0                
#define RW_pin    1
#define EN_pin    2
#define BACK_pin  3
#define D4_pin    4
#define D5_pin    5
#define D6_pin    6
#define D7_pin    7

LiquidCrystal_I2C lcd(I2C_ADDR, EN_pin, RW_pin, RS_pin, D4_pin, D5_pin, D6_pin, D7_pin, BACK_pin, POSITIVE);
//Pins for the LCD are SCL A5, SDA A4

const char custom[][8] PROGMEM = {
     {0x00, 0x00, 0x00, 0x00, 0x01, 0x07, 0x0F, 0x1F},      // char 1: bottom right triangle
     {0x00, 0x00, 0x00, 0x00, 0x1F, 0x1F, 0x1F, 0x1F},      // char 2: bottom block
     {0x00, 0x00, 0x00, 0x00, 0x10, 0x1C, 0x1E, 0x1F},      // char 3: bottom left triangle
     {0x1F, 0x0F, 0x07, 0x01, 0x00, 0x00, 0x00, 0x00},      // char 4: top right triangle
     {0x1F, 0x1E, 0x1C, 0x10, 0x00, 0x00, 0x00, 0x00},      // char 5: top left triangle
     {0x1F, 0x1F, 0x1F, 0x1F, 0x00, 0x00, 0x00, 0x00},      // char 6: upper block
     {0x1F, 0x1F, 0x1E, 0x1C, 0x18, 0x18, 0x10, 0x10}       // char 7: full top right triangle
                                                            // room for another one!
};
 
const char bn[][30] PROGMEM = {                             // organized by row
//         0               1               2               3               4              5               6                7               8               9
    {0x01,0x02,0x03, 0x01,0x02,0xFE, 0x01,0x02,0x03, 0x01,0x02,0x03, 0x02,0xFE,0x02, 0x02,0x02,0x02, 0x01,0x02,0x03, 0x02,0x02,0x02, 0x01,0x02,0x03, 0x01,0x02,0x03},
    {0xFF,0xFE,0xFF, 0xFE,0xFF,0xFE, 0x01,0x02,0xFF, 0xFE,0x02,0xFF, 0xFF,0x02,0xFF, 0xFF,0x02,0x02, 0xFF,0x02,0x03, 0xFE,0x01,0x07, 0xFF,0x02,0xFF, 0xFF,0xFE,0xFF},
    {0xFF,0xFE,0xFF, 0xFE,0xFF,0xFE, 0xFF,0xFE,0xFE, 0xFE,0xFE,0xFF, 0xFE,0xFE,0xFF, 0xFE,0xFE,0xFF, 0xFF,0xFE,0xFF, 0xFE,0xFF,0xFE, 0xFF,0xFE,0xFF, 0x04,0x06,0xFF},
    {0x04,0x06,0x05, 0xFE,0x06,0xFE, 0x06,0x06,0x06, 0x04,0x06,0x05, 0xFE,0xFE,0x06, 0x04,0x06,0x05, 0x04,0x06,0x05, 0xFE,0x06,0xFE, 0x04,0x06,0x05, 0xFE,0xFE,0x06}
};

byte col,row,nb=0,bc=0;                                 
byte bb[8];                                              

#include <Wire.h>
#include <Time.h>
#include <DS1307RTC.h> 

byte hr, mn, se, osec;


tmElements_t t, t_set; 
time_t tt;       


void setup() {
      RTC.read(t); 
      lcd.begin(20, 4);
      for (nb=0; nb<7; nb++ ) {                     // create 8 custom characters
      for (bc=0; bc<8; bc++) bb[bc]= pgm_read_byte( &custom[nb][bc] );
      lcd.createChar ( nb+1, bb );
  }
  lcd.clear();
      setTime(t.Hour, t.Minute, t.Second, t.Day, t.Month, t.Year+1970);
      lcd.setCursor(4, 0); 
      lcd.print(F("4-Line LARGE")); 
      lcd.setCursor(4, 1); 
      lcd.print(F("TIME DISPLAY")); 
      lcd.setCursor(5, 3); 
      lcd.print(F("V")); 
      lcd.print(build); 
      lcd.print(F(".")); 
      lcd.print(revision);
      lcd.print(F(" "));  
      lcd.print(freeRam()); 
      lcd.print(F("B"));
      printNum(random(0,10),0);
      printNum(random(0,10),17);
      delay(1000);
      lcd.clear();
 }
 
void loop() {

      hr = hour();
      mn = minute();
      se = second();
      if(se != osec) {
      printNum(hr/10,0);
      printNum(hr%10,3);
      printColon(6);
      printNum(mn/10,7);
      printNum(mn%10,10);
      printColon(13);
      printNum(se/10,14);
      printNum(se%10,17);
      osec = se;
     }
    delay(50);                
}


void printNum(byte digit, byte leftAdjust) {
       for(row=0; row<4; row++) {
       lcd.setCursor(leftAdjust,row);               
       for(col=digit*3; col <digit*3+3; col++) {
       lcd.write(pgm_read_byte( &bn[row][col]) );
     }
   }
}

void printColon(byte leftAdjust) {
      for(row=0; row<4; row++) {
      lcd.setCursor(leftAdjust,row);               
      if(row == 1 || row == 2) lcd.print(F(".")); else lcd.print(F(" "));
  }
}


int freeRam(void) {
      extern int  __bss_end, *__brkval; 
      int free_memory; 
      if((int)__brkval == 0) {
      free_memory = ((int)&free_memory) - ((int)&__bss_end); 
   } 
      else {
      free_memory = ((int)&free_memory) - ((int)__brkval); 
   }
      return free_memory; 
}

y mi intención poner esta parte del código;

      hr = hour();
      mn = minute();
      se = second();
      if(se != osec) {
      printNum(hr/10,0);
      printNum(hr%10,3);
      printColon(6);
      printNum(mn/10,7);
      printNum(mn%10,10);
      printColon(13);
      printNum(se/10,14);
      printNum(se%10,17);
      osec = se;

que está en loop y ponerlo en una función que luego se le llamaría en otra parte del programa. El problema que al llamarla no refresca los segundos del reloj (bueno el reloj en sí, solo muestra la primera vez). He leído y probado con un do…while pero tampoco funciona.

Crieis que hay alguna forma de hacerlo?
A ver si tengo suerte que llevo 3 días dejándome la vista sin parar…
Saludos :slight_smile:

Después de pegar palos de ciego durante 4 días (con sus noches incluidas, :slight_smile: :slight_smile: :slight_smile: )lo he solucionado
Como tampoco necesitaba realmente llamar a la función, lo que se ha ajustado a mi necesidad ha sido realizar unos simples temporizadores.

El resultado es este;

      hr = hour();
      mn = minute();
      se = second();

      lcd.setCursor(0, 0);
      lcd.print("PRUEBA");

      if (millis()-time > 30000)   // SI PASA 30 SEGUNDOS MOSTRAMOS EL RELOJ //
    {
      printNum(hr/10,0);
      printNum(hr%10,3);
      printColon(6);
      printNum(mn/10,7);
      printNum(mn%10,10);
      printColon(13);
      printNum(se/10,14);
      printNum(se%10,17);
         }

. . . 

. . . 

. . .

El LCD escribe PRUEBA, pasado 30 segundos se borra la pantalla y se imprime el reloj. como tengo en el loop los botones definidos para una tecla determinada, al pulsarla, desaparece el reloj y así sucesivamente. Esta era una parte que quería incluir en el proyecto de mi Radio de FM

Saludos.