quinta-feira, 8 de março de 2012

Semáforo de Pedestres

Olá!

Como primeiro teste, criei um semáforo de pedestres, que ao clicar no botão de travessia ele fecha o farol de veículos e abre o de pedestre. Simples assim!

Fiz um tratamento para impedir que o pedestre fica apertando o botão e fechando o farol a todo momento, então sempre é necessário esperar 50 segundos (definido pelo código) para que o farol de pedestres abra novamente.

Tirei a idéia desse exemplo do livro "Arduino Básico - Novatec", porém pelo código do livro é sempre necessário que o pedestre aguarde os 50 segundos (sempre ignora o pressionamento do botão) para que o semáforo registre uma nova solicitação de travessia, eu refiz o código, e dessa forma o usuário pode registrar a solicitação de travessia a qualquer momento, sendo que o semáforo apenas irá respeitar os 50 segundos mínimos para a passagem dos carros.

Segue uma foto do Arduino + Protoboard:


Segue vídeo do brinquedo funcionando:

Itens utilizados:
- 5 leds - 3 para o semáforo de carros e 2 para o semáforo de pedestres.
- 5 resistores - um para cada led.
- 1 botão - para acionamento da  requisição de travessia.

Código do Semáforo:

byte red = 13;
byte yellow = 12;
byte green = 11;
byte button = 10;
byte redPedestre = 9;
byte greenPedestre = 8;
unsigned long tempo=50000;
boolean entrar = false;

void setup() {               
  // inicializa os pinos como OUTPUTT
  pinMode(red, OUTPUT); 
  pinMode(yellow, OUTPUT); 
  pinMode(green, OUTPUT);
  pinMode(redPedestre, OUTPUT);
  pinMode(greenPedestre, OUTPUT);
  // inicializa o pino do botao como INPUT
  pinMode(button, INPUT);
  digitalWrite(button, HIGH); 
}

void loop() {
 
  upGreen();
 
  int val = digitalRead(button);
 
  if (val == LOW || entrar) {
    if ((millis() - tempo) > 50000){
      entrar = false;
      upYellow(5000);
      upRed(20000);
      tempo = millis();
    }
    else {
      entrar = true;
      delay(50000 - (millis() - tempo));
    }
  }
}
void upRed(int timeDelay) {
  offAll();
  digitalWrite(red, HIGH);   // set the LED on
  digitalWrite(greenPedestre, HIGH); // set the LED on
 
  delay(timeDelay);              // wait for a second
 
  digitalWrite(greenPedestre, LOW);
 
  int x;
  for(x=0; x<=9; x++) {
    digitalWrite(redPedestre, LOW);
    delay(250);
    digitalWrite(redPedestre, HIGH);
    delay(250);
  }
}
void upYellow(int timeDelay) {
  offAll();
  digitalWrite(yellow, HIGH);   // set the LED on
  digitalWrite(redPedestre, HIGH); // set the LED on
  delay(timeDelay);              // wait for a second
}
void upGreen() {
  offAll();
  digitalWrite(redPedestre, HIGH); // set the LED on
  digitalWrite(green, HIGH);   // set the LED on 
}
void offAll() {
  digitalWrite(red, LOW);    // set the LED off
  digitalWrite(yellow, LOW);    // set the LED off 
  digitalWrite(green, LOW);    // set the LED off
  digitalWrite(redPedestre, LOW); // set the LED off
  digitalWrite(greenPedestre, LOW); // set the LED off
}

Se alguém tiver dúvidas ou quiser dar sugestões, sempre serão bem-vindas!

Diego Feliciano

Um comentário:

  1. E se não apertar o botão, de tempos em tempos ele fica vermelho também?

    ResponderExcluir