Semáforo con botón peatonal (para pasar)

Hola que tal, estoy con un proyecto escolar, y necesito de un semáforo que funcione siempre y al presionar el botón, cambie a rojo y después vuelva a su secuencia normal, tengo el siguiente código, y el semáforo funciona perfectamente pero al presionar el botón no pasa nada, el botón esta conectado de un lado a la linea de entrada (pin 2) y a la corriente de 5v. y al otro lado al GND, si alguien puede ayudarme a saber como hacer que al presionar el botón, se cambie a rojo, me ayudaría mucho
Gracias.

int led_red = 13;
int led_yellow = 12;
int led_green = 11;
int estado;

void setup() {

 pinMode(led_red, OUTPUT);
 pinMode(led_yellow, OUTPUT);
 pinMode(led_green, OUTPUT);
 pinMode(2, INPUT);
}

void loop() {
   estado = digitalRead(2);
if(estado == LOW){
Rojo();
}else{
Verde();
for (int i = 0; i < 5; i++){
BlinkVerde();
}
Amarillo();
 for (int i = 0; i < 2; i++){
BlinkAmarillo();
}
Rojo();

}
}

void Verde(){
 digitalWrite(led_red, LOW);
 digitalWrite(led_yellow, LOW);
 digitalWrite(led_green, HIGH);
 delay(500);    
}

void BlinkVerde(){
  digitalWrite(led_red, LOW);
 digitalWrite(led_yellow, LOW);
 digitalWrite(led_green, LOW);
 delay(500);
   digitalWrite(led_red, LOW);
 digitalWrite(led_yellow, LOW);
 digitalWrite(led_green, HIGH);
 delay(1000);
 digitalWrite(led_red, LOW);
 digitalWrite(led_yellow, LOW);
 digitalWrite(led_green, LOW);
 delay(500);
}

void Amarillo(){
digitalWrite(led_red, LOW);
 digitalWrite(led_yellow, HIGH);
 digitalWrite(led_green, LOW);
 delay(5000);  
}

void BlinkAmarillo(){
  digitalWrite(led_red, LOW);
 digitalWrite(led_yellow, LOW);
 digitalWrite(led_green, LOW);
 delay(500);
   digitalWrite(led_red, LOW);
 digitalWrite(led_yellow, HIGH);
 digitalWrite(led_green, LOW);
 delay(1000);
  digitalWrite(led_red, LOW);
 digitalWrite(led_yellow, LOW);
 digitalWrite(led_green, LOW);
 delay(500);
}
void Rojo(){
digitalWrite(led_red, HIGH);  
 digitalWrite(led_yellow, LOW);
 digitalWrite(led_green, LOW);
 delay(500);  
}

P.D.: No hagan mucho caso a los tiempos, son para hacer un poco mas rápido las pruebas

Hola, en principio no veo nada mal en el sofware, pero no entiendo como has conectado el botón. ¿podrias subir un pequeño esquema aunque sea a mano alzada?.

El botón lleva un terminal conectado a masa (GND) el otro terminal al pin del arduino, el pin debes definirlo como INPUT_PULLUP.

El código no está mal, el problema es que los delay impiden que leas el boton hasta que termine la secuencia.
Una solución es que pongas la secuencia de colores dentro de un lazo

while(estado == HIGH){

y antes de cada cambio de color vuelves a leer el botón y si estado es LOW sales con break, así cuando lo pulsas sale del while y ya fuera del while haces el if() para llamar a rojo()

Hola @gatul Dices que el boton lleva, o querias decir ¿deberia llevar? y eso es lo que me preocupa según como el describe la conexión:

el botón esta conectado de un lado a la linea de entrada (pin 2) y a la corriente de 5v.

Me preocupa lo que halla echo y por eso le hago la pregunta. Si decimos en tu contestación "debería llevar" coincido al 100% con tu opinión de que esa es la solución.
Saludos.

Si prefieres llevaría o debería estar conectado.
Para mi, lleva el terminal conectado a masa (en la configuración acorde al código) porque no hay lugar a dudas que debe ser así. :wink:

Hola otra vez ¿y si lo que ha echo, como creo según el dice, es conectar todo junto, el puerto, el VCC y un lado del botón. Conectando el otro terminal del boton a masa?.
Yo no lo veo tan claro, espero que conteste.
Saludos.

Yo dije como debe conectarlo.
Si lo conectó como tu supones va a obtener un lindo chispazo (salvo que sea un pulsador inversor de 3 pines como el que se usa o usaba en los gabinetes de PC).

@alxmoram me olvidé de recordarte que debes editar tu post y mostrar el código de acuerdo con las Normas del foro, punto 7.

Gracias a ambos por responder
Tome en cuenta la sugerencia de @gatul, y me quedo el código así

int led_red = 13; // the red LED is connected to Pin 0 of the Arduino
int led_yellow = 12; // the yellow LED is connected to Pin 1 of the Arduino
int led_green = 11;
int estado;

void setup() {
  // set up all the LEDs as OUTPUT
  pinMode(led_red, OUTPUT);
  pinMode(led_yellow, OUTPUT);
  pinMode(led_green, OUTPUT);
  pinMode(2, INPUT);
}

void loop() {
    estado = digitalRead(2);
while(estado==HIGH){
  Verde();
  BlinkVerde();
  Amarillo();
  BlinkAmarillo();
  Rojo();
  
}
if(estado==LOW){
  delay(2000);
  Rojo();
}
}

void Verde(){
  digitalWrite(led_red, LOW); 
  digitalWrite(led_yellow, LOW);
  digitalWrite(led_green, HIGH);
  delay(2000);    
}

void BlinkVerde(){
   digitalWrite(led_red, LOW); 
  digitalWrite(led_yellow, LOW);
  digitalWrite(led_green, LOW);
  delay(500); 
    digitalWrite(led_red, LOW); 
  digitalWrite(led_yellow, LOW);
  digitalWrite(led_green, HIGH);
  delay(1000); 
  digitalWrite(led_red, LOW); 
  digitalWrite(led_yellow, LOW);
  digitalWrite(led_green, LOW);
  delay(500); 
}

void Amarillo(){
 digitalWrite(led_red, LOW);
  digitalWrite(led_yellow, HIGH);
  digitalWrite(led_green, LOW);
  delay(5000);  
}

void BlinkAmarillo(){
   digitalWrite(led_red, LOW); 
  digitalWrite(led_yellow, LOW);
  digitalWrite(led_green, LOW);
  delay(500); 
    digitalWrite(led_red, LOW); 
  digitalWrite(led_yellow, HIGH);
  digitalWrite(led_green, LOW);
  delay(1000); 
   digitalWrite(led_red, LOW); 
  digitalWrite(led_yellow, LOW);
  digitalWrite(led_green, LOW);
  delay(500); 
}
void Rojo(){
 digitalWrite(led_red, HIGH);  
  digitalWrite(led_yellow, LOW);
  digitalWrite(led_green, LOW);
  delay(20500);  
}

No se si es a eso a lo que se refería, aun no entiendo muy bien como comprobar el estado del botón después de cada cambio de color, agradecería que me dijeras como hacer eso
Y en cuanto al circuito es el siguiente

Al final quedo así el código, con su ayuda

int led_red = 13;
int led_yellow = 12;
int led_green = 11;
int estado;

void setup() {

  pinMode(led_red, OUTPUT);
  pinMode(led_yellow, OUTPUT);
  pinMode(led_green, OUTPUT);
  pinMode(2, INPUT_PULLUP);
    Serial.begin(9600);
}

void loop() {
    estado = digitalRead(2);
  Serial.println(estado);

    do{ 
 Verde();
      for(int i=0;i<15;i++){
     estado = digitalRead(2);
        delay(1000);
        if(estado==LOW){
          delay(2000);
          Rojo();
          break;
        }
      }
  }while(estado==LOW);
  for(int i=0;i<5;i++){
    BlinkVerde();
  }
  Amarillo();
    for(int i=0;i<2;i++){
    BlinkAmarillo();
  }
  Rojo();
}


void Verde(){
  
  digitalWrite(led_red, LOW); 
  digitalWrite(led_yellow, LOW);
  digitalWrite(led_green, HIGH);

}

void BlinkVerde(){
   delay(250); 
   digitalWrite(led_red, LOW); 
  digitalWrite(led_yellow, LOW);
  digitalWrite(led_green, LOW);
 delay(500); 
    digitalWrite(led_red, LOW); 
  digitalWrite(led_yellow, LOW);
  digitalWrite(led_green, HIGH);
  delay(750); 
  digitalWrite(led_red, LOW); 
  digitalWrite(led_yellow, LOW);
  digitalWrite(led_green, LOW);
  
}

void Amarillo(){

 digitalWrite(led_red, LOW);
  digitalWrite(led_yellow, HIGH);
  digitalWrite(led_green, LOW);
  delay(5000);  
}

void BlinkAmarillo(){
  delay(250); 
   digitalWrite(led_red, LOW); 
  digitalWrite(led_yellow, LOW);
  digitalWrite(led_green, LOW);
 delay(500); 
    digitalWrite(led_red, LOW); 
  digitalWrite(led_yellow, HIGH);
  digitalWrite(led_green, LOW);
  delay(750); 
   digitalWrite(led_red, LOW); 
  digitalWrite(led_yellow, LOW);
  digitalWrite(led_green, LOW);
 
}
void Rojo(){
  
 digitalWrite(led_red, HIGH);  
  digitalWrite(led_yellow, LOW);
  digitalWrite(led_green, LOW);
   delay(20500);
}

El semáforo cambia a rojo después de dos segundos de haber presionado el botón, únicamente cuando esta en verde (no tiene mucho propósito que lo haga en amarillo, o en rojo), y la secuencia del semáforo es continua, hasta que se apague el mismo
Dejo el enlace al Tinkercad, por si alguien necesita ver conexiones o cualquier otra cosa

Y de nuevo gracias a las dos personas que me ayudaron.

De nada! :wink:

Saludos

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