Magos do Arduino

Projeto farol de trânsito

Aprenda a criar um farol de trânsito com o Arduino utilizando LEDs, push buttons e buzzers

Magos do Arduino

Projeto farol de trânsito

Neste projeto usaremos LEDs, push buttons e buzzers.

Com estes componentes, teremos os LEDs para controlar o estado do farol, enquanto que usaremos o buzzer para emitir um assim que o farol abrir para auxiliar pessoas com deficiência visual.

Por fim, teremos um push button que ao ser pressionado, fará uma requisição para que o farol abra para pedestres.

O que são interrupções?

Interrupções são processos inicializados por um evento externo, como pressionar um botão.

Ao inicializar uma interrupção, o código principal é paralizado temporariamente para a execução de uma função, e ao seu término o fluxo retorna ao código principal.

No Arduino, uma interrupção é registrada através da função attachInterrupt().

No Arduino Uno apenas os pinos 2 e 3 suportam interrupções.

Para outros modelos, consulte attachInterrupt()

Montagem do circuito do farol

Para a criação deste circuito serão necessários os seguintes componentes:

  • 1x breadboard
  • 1x Arduino UNO
  • 1x Buzzer ativo
  • 1x Push button
  • 3x LEDs (vermelho, verde e amarelo)
  • 3x Resistores de 220-300 Ohms
  • Jumpers

Circuito para o farol de trânsito

Para montar o circuito, visualize na imagem a seguir como conectar os componentes entre a placa Arduino e a breadboard.

Circuito buzzer ativo/passivo

Schematics do circuito do farol

A seguir temos o schematics do circuito, que detalha suas conexões e fornece detalhes mais específicos do que o circuito da imagem anterior.

Schematics LED

Código fonte para o circuito do farol de trânsito

Uma vez criado o circuito, use o código fonte a seguir no Arduino IDE para fazer o upload dele na placa Arduino e assim ver o resultado do circuito em funcionamento.

// define os pinos para os componentes
#define PINO_BUZZER 8
#define PINO_BTN 2
#define PINO_VERMELHO 9
#define PINO_AMARELO 10
#define PINO_VERDE 11

// utilizado para controlar o estado corrente dos leds
int estadoVerde = HIGH;
int estadoAmarelo = LOW;
int estadoVermelho = LOW;

unsigned long ultimaMudanca = 0;
unsigned long espera = 5000;

void setup() {
    // define a direção correta dos pinos de GPIO
    pinMode(PINO_BTN, INPUT_PULLUP);
    pinMode(PINO_VERMELHO, OUTPUT);
    pinMode(PINO_AMARELO, OUTPUT);
    pinMode(PINO_VERDE, OUTPUT);
    pinMode(PINO_BUZZER, OUTPUT);

    // registra a interrupção utilizada quando o push button for pressionado
    attachInterrupt(digitalPinToInterrupt(PINO_BTN), abrirFarol, FALLING);

    ultimaMudanca = millis();
}

void loop() {
    // acende/apaga os leds
    digitalWrite(PINO_VERDE, estadoVerde);
    digitalWrite(PINO_AMARELO, estadoAmarelo);
    digitalWrite(PINO_VERMELHO, estadoVermelho);

    // caso farol verde, aciona o buzzer
    if (estadoVerde == HIGH) {
    digitalWrite(PINO_BUZZER, HIGH);
    delay(150);
    digitalWrite(PINO_BUZZER, LOW);
    delay(150);
    }

    // verifica se o farol deve mudar de estado/cor
    if ((millis() - ultimaMudanca) > espera) {
    mudarCorFarol();
    espera = (estadoAmarelo == HIGH) ? 2000 : 5000;
    ultimaMudanca = millis();
    }

}

// função utilizada na interrupção caso o push button seja pressionado
void abrirFarol() {
    // retorna caso farol esteja verde
    if (estadoVerde == HIGH) {
    return;
    }

    delay(300);
    espera = 0;
}

// função utilizada para mudar a cor do farol
void mudarCorFarol() {
    if (estadoVerde == HIGH) {
    estadoVerde = LOW;
    estadoAmarelo = HIGH;
    estadoVermelho = LOW;
    } else if (estadoAmarelo == HIGH) {
    estadoVerde = LOW;
    estadoAmarelo = LOW;
    estadoVermelho = HIGH;
    } else {
    estadoVerde = HIGH;
    estadoAmarelo = LOW;
    estadoVermelho = LOW;
    }
}