Gadget para desconectar un ascensor

Hola,

Hay muchas maneras de hacerlo. La manera que yo elegí (que no es para nada como te pongo aquí abajo), la puedes ver en el código de mi librería y ejemplos....SECUduino/FSM Library at master · IgorReal/SECUduino · GitHub

Lo hagas como lo hagas, quieres que en tu loop se este haciendo todo el rato (hablando de una máquina sencilla):

  1. Leer eventos (transiciones)
  2. Actualizar estados
  3. Realizar la función que corresponda a dicho estado.

Por ejemplo, una muy básica pero que tiene el problema de gastar mucha RAM por las variables utilizadas(ya que tienes una variable por cada evento), podría ser:

//EVENTOS
if (Serial.available()>0) myReceivedByte=Serial.read();
ev_botonOK=digitalRead(5) || myReceivedByte=="O";
ev_botonUP=digitalRead(1) || myReceivedByte=="U";
if (RTC.Hora==13 && RTC.Minutos>=30)
{
ev_alarma1=1;
}else
ev_alarma1=0;
}

//MAQUINA DE ESTADOS
switch(estado)
{
case st_Menu:
//Muestro por pantalla cosas, activo salidas, etc
if (ev_botonOK) estado=st_Pantalla1;
break;
case st_Pantalla1;
//muestro por pantalla cosas
if (ev_botonUP)
{
estado=st_MENU;
}else if (ev_alarma1)
{
estado=st_Alarma;
}
break;
case st_Alarma:
....
break;
etc.
}

Y a partir de esto básico, pues seguro que ves como puedes mejorar y hacerla más efectiva (en cuanto a código).
Para botones, al leer tus entradas, puedes crearte un byte (o del tamaño que necesites) que cada bit sea una de ellas. Es decir, el bit0 es botonUP, el bit1 es botonOK, etc...Incluso si te lo montas bien en tu código, puedes conectarlo al mismo puerto(hardware), y leer el puerto de una vez.Cosa que será más rápida que digitalRead() de Arduino.
Bueno, en realidad podrías tener una variable evento, y que cada bit tiene un significado (según su posición, indica el estado de los eventos).

Luego usas máscaras para saber si está activo o no.

Pero poco a poco!! :wink:

Saludos,

Igor R.

[1] Manejo de puertos => http://arduino.cc/es/Reference/PortManipulation
[2] Máscaras y operaciones con bits => http://arduino.cc/es/Tutorial/BitMask