Saludos.
Soy nuevo con esto, soy técnico electrónico y aficionado al DIY, el caso es que estoy realizando una automatización de una barrera para el acceso de vehículos y el funcionamiento que busco seria el siguiente.
Placa: NANO 328
Palca de 8 relés.
Bien uso 2 juegos de 3 relés para hacer la inversión de un motor monofásico, 3 relés para un sentido y tres para otro, ambos juegos se activan con una sola salida cada juego, luego uso otro relé para alimentar el conjunto después de haber activado el modo de inversión.
La necesidad es:
Si la barrera está subiendo y doy un pulso en la interrupción (1), debe parar y volver a bajar.
Si está bajando y pulso, debe parar y subir de nuevo.
Cuando hace la subida y no se le da orden debe esperar el tiempo indicado y volver a bajar, pero si por el contrario se le da un nuevo pulso, debe permanecer parada arriba has recibir un nuevo pulso que la hace bajar sin esperar.
Bien tengo unoardusim con el que simulo el programa y el cual me funciona sin problemas, pero al cargarlo a la placa no hace lo que debe.
A ver si alguien ve en que fallo.
Gracias a todos de ante mano.
//PROGRAMA BARRERA HIDRAULICA
//PROGRAMA BARRERA HIDRAULICA
//Definir pines de salida
#define rldown 4
#define rlup 5
#define rlpow 6
int tsubida = 13;
int tbajada = 10;
volatile int c = 0;
volatile int b = 0;
volatile int state = 1; //state 1=subida, state 2=bajando, state 3=bajada, state 4=subiendo, state 5=parada arriba
int tespera = 30;
void control()
{
para();
b = 1;
c=0;
}
void setup()
{
// put your setup code here, to run once:
pinMode(rldown, OUTPUT);
pinMode(rlup, OUTPUT);
pinMode(rlpow, OUTPUT);
pinMode(3, INPUT);
digitalWrite(rlpow, HIGH);
digitalWrite(rldown, HIGH);
digitalWrite(rlup, HIGH);
state = 1;
attachInterrupt(1, control, FALLING);
}
void sube()
{
delay(500);
digitalWrite(rlup, LOW); delay(500); digitalWrite(rlpow, LOW);
}
void baja()
{
delay(500);
digitalWrite(rldown, LOW); delay(500); digitalWrite(rlpow, LOW);
}
void para()
{delay(500);
digitalWrite(rlpow, HIGH); digitalWrite(rldown, HIGH); digitalWrite(rlup, HIGH);
}
void loop()
// put your main code here, to run repeatedly:
{ delay(500);
while (state==1) //subida
{
while (b==1)
{
state=5; c=1; break;
}
while (b==0)
{
for (int cuenta=0;cuenta < tespera;cuenta++)
{
if (b==0)
{ delay(1000); digitalWrite(13,LOW);}
else
{ break;}
}
while (b==0) { baja(); state=2; b=0;break;} break;
}break;
}
while (state==2) //bajando
{
while (b==0)
{
for (int tb=0;tb < tbajada;tb++)
{ if (b==0)
{ delay(1000);digitalWrite(13,LOW);}
else
{ break;}
}
while (b==0) { para(); state=3; b=0; c=0;break;} break;
}
while (b==1)
{
para(); delay(1000); sube(); state=4; b=0; break;
}
}
while (state==3) //bajada
{
while (b==1)
{
sube(); state=4; b=0;
}break;
}
while (state==4) //subiendo
{
while (b==0)
{
for (int tb=0;tb<tsubida;tb++)
{ if (b==0)
{ delay(1000);digitalWrite(13,LOW);}
else
{ break;}
}
while (b==0) { para(); state=1;break;}break;
}
while (b==1)
{
para(); delay(500); baja();state=2;b=0;break;
}
}
while (state==5) //parada
{
while (c==1)
{ b=0;c=0; break;}
while (b==1)
{
baja(); state=2; b=0;
for (int tb=0;tb<tbajada;tb++)
{ if (b==0)
{ delay(1000);digitalWrite(13,LOW);}
else
{ break;}break;
}
}break;
}
}
Moderador: Editado para que el código sea visible. Los códigos se adjuntan cuando superan los 9000 caracteres.
probada.ino (2.32 KB)