Modificar encendido leds

Hola a todos, tengo un problema con un proyecto de unas barreras con leds para una maqueta de tren, después de recopilar varios programas por la red y adaptarlos a mi proyecto, soy incapaz de hacer funcionar correctamente los leds, en cuanto alimento el nano, funcionan los leds siempre, independientemente del servo.
Mi idea es que empiecen a funcionar en cuanto se active el pulsador y dejen de funcionar cuando el servo haya vuelto a su posición inicial, que hago mal?

Gracias

// LEDS PARPADEAN SIEMPRE REVISAR
#include <VarSpeedServo.h>

int button1 = 3; //button pin, connect to ground to move servo
int press1 = 0;

VarSpeedServo servo1;

const int servoPin1 = 9;



void setup()
{
  servo1.attach(9);
  pinMode(button1, INPUT);
  pinMode(12, OUTPUT);
  pinMode(11, OUTPUT);
  digitalWrite(3, HIGH); //enable pullups to make pin high
 
}

void loop()

{
    press1 = digitalRead(button1);
    
  digitalWrite(12, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(250);              // wait for a second
  digitalWrite(12, LOW);    // turn the LED off by making the voltage LOW
  delay(100);              // wait for a second
  digitalWrite(11, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(250);              // wait for a second
  digitalWrite(11, LOW);    // turn the LED off by making the voltage LOW
  delay(100);              // wait for a second

  servo1.write(500,5);  // GRADOS GIRO, VELOCIDAD
  

 if 
 (press1 == LOW); //CAMBIA SENTIDO DE GIRO SERVO
 
 else
 {
  servo1.write(80,5);

}
}

Hola!! En void setup asigna al pin de cada led el valor LOW. Así deberían empezar apagados.

Segun tu codigo los led no se encienden en funcion de nada. Estan dentro del loop y se activan asi: El lel del pin 12 se enciende y se apaga a las 250 milisegundos, luego a los 100 milisegundos el led del pin 11 se enciende y se apaga a los 250 milisegundos, luego a los 100 milisegundos se repite el ciclo.

Los led no estan conectados a nada. Ponlos dentro del if (debajo del else) y veras como actuan cuando hay señal en el button1

Para lo que tu quieres esto te puede servir:

// LEDS PARPADEAN SIEMPRE REVISAR
#include <VarSpeedServo.h>

int button1 = 3; //button pin, connect to ground to move servo
int press1 = 0;

VarSpeedServo servo1;

const int servoPin1 = 9;


void setup()
{
  servo1.attach(9);
  pinMode(button1, INPUT);
  pinMode(12, OUTPUT);
  pinMode(11, OUTPUT);
  digitalWrite(3, HIGH); //enable pullups to make pin high
 
}

void loop()

{
    press1 = digitalRead(button1);

    if (press1 == HIGH){// si presionas  el boton 

  digitalWrite(12, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(250);              // wait for a second
  digitalWrite(12, LOW);    // turn the LED off by making the voltage LOW
  delay(100);              // wait for a second
  digitalWrite(11, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(250);              // wait for a second
  digitalWrite(11, LOW);    // turn the LED off by making the voltage LOW
  delay(100);              // wait for a second

  servo1.write(500,5);  // GRADOS GIRO, VELOCIDAD
  }
else // si no lo presionas todo off
{
digitalWrite(12, LOW);  
digitalWrite(11, LOW);
}     

 if 
 (press1 == LOW){}; //CAMBIA SENTIDO DE GIRO SERVO
 
 else
 {
  servo1.write(80,5);

}
}

Si te soy sincero esta parte no se lo que quieres hacer ni para que sirve, porque solo dices: si press1 no esta conectado…

if 
 (press1 == LOW); //CAMBIA SENTIDO DE GIRO SERVO
 
 else
 {
  servo1.write(80,5);

}

Hace lo mismo que tu. Tu preguntas si press1 es igual a High para hacer algo y el se pregunta si es igual a low para hacer algo en caso contrario, por eso lo pone en el else :wink:

Lee las normas del foro.
**Edita título y postea usando tags (</>) tu código. **
Ese código debe verse en el hilo y no adjuntarlo. Hazlo en el primer post no en uno nuevo.

Ya está modificado el post, disculpad por el error.

En cuanto a las respuestas gracias por vuestro interés, pero ninguna funciona.

La primera no sirve o soy incapaz de implementarla correctamente.

En la segunda respuesta lo mismo, pero deduzco que en cuanto suelte el button1 se apagarían y no es esta la opción que necesito.

La tercera respuesta el código tiene error, hay algún token de más, después de eliminarlos lo he probado y no funciona el servo, pero si apagan los leds, aunque inmediatamente.
En la parte del código que no entiendes tampoco yo, soy muy novato y mi experiencia se limita a otro proyecto realizado con éxito de una placa giratoria con stepper y aperturas de puertas mediante servos, con Arduino Nano y códigos de la red, modificando valores para mis necesidades.
Como comento en la línea del código, si cambio a HIGH invierte el sentido del servo.

Quizá no me he explicado bien en el primer post.

Se trata de unas barreras en un paso a nivel de una maqueta ferroviaria, en principio el funcionamiento es manual mediante interruptor.
Al cerrar el circuito mueve un servo y debe encender los leds para los semáforos, dos de forma alternativa, al abrir el circuito el servo vuelve a su posición inicial debiendo mantener los leds encendidos hasta el final del movimiento.
El servo está conseguido, velocidad y recorrido, pero los leds encienden siempre nada más conectgar alimentación.

Gracias por vuestro tiempo.

No hay nadie que pueda aportar una solución a mi problema?, soy neófito y no consigo solucionarlo, gracias.

A ver, yo no trabaje con servos pero si tu ya lo tienes conseguido ni hace falta.

No entiendo bien que significa encender los led de forma alternativa. Que son dos luces amarillas que parpadean una si y una no?

Aun sin saber como funcionan los servos se me ocurre que tus led pueden empezar a funcionar cuando el circuito se cierre y hacerlo hasta X tiempo despues de que abra, para que esten activos mientras el servo termina de hacer su trabajo.

Dices que los led te quedan encendidos desde el principio. No se si estas trabajando con el codigo que tienes en el primer post pero si es asi ya te lo conteste. Tus led se activan con independencia de que la señal que tu activas este ON/OFF.

En tu codigo dentro de void loop cargas en press1 la señal que lees del button1. Pero inmediatamente a continuacion juegas con los led con independencia de lo que has leido.

Mas abajo tienes un IF en donde te preguntas si press1 es LOW para en ese caso (mejor dicho en el contrario porque lo ponese en el ELSE) haga determiandas cosas.

Esa es la unica parte de tu codigo en las que algo se hace en funcion del estado button1, lo demas, los led estan SIEMPRE ACTIVADOS. Ya te comente que probaras en poner la secuencia de led DENTRO DEL IF, ya sea en la zona IF si quieres que se active cuando button1 sea LOW o en la zona ELSE si quieres que se active cuando button1 sea HIGH.

Otra cosa que te puede afectar es el rebote, el paso de LOW a HIGH o el contrario, en un interruptor no es UNICO. En la zona de transcion se producen muchos cambios (*) lo llamamos rebote y puede afectar a tu proyecto.

(*) Por ejemplo si tu activas tu quieres que pase de LOW a HIGH, pero al mover el interruptor tienes que tener en cuenta que quizas el cambio real sea: (LOW, HIGH, LOW, HIGH, LOW, HIGH, LOW, HIGH) Cosas de la velocidad de la luz...!!!

Hola. Algo confusa tu explicación, pero repasemos algunos comentarios tuyos.

El servo está conseguido, velocidad y recorrido, pero los leds encienden siempre nada más conectgar alimentación.

Si los leds encienden al conectar la alimentación y no has presionado el pulsador entonces lo tienes mal conectado o el estado que debes esperar al presionarlo debe ser LOW y no HIGH.
Primero identifiquemos como lo has conectado. Es pull down o pull up. Para mi es pull-up porque tienes HIGH siempre y eso haría que los leds parpadeen al energizar el arduino aún sin presionarlo.

Caso pull-up. Tu energizas y siempre ve un HIGH. Si presionas leeras un LOW
Caso pull-down. Tu energizas y siempre leeras un LOW. Al presionar lees un HIGH.
Asi que en función de esto, corrige tu hardware.

Luego seguimos con el semáforo.

Si los leds encienden al conectar la alimentación y no has presionado el pulsador entonces lo tienes mal conectado o el estado que debes esperar al presionarlo debe ser LOW y no HIGH.

No, mira el codigo.

Los led se encienden (se encienden y se apagan en forma alternativa) porque estan fuera de ninguna condicion. Da igual si presiona o no presiona, no es un problema de que este bien o mal conectado. El programa funciona como el lo ha escrito, bien. Cuando arranca los led se empiezan a mover.

Vaya que me pareció haber visto un if algo.. ok, tienes razon cas6678.
Encontes? Que es lo que pide?
Si tienes en el loop los leds para que se enciendan y no quiere que lo hagan, es una conversación de locos.
Me había parecido que estaba leyendo un pulsador y lo hacía mal y por eso se veían.
A ver si clarificas por favor jorart05.

Que quieres que hagan los leds? Deja el servo tranquilo. Enfócate en los leds y como quieres que funcionen.
Tal como has hecho siempre parpadearán al correr el loop sin control alguno. Asi que establece la condicion que los pone en marcha o no.

Hola Jorart05

Si no estas cansado de pruebas haz esta:

// codigo anterior...
  digitalWrite(12, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(1500);              // wait for a second
  digitalWrite(12, LOW);    // turn the LED off by making the voltage LOW
  delay(1000);              // wait for a second
  digitalWrite(11, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(1500);              // wait for a second
  digitalWrite(11, LOW);    // turn the LED off by making the voltage LOW
  delay(1000);              // wait for a second
// codigo posterior ...

Y luego nos lo cuentas.

Verás el problema puede deberse a que estas jugando con milisegundos y como el programa va muy rapido el parpadeo no se distingue de un nivel medio de luz.

Lo he modificado a 1,5 segs ON - 1 seg OFF

Ya he conseguido, después de infinidad de pruebas y leyendo multitud de programas, encender los leds al activar el interruptor, como bien comentáis, no estaban asociados a ningún pin, ahora ya funciona correctamente, pero sigo con el problema del apagado, en cuanto abro el circuito se apagan antes de que el servo levante las barreras.

Para aclarar, al cerrar el circuito empiezan a parpadear los leds y acto seguido bajan las barreras, hasta aquí correcto.
Al abrir el circuito dejan de parpadear los leds y después suben las barreras, necesito que primero suban las barreras y después apaguen los leds, es decir, un retraso de apagado.
Muchas gracias por vuestra ayuda.

Cuando presentes un problema recuerda que no estamos en tu cabeza.
Primero dinos como hiciste de que se trata, un tren de modelismo.
Luego nos dices.. quiero hacer tal o cual cosa. Pero explicas el objetivo, no tu programa y lo que hace mal.
Entonces si pones el programa y dices que no hace.

De ese modo es mas fácil entender lo que persigues.
Mira desde tu post inicial hasta mi comentario como no dijiste nada sobre un interruptor que accione las luces lo que era lógico para mi porque el semáforo debe accionarse con la presencia o proximidad del tren para simular situaciones.
Así que tenlo presente, para la próxima consulta.

Cuando uno hace una pregunta deberia perder un poco de tiempo en leer las respuestas que le dan.

Insistes ahora en decir que los led se te apagan cuando la barrera empieza a subir y tu quieres esperar a que terminen de subir, no es eso? Pues ya te lo conteste.

Aun sin saber como funcionan los servos se me ocurre que tus led pueden empezar a funcionar cuando el circuito se cierre y hacerlo hasta X tiempo despues de que abra, para que esten activos mientras el servo termina de hacer su trabajo.

Se trata de que calcules cuanto tardan las barreras en subir y que el apagado de led se produzca cuando las barreras suban (empiecen a subir) + el tiempo que tardan.

Como te dijo Surbyte si pones el codigo a todos nos es mas facil ayudarte, yo ahora te podria proponer la modificacion sobre tu propio codigo.

Basicamente cuando el servo para subir la barrera se activa tomas el tiempo (una vez) y lo guardas en una variable, tambien previamente gusrdas el tiempo de subir las barreras.

Tiemposubir=2000; // el que sea, tomalo tu
Barreraarriba=Millis();

Y la secuencia de led encendidos los pones dentro de un if asi:

If ((Barreraarriba+Tiemposubir)>Millis){
///LED ENCENDIDOS
}
ELSE {
// LED APAGADOS
}

Vaya tirón de orejas por la mañana, vuelvo a disculparme por la dificultad en explicar mi problema, voy a ver si lo explico correctamente y os pongo el último código que he puesto en el Nano.
El problema no está en la lectura de las respuestas, es que soy muy novato y no se implementar las soluciones que facilitáis, llega un momento que me pierdo entre tanto código y pruebas.

Son una barreras de paso a nivel para una maqueta de tren, accionadas mediante un servo y activando un semáforo de encendido alternativo y otro fijo, ( esto es una última modificación uno de los semáforos ya es intermitente de fábrica ), en principio es un interruptor el que activa el funcionamiento del sistema, sin ningún otro automatismo.
El problema reside en que necesito que los semáforos se apaguen después de haber levantado la barrera, no antes como hacen ahora.

// LEDS IMPLEMENTAR RETARDO APAGADO, SALIDA 10 LED FIJO, LEDS ENCIENDEN AL PULSAR Y APAGA AL DESCONECTAR
#include <VarSpeedServo.h>

int button1 = 3; //button pin, connect to ground to move servo
int press1 = 0;
int buttonState = 1; // set buttonState

VarSpeedServo servo1;

const int servoPin1 = 9;



void setup()
{
  servo1.attach(9);
  pinMode(button1, INPUT);
  pinMode(12, OUTPUT); // LED INTERMITENTE
  pinMode(11, OUTPUT); // LED INTERMITENTE
  pinMode(10, OUTPUT); // LED FIJO
  digitalWrite(3, HIGH); //enable pullups to make pin high

}

void loop()

{
   press1 = digitalRead(button1); 
 buttonState = digitalRead(button1); // read and save to the variable "buttonState" the actual state of button

if (buttonState == LOW)
  digitalWrite(12, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(500);              // wait for a second
  digitalWrite(12, LOW);    // turn the LED off by making the voltage LOW
  delay(100);              // wait for a second

if (buttonState == LOW)  
  digitalWrite(11, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(250);              // wait for a second
  digitalWrite(11, LOW);    // turn the LED off by making the voltage LOW
  delay(100);              // wait for a second
if (buttonState == LOW) 
digitalWrite (10,HIGH); //SALIDA FIJA PARA LED INTERMITENTE

  
servo1.write(500,5);  // GRADOS GIRO, VELOCIDAD

if 
(press1 == HIGH); //CAMBIA SENTIDO DE GIRO SERVO
else
{
servo1.write(80,5);
}

if (buttonState == HIGH) 
digitalWrite (10,LOW);
}

Ahora intentaré colocar el código de la última respuesta.

Gracias.

Hola Jorart05

No son tirones de orejas, son lecciones practicas jejeje,..
Si el tema de la programacion te gusta y decides profundizar en el, comprenderas que es indispensable seguir unas reglas basicas para no volverse loco.
Y como dice el refrán: " la letra con sangre entra" jajaja..

Bueno y vamos al tema.
Veo que tu sketch sigue manteniendo delays de 0,5seg (antes 0,25seg) y de 0,1 seg. y que en el comentario de la linea pones como: "wait for a second".
Mi pregunta es ¿es un error?, y caso de no serlo ¿no es demasiado rapida la intermitencia?
Aunque esto no es tu principal preocupacion, me ha despertado la curiosidad.

Saludos

No es un error, esta alternancia parece adecuada para un semáforo con dos leds, tampoco es complicación modificarlo si veo que es excesiva la rapidez.

Al pulsar el boton, la barrera sube hasta su punto maximo?
Y al soltarlo baja al punto inicial?

Espero respuesta