Menu
CoddyTech

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.

challenge icon

Desafío

Intermedio

Añ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);
    }
  }
}
quiz iconPonte a prueba

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