Terminar codigo con un boton

HOLA, gracias de antemano por la ayuda

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

Saludos.

El problema no es el pulsador. El problema es el delay. La única solución es saber leer el botón y usar millis.

Te dejo tres enlaces a tres tutoriales que te van ayudar a solucionar el problema:

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.

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