Go Down

Topic: Modificar encendido leds (Read 3100 times) previous topic - next topic

cas6678

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.

Quote
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.

Code: [Select]

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


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

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



Jorart05

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.

Code: [Select]

// 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.

Alfaville

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

Jorart05

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.

Alfaville

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

Espero respuesta


Jorart05

Exactamente, esta cofigurado así,  levantadas y al cerrar el interruptor encienden los leds, después de un par de segundos bajan las barreras, al abrir el circuito apagan y también en unos segundos suben a su posición.

Alfaville

Pregunto:



Al cerrar el interruptor, la barrera sube hasta su punto maximo?

Me respondes:



Exactamente, esta cofigurado así,  levantadas y al cerrar el interruptor encienden los leds


En que quedamos ¿estan levantadas sin cerrar el interruptor?. No me queda claro, pero si quiero ayudarte no tengo mas remedio que tenerlo claro.

Dime la secuencia completa, por ejemplo:
" en reposo la barrera esta levantada y el interruptor off. Tras cerrar el interruptor comienzan a parpadear los led y la barrera baja hasta detenerse, tras lo cual los led se apagan,.." (esta secuencia es un ejemplo).

Jorart05

Es correcto lo que citas, excepto que los leds siguen encendidos, como ha de ser, mientras la barrera está abajo, al abrir el interruptor se apagan y sube la barrera.
Lo que necesito es a la inversa, que suba la barrera y se apaguen luego.

Alfaville

Que sentencia es la que sube la barrera:
esta? <servo1.write(500,5);>
o esta otra? <servo1.write(80,5);>

Jorart05


Alfaville


Alfaville

Bueno, aunque esto no debe hacerse, creo que por esta vez ya te hemos hecho reflexionar bastante.

Te adjunto mi version del sketch (mejorable seguro) y no exenta de algun pequeño bug. No tengo la libreria que usas para el servo ni el montaje asi pues no está probado. Eso te toca a ti

Espero tus comentarios, y si quieres aclaracion extra sobre el sketch, pregunta.

Al final para poder completar la subida ha sido necesaria la solucion propuesta por cas6678.

Code: [Select]

// Sketch modelizacion de barrera paso a nivel
#include <VarSpeedServo.h>
#define ESPERA 2000   // milisegundos que tarda en completarse la maniobra de subida

const int servoPin1 = 9;
int button1 = 3;      // Interruptor (usar Pull Up)
int buttonState;      // Estado del interruptor
unsigned long duracion = 0;   // Variable para la toma inicial del tiempo
bool maniobra=false;  // Indica que hemos comenzado un ciclo de baja-sube

VarSpeedServo servo1;

void setup()
{
  servo1.attach(9);
  pinMode(button1, INPUT);
  pinMode(12, OUTPUT);    // LED intermitente
  pinMode(11, OUTPUT);    // LED intermitente
  pinMode(10, OUTPUT);    // LED de parpadeo fijo
  digitalWrite(3, HIGH);  // Activa pullup interno
}

void loop()
{
 buttonState = digitalRead(button1); // Leemos y guardamos el estado del interruptor

if (buttonState == LOW)
{
  digitalWrite(10,HIGH); // Led de parpadeo fijo a ON
  servo1.write(500,5);   // Bajamos la barrera
  maniobra = true;
  
  while((buttonState=readDigital(button1))==LOW)
  {
    digitalWrite(12,HIGH);   // Led 12 ON
    delay(500);              // 0,5 seg de pausa
    digitalWrite(12,LOW);    // Led 12 OFF
    delay(100);              // 0,1 seg de pausa
    digitalWrite(11,HIGH);   // Led 11 ON
    delay(250);              // 0,25 seg de pausa
    digitalWrite(11,LOW);    // Led 11 OFF
    delay(100);              // 0,1 seg de pausa
  }
}
else
{
  digitalWrite (10,LOW);  // Apagamos led de intermitencia fija
  if(maniobra)            // Tenemos a medio una maniobra baja-sube ?
  {
    servo1.write(80,5);   //Subimos la barrera
 maniobra=false;       // Maniobra completada
 duracion=millis();    // tomamos tiempo inicial
    while((duracion+ESPERA)<millis())
    {
      digitalWrite(12,HIGH);   // Led 12 ON
      delay(500);              // 0,5 seg de pausa
      digitalWrite(12,LOW);    // Led 12 OFF
      delay(100);              // 0,1 seg de pausa
      digitalWrite(11,HIGH);   // Led 11 ON
      delay(250);              // 0,25 seg de pausa
      digitalWrite(11,LOW);    // Led 11 OFF
      delay(100);              // 0,1 seg de pausa
    }
  }
}
}


Secuencia de funcionamiento:
- inicialmente barrera levantada y leds apagados (segun tus palabras)
- cerramos el interruptor y comienzan a parpadear los leds y a bajar la barrera. Una vez la barrera esta abajo los leds SIGUEN parpadeando, situacion que se mantiene hasta que levantemos de nuevo la barrera.
- abrimos el interruptor y la barrera sube (los leds siguen parpadeando) y una vez esta arriba los leds se apagan (el tiempo de esta maniobra está en <ESPERA>).

Jorart05

Después lo pruebo, muchas gracias.

Alfaville

No te olvides de comentar.

surbyte

Usar delay dentro de millis() hace que el sistema no verá los cambios hasta terminado el ciclo de parpadeo de leds. 
Ten muy presente eso jorart05. 

Go Up