Hola tengo un problema en el control de dos reles por arduino desarrollo el funcionamiento deseado
1 al pisar el primer pedal "avanceIN" tiene un sensor magnetico activa una fresadora "corteCanto" 3 segundos despues activa un rodillo "avanceOUT"
2 AL Pisar un segundo pedal "tijeraIN" desactiva la fresadora "corteCanto" y el rodilEL PROBLEMA lo "avanceOUT"
3 Hay un interruptor para que en posicion off mantenga desactivada la fresadora "corteCanto" aunque se pise el pedal "avanceIN" Y mantenga activado siempre "avanceOUT". y en posicion on permita el funcionamiento de los pasos 1 y 2.
El problema es que en posicion off se activa y desactiva la fresadora " corteCanto" mientra se pisa el primer pedal.
añado comentarios al codigo para que se vea mejor.
cualquier ayuda de mejora del codigo es bienvenida.
gracias
const int avanceIN = A5; //entrada sensor magnetico pedal avance
const int tijeraIn = A1; // entrada sensor optico corte tijera
const int avanceOUT = 9; //salida activacion rele rodillo cola
const int corteCanto = 12; //salida activacion rele fresadora aspiracion
const int paroMarcha= 11; //interruptor paro y encendido Para dejar HIGH rodillo cola y LOW la fresadora.
int optoValor;
int magnetValor;
int control;
int enciende;
int apaga =0;
void setup() {
pinMode(avanceIN,INPUT);
pinMode(avanceOUT,OUTPUT);
pinMode(tijeraIn, INPUT);
pinMode(cortecanto,OUTPUT);
pinMode(paroMarcha,INPUT);
digitalWrite(corteCanto,LOW);
digitalWrite(avanceOUT,LOW);
}
void loop(){
control=digitalRead(paroMarcha);
if (control==LOW){
digitalWrite(avanceOUT,HIGH);
digitalWrite(corteCanto, LOW);
enciende=1; // mantener en off fresadora y permitir activacion y desactivacion de rodillo
}
else if (enciende!=apaga ){
digitalWrite(avanceOUT,LOW);
digitalWrite(corteCanto, LOW);
enciende=0; // permitir activacion y desactivacion de rodillo y fresadora
}
optoValor=analogRead(tijeraIn);//lectura sensor optico
if (optoValor >800){
digitalWrite(corteCanto, LOW);
digitalWrite(avanceOUT,LOW);
delay(1000);
}
magnetValor=digitalRead(avanceIN);
if (magnetValor==LOW && enciende==0){
digitalWrite(cortecanto,HIGH); //activacion fresadora
delay(3000);
digitalWrite(avanceOUT,HIGH); //acivacion rodillo
}
}
else if (enciende!=apaga ){
digitalWrite(avanceOUT,LOW);
digitalWrite(corteCanto, LOW);
enciende = 1; // permitir activacion y desactivacion de rodillo y fresadora
}
Apaga = 0 siempre, no lo cambias en tu loop jamás.
cuando enciende cambia a 1 es distinto a apaga y entones cambia los valores.
Primero no tiene razón de estar, asi que quítalo.
Leve modificación a tu loop, resto bien
void loop(){
magnetValor = digitalRead(avanceIN);
optoValor = analogRead(tijeraIn);//lectura sensor optico
control = digitalRead(paroMarcha);
// al pisar el primer pedal "avanceIN" tiene un sensor magnetico
// activa una fresadora "corteCanto" 3 segundos despues activa un rodillo "avanceOUT"
if (!magnetValor==LOW && enciende==1){
digitalWrite(cortecanto,HIGH); //activacion fresadora
delay(3000);
digitalWrite(avanceOUT,HIGH); //acivacion rodillo
}
// AL Pisar un segundo pedal "tijeraIN" desactiva la fresadora "corteCanto" y
// el rodilEL PROBLEMA lo "avanceOUT"
if (optoValor >800){
digitalWrite(corteCanto, LOW);
digitalWrite(avanceOUT,LOW);
delay(1000);
}
// Hay un interruptor para que en posicion off mantenga desactivada la fresadora "corteCanto" aunque se pise el pedal "avanceIN"
// Y mantenga activado siempre "avanceOUT"
// en posicion ON permita el funcionamiento de los pasos 1 y 2.
if (control==LOW){
digitalWrite(avanceOUT,HIGH);
digitalWrite(corteCanto, LOW);
enciende = 0; // mantener en off fresadora y permitir activacion y desactivacion de rodillo
}
else {
digitalWrite(avanceOUT,LOW);
digitalWrite(corteCanto, LOW);
enciende = 1; // permitir activacion y desactivacion de rodillo y fresadora
}
}
la verdad no tengo claro si tenia que realizar de nuevo la lectura de "control" en este bucle o si hubiera recogido el valor desde el primer IF ,estoy muy verde aun Soy un viejo y eterno aprendiz,aunque por temporadas a duras penas use javascript , php,html en realidad lo mio era y hace mucho mucho el ensamblador en los 6502 , z80 o algun 16f84 etc un pc avanzado era el comodore vic20 en esa epoca.
De nuevo mil Gracias
Mira como lo hice que es mas limpio que lo que tu haces.
Tu complicas el código agregando mas flags o banderas que controlan algo que no lo requiere.
Eso si lo que yo te sugerí funciona.
Cuando son estados digitales, suelo leerlos todos juntos. Cómo el tuyo es un código pequeño no me hago problemas por el uso de delay() pero en general no uses delay(). Solo genera problemas.
Por cada delay(3000) piensa que hay 3 segundos que no atiendas a ninguna entrada digital o al pedal mencionado.
Entonces a futuro, ve a Documentación y lee sobre como se usa millis() y máquinas de estado.
No conocia el metodo de adjuntar imagenes ya esta corregido.
Hoy a pesar de tener resistencias pull down externas, al enchufar otra maquina , en la misma linea electrica disparo la fresadora ,¿ servira de algo? al igual que en otros micros usar resistencias al pull down internas de arduino junto con las externas
Gracias por tus consejos Surbyte