Menu
CoddyTech

Señal peatonal y zumbador

Parte de la sección Proyectos del Journey de Arduino de Coddy. Lección 4 de 24.

Los peatones tienen sus propios semáforos: rojo en el pin 7 (esperar) y verde en el pin 6 (caminar). Mientras los coches tienen luz roja, los peatones ven la luz verde; el resto del tiempo ven la luz roja.

La señal peatonal cambia solo en dos momentos: cuando los coches se ponen en rojo y cuando dejan de estarlo. Escribe una función para las luces peatonales y llámala en esos dos lugares:

void showWalk(bool walk) {
  if (walk) {
    digitalWrite(walkRedPin, LOW);
    digitalWrite(walkGreenPin, HIGH);
  } else {
    digitalWrite(walkGreenPin, LOW);
    digitalWrite(walkRedPin, HIGH);
  }
}

Los cruces también emiten pitidos mientras sea seguro cruzar, para las personas que no pueden ver las luces. tone() puede recibir un tercer número que indica cuánto tiempo debe sonar: tone(buzzerPin, 1000, 100) reproduce un tono de 1000 Hz durante 100 ms y se detiene automáticamente. El sketch no espera a que termine.

Para emitir un pitido cada 500 ms solo durante la luz roja, añade un tercer temporizador millis() dentro de case RED:.

challenge icon

Desafío

Intermedio

Añade la señal peatonal y su zumbador:

  • rojo peatonal en el pin 7 y verde peatonal en el pin 6, ambas salidas
  • mientras los coches tengan el semáforo en rojo: verde peatonal encendido, rojo peatonal apagado y un pitido de 100 ms a 1000 Hz en el pin 8 cada 500 ms
  • el resto del tiempo: rojo peatonal encendido, verde peatonal apagado, sin sonido

Pulsa Run, después Check.

Pruébalo tú mismo

// Las luces para los vehículos
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;
// El botón para cruzar
const int buttonPin = 2;

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);
  pinMode(buttonPin, INPUT_PULLUP);
  showLight(greenPin);
}

void loop() {
  unsigned long now = millis();

  switch (light) {
    case GREEN:
      // Al pulsar el botón para cruzar, la luz verde termina antes de tiempo.
      if (now - lightStart >= 3000 || digitalRead(buttonPin) == LOW) {
        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 para los vehículos.
  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