Cómo parar un loop

Hola a todos,

Estoy embarcado en otro proyecto, esta vez consiste en hacer una caja fuerte (de pega, lógicamente ::) ) que se abra mediante una tarjeta. En realidad, la tarjeta lo que hace es cortar la luz que le llega a una LDR. Os pongo prímero el código que estoy usando:

int enablePin = 2;
int motor11Pin = 3;
int motor12Pin = 4;
int motor21Pin = 5;
int motor22Pin = 7;
int rojo = 9;
int verde = 8;
int led = 11;
void parar(); 
const int analogPin = 0;
const int threshold = 970;

void setup() {
  pinMode(enablePin, OUTPUT);
  pinMode(motor11Pin, OUTPUT);
  pinMode(motor12Pin, OUTPUT);
  pinMode(motor21Pin, OUTPUT);
  pinMode(motor22Pin, OUTPUT);
  pinMode(rojo, OUTPUT);
  pinMode(verde, OUTPUT);  
  Serial.begin(9600);
  }


void loop() {
  digitalWrite(enablePin, HIGH);
  digitalWrite(led, HIGH);  
  int analogValue = analogRead(analogPin);
  
    Serial.println(analogValue, DEC); 
         switch (analogValue > threshold) {
           case 1:
           digitalWrite(verde, HIGH);
           delay(2000);
           digitalWrite(verde, LOW);
           delay(500);           
           digitalWrite(motor11Pin, HIGH);
           digitalWrite(motor12Pin, LOW);
           delay(2700);
           digitalWrite(motor11Pin, LOW);
           digitalWrite(motor12Pin, LOW);
           delay(2000);
           break;
           case 2:
           digitalWrite(motor11Pin, LOW);
           digitalWrite(motor12Pin, HIGH);
           delay(2800);
           digitalWrite(motor11Pin, LOW);
           digitalWrite(motor12Pin, LOW);
           delay(2000);
           break;
           default:
           digitalWrite(motor11Pin, LOW);
           digitalWrite(motor12Pin, LOW);
           digitalWrite(rojo, HIGH);
           delay(1000);
           digitalWrite(rojo, LOW);
           delay(1000);
         }       
            
        digitalWrite(motor11Pin, LOW);
        digitalWrite(motor12Pin, LOW);
        digitalWrite(rojo, HIGH);
        delay(1000);
        digitalWrite(rojo, LOW);
        delay(1000);
}

Resulta que quiero que cuando introduzca la tarjeta, se abrá la puerta, y cuando la retire, se cierre. También puede ser que introduzca una vez, se abra, y la introduzca de nuevo para cerrar, me da igual. El caso es que no lo hace, tengo que invertir la polaridad del motor.

He probado mil cosas. Lo más simple, a mi parecer, es usar el if...else, pero el motor se mueve continuamente. No sé como decirle a Arduino que pare hasta que saque la tarjeta.

No se si me habré explicado adecuadamente.

Muchas gracias

Podias instalar un pulsador donde hace tope la tarjeta y ejecutar el codigo cada vez cambie de estado el pulsador.

Un Saludo

Debes utilizar un final de carrera que le indique al arduino cuando se ha abierto la puerta por completo, al igual que para cerrarse.

un saludo

Muchas gracias por contestar.

Dpousada, pienso que la LDR la estoy usando como "pulsador óptico". La LDR la uso para saber si hay o no una tarjeta. Un pulsador creo que haría lo mismo, solo que hay que empujar la tarjeta para cerrar el pulsador.

Chiva, va a ser complicado instalar los finales de carrera. La puerta no es corredera, es como las puertas normales ;D ;D .

En un momento os subo unas fotos para aclararlo.

Saludos

Las fotos como dije:

Le he añadido otro motor, para la apertura/cierre de la puerta. El código ahora es:

int enablePin = 2;
int motor11Pin = 3;
int motor12Pin = 4;
int motor21Pin = 5;
int motor22Pin = 7;
int rojo = 9;
int verde = 8;
int led = 11;
const int analogPin = 0;
const int threshold = 970;

void setup() {
  pinMode(enablePin, OUTPUT);
  pinMode(motor11Pin, OUTPUT);
  pinMode(motor12Pin, OUTPUT);
  pinMode(motor21Pin, OUTPUT);
  pinMode(motor22Pin, OUTPUT);
  pinMode(rojo, OUTPUT);
  pinMode(verde, OUTPUT);  
  Serial.begin(9600);
  }
 
void loop() {
  digitalWrite(enablePin, HIGH);
  digitalWrite(led, HIGH);  
  int analogValue = analogRead(analogPin);
  
    Serial.println(analogValue, DEC); 
         if (analogValue > threshold) {
           
           digitalWrite(verde, HIGH);
           delay(500);           
           digitalWrite(motor11Pin, HIGH);
           digitalWrite(motor12Pin, LOW);
           delay(2700);
           digitalWrite(motor11Pin, LOW);
           digitalWrite(motor12Pin, LOW);
           delay(1000);
           digitalWrite(motor21Pin, HIGH);
           digitalWrite(motor22Pin, LOW);
           delay(4000);
           digitalWrite(motor21Pin, LOW);
           digitalWrite(motor22Pin, LOW);
           
           delay(27000);        
           digitalWrite(verde, LOW);
           delay(500);
           digitalWrite(verde, HIGH);
           delay(500);
           digitalWrite(verde, LOW);
           delay(500);
           digitalWrite(verde, HIGH);
           delay(500);
           digitalWrite(verde, LOW);
           delay(500);
           digitalWrite(verde, HIGH);
           delay(500);
           digitalWrite(motor21Pin, LOW);
           digitalWrite(motor22Pin, HIGH);
           delay(4000);
           digitalWrite(motor21Pin, LOW);
           digitalWrite(motor22Pin, LOW);
           delay(500);
           digitalWrite(motor11Pin, LOW);
           digitalWrite(motor12Pin, HIGH);
           delay(2700);
           digitalWrite(motor11Pin, LOW);
           digitalWrite(motor12Pin, LOW);
           delay(2000);
           digitalWrite(verde, LOW);
           delay(500); 
           
         }       
            
        digitalWrite(motor11Pin, LOW);
        digitalWrite(motor12Pin, LOW);
        digitalWrite(rojo, HIGH);
        delay(1000);
        digitalWrite(rojo, LOW);
        delay(1000);
}

Pero claro, sigue sin funcionar como quiero. Si existiese algún modo de decirle a Arduino que parase hasta que no se detectase un cambio en la LDR funcionaría bien, pero no sé cómo hacerlo.

Muchas gracias