Menu
CoddyTech

Semáforo com millis()

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

Durante cada delay(3000), a placa não faz mais nada, então não poderia perceber o botão de travessia que a próxima etapa adiciona. A temporização passa a usar millis().

A luz é uma máquina de estados: está sempre em um estado (verde, amarelo ou vermelho) e passa para o próximo quando permanece nesse estado por tempo suficiente. Um enum nomeia os estados, uma variável guarda o estado atual e outra guarda quando ele começou:

enum Light { GREEN, YELLOW, RED };
Light light = GREEN;
unsigned long lightStart = 0;

O primeiro estado é verde, então acenda a luz verde em setup(). A cada passagem de loop(), um switch verifica se o estado atual durou tempo suficiente e só então avança e muda as luzes:

case GREEN:
  if (millis() - lightStart >= 3000) {
    light = YELLOW;
    lightStart = millis();
    showLight(yellowPin);
  }
  break;

Nada fica esperando, então loop() fica livre para outras tarefas. Comprove isso com uma luz de status: faça o próprio LED da placa, pino 13, piscar a cada 500 ms.

challenge icon

Desafio

Médio

Reescreva a temporização sem delay():

  • mantenha o verde por 3000 ms, o amarelo por 1000 ms e o vermelho por 3000 ms
  • use um enum para os três estados, um switch e millis()
  • acenda o verde em setup() e chame showLight() somente quando o estado mudar
  • pisque o pino 13 a cada 500 ms (500 ms ligado, 500 ms desligado), o tempo todo

Pressione Run e depois Check.

Experimente você mesmo

// As luzes dos carros
const int redPin = 12;
const int yellowPin = 11;
const int greenPin = 10;

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

void loop() {
  showLight(greenPin);
  delay(3000);
  showLight(yellowPin);
  delay(1000);
  showLight(redPin);
  delay(3000);
}
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