Problema con boton en tinkercad

Pues estoy haciendo semaforos inteligentes (aun no lo son) pero el caso es que mi boton no logra funcionar, yo quiero que al principio siga una secuencia comun, pero cuando un peaton pulsa un boton deberia ejecutarse un codigo especifico para que el peaton pase, el caso es que llevo 1 meses y sigo sin ser capaz de hacerlo funcionar, porque en el serial monitor dice que en efecto, esta siendo presionado pero el codigo lo ignora completamente, es la primera vez que programo y supongo que algo mal estara hecho.

int rojo=13;
int amarillo=12;
int verde=11;
int b=2;     
int rp=7; 
int vp=6;
int r2=10;
int a2=9;
int v2=8;
int rp2=5;
int vp2=4;

int buttonState = 0;  

void setup()
{
pinMode(13, OUTPUT);
pinMode(12, OUTPUT);
pinMode(11,OUTPUT);
pinMode(7, OUTPUT);
pinMode(6, OUTPUT);
pinMode(10,OUTPUT);
pinMode(9,OUTPUT);
pinMode(8,OUTPUT);
pinMode(5,OUTPUT);
pinMode(4,OUTPUT);
pinMode(2,INPUT);       
  
attachInterrupt(digitalPinToInterrupt(2), readButton, CHANGE);
  Serial.begin(
    2600);
} 

void readButton()
{
  buttonState = digitalRead(2);
  Serial.println(buttonState);
}

  void loop()
{
    if (buttonState == 1) {  
    digitalWrite(verde,LOW);        
	digitalWrite(amarillo,HIGH);
    digitalWrite(rojo,LOW);
    digitalWrite(r2,LOW);
    digitalWrite(a2,LOW);
    digitalWrite(v2,HIGH);
  	delay(3000);
   digitalWrite(rp,LOW);
   digitalWrite(vp,HIGH);
   digitalWrite(verde,LOW);
   digitalWrite(amarillo,LOW);
   digitalWrite(rojo,HIGH);
  digitalWrite(rp2,HIGH);
  digitalWrite(vp2,LOW);
  digitalWrite(v2,HIGH);
  digitalWrite(a2,LOW);
  digitalWrite(r2,LOW);
    delay(5000);
}
digitalWrite(rojo,HIGH);
digitalWrite(amarillo,LOW);
digitalWrite(verde,LOW);
    
digitalWrite(rp,LOW);
digitalWrite(vp,HIGH);
    
digitalWrite(r2,LOW);
digitalWrite(a2,LOW);
digitalWrite(v2,HIGH);
    
digitalWrite(rp2,HIGH);
digitalWrite(vp2,LOW);   
 delay(5000);

digitalWrite(v2,LOW);
digitalWrite(a2,HIGH);
 delay(3000);
    
digitalWrite(rojo,LOW);
digitalWrite(amarillo,LOW);
digitalWrite(verde,HIGH);
    
digitalWrite(rp,HIGH);
digitalWrite(vp,LOW);
    
digitalWrite(a2,LOW);
digitalWrite(r2,HIGH);
    
digitalWrite(rp2,LOW);
digitalWrite(vp2,HIGH);
 delay(20000);
  
digitalWrite(rojo,LOW);
digitalWrite(amarillo,HIGH);
digitalWrite(verde,LOW);

digitalWrite(r2,HIGH);
digitalWrite(a2,LOW);
digitalWrite(v2,LOW);
 delay(7000);
    
digitalWrite(rojo,HIGH);
digitalWrite(amarillo,LOW);
digitalWrite(verde,LOW);
    
digitalWrite(rp,LOW);
digitalWrite(vp,HIGH);
    
digitalWrite(r2,LOW);
digitalWrite(a2,LOW);
digitalWrite(v2,HIGH);
    
digitalWrite(rp2,HIGH);
digitalWrite(vp2,LOW);    
delay(20000);
    
    
}

Hombre quieres hacer un semáforo inteligente y lo primero que veo son delay() y dices que un peatón va a pulsar el botón y se espera que haga que?
NO sabes acaso que cuando pones delay como ese ultimo que veo, de 20 segundos son 20 seg que el micro no hace nada.. así que ahí lo tienes al peatón esperando 20 segundos.
Ve a Documentación y aprende a usar millis() y máquina de estados.
Cada estado es una acción diferente pero claramente un pulso puede modificar los estados porque estos no consumen tiempo aunque curiosamente lo respetan.

Describir: 1. La configuración del hardware (incluyendo dar nombres a las letras individuales que utiliza). 2. Cómo se inicia el proyecto. 3. Un ciclo completo del proyecto 4. Cómo ingresa la persona 5. Cómo reacciona el proyecto a la entrada De esta manera, puede dividir el proyecto total en funciones más pequeñas y luego llamar a cada función cuando lo necesite.

Ahh y me acabo de dar cuenta que usas una interrupción para justamente no tener en cuenta lo que te he indicado en el post#2.

Y tu problema tal como esta todo programado esta acá

void readButton()
{
  buttonState = digitalRead(2);
  Serial.println(buttonState);
}

Asi debe ser

void readButton()
{
  buttonState = digitalRead(2);
  flag = true;
}

Luego en tu loop preguntas por flag y luego lo pones en false para que no se imprima de nuevo.

  if (flag) {
    Serial.print("Estado pulsador" );
    Serial.println(buttonState ? "  ON" : " OFF");
    flag = false;

  }

Una rutina de interrupción no puede ni debe llamar al Serial.
Solo concéntrate en leer el estado y acciona un flag para que imprima
Ya te digo como
Igualmente el código no me gusta pero que funciona funciona.
Ahora bien, si no puedo imprimir cuando se produce el evento eso indica que debo esperar a que se produzca todo un ciclo para poder ver que alguien presionó.

Acá te dejo la modificación, no se si esta del todo bien. En principio permite hacer todo.

Agrega Leds y resistencias según corresponda. Yo puse los primeros 3.
Entonces tienes dos máquinas de estados, una para el semáforo en general y otra para el peatón.
Así que ojo, porque las cosas seguirán funcionando.

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