Consulta problema en manejo de dos reles

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
   } 
      
}

Esto esta mal

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
	} 	
}

Gracias por la respuesta lo modificare y probare de nuevo el codigo ,esta mañana modifique y funciono.

 if (magnetValor==LOW && enciende==0){
       digitalWrite(cortecanto,HIGH); //activacion fresadora 
       delay(3000);
       digitalWrite(avanceOUT,HIGH); //acivacion rodillo
   } escribe o pega el código aquí

De esta manera

    control=digitalRead(paroMarcha);
  if (magnetValor==LOW && enciende==0&& control==HIGH){
       digitalWrite(cortecanto,HIGH); //activacion fresadora 
       delay(3000);
       digitalWrite(avanceOUT,HIGH); //acivacion rodillo
   } 

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.

1 Like

Hola en cuanto la faena me lo permita desmontare la circuiteria provisional y probare tu codigo , esta claro que es mas limpio yo soy novato y llegar a un buen nivel me llevara mucho tiempo.
[https://europe1.discourse-cdn.com/arduino/original/4X/1/f/6/1f69f852153abcee5c2881dd01944b6570c2cc18.jpeg]
https://europe1.discourse-cdn.com/arduino/original/4X/1/3/0/1307592c84378ff36692971a2fc4fcec475f487d.jpeg
https://europe1.discourse-cdn.com/arduino/original/4X/3/a/e/3ae4a29a2b727e14adcf14e416599d55f77b5d5f.jpeg

para esta maquina en el taller para hacer algo decente a veces la faena lo impide.
por cierto leer tus codigos ayuda a aprender

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.

1 Like

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

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.