Dentro de un bucle if, en una FUNCION, no hago actuar el contador millis()

Un gran saludo a esta enorme familia tecnológica que desconocía su existencia hace sólo unos meses.
Es la primera vez que entro al Foro y espero no molestar ni resultar pesado. Aunque hace mas de 40 años que fui un pionero en programación (BASIC) llevo muchísimos años sin tocarla (Ahora tengo 73)...
En mi casa tengo un sistema de domótica que se me ha averiado y es muy obsoleto y no encuentro repuestos, por lo que he decidido tratar de hacerlo funcionar, al menos, en parte.
Buscando sistemas encontré esta maravilla de software libre de ARDUINO y traté de empezar por los cimientos: viendo tutoriales, adquiriendo un kit básico (con placa UNO) y, sobre todo, comprando un buen libro ( Genuino-Arduino, de Torrente Artero) que me ha empezado a poner al día...
Hecha esta amplia introducción os planteo la pregunta.
He creado una FUNCION que es llamada desde distintas zonas del Sketch, para que me "cuente" el número de segundos que le indique desde el void loop, para mantener una luz encendida ese tiempo, pero si la operación la hago desde el propio void loop no tengo problema, pero si es auxiliandomen de una función no lo consigo. Concretamente, dentro del siguiente bucle:

if (TiempoAhora < INICIO_SUCESO) // Al principio, Inicio_Suceso es MAYOR
     {delay (200);
      TiempoAhora=millis();} // ---NO SE ACUMULAN LOS millis() en TiempoAhora

NO se vuelcan los millis() a la variable TiempoAhora.

Les mando el Sketch completo esperando de alguno de vds. la solución al error pues, la verdad, ya he
tocado fondo... ¡Muchas gracias!

// Con sistema de medida de tiempo para uso en Domo7
 // VARIABLES GENERALES del SKETCH

int PULSADOR=2; // Se le asigna el valor entero 2, al PULSADOR
int NS=0;  // Núm. de segundos a contar indicado desde el SKETCH principal 
int LED = LED_BUILTIN;  // Establece el PIN del LED de PLACA (Led Builtin)    


// - - - Entrada en FUNCION que contará los SEGUNDOS solicitados - - - 

void CUENTA_SEGUNDOS() // VOID porque NO devuelve ningún cálculo           

// Def.VARIABLES sólo de esta Función
{ 
Serial.println ("            ... Estoy en FUNCION ");

unsigned long INICIO_SUCESO;
unsigned long TiempoAhora;

INICIO_SUCESO=millis(); //Inicialmente, son los mismos tiempos
TiempoAhora=millis();

// NS son los núm. de segundos que queremos contar

INICIO_SUCESO=INICIO_SUCESO + (NS*1000); // X 1000 para pasar a miliseg.

      Serial.print (" El 1er. TiempoAhora = ");
      Serial.println (TiempoAhora);
    
  if (TiempoAhora < INICIO_SUCESO) // Al principio, Inicio_Suceso es MAYOR
     {delay (200);
      TiempoAhora=millis();} // ---NO SE ACUMULAN LOS millis() en TiempoAhora

//if (millis() > TiempoAhora + periodo   && X < NS )      
      
      Serial.print (" Inicio_Suceso es = ");
      Serial.println (INICIO_SUCESO);    

      Serial.print (" El último TiempoAhora (Despues del IF) es = ");
      Serial.println (TiempoAhora);


      //{if (millis() < TiempoAhora + periodo)   
      //{TiempoAhora = millis();   
      
      Serial.println (" ");
      
 }

// - - - - - - - - Vuelve a SKETCH principal - - - - - - 

// - - - - - - - - -  FIN de la Función - - - - - - - - 



void setup()
{
  Serial.begin(9600);  
}

void loop() 
{

Serial.println (" Estoy en VOID LOOP en espera de pulsar ");
while (digitalRead(PULSADOR)==HIGH);   // No avanza mientras NO SE PULSE
delay (50);
Serial.println (" He PULSADO ... ");

digitalWrite(LED, HIGH); // Enciende el LED que estará luciendo NS segundos

NS=15;  

CUENTA_SEGUNDOS(); //  - - Me voy a la Función "Contar segundos"  - - - -      
  
digitalWrite(LED, LOW); // Se apagará el LED
   
}

Hola bienvenido al foro!! y enhorabuena es usted parte del 1% que leen las normas del foro antes de escribir su primer post y lo hace correctamente.

Pasando a su consulta me ayudaría mas si explicara que es lo que desea lograr y así poder ayudarlo, porque a simple vista no logro descifrar su código,
De primera le digo que combinar millis() con delay() es una contradicción, yo lo considero una aberración, así que si va comenzando en este mundo es mejor que borre los delay() de su mente.
Como no entiendo el código, no estoy seguro de lo que voy a decir pero creo que puede ser el problema: usted declaró las variables

unsigned long INICIO_SUCESO;
unsigned long TiempoAhora;

como locales, entonces al salir de la función se destruyen, pruebe cambiando las variables a globales.
Estoy atento a su respuesta, saludos

¡Muchísimas gracias por su pronta, educada y atenta respuesta!
Comentaba en mi consulta inicial que era la primera vez que accedía a un Foro y, supongo que por mi inexperiencia no me he expresado bien; trato de aclararme mejor:

  • De acuerdo con la incompatibilidad del delay() con millis(), pero en las líneas donde aparece:

if (TiempoAhora < INICIO_SUCESO) // Al principio, Inicio_Suceso es MAYOR
{delay (200);
TiempoAhora=millis();} // ---NO SE ACUMULAN LOS millis() en TiempoAhora

lo usé provisional para ver si el valor de millis() en la tercera línea, pues ese el problema que trato de solucionar:

1- La Función "CUENTA_SEGUNDOS" pretendo llamarla desde distintos momentos del Sketch, después de haber encendido el LED, al objeto me mantenga en ella y de que no efectúe el "return" hasta que no transcurran los segundos indicados en la variable NS, que al retornar al Sketch, apagará el Led.

2 - Al entrar en el IF, TiempoAhora es menor que INICIO_SUCESO (que ya lleva sumado al millis() de TiempoAhora, el número de milisegundos que quiero "entretener" el IF = NSx1000), por lo que procederé a efectuar la operación entre {}.

3- Mi intención es que, al no cumplirse la condición, el nuevo millis() se carge en TiempoAhora con un valor aumentado y vuelva al IF y efectúe la comparación que, teóricamente, seguirá hasta alcazar el valor de INICIO_SUCESO.

4 - El problema es que el millis() de la tercera línea, NO AUMENTA, según los valores que tengo monitorizados en la pantalla para, provisionalmente, hacer el seguimiento del programa.

5- He probado con la declaración de la variables:
unsigned long INICIO_SUCESO;
unsigned long TiempoAhora;
como globales y el problema persiste.

Espero haberle expresado mejor mis dudas y pueda ayudarle a aclarar mi problema.
Reciba un cordial saludo.
Ludepi

ludepi:
¡Muchísimas gracias por su pronta, educada y atenta respuesta!
Comentaba en mi consulta inicial que era la primera vez que accedía a un Foro y, supongo que por mi inexperiencia no me he expresado bien; trato de aclararme mejor:

  • De acuerdo con la incompatibilidad del delay() con millis(), pero en las líneas donde aparece:

if (TiempoAhora < INICIO_SUCESO) // Al principio, Inicio_Suceso es MAYOR
{delay (200);
TiempoAhora=millis();} // ---NO SE ACUMULAN LOS millis() en TiempoAhora

lo usé provisional para ver si el valor de millis() en la tercera línea, pues ese el problema que trato de solucionar:

1- La Función "CUENTA_SEGUNDOS" pretendo llamarla desde distintos momentos del Sketch, después de haber encendido el LED, al objeto me mantenga en ella y de que no efectúe el "return" hasta que no transcurran los segundos indicados en la variable NS, que al retornar al Sketch, apagará el Led.

2 - Al entrar en el IF, TiempoAhora es menor que INICIO_SUCESO (que ya lleva sumado al millis() de TiempoAhora, el número de milisegundos que quiero "entretener" el IF = NSx1000), por lo que procederé a efectuar la operación entre {}.

3- Mi intención es que, al no cumplirse la condición, el nuevo millis() se carge en TiempoAhora con un valor aumentado y vuelva al IF y efectúe la comparación que, teóricamente, seguirá hasta alcazar el valor de INICIO_SUCESO.

4 - El problema es que el millis() de la tercera línea, NO AUMENTA, según los valores que tengo monitorizados en la pantalla para, provisionalmente, hacer el seguimiento del programa.

5- He probado con la declaración de la variables:
unsigned long INICIO_SUCESO;
unsigned long TiempoAhora;
como globales y el problema persiste.

Espero haberle expresado mejor mis dudas y pueda ayudarle a aclarar mi problema.
Reciba un cordial saludo.
Ludepi

Hola de nuevo...
Bueno ahora que ha explicado lo que pretende, tenemos un problema.
Esto:

1- La Función "CUENTA_SEGUNDOS" pretendo llamarla desde distintos momentos del Sketch, después de haber encendido el LED, al objeto me mantenga en ella y de que no efectúe el "return" hasta que no transcurran los segundos indicados en la variable NS, que al retornar al Sketch, apagará el Led.

Es básicamente es un delay, y es justo lo que queremos evitar, por lo que no sirve de nada tener esa función y utilizar millis(). ya que el programa estará detenido hasta que salga de la función por lo que no podrá ejecutar nada mas.
Por otro lado encontre fallas en el codigo como esto:
while (digitalRead(PULSADOR)==HIGH); while() no lleva " ; " y otro error es en el setup falto declarar el pin del pulsador como entrada que, según la linea anterior esta como pull-up. Ademas usar while para detectar el cambio de estado de un pulsador es la peor forma de hacerlo ya que al igual que delay es un bucle bloqueante.
Solo para dejar mas claro lo que trato de decir, modifiqué su código solo para probar, pero repito, no es un codigo funcional

// Con sistema de medida de tiempo para uso en Domo7
 // VARIABLES GENERALES del SKETCH

int PULSADOR=2; // Se le asigna el valor entero 2, al PULSADOR
int NS=0;  // Núm. de segundos a contar indicado desde el SKETCH principal
int LED = LED_BUILTIN;  // Establece el PIN del LED de PLACA (Led Builtin)   
unsigned long INICIO_SUCESO;
unsigned long TiempoAhora;

// - - - Entrada en FUNCION que contará los SEGUNDOS solicitados - - -

void CUENTA_SEGUNDOS(unsigned long tiempo) // VOID porque NO devuelve ningún cálculo           

// Def.VARIABLES sólo de esta Función
{
Serial.println ("            ... Estoy en FUNCION ");

     


  while (millis()- INICIO_SUCESO < tiempo *1000UL) // Al principio, Inicio_SucesFin de la   } 
      {}

        Serial.println (" Fin de la FUNCION ");   
 }

// - - - - - - - - Vuelve a SKETCH principal - - - - - -

// - - - - - - - - -  FIN de la Función - - - - - - - -



void setup()
{

  Serial.begin(9600);
  pinMode (PULSADOR, INPUT_PULLUP) ;
  pinMode(LED , OUTPUT);
}

void loop()
{

Serial.println (" Estoy en VOID LOOP en espera de pulsar ");
while (digitalRead(PULSADOR)==HIGH)   // No avanza mientras NO SE PULSE  <<<<Error aqui  ese " ; " no debe estar aqui
       delay(50);

Serial.println (" He PULSADO ... ");

digitalWrite(LED, HIGH); // Enciende el LED que estará luciendo NS segundos

NS=15; 
 INICIO_SUCESO=millis();
CUENTA_SEGUNDOS(NS); //  - - Me voy a la Función "Contar segundos"  - - - -     
 
digitalWrite(LED, LOW); // Se apagará el LED
   
}

Pruebelo y después el siguiente es lo mismo utilizando delay():

int PULSADOR=2; // Se le asigna el valor entero 2, al PULSADOR
int NS=0;  // Núm. de segundos a contar indicado desde el SKETCH principal
int LED = LED_BUILTIN;  // Establece el PIN del LED de PLACA (Led Builtin)   
unsigned long INICIO_SUCESO;
unsigned long TiempoAhora;


void setup()
{

  Serial.begin(9600);
  pinMode (PULSADOR, INPUT_PULLUP) ;
  pinMode(LED , OUTPUT);
}

void loop()
{

Serial.println (" Estoy en VOID LOOP en espera de pulsar ");
while (digitalRead(PULSADOR)==HIGH)   // No avanza mientras NO SE PULSE 
       delay(50);

Serial.println (" He PULSADO ... ");

digitalWrite(LED, HIGH); // Enciende el LED que estará luciendo NS segundos

delay(15000); 
digitalWrite(LED, LOW); // Se apagará el LED
   
}

Bien después de probarlos, ahora dejo el siguiente código que hace lo mismo pero no bloquea nada

// Con sistema de medida de tiempo para uso en Domo7
 // VARIABLES GENERALES del SKETCH

int PULSADOR=2; // Se le asigna el valor entero 2, al PULSADOR
int NS=0;  // Núm. de segundos a contar indicado desde el SKETCH principal
int LED = LED_BUILTIN;  // Establece el PIN del LED de PLACA (Led Builtin)   
unsigned long INICIO_SUCESO;
unsigned long TiempoAhora;


void setup()
{

  Serial.begin(9600);
  pinMode (PULSADOR, INPUT_PULLUP) ;
  pinMode(LED , OUTPUT);
}

void loop()
{
  
Serial.println (" Estoy en VOID LOOP en espera de pulsar ");   //>>>>>>Deje esta linea para que ve a que el loop no se detiene y el programa sigue corriendo

if (!digitalRead(PULSADOR)){
     Serial.println (" He PULSADO ... ");
     digitalWrite(LED, HIGH); // Enciende el LED que estará luciendo NS segundos
     INICIO_SUCESO=millis();
     NS=15;
     }

if(millis()-INICIO_SUCESO >= NS *1000UL )
     digitalWrite(LED, LOW); // Se apagará el LED
   
}

Bueno como ve, los tres códigos hacen lo mismo, encienden y apagan un led determinado tiempo, pero si quiere agregar alguna otra cosa como por ejemplo el manejo de otro led, con los 2 primeros no funcionara pero con el tercer código si

¡¡¡¡¡ MUCHÍSIMAS GRACIAS !!!!
En algún sitio del Foro leí que aconsejaban limitar el uso de mayúsculas... pero, ¡perdón!, la ocasión lo merece:

1 - He ejecutado el programa que Vd. ha corregido sobre el mío y funciona perfectamente... aunque aún no me ha detenido a analizarlo para ver el porqué de cada una de las variaciones, pues lo más importante era contestarle dándole las GRACIAS e informarle que funciona.

2 - No puede hacerse idea de lo que me costado tratar de hacerlo yo solo, sin pedir ayuda; estaba ya casi en una situación pseudodepresiva... pero ha valido la pena por la rapidez, eficacia y profesionalidad demostrada.

3 - Las dos siguientes soluciones que me propone, no las he mirado aún, pues lo importante era contestarle. Le prometo, cuando lo haga, hacerle llegar mi opinión.

4 - Respecto al ";" después del while, por supuesto lo he quitado, pero nunca he sabido apreciar el inconveniente de tenerlo puesto; por supuesto que, en lo sucesivo, no lo pondré.

5 - Creo que el while como bloqueante del programa mientras se pulsa, en mi planteamiento quizá no sea decisivo, puesto que es un pulsador el elemento base del inicio; le comento, esquemáticamente lo que estoy tratando de hacer:

a) el vestíbulo de la casa tiene una serie de pulsadores conectados en paralelo y pretendo que, con una pulsación corta (entre 0.1 y 1,5 seg), accione el encendido temporizado del alumbrado de la entrada y escalera en torno a unos 15 o 20 segundos. También se dispararía este encendido con un detector de presencia de IR.
b) con una pulsación más larga (entre 1,6 y 4 seg.) mantener el alumbrado encendido, permanente, hasta que se vuelva a pulsar y caer a la situación de inicio.
c) y, por último, con una pulsación muy larga (entre 4,1 y 8 segundos) iniciar un proceso disuasivo de "simulador de presencia", con encendidos y apagados alternativos y aleatorios en sus períodos. Este último estado, sería siempre que una célula fotoeléctrica indicara situación de nocturnidad.

Bueno, basta de palabrería que lo importante es, que reciba cuanto antes mi reconocimiento. Ya le iré manteniendo informado del estudio de los otros dos casos que me propone y del resto del proyecto.

Muy Agradecido.

Una última cuestión, me cuesta aún manejarme en el foro y encontrar lo que yo envío, así como sus respuestas: ¿hay algún, enlace, email u otra forma más eficaz de contacto? Gracias

RIG:
Hola de nuevo...
Bueno ahora que ha explicado lo que pretende, tenemos un problema.
Esto:Es básicamente es un delay, y es justo lo que queremos evitar, por lo que no sirve de nada tener esa función y utilizar millis(). ya que el programa estará detenido hasta que salga de la función por lo que no podrá ejecutar nada mas.
Por otro lado encontre fallas en el codigo como esto:
while (digitalRead(PULSADOR)==HIGH); while() no lleva " ; " y otro error es en el setup falto declarar el pin del pulsador como entrada que, según la linea anterior esta como pull-up. Ademas usar while para detectar el cambio de estado de un pulsador es la peor forma de hacerlo ya que al igual que delay es un bucle bloqueante.
Solo para dejar mas claro lo que trato de decir, modifiqué su código solo para probar, pero repito, no es un codigo funcional

// Con sistema de medida de tiempo para uso en Domo7

// VARIABLES GENERALES del SKETCH

int PULSADOR=2; // Se le asigna el valor entero 2, al PULSADOR
int NS=0;  // Núm. de segundos a contar indicado desde el SKETCH principal
int LED = LED_BUILTIN;  // Establece el PIN del LED de PLACA (Led Builtin) 
unsigned long INICIO_SUCESO;
unsigned long TiempoAhora;

// - - - Entrada en FUNCION que contará los SEGUNDOS solicitados - - -

void CUENTA_SEGUNDOS(unsigned long tiempo) // VOID porque NO devuelve ningún cálculo

// Def.VARIABLES sólo de esta Función
{
Serial.println ("            ... Estoy en FUNCION ");

while (millis()- INICIO_SUCESO < tiempo *1000UL) // Al principio, Inicio_SucesFin de la  }
      {}

Serial.println (" Fin de la FUNCION "); 
}

// - - - - - - - - Vuelve a SKETCH principal - - - - - -

// - - - - - - - - -  FIN de la Función - - - - - - - -

void setup()
{

Serial.begin(9600);
  pinMode (PULSADOR, INPUT_PULLUP) ;
  pinMode(LED , OUTPUT);
}

void loop()
{

Serial.println (" Estoy en VOID LOOP en espera de pulsar ");
while (digitalRead(PULSADOR)==HIGH)  // No avanza mientras NO SE PULSE  <<<<Error aqui  ese " ; " no debe estar aqui
      delay(50);

Serial.println (" He PULSADO ... ");

digitalWrite(LED, HIGH); // Enciende el LED que estará luciendo NS segundos

NS=15;
INICIO_SUCESO=millis();
CUENTA_SEGUNDOS(NS); //  - - Me voy a la Función "Contar segundos"  - - - -

digitalWrite(LED, LOW); // Se apagará el LED
 
}




Pruebelo y después el siguiente es lo mismo utilizando delay():


int PULSADOR=2; // Se le asigna el valor entero 2, al PULSADOR
int NS=0;  // Núm. de segundos a contar indicado desde el SKETCH principal
int LED = LED_BUILTIN;  // Establece el PIN del LED de PLACA (Led Builtin) 
unsigned long INICIO_SUCESO;
unsigned long TiempoAhora;

void setup()
{

Serial.begin(9600);
  pinMode (PULSADOR, INPUT_PULLUP) ;
  pinMode(LED , OUTPUT);
}

void loop()
{

Serial.println (" Estoy en VOID LOOP en espera de pulsar ");
while (digitalRead(PULSADOR)==HIGH)  // No avanza mientras NO SE PULSE
      delay(50);

Serial.println (" He PULSADO ... ");

digitalWrite(LED, HIGH); // Enciende el LED que estará luciendo NS segundos

delay(15000);
digitalWrite(LED, LOW); // Se apagará el LED
 
}




Bien después de probarlos, ahora dejo el siguiente código que hace lo mismo pero no bloquea nada



// Con sistema de medida de tiempo para uso en Domo7
// VARIABLES GENERALES del SKETCH

int PULSADOR=2; // Se le asigna el valor entero 2, al PULSADOR
int NS=0;  // Núm. de segundos a contar indicado desde el SKETCH principal
int LED = LED_BUILTIN;  // Establece el PIN del LED de PLACA (Led Builtin) 
unsigned long INICIO_SUCESO;
unsigned long TiempoAhora;

void setup()
{

Serial.begin(9600);
  pinMode (PULSADOR, INPUT_PULLUP) ;
  pinMode(LED , OUTPUT);
}

void loop()
{
 
Serial.println (" Estoy en VOID LOOP en espera de pulsar ");  //>>>>>>Deje esta linea para que ve a que el loop no se detiene y el programa sigue corriendo

if (!digitalRead(PULSADOR)){
    Serial.println (" He PULSADO ... ");
    digitalWrite(LED, HIGH); // Enciende el LED que estará luciendo NS segundos
    INICIO_SUCESO=millis();
    NS=15;
    }

if(millis()-INICIO_SUCESO >= NS *1000UL )
    digitalWrite(LED, LOW); // Se apagará el LED
 
}




Bueno como ve, los tres códigos hacen lo mismo, encienden y apagan un led determinado tiempo, pero si quiere agregar alguna otra cosa como por ejemplo el manejo de otro led, con los 2 primeros no funcionara pero con el tercer código si

Estimado RIG:
De nuevo una letras para decirle que ya he analizado los otros dos sketch, basados en dalay() y millis() y, efectivamente a pesar de su simpleza, he aprendido cosas nuevas (como el UL en la variable... que lo desconocía).

Al respecto, le diré que esos dos tipos de contadores ya los había logrado hacer (¡No con su elegancia!) y me habían funcionado bien dentro del void loop normal; el problema se me presentó y de forma irresoluble, cuando quise hacerlo derivando el contador a una Función...

Por fin TODO RESUELTO y ¡¡¡MUCHAS GRACIAS!!! (Perdón por las mayúsculas...)

Buenas tardes estimado RIG:

He continuado trabajando con el tercer ejemplo que me envió por considerarlo más operativo pero, al tratar de hacerlo por medio de una FUNCIÓN, (de forma similar al primero que Vd. me modificó indicándome:

"Solo para dejar mas claro lo que trato de decir, modifiqué su código solo para probar, pero repito, no es un código funcional", No he conseguido hacerlo rodar, a pesar de darles los "palos" que se me han ido ocurriendo...

Me atrevo a enviárselo como me ha quedado por si fuera una tontería que no alcanzo a ver...
De nuevo muy agradecido, reciba un cordial saludo,

// Con sistema de medida de tiempo para uso en Domo7
 // Incluidas modificaciones sugeridas por RIG, del Foro Arduino. 28/05/2020. También me envía
 // 
 // Las modificaciones incorpordas por él a mi V. LPG_Crono_7, que FUNCIONAN, pasan a Crono_8-1.
 // DOS sugerencias MÁS, hechas con delay() y millis (), las archivo como ( Crono_8-2 y 8-3),
 
 // A la nueva V.8-1, (perfecta), le incorporo en la FUNCIÓN la solución 8-3 propuesta por RIG-
 // La nombro como V. 8-1_3a  y NO FUNCIONA al compartir el bucle del ejemplo 8-3 con la FUNCION 
 
 // Las salidas a Monitor se anularán, pues sólo sirven para análisis del proceso

 // VARIABLES GENERALES del SKETCH // Igual que V.8_1

int PULSADOR=2; // Se le asigna el valor entero 2, al PULSADOR
int NS=0;  // Núm. de segundos a contar, indicado desde el SKETCH principal 
int LED = LED_BUILTIN;  // Establece el PIN del LED de PLACA (Led Builtin)    
unsigned long INICIO_SUCESO;
unsigned long TiempoAhora;

// - - - - - Entrada en la FUNCION que contará los SEGUNDOS solicitados - - - - - 

void CUENTA_SEGUNDOS(unsigned long tiempo) // VOID porque NO devuelve ningún cálculo
                                    
// tiempo:única VARIABLE de Función que desde V.LOOP viene como NS (Núm.seg. a contar)

{
Serial.println ("            ... Estoy ya en la FUNCION ");

   
 
 if(millis()-INICIO_SUCESO >= NS *1000UL )   
    
      //8-1 while(millis()- INICIO_SUCESO < tiempo *1000UL)//Inicio_Suceso, son los millis() que vienen desde V.Loop
      //8-1  {
        Serial.print (" Los millis() como Inicio_Suceso, (desde V.Loop) son = ");
        Serial.println (INICIO_SUCESO);  
             
        Serial.print (" Los millis() en la Función van siendo = ");
        Serial.println (millis()); 
 
        Serial.println (" Fin de un ciclo de if ");   
        Serial.println (" ");
        delay(250); // Para que dé tiempo a ver el monitor
     
  Serial.println (" Fin de la Función ");
     
}
// - - - - FIN de la FUNCIÓN y vuelve a SKETCH principal - - - - - - 

void setup() // Igual que V.8-1
{
  Serial.begin(9600);  
  pinMode (PULSADOR, INPUT_PULLUP) ;
  pinMode(LED , OUTPUT);
}

void loop() 
{
Serial.println (" Estoy en VOID LOOP en espera de pulsar ");
    //8-1 while (digitalRead(PULSADOR)==HIGH)  // No avanza mientras NO SE PULSE
    //8-1 delay (50);

if (!digitalRead(PULSADOR))
   
   Serial.println (" He PULSADO ... ");
   digitalWrite(LED, HIGH); // Enciende el LED que estará luciendo NS segundos
   INICIO_SUCESO=millis();
   NS=15;



    
CUENTA_SEGUNDOS(NS);  // - - - Me voy a la Función "Contar segundos"  - - - -    
    
     //Serial.println (" He PULSADO ... ");
     //digitalWrite(LED, HIGH); // Enciende el LED que estará luciendo NS segundos
     //INICIO_SUCESO=millis();
      
   
    //8-1 Serial.println (" He PULSADO ... ");

    //8-1 digitalWrite(LED, HIGH); // Enciende el LED que estará luciendo NS segundos

    //8-1 NS=15;  
    //8-1 INICIO_SUCESO=millis();
    
CUENTA_SEGUNDOS(NS);  // - - - Me voy a la Función "Contar segundos"  - - - -      

                      // - - - - - - - Regreso de la FUNCIÓN - - - - - - -  
digitalWrite(LED, LOW); // Se apagará el LED
   
}