temporizador sin delay + bluetooth

III)

Implementación (II):
El esquema del sketch completo es:
1 Inicialización
2 Lo anterior

Setup:
Lo habitual: baudios, modos de los pines
La inicialización de las variables propias de la aplicación se hizo al definirlas.

3 Loop:
{
/* En general se debe trocear el código en funciones aunque no sea más que para facilitar el mantenimiento posterior del programa. En este caso tendremos las funciones siguientes:
*/
deteccion(); // Ver si el usuario pide algo y/o ha terminado una temporización
ejecucion(); // Hacer lo que toque
}
(Se insiste en que, aunque a veces no lo parezca, esto es “pseudo código”)
Bien, vamos con las funciones:

////////////////////////////////////////////////////////////////////////////////
void deteccion()
/* Esta función examina el buffer serie y comprueba los timers del sistema para detectar si hay que realizar alguna tarea. Actualiza la variable “evento” de acuerdo con la siguiente tabla:
0	No hay evento que atender
1	el usuario ha solicitado que arranque el aparato A
2	Ídem “B”
3	el usuario ha solicitado que pare el aparato A
4	Ídem “B”
5	Fin de período del LED
6	Fin temporización aparato “A”
7	Fin temporización aparato “B”
*/

{
	if (Serial.available() > 0)
	// El usuario ha tecleado algo
	{
	    char dato = Serial.read();
    switch (dato)
    {
           case 'A':  // encender “A”
   	{evento = 1; break;}	
	
          case 'B':  // encender “B”
   	{evento = 2; break;}		

	… resto de eventos hasta 4

	return;					// No comprobar resto de eventos
} // Fin eventos serial.

	// Comprobar si hay que apagar encender el LED      
      	if ((millis() - lastLoopPer) > loopPeriod)
      	{evento = 5; return;}

// Comprobar temporización aparato “A”
If (APerFlag == 1);			// Comprobar solo si está en marcha
If ((millis() - lastAPer) > APeriod)
      	{evento = 6; return;}

// Comprobar temporización aparato “B”
If (BPerFlag == 1);			// Comprobar solo si está en marcha
If ((millis() - lastBPer) > BPeriod)
      	{evento = 7; return;}
	
} 	// Fin deteccion()


////////////////////////////////////////////////////////////////////////////////
void ejecucion()
/* Esta función ejecuta lo que haya que hacer en función del valor de evento

0	No hay evento que atender
1	el usuario ha solicitado que arranque el aparato A
2	Ídem “B”
3	el usuario ha solicitado que pare el aparato A
4	Ídem “B”
5	Fin de período del LED
6	Fin temporización aparato “A”
7	Fin temporización aparato “B”
*/


{

    transicion = eventosTransiciones[evento];
    /* 
     Esta instrucción es una de las más importantes del programa (junto con el contenido del array “eventosTransiciones[]”). En función del evento que haya sucedido, se decide que es lo que hay que hacer. Nótese que hay diferentes eventos que disparan la misma transición.
    */
    switch (transicion)
    {
      case '1':  // Arrancar “A”
        {
          ArrancarA();
          break;
        }

      case '2':  // Arrancar “B”
        {
          ArrancarB();
          break;
        }

            case '3':  // Parar A
        {
          PararA();
          break;
        }

            case '4':  // Parar B
        {
          PararB();
          break;
        }

      case '5':  // Apagar/encender LED
        {
          LED();
          break;
        }

} 	// Fin deteccion()


//////////////////////////////////////////////////////////////////////////////////
//		TRANSICIONES
//////////////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////////////
Void LED()
  {
      // Update signalization (flashing LED)
      
      if ((millis() - lastLoopPer) > loopPeriod)
      {
        // Time to change
        if (loopPerFlag)   // 0 to 1 or 1 to 0?
        {
          // 1 to 0
          digitalWrite(sigPin, LOW);
          loopPerFlag = LOW; // Change flag
        }
        else
        {
          // 0 to 1
          digitalWrite(sigPin, HIGH);
          loopPerFlag = HIGH; // Change flag
        }
        // Store time
        lastLoopPer = millis();
      }
  }

//////////////////////////////////////////////////////////////////////////////////
Void ArrancarA()
        {
          digitalWrite(pinA, HIGH);
          Serial.println("Rele1 encendido");
	lastAPer = millis();		// Resetear el contador
	APerFlag = 1;		// Situación de A
        }

//////////////////////////////////////////////////////////////////////////////////
Void ArrancarB()
        {
          digitalWrite(pinB, HIGH);
          Serial.println("Rele2 encendido");
	lastBPer = millis();		// Resetear el contador
	BPerFlag = 1;		// Situación de B
        }


//////////////////////////////////////////////////////////////////////////////////
Void PararA()
        {
          digitalWrite(pinA, LOW);
          Serial.println("Rele1 apagado");
	APerFlag = 0;		// Situación de A
        }

//////////////////////////////////////////////////////////////////////////////////
Void PararB()
        {
          digitalWrite(pinB, LOW);
          Serial.println("Rele2 apagado");
	BPerFlag = 0;		// Situación de B
        }