#define salida 22
#define entrada 35
#define encendido 2
#define parpadeo 1
#define apagado 0
int modo=0;
int testigo;
int n=0;
void setup() {
Serial.begin(115200);
pinMode(salida, OUTPUT);
digitalWrite(salida, HIGH);
pinMode(entrada, INPUT);
Serial.println("Inicio: apagado");
}
/*Los bloques indicados como MODOS definen el funcionamiento en
cada modo. Los principales, PARPADEO y ENCENDIDO, funcionan siempre
que ese modo está activo y la entrada detecta nivel alto. Un nivel bajo
en la entrada o bits por leer en el puerto serie sacan el programa del
bloque do-while. Hay dos bloques de PERMUTACIÓN principales que cambian
entre PARPADEO y APAGADO en función del modo previo al detectar nivel
bajo en la entrada. Por último, hay otro bloque de PERMUTACIÓN que se
activa al detectar bits por leer en el puerto serie. Este lee el puerto
y si la letra introducida es la F, correspondiente con el código ASCII
70, ejecuta el bloque MODO ENCENDIDO, que a diferencia de
los anteriores, no tiene ninguna condición para salir de él, así que no
habrá otra forma de interactuar con el programa sin reiniciarlo. En caso
de que la entrada serie no sea una F, la variable testigo, que registra
si hay algo en el puerto serie se reinicia para permitir que el programa
siga funcionando.
NOTAS:
-En los bloques MODOS principales se han introducido delays. los
de PARPADEO son necesarios para el correcto funcionamiento de este
modo, y el de APAGADO también es imprescindible, por alguna razón. Si
la pulsación del botón sucede durante ese retardo de 0,1s el programa
no es capaz de leerla. Así mismo, si la pulsación es demasiado larga,
el programa saltará de un modo a otro constantemente.
-Por alguna razón, al introducir una letra que no sea la F, el LED
hace dos parpadeos largos. No he sido capaz de ver por qué.*/
void loop() {
do { //MODO PRINCIPAL PARPADEO
testigo=Serial.available();
digitalWrite(salida, LOW);
delay(100);
digitalWrite(salida, HIGH);
delay(100);
} while(modo==parpadeo&&digitalRead(entrada)&&!testigo);
if(modo==parpadeo&&!digitalRead(entrada)) { //PERMUTACIÓN POR NIVEL
modo=apagado;
Serial.println("Apagado");
}
do { //MODO PRINCIPAL APAGADO
testigo=Serial.available();
digitalWrite(salida, HIGH);
delay(100);
} while(modo==apagado&&digitalRead(entrada)&&!testigo);
if(modo==apagado&&!digitalRead(entrada)) { //PERMUTACIÓN POR NIVEL
modo=parpadeo;
Serial.println("Parpadeo");
}
if(testigo) { //PERMUTACIÓN POR BUFFER SERIE
if(Serial.read()==70) modo=encendido;
else testigo=0;
}
do{ //MODO ENCENDIDO
digitalWrite(salida, LOW);
if(modo==encendido&&!n) {
Serial.println("Encendido, reinicia");
n++;
}
} while(modo==encendido);
}