Estoy intentando hacer un semáforo para bmx race, y debo detener el semáforo en cualquier momento por medio de un botón, no tengo aun los conocimientos para recrearlo, me podrían guiar y así seguir con el proyecto, gracias nuevamente
int rojo=12;
int amarillo=9;
int amarillo2=8;
int verde=6;
int pulsador=2;
int pulsador2=1;
void setup(){
pinMode(rojo, OUTPUT); // led rojo - pin de salida
pinMode(verde, OUTPUT); // led verde - pin de salida
pinMode(amarillo, OUTPUT); // led amarillo - pin de salida
pinMode(amarillo2, OUTPUT);
pinMode(pulsador, INPUT); // pulsador - pin de entrada
pinMode(pulsador2, OUTPUT);
}
void loop() { // bucle infinito
if (digitalRead(pulsador)){
digitalWrite(verde, HIGH); // se enciende el led verde
delay(1000);
digitalWrite(verde, LOW); // se apaga el led verde
digitalWrite(amarillo2, HIGH); // se enciende el led verde
delay(1000);
digitalWrite(amarillo2, LOW);
digitalWrite(amarillo, HIGH); // se enciende el led amarillo
delay(1000); // pausa 1 segundo
digitalWrite(amarillo, LOW); // se apaga el led amarillo
digitalWrite(rojo, HIGH); // se enciende el led rojo
delay(3000);
digitalWrite(rojo, LOW); // se apaga el led rojo
}
}
Hola, desconozco cómo tienes conexionado el pulsador. Puede ser que necesites utilizar resistencia PullUp/down
te paso link: resistencias en pulsadores
Respecto a la pregunta, y haciendo una modificación rápida y no óptima:
if (digitalRead(pulsador)==HIGH){
digitalWrite(verde, HIGH); // se enciende el led verde
delay(1000);
...bla bla bla
}
else //apagamos todo
{
digitalWrite(verde, LOW);
digitalWrite(amarillo2, LOW);
digitalWrite(amarillo, LOW);
digitalWrite(rojo, LOW);
while(1); //aqui me quedo para siempre hasta que se reinicie Arduino
}
Ten en cuenta que depende del pulsador, puede ser que en el "if" necesites poner ==LOW en vez de ==HIGH
Tu código tiene 6 segundos de demora antes de poder responder de nuevo a un pulsador, por lo tanto NO SIRVE.
Se que estas empezando pero la recomedación es NO USAR DELAY.
Ve a documentación y lees los tutoriales que hay usando millis().
También necesitas una máquina de estados para reemplazar todo pero eso si que será complicado en esta etapa para tu nivel.
Pruebalo a ver como trabaja
#include <Arduino.h>
int rojo = 12;
int amarillo = 9;
int amarillo2 = 8;
int verde = 6;
int pulsador = 2;
int pulsador2 = 1;
int boton, botonAnt = 0, estado = 0;
byte maquina = 0;
unsigned long start;
void setup() {
pinMode(rojo, OUTPUT); // led rojo - pin de salida
pinMode(verde, OUTPUT); // led verde - pin de salida
pinMode(amarillo, OUTPUT); // led amarillo - pin de salida
pinMode(amarillo2, OUTPUT);
pinMode(pulsador, INPUT); // pulsador - pin de entrada
pinMode(pulsador2, OUTPUT);
}
void loop() { // bucle infinito
boton = digitalRead(pulsador);
if (boton && !botonAnt) {
estado = !estado;
}
botonAnt = boton;
if (estado) {
switch(maquina) {
case 0: digitalWrite(verde, HIGH); // se enciende el led verde
start = millis();
maquina = 1;
break;
case 1: if (millis() - start > 1000UL) {
digitalWrite(verde, LOW); // se apaga el led verde
digitalWrite(amarillo2, HIGH); // se enciende el led verde
start = millis();
maquina = 2;
}
break;
case 2: if (millis() - start > 1000UL) {
digitalWrite(amarillo2, LOW);
digitalWrite(amarillo, HIGH); // se enciende el led amarillo
start = millis();
maquina = 3;
}
break;
case 3: if (millis() - start > 1000UL) {
digitalWrite(amarillo2, LOW);
digitalWrite(rojo, HIGH); // se enciende el led rojo
start = millis();
maquina = 4;
}
break;
case 4: if (millis() - start > 3000UL) {
digitalWrite(rojo, LOW); // se apaga el led rojo
maquina = 5;
}
break;
case 5: break;
}
}
else
maquina = 0;
}
Si quieres entenderlo, solo consulta.
La máquina de estados esta indicada en switch(maquina) y cada uno de sus casos de 0 a 5
Cada case o caso, es uno de los estados lógicos presentes en tu código inicial, solo que ahora lucen diferentes. Cada caso ejecuta la secuencia que tu mismo diseñaste solo que no usa delay() sino que ahora aprovecha una funcionalidad interna de todo el ambiente arduino que es millis() o sea un cronómetro en milisegundos que arranca en 0 cuando el Arduino (sea cual sea se energiza). Eso es fantástico pero también puede resultar dificil de usar. Bueno no tanto.
Imagina que tienes un cronómetro y tus corredores salen de la partida pero tu debes indicar los tiempos parciales de cada vuelta como harías? Pues cuando pasa un corredor pausas sin detener el cronometro (es lo que hacemos cuando pongo start = millis() ) y hago que esa variable sepa a cuantos milisegundos pasó dicho evento (corredor en la analogía).
Ahora en tu caso lo que quieres es hacer algo cuando transcurran 1000 o 3000 mseg.
Entonces si hago la diferencia entre millis() y ese tiempo capturado tendré lo que busco.
Como verás reutilizo la misma variable porque solo tiene sentido en el contexto del caso que estoy usando.
Todo eso ocurre sin demoras.
Si vuelves a presionar el pulsador, se detiene la operación porque depende de que boton se pulse, y con cada pulsacion cambios el valor a estado que cambiará a 1 y con la nueva pulsación a 0 y asi susecivamente.