Por poco cumplo el reto 😅😅 Comparto mi código, Arduino y diagrama de flujo. Necesitaría una pista, si no es molestia. Armé estos semáforo...

Nicolas Pennisi

Nicolas Pennisi

Pregunta
studenthace 6 años

Por poco cumplo el reto 😅😅

Comparto mi código, Arduino y diagrama de flujo. Necesitaría una pista, si no es molestia.

Armé estos semáforos basados en el sistema que vi en L.A., que cuando un peatón aprieta el botón, todos los semáforos se ponen en rojo y los peatones pueden cruzar para cualquier lado.

Usé 2 Leds RGB para simular el semáforo principal, 2 Leds azules para simular las luces de giro y 2 blancos para simular la luz de los peatones. La idea es que, como no me alcanzan los pines digitales, cada uno cumple la función los 2 semáforos de la avenida (que están enfrentados).

Mi problema es que quiero que cuando se apriete un botón, el programa espere a que el Led termine su acción y luego pase al sistema de peatón. En el sentido que no se apriete el botón y pase automáticamente al modo de peatones. Y si alguno sabe, estaría agradecido que me diera aunque sea una pista para después yo averiguar por mí mismo.

Me encantó el curso hasta ahora!!

IMG_20190204_151205413 (2).jpg Usé el Monitor Serial para hacer controles nada más.

//p refiere a la avenida principal, mientras que s refiere a la avenida secundaria constint redP = 11; constint greenP = 10; constint blueP = 9;; constint peatonP = 13; constint giroP = 12; constint redS = 7; constint greenS = 6; constint blueS = 5; constint peatonS = 3; constint giroS = 4; constint button = 2; int button_value; int button_pressed = LOW; long previousTime = 0; int semaforo = 0; long semaforo_rojo_verde = 16000; long semaforo_peatones = 16000; long semaforo_giro = 6000; long semaforo_amarillo = 2000; voidsetup() { pinMode(redP, OUTPUT); pinMode(greenP, OUTPUT); pinMode(blueP, OUTPUT); pinMode(peatonP, OUTPUT); pinMode(giroP, OUTPUT); pinMode(redS, OUTPUT); pinMode(greenS, OUTPUT); pinMode(blueS, OUTPUT); pinMode(peatonS, OUTPUT); pinMode(giroS, OUTPUT); pinMode(button, INPUT_PULLUP); Serial.begin(9600); } voidloop() { button_value = digitalRead(button); unsignedlong currentTime = millis(); //En esta cadena de if se van apagando y prendiendo LEDs siguiendo un orden especifico para simular la actuacion de los semaforos en la calle //currentTime = previousTime es necesario porque, una vez que se supera el tiempo que se quiere, la accion queda. Si esta igualdad no estuviera, la accion se repetiria todo el tiempo. Es un if, no un while\ //El tiempo que se fija a superar en los if se refiere al de la duracion del if anterior. En el caso 0 se refiere al 10 //Estructura en los digitalWrite: // 1 - Leds que pasan a HIGH y Leds que pasan a LOW, tienen un delay de 100, haciendo de cuenta que pasarian a ser otro Led mas o que el RGB va a cambiar de color, y pasan de vuelta a HIGH // 2 - Leds que permanecen en HIGH // 3 - Leds que pasan a LOW // 4 - Leds que permanecen en LOW if(semaforo == 0) { if (currentTime - previousTime > semaforo_amarillo) { previousTime = currentTime; semaforo++; digitalWrite(redP, HIGH); digitalWrite(giroP, HIGH); digitalWrite(redS, HIGH); digitalWrite(greenP, LOW); digitalWrite(blueP, LOW); digitalWrite(peatonP, LOW); digitalWrite(greenS, LOW); digitalWrite(blueS, LOW); digitalWrite(peatonS, LOW); digitalWrite(giroS, LOW); Serial.println("0"); Serial.println(currentTime); } } if(semaforo == 1) { if (currentTime - previousTime > semaforo_giro) { previousTime = currentTime; semaforo++; digitalWrite(giroP, LOW); delay(100); digitalWrite(giroP, HIGH); digitalWrite(redP, HIGH); digitalWrite(redS, HIGH); digitalWrite(greenP, LOW); digitalWrite(blueP, LOW); digitalWrite(peatonP, LOW); digitalWrite(greenS, LOW); digitalWrite(blueS, LOW); digitalWrite(peatonS, LOW); digitalWrite(giroS, LOW); Serial.println("1"); Serial.println(currentTime); } } if(semaforo == 2) { if (currentTime - previousTime > semaforo_giro) { previousTime = currentTime; semaforo++; digitalWrite(redP, LOW); delay(100); digitalWrite(redP, HIGH); digitalWrite(greenP, HIGH); digitalWrite(redS, HIGH); digitalWrite(blueP, LOW); digitalWrite(peatonP, LOW); digitalWrite(giroP, LOW); digitalWrite(greenS, LOW); digitalWrite(blueS, LOW); digitalWrite(peatonS, LOW); digitalWrite(giroS, LOW); Serial.println("2"); Serial.println(currentTime); } } if(semaforo == 3) { if (currentTime - previousTime > semaforo_amarillo) { previousTime = currentTime; semaforo++; digitalWrite(greenP, LOW); delay(100); digitalWrite(greenP, HIGH); digitalWrite(peatonP, HIGH); digitalWrite(redS, HIGH); digitalWrite(redP, LOW); digitalWrite(blueP, LOW); digitalWrite(giroP, LOW); digitalWrite(greenS, LOW); digitalWrite(blueS, LOW); digitalWrite(peatonS, LOW); digitalWrite(giroS, LOW); Serial.println("3"); Serial.println(currentTime); } } if(semaforo == 4) { if (currentTime - previousTime > semaforo_rojo_verde) { previousTime = currentTime; semaforo++; digitalWrite(greenP, LOW); delay(100); digitalWrite(greenP, HIGH); digitalWrite(redP, HIGH); digitalWrite(redS, HIGH); digitalWrite(peatonP, LOW); digitalWrite(blueP, LOW); digitalWrite(giroP, LOW); digitalWrite(greenS, LOW); digitalWrite(blueS, LOW); digitalWrite(peatonS, LOW); digitalWrite(giroS, LOW); Serial.println("4"); Serial.println(currentTime); } } if(semaforo == 5) { if (currentTime - previousTime > semaforo_amarillo) { previousTime = currentTime; semaforo++; digitalWrite(redP, LOW); delay(100); digitalWrite(redP, HIGH); digitalWrite(giroS, HIGH); digitalWrite(giroS, HIGH); digitalWrite(redS, HIGH); digitalWrite(greenP, LOW); digitalWrite(blueP, LOW); digitalWrite(peatonP, LOW); digitalWrite(giroP, LOW); digitalWrite(greenS, LOW); digitalWrite(blueS, LOW); digitalWrite(peatonS, LOW); Serial.println("5"); Serial.println(currentTime); } } if(semaforo == 6) { if (currentTime - previousTime > semaforo_giro) { previousTime = currentTime; semaforo++; digitalWrite(giroS, LOW); delay(100); digitalWrite(giroS, HIGH); digitalWrite(redP, HIGH); digitalWrite(redS, HIGH); digitalWrite(greenP, LOW); digitalWrite(blueP, LOW); digitalWrite(peatonP, LOW); digitalWrite(giroP, LOW); digitalWrite(greenS, LOW); digitalWrite(blueS, LOW); digitalWrite(peatonS, LOW); Serial.println("6"); Serial.println(currentTime); } } if(semaforo == 7) { if (currentTime - previousTime > semaforo_giro) { previousTime = currentTime; semaforo++; digitalWrite(redS, LOW); delay(100); digitalWrite(redS, HIGH); digitalWrite(greenS, HIGH); digitalWrite(redP, HIGH); digitalWrite(giroS, LOW); digitalWrite(greenP, LOW); digitalWrite(blueP, LOW); digitalWrite(peatonP, LOW); digitalWrite(giroP, LOW); digitalWrite(blueS, LOW); digitalWrite(peatonS, LOW); Serial.println("7"); Serial.println(currentTime); } } if(semaforo == 8) { if (currentTime - previousTime > semaforo_amarillo) { previousTime = currentTime; semaforo++; digitalWrite(greenS, LOW); delay(100); digitalWrite(greenS, HIGH); digitalWrite(peatonS, HIGH); digitalWrite(redP, HIGH); digitalWrite(redS, LOW); digitalWrite(greenP, LOW); digitalWrite(blueP, LOW); digitalWrite(peatonP, LOW); digitalWrite(giroP, LOW); digitalWrite(blueS, LOW); digitalWrite(giroS, LOW); Serial.println("8"); Serial.println(currentTime); } } if(semaforo == 9) { if (currentTime - previousTime > semaforo_rojo_verde) { previousTime = currentTime; semaforo++; digitalWrite(greenS, LOW); delay(100); digitalWrite(greenS, HIGH); digitalWrite(redS, HIGH); digitalWrite(redP, HIGH); digitalWrite(peatonS, LOW); digitalWrite(greenP, LOW); digitalWrite(blueP, LOW); digitalWrite(peatonP, LOW); digitalWrite(giroP, LOW); digitalWrite(blueS, LOW); digitalWrite(giroS, LOW); Serial.println("9"); Serial.println(currentTime); } } if(semaforo > 9) { semaforo = 0; } if (button_value == LOW && button_pressed == LOW) { digitalWrite(redP, HIGH); digitalWrite(peatonP, HIGH); digitalWrite(redS, HIGH); digitalWrite(peatonS, HIGH); digitalWrite(greenP, LOW); digitalWrite(blueP, LOW); digitalWrite(giroP, LOW); digitalWrite(greenS, LOW); digitalWrite(blueS, LOW); digitalWrite(giroS, LOW); delay(semaforo_peatones); Serial.println("boton"); Serial.println(currentTime); button_pressed = HIGH; } if (button_value == HIGH && button_pressed == HIGH) { button_pressed = LOW; } }
2 respuestas
para escribir tu comentario
    Emanuel Moreno Manriquez

    Emanuel Moreno Manriquez

    studenthace 5 años

    Como solo quieres una pista intenta usar while y goto para forzar las rutas del diagrama de flujo para que no tengas que leer todas las situaciones en cada ciclo.

    Nicolas Pennisi

    Nicolas Pennisi

    studenthace 6 años

    IMG_20190204_151245362.jpgIMG_20190204_151242668.jpgIMG_20190204_152542633.jpg

Fundamentos de Desarrollo de Hardware con Arduino

Fundamentos de Desarrollo de Hardware con Arduino

Crea un robot que evite obstáculos controlado por un Arduino, utilizando sensores y actuadores. Aprende a manejar motores, servomotores y a programar circuitos integrados para el desarrollo de prototipos en hardware.

Fundamentos de Desarrollo de Hardware con Arduino
Fundamentos de Desarrollo de Hardware con Arduino

Fundamentos de Desarrollo de Hardware con Arduino

Crea un robot que evite obstáculos controlado por un Arduino, utilizando sensores y actuadores. Aprende a manejar motores, servomotores y a programar circuitos integrados para el desarrollo de prototipos en hardware.