Hola muy buenas a todos, estoy iniciandome con esto de arduino y queriendo hacer un proyecto copiado de un compañero del foro, pero resulta que no me aclaro con la programación .
se trata de una puerta corredera con un motor paso a paso, a la hora de abrir si que abre pero luego al cerrar no cierra y vuelve a abrir estando en la posicion del final de carrera de cierre. adjunto el codigo para ver si veis algun fallo.
un saludo
int spk = 5; // pin del zumbador
int frecuenciaapertura = 220; // frecuencia correspondiente a la nota La
int frecuenciacierre = 1000; // frecuencia correspondiente a la nota La
const int fincarreracierre = 6;
const int fincarreraapertura = 7;
const int dirPin = 8;
const int stepPin = 9;
int c[5]={131,262,523,1046,2093}; // frecuencias 4 octavas de Do
int cs[5]={139,277,554,1108,2217}; // Do#
int d[5]={147,294,587,1175,2349}; // Re
int ds[5]={156,311,622,1244,2489}; // Re#
int e[5]={165,330,659,1319,2637}; // Mi
int f[5]={175,349,698,1397,2794}; // Fa
int fs[5]={185,370,740,1480,2960}; // Fa#
int g[5]={196,392,784,1568,3136}; // Sol
int gs[5]={208,415,831,1661,3322}; // Sol#
int a[5]={220,440,880,1760,3520}; // La
int as[5]={233,466,932,1866,3729}; // La#
int b[5]={247,494,988,1976,3951}; // Si
int stepDelay;
int pinLDR = A1; // leeremos el pin 0 LDR
int valorLDR = 0; //Aquí almacenamos los datos recogidos del LDR:
int vuelta = 1; //Aqui almacenamos el numero de ciclos de vueltas
int valuefincarreraapertura;
int valuefincarreracierre;
void nota(int a, int b); // declaración de la función auxiliar. Recibe dos números enteros.
void setup()
{
// Visualización de los valores por la consola, hay que clicar en el botón Serial Monitor
Serial.begin(9600);
pinMode(dirPin, OUTPUT);
pinMode(stepPin, OUTPUT);
pinMode(fincarreraapertura, INPUT);
pinMode(fincarreracierre, INPUT);
}
void loop()
{
//Guardamos el valor leido en una variable
valorLDR = analogRead(pinLDR);
// Impresión de los valores leídos por el sensor por pantalla
Serial.print("LDR = ");
Serial.println(valorLDR);
delay (10000);// tiempo de retardo
if (valorLDR <= 110 and vuelta <= 0)
cerrar (); //Esta función es para CERRAR
else if (valorLDR >= 220 and vuelta >= 1)
abrir(); //Esta función es para ABRIR
else
parar();
}
void cerrar() //Esta función es para CERRAR
{
{
// Música de Star Wars para cerrar la puerta
nota(d[1],150);noTone(spk);delay(50);
nota(d[1],150);noTone(spk);delay(50);
nota(d[1],150);noTone(spk);delay(50);
nota(g[1],900);noTone(spk);delay(150);
nota(d[2],900);noTone(spk);delay(50);
nota(c[2],150);noTone(spk);delay(50);
nota(b[1],150);noTone(spk);delay(50);
nota(a[1],150);noTone(spk);delay(50);
nota(g[2],900);noTone(spk);delay(150);
nota(d[2],900);noTone(spk);delay(100);
nota(c[2],150);noTone(spk);delay(50);
nota(b[1],150);noTone(spk);delay(50);
nota(a[1],150);noTone(spk);delay(50);
nota(g[2],900);noTone(spk);delay(150);
nota(d[2],900);noTone(spk);delay(100);
nota(c[2],150);noTone(spk);delay(50);
nota(b[1],150);noTone(spk);delay(50);
nota(c[2],150);noTone(spk);delay(50);
nota(a[1],1200);noTone(spk);delay(1000);
nota(d[1],150);noTone(spk);delay(50);
nota(d[1],150);noTone(spk);delay(50);
nota(d[1],150);noTone(spk);delay(50);
nota(g[1],900);noTone(spk);delay(150);
nota(d[2],900);noTone(spk);delay(50);
nota(c[2],150);noTone(spk);delay(50);
nota(b[1],150);noTone(spk);delay(50);
nota(a[1],150);noTone(spk);delay(50);
nota(g[2],900);noTone(spk);delay(150);
nota(d[2],900);noTone(spk);delay(100);
nota(c[2],150);noTone(spk);delay(50);
nota(b[1],150);noTone(spk);delay(50);
nota(a[1],150);noTone(spk);delay(50);
nota(g[2],900);noTone(spk);delay(150);
nota(d[2],900);noTone(spk);delay(100);
nota(c[2],150);noTone(spk);delay(50);
nota(b[1],150);noTone(spk);delay(50);
nota(c[2],150);noTone(spk);delay(50);
nota(a[1],1200);noTone(spk);delay(180000); //dejamos tres minutos para que entren todas las gallinas
//Fin de música
//Cambiamos la direccion y aumentamos la velocidad
digitalWrite(dirPin, HIGH);
stepDelay = 100;
// Giramos
for (int x = 0; x < 5500; x++) {
valuefincarreracierre = digitalRead(fincarreracierre);
if (valuefincarreracierre == HIGH) {
break;
}else{
Serial.println("Cerrando");
digitalWrite(stepPin, HIGH);
delayMicroseconds(stepDelay);
digitalWrite(stepPin, LOW);
delayMicroseconds(stepDelay);
}
}
vuelta = vuelta + 1;
delay(1000);
}
}
void abrir()
{
//Marcha del imperio para abrir puerta
nota(g[2],500);noTone(spk);delay(100);
nota(g[2],500);noTone(spk);delay(100);
nota(g[2],500);noTone(spk);delay(100);
nota(ds[2],500);noTone(spk);delay(1);
nota(as[2],125);noTone(spk);delay(25);
nota(g[2],500);noTone(spk);delay(100);
nota(ds[2],500);noTone(spk);delay(1);
nota(as[2],125);noTone(spk);delay(25);
nota(g[2],500);
noTone(spk);delay(2000);
//Fin de música para abrir puerta
//Cambiamos la direccion y aumentamos la velocidad
digitalWrite(dirPin, LOW);
stepDelay = 100;
// Giramos 400 pulsos para hacer dos vueltas completas
for (int x = 0; x < 5500; x++) {
valuefincarreraapertura = digitalRead(fincarreraapertura);
if (valuefincarreraapertura == HIGH) {
break;
}else{
Serial.println("Abriendo");
digitalWrite(stepPin, HIGH);
delayMicroseconds(stepDelay);
digitalWrite(stepPin, LOW);
delayMicroseconds(stepDelay);
}
}
vuelta = vuelta - 1;
delay(1000);
}
void parar()
{
digitalWrite(stepPin, LOW);
digitalWrite(stepPin, LOW);
}
void nota(int frec, int t)
{
tone(spk,frec); // suena la nota frec recibida
delay(t); // para despues de un tiempo t
}
/code]