Estudiantes novatos de 2º de Bachillerato en apuros

Hola y gracias de antemano.

Somos un grupo de estudiantes de segundo de bachillerato a los que nos han mandado un proyecto de Arduino. Debido al Estado de Alarma, nos hemos visto obligados a realizar el trabajo desde nuestros hogares, con todas las dificultades que ello conlleva para unos novatos cuyo conocimiento de electrónica es prácticamente nulo. Agradeceríamos si alguien nos pudiera prestar algo de ayuda.

Las instrucciones del proyecto son:
-Una puerta se abre cuando detecta la presencia de una persona haciendo parpadear una luz
-Al llegar al final del recorrido la puerta se para, espera 10 segundos y se cierra parpadeando una luz y emitiendo un sonido
-Si hay algún obstáculo la puerta no se cierra y si esta libre se cierra al llegar a la posición original.

Debido al confinamiento, tampoco disponemos de todo el material que nos gustaría. Estamos usando un motor paso a paso y un sensor PIR para detectar la presencia.

El código de programación ya lo tenemos escrito.

//PINES
int sensorInfra=2; //Detector de presencia de infrarrojos
int ledParpa=4; //Hace parpadear la luz
int sonido=3;
int luz=A0;
//------------------------MOTOR------------------------
//funcionamiento motor en https://www.prometec.net/motor-28byj-48/
int abriendo=0;
int fase=7;
int IN1=9; //Entrada motor 1
int IN2=10; //Entrada motor 2
int IN3=11; //Entrada motor 3
int IN4=12; //Entrada motor 4
int recorrido_puerta=0;
int fases [ 8 ][ 4 ] =
{ {1, 0, 0, 0},
{1, 1, 0, 0},
{0, 1, 0, 0},
{0, 1, 1, 0},
{0, 0, 1, 0},
{0, 0, 1, 1},
{0, 0, 0, 1},
{1, 0, 0, 1}
};

void setup() {
// put your setup code here, to run once:
pinMode(sensorInfra,INPUT);
pinMode(ledParpa, OUTPUT);
pinMode(IN1,OUTPUT);
pinMode(IN2,OUTPUT);
pinMode(IN3,OUTPUT);
pinMode(IN4,OUTPUT);
pinMode(sonido,OUTPUT);
pinMode(luz,INPUT);
digitalWrite(ledParpa,LOW);
Serial.begin(9600);
}

void loop() {
// put your main code here, to run repeatedly:

if(digitalRead(sensorInfra)==HIGH){
delay(1000);
if (abriendo==0){
abriendo=1;
}
else
{
abriendo=0;
}
//digitalWrite(ledParpa,HIGH);

}

if (abriendo==1) {
Serial.write("abriendo");
Serial.println();
noTone(sonido);

if (recorrido_puerta<120)
{
//Serial.write(fase);
movimientoMotor();
delay (1) ;
fase--;

if (fase<0)
{fase=7;}
recorrido_puerta++;
if (recorrido_puerta==119)
{abriendo=0;
delay(10000);}
if (digitalRead(ledParpa)==LOW) {
digitalWrite(ledParpa,HIGH);
}else{
digitalWrite(ledParpa,LOW);
}

delay(100);

}

}
else{
if (recorrido_puerta>0)
{
Serial.write("cerrando");
Serial.println();
int v = analogRead(A0);
Serial.println(v);
if (v<2)
{abriendo=1;
Serial.write("interferencia");
Serial.println();
}
//Serial.write(fase);
movimientoMotor();

fase++;

if (fase>7)
{fase=0;}
recorrido_puerta--;

tone(sonido,100);
if (digitalRead(ledParpa)==LOW) {
digitalWrite(ledParpa,HIGH);
}else{
digitalWrite(ledParpa,LOW);
}

delay(100);

}
else
{
Serial.write("cerrado no hace nada");
Serial.println();
noTone(sonido);
}

}
}

void movimientoMotor()
{ digitalWrite( IN1, fases[fase][ 0] );
digitalWrite( IN2, fases[fase][ 1] );
digitalWrite( IN3, fases[fase][ 2] );
digitalWrite( IN4, fases[fase][ 3] );
}

Nuestros mayores problemas llegan a la hora del montaje, puesto que por alguna razón que desconocemos, al compilar el programa lo único que sucede es que el buzzer hace sonidos.

Muchas gracias

Hola @garcia050402, bienvenidos al foro Arduino.
En la sección proyectos tienes estos dos hilos que debiste haber leído antes de postear

Como su consulta es para otra sección lo muevo a Software.
Por cierto aunque ahora mueva tu hilo, no pases por alto la lectura de las normas que te acabo de indicar. Y cuando postees recuerda que NADA se copia y pega porque TODO lleva etiquetas para que sea visualizado adecuadamente.
El código debe ir con etiquetas para código/errores.

Hola, he leído vuestro post y veo varias cosas mejorables (no me mal interpretéis, no soy experto en arduino) solo veo que no habéis empezado de una manera estructurada y también veo fallas en el planteamiento. No se si las instrucciones que ponéis al inicio son precisas o no pero primero empezaría por depurar un poco las premisas.

1º la puerta ha de estar cerrada y si se activa el IR (infrarrojos) inicia el proceso de apertura
2º El proceso de apertura: comienza a parpadear el led y el motor comienza a subir la puerta
3º Cuando la puerta llegué a la posición de apertura, se apaga el led y espera 10 segundos.
4º Si acabado ese tiempo, el IR no detecta nada, comienza a sonar el zumbador, a parpadear el led y a bajar la puerta.

Aunque la posición de la puerta la definís con el valor de recorrido_puerta, yo usaría un par de detectores y serian los de final de carrera de puerta arriba y puerta abajo. Para conocer cuando la puerta está arriba o abajo del todo.

Por otro lado (y esto es un consejo) no ponéis apenas comentarios acerca de lo que hace la programación. Esto es lo primero que ha de aprender un programador (aunque sea solo para hacer una tarea del cole) porque 1º es posible que pase tiempo desde crear el código y continuar o modificarlo más adelante o 2º otra persona puede usar ese código. Si los comentarios no son claros, será un problema.

He copiado y pegado vuestro código al IDE arduino y he comentado todo como me ha parecido.
Pero creo que lo primero sería añadir unos interruptores para simular los finales de carrera de puerta_arriba y puerta_abajo, si no, es posible que aún teniendo bien el valor de recorrido_puerta, en la práctica podría daros problemas.

Otra cosa que no entiendo (perdonadme pero no le he dedicado mucho tiempo y si estuviera bien comentado sería más rápido entenderlo), no se para que usáis un puerto analógico para la entrada v. Qué es eso?

Bueno, os añado el código, con mis comentarios (seguro que algo no está bien, ni he usado un estandar para hacerlos, pero bueno...)

Por cierto, también es muy práctico estructurar bien (y me refiero a cómo se ven) los condicionales. Sobetodo los anidados. Si está claro qué está dentro de qué, es mucho más fácil entender el código.

//PINES
int sensorInfra=2;                      //Detector de presencia de infrarrojos. Pin de entrada del sensor IR
int ledParpa=4;                         //Hace parpadear la luz. Pin de salida del led.
int sonido=3;
int luz=A0;
//------------------------MOTOR------------------------
//funcionamiento motor en https://www.prometec.net/motor-28byj-48/
int abriendo=0;
int fase=7;
int IN1=9;    //Entrada motor 1
int IN2=10;   //Entrada motor 2
int IN3=11;   //Entrada motor 3
int IN4=12;   //Entrada motor 4
int recorrido_puerta=0;
int fases [ 8 ][ 4 ] =
   {  {1, 0, 0, 0},
      {1, 1, 0, 0},
      {0, 1, 0, 0},
      {0, 1, 1, 0},
      {0, 0, 1, 0},
      {0, 0, 1, 1},
      {0, 0, 0, 1},
      {1, 0, 0, 1}
   };

void setup() 
  {
   // Definimos los pines de entrada y salida
   pinMode(sensorInfra,INPUT);  //Pin sensorInfra como INPUT del valor del infrarojo
   pinMode(ledParpa, OUTPUT);   //Pin ledParpa como OUTOPUT para el led
   pinMode(IN1,OUTPUT);         //Pin IN1 como cable 1 del motor PAP
   pinMode(IN2,OUTPUT);         //Pin IN2 como cable 2 del motor PAP
   pinMode(IN3,OUTPUT);         //Pin IN3 como cable 3 del motor PAP
   pinMode(IN4,OUTPUT);         //Pin IN4 como cable 4 del motor PAP
   pinMode(sonido,OUTPUT);
   pinMode(luz,INPUT);
   // Definimos el estado inicial del pin ledParpa.
   digitalWrite(ledParpa,LOW);
   // Iniciamos el puerto serie a 9600 baudios por segundo
   Serial.begin(9600);
  }

void loop() 
  {
   
   if(digitalRead(sensorInfra)==HIGH)     //Si tenemos presencia en puerta
    {
     delay(1000);
     if (abriendo==0)                     //Si la puerta no está abriendo
      {
       abriendo=1;                        //Damos orden de abrir la puerta
      }
   else
      {
       abriendo=0;                        // De otra manera, damos valor 0 a abriendo
      }
    //digitalWrite(ledParpa,HIGH);
   
    }

    if (abriendo==1)                      //Si la puerta está abriendo
      {
       Serial.write("abriendo");          //Imprimimos en el puerto serie el mensaje "abriendo"            
       Serial.println();
       noTone(sonido);                    //Nos aseguramos que el buzzer no emite sonido por el pin 3
       if (recorrido_puerta<120)          //Si el ·recorrido_puerta· es menor que 120
         {
         //Serial.write(fase);
         movimientoMotor();               //Ejecutamos la función "movimientoMotor"
         delay (1) ;                      //Esperamos 1 ms
         fase--;                          //Decrementamos en 1 "fase"
         if (fase<0)                      //Si "fase" es menor que 0
           {
           fase=7;                        //Damos el valor 7 a "fase"
           }
         recorrido_puerta++;              //Incrementamos en 1 el valor de "recorrido_puerta"
         if (recorrido_puerta==119)       //si "recorrido_puerta" es igual a 119
           {
           abriendo=0;                    //abriendo = 0 para cerrar la puerta (despues de la espera)
           delay(10000);                  //Esperamos 10.000ms
           }
         if (digitalRead(ledParpa)==LOW)  //Si La salida "ledparpa" está OFF 
           {
           digitalWrite(ledParpa,HIGH);   //"ledparpa" ON
           }
        else
           {
           digitalWrite(ledParpa,LOW);    //ledparpa OFF
           }
        delay(100);                       //Esperamos 100ms
         }
      }
        else
          {
            if (recorrido_puerta>0)       //Si recorrido_puerta mayor de 0
              {
                Serial.write("cerrando"); //Mostrar por puerto serie "cerrando"
                Serial.println();
                int v = analogRead(A0);   //Asignamos a "v" el valor de la entrada analógica A0
                Serial.println(v);        //Mostramos el valor de "v" por el puerto serie
                if (v<2)                  //Sí el valor de "v" es menor que 2
                  {
                    abriendo=1;           //Asignamos a "abriendo" el valor 1
                    Serial.write("interferencia");  //Mostramos por el puerto serie "Interferencia"
                    Serial.println();
                  }
                  //Serial.write(fase);
                  movimientoMotor();       //Llamamos a la función movimientoMotor;
                  fase++;                  //incrementamos fase en 1
                if (fase>7)                //Si fase es mayor que 7 
                  {
                    fase=0;               //Fase igual a 0
                  }
                recorrido_puerta--;       //Incrementamos recorrido_puerta en 1
                tone(sonido,100);         //Llamamos a la funcion "tone" para que sune el buzzer por el pin 3 100ms
                if (digitalRead(ledParpa)==LOW)   //Si ledparpa está a 1
                  {
                    digitalWrite(ledParpa,HIGH);  //Ponemos ledparpa a 0
                  }
              else
                  {
                    digitalWrite(ledParpa,LOW);   //si no, ponemos ledparpa a 0
                  }
              delay(100);                         //Esperamos 100ms
              }
              else
              {
                Serial.write("cerrado no hace nada");//Enviamos al puerto serie "cerrado no hace nada"
                Serial.println();
                noTone(sonido);                     //Nos aseguramos que el buzzer del pin 3 no suene
              }
           }
   }

void movimientoMotor()       //Definición de la función movimientoMotor. Sin parametros
   {  
    digitalWrite( IN1, fases[fase][ 0] );
    digitalWrite( IN2, fases[fase][ 1] );
    digitalWrite( IN3, fases[fase][ 2] );
    digitalWrite( IN4, fases[fase][ 3] );
   }