Hola. Para quien le haga falta. Está funcionando perfectamente. Y para los que saben, que señalen los horrores que he cometido y algunos aprenderemos. Saludos.
JV
unsigned long Crono = 0;
unsigned long inicio_cuenta = 0 ;
const int photoPin = 9; //FOTOCÉLULA
const int final_abrirPin = 12; //FINAL DE CARRERA ABRIR
const int pulsadorPin = 10; //PULSADOR
const int final_cerrarPin = 13; //FINAL DE CARRERA CERRAR
const int M_ABREPin = 15; //SEÑAL MOTOR ABRIR
const int M_CIERRAPin = 14; //SEÑAL MOTOR CERRAR
int photo, final_abrir, pulsador, final_cerrar;
int estado = 0;
int indice = 0;
void setup() {
pinMode (photoPin, INPUT); // 9-- 0
pinMode (final_abrirPin, INPUT); //12-- 1
pinMode (final_cerrarPin, INPUT); //13-- 0
pinMode (pulsadorPin, INPUT); //10-- 0
pinMode (M_ABREPin, OUTPUT); //15-- ?
pinMode (M_CIERRAPin, OUTPUT); //14-- ?
photo = digitalRead(photoPin);
final_abrir = digitalRead(final_abrirPin);
pulsador = digitalRead(pulsadorPin);
final_cerrar = digitalRead(final_cerrarPin);
digitalWrite (M_ABREPin, LOW);
digitalWrite (M_CIERRAPin, LOW);
delay(500);
if (final_cerrar == HIGH ) { //Por si se cortó la corriente
digitalWrite(M_CIERRAPin, HIGH);
estado = 3;
}
}
void loop() {
switch (estado) {
case 0: //SI PULSADOR = HIGH, ABRIMOS
pulsador = digitalRead(pulsadorPin);
if (pulsador == HIGH)
{
digitalWrite(M_ABREPin, HIGH);
estado = 1;
}
break;
//**********************
case 1: //ESPERAMOS FIN DE CARRERA ABRIR
final_abrir = digitalRead(final_abrirPin);
if (final_abrir == LOW)
{ para();
estado = 2;
inicio_cuenta = millis();
Crono = inicio_cuenta + 30000UL;
}
break;
//*******************
case 2: // ESPERAMOS POR EL PULSADOR O TIEMPO PARA CERRAR.
indice = 0;
pulsador = digitalRead(pulsadorPin);
while (Crono < millis() || pulsador == HIGH) //|=alt+124
{ Crono = millis() + 30000UL;
digitalWrite(M_CIERRAPin, HIGH); // empezamos a cerrar...
estado = 3; // si superamos 120 segundos o pulsamos
final_cerrar = digitalRead(final_cerrarPin);
final_abrir = HIGH;
pulsador = digitalRead(pulsadorPin);
}
break;
//*******************
case 3: //SUPERVISAMOS PULSADOR Y CELULA MIENTRAS ESPERAMOS FIN DE CIERRE
while (final_cerrar == HIGH )
{ pulsador = digitalRead(pulsadorPin);
photo = digitalRead(photoPin);
if (pulsador == HIGH || photo == HIGH) //Pulsacion de peligro
{ para();
delay(100);
indice = 1;
digitalWrite(M_ABREPin, HIGH);
break;
}
final_cerrar = digitalRead(final_cerrarPin);
}
estado = indice;
if (estado == 1) {
digitalWrite(M_ABREPin, HIGH);
}
else {
para();
}
pulsador = digitalRead(pulsadorPin);
break;
}
}
//**********************
void para() { // Funcion PARAR
digitalWrite(M_ABREPin, LOW);
digitalWrite(M_CIERRAPin, LOW);
}