Menu
CoddyTech

Sinal de pedestre e buzzer

Parte da seção Projetos do Journey de Arduino da Coddy. Lição 4 de 24.

As pessoas a pé têm seus próprios sinais: vermelho no pino 7 (aguarde) e verde no pino 6 (atravesse). Enquanto os carros estão no vermelho, as pessoas veem o verde; no restante do tempo, veem o vermelho.

O sinal de travessia muda em apenas dois momentos: quando os carros entram no vermelho e quando saem dele. Escreva uma função para as luzes de travessia e chame-a nesses dois lugares:

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

As travessias também emitem bipes enquanto é seguro atravessar, para as pessoas que não conseguem ver os sinais. tone() pode receber um terceiro número, que indica por quanto tempo tocar: tone(buzzerPin, 1000, 100) toca a 1000 Hz por 100 ms e para sozinho. O sketch não espera que ele termine.

Para emitir um bipe a cada 500 ms somente durante o vermelho, coloque um terceiro temporizador millis() dentro de case RED:.

challenge icon

Desafio

Médio

Adicione o sinal de pedestres e seu buzzer:

  • vermelho para pedestres no pino 7 e verde para pedestres no pino 6, ambos como saídas
  • enquanto os carros estiverem no vermelho: verde para pedestres aceso, vermelho para pedestres apagado e um beep de 100 ms a 1000 Hz no pino 8 a cada 500 ms
  • no restante do tempo: vermelho para pedestres aceso, verde para pedestres apagado, sem som

Pressione Run e, em seguida, Check.

Experimente você mesmo

// As luzes dos carros
const int redPin = 12;
const int yellowPin = 11;
const int greenPin = 10;
// O LED da própria placa: a luz de status do controlador
const int statusPin = 13;
// O botão de travessia
const int buttonPin = 2;

enum Light { GREEN, YELLOW, RED };
Light light = GREEN;
unsigned long lightStart = 0;  // quando a luz atual acendeu

bool statusOn = false;
unsigned long lastBlink = 0;

// Acenda uma luz e apague as outras duas.
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:
      // Pressionar o botão de travessia encerra o sinal verde mais cedo.
      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;
  }

  // A luz de status pisca a cada 500 ms, independentemente das luzes dos carros.
  if (now - lastBlink >= 500) {
    lastBlink = now;
    if (statusOn) {
      statusOn = false;
      digitalWrite(statusPin, LOW);
    } else {
      statusOn = true;
      digitalWrite(statusPin, HIGH);
    }
  }
}
quiz iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Projetos

Pratique por conta própria: Playground de Arduino