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
}