Botón de cruce
Parte de la sección Proyectos del Journey de Arduino de Coddy. Lección 3 de 24.
Las personas que van a pie necesitan una forma de pedir paso. El botón azul del pin 2 es el botón del cruce: si se pulsa durante la luz verde, esta termina de inmediato, para que los coches pasen a amarillo y después a rojo.
Como las luces funcionan con millis(), loop() pasa por el estado verde miles de veces por segundo y puede leer el botón cada vez, además del reloj. La luz verde termina cuando se cumple cualquiera de las dos condiciones, tal como indica || (o):
case GREEN:
if (millis() - lightStart >= 3000 || digitalRead(buttonPin) == LOW) {
// cambiar a amarillo
}
break;El botón conecta el pin 2 a tierra, así que configura el pin como INPUT_PULLUP: lee HIGH hasta que el botón lo lleva a LOW.
Solo el estado verde lee el botón. Durante el amarillo y el rojo, los coches ya están deteniéndose, y la luz amarilla dura el segundo completo para que los conductores tengan tiempo de parar.
Desafío
IntermedioAñade el botón del paso de peatones en el pin 2:
- configura el pin 2 como
INPUT_PULLUP - mientras la luz esté verde, al pulsar el botón la luz verde termina inmediatamente (la luz se pone amarilla)
- las luces amarilla y roja mantienen sus tiempos, tanto si se pulsa el botón como si no
Pulsa Run, espera a que se ponga verde, pulsa el botón azul y después Check.
Pruébalo tú mismo
// Las luces de los coches
const int redPin = 12;
const int yellowPin = 11;
const int greenPin = 10;
// El LED de la propia placa: la luz de estado del controlador
const int statusPin = 13;
enum Light { GREEN, YELLOW, RED };
Light light = GREEN;
unsigned long lightStart = 0; // cuando se encendió la luz actual
bool statusOn = false;
unsigned long lastBlink = 0;
// Enciende una luz y apaga las otras dos.
void showLight(int pin) {
digitalWrite(redPin, LOW);
digitalWrite(yellowPin, LOW);
digitalWrite(greenPin, LOW);
digitalWrite(pin, HIGH);
}
void setup() {
pinMode(redPin, OUTPUT);
pinMode(yellowPin, OUTPUT);
pinMode(greenPin, OUTPUT);
pinMode(statusPin, OUTPUT);
showLight(greenPin);
}
void loop() {
unsigned long now = millis();
switch (light) {
case GREEN:
if (now - lightStart >= 3000) {
light = YELLOW;
lightStart = now;
showLight(yellowPin);
}
break;
case YELLOW:
if (now - lightStart >= 1000) {
light = RED;
lightStart = now;
showLight(redPin);
}
break;
case RED:
if (now - lightStart >= 3000) {
light = GREEN;
lightStart = now;
showLight(greenPin);
}
break;
}
// La luz de estado parpadea cada 500 ms, independientemente de lo que hagan las luces de los coches.
if (now - lastBlink >= 500) {
lastBlink = now;
if (statusOn) {
statusOn = false;
digitalWrite(statusPin, LOW);
} else {
statusOn = true;
digitalWrite(statusPin, HIGH);
}
}
}
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Proyectos
Practica por tu cuenta: Playground de Arduino