Menu
CoddyTech

Botão de travessia

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

As pessoas a pé precisam de uma forma de pedir passagem. O botão azul no pino 2 é o botão de travessia: pressioná-lo durante o verde encerra o verde imediatamente, então os carros recebem o amarelo e, depois, o vermelho.

Como as luzes funcionam com millis(), loop() passa pelo estado verde milhares de vezes por segundo e pode ler o botão a cada vez, além do relógio. O verde termina quando qualquer uma das duas condições é verdadeira, que é o que || (ou) indica:

case GREEN:
  if (millis() - lightStart >= 3000 || digitalRead(buttonPin) == LOW) {
    // mudar para amarelo
  }
  break;

O botão conecta o pino 2 ao terra, então configure o pino como INPUT_PULLUP: ele lê HIGH até que o botão o coloque em LOW.

Apenas o estado verde lê o botão. No amarelo e no vermelho, os carros já estão parando, e o amarelo mantém seu segundo completo para que os motoristas tenham tempo de parar.

challenge icon

Desafio

Médio

Adicione o botão de travessia no pino 2:

  • configure o pino 2 como INPUT_PULLUP
  • enquanto a luz estiver verde, um toque encerra o verde imediatamente (a luz fica amarela)
  • o amarelo e o vermelho mantêm seus tempos, com ou sem toque

Pressione Run, aguarde a luz verde, pressione o botão azul 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;

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);
  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;
  }

  // A luz de status pisca a cada 500 ms, independentemente do que as luzes dos carros façam.
  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