Mostrando postagens com marcador Projeto 4. Mostrar todas as postagens
Mostrando postagens com marcador Projeto 4. Mostrar todas as postagens

terça-feira, 22 de novembro de 2011

Projeto 4 - Semáforo interativo

Neste projeto iremos trabalhar com um novo componente, um botão.
Essa é a primeira vez que iremos interagir com o hardware, ou seja, iremos enviar uma informação ao Arduino que irá receber essa informação e gerar um resultado.
Este projeto ainda é bem simples mas, mesmo assim, é bem interessante. Utilizaremos o botão para fazer o papel de "resitor pull-down". 
O autor explicou de forma bem simples o conceito: "Se o botão for pressionado, a eletricidade tomará o caminho de menor resistência, e fluirá entre os 5V e o pino de entrada (há um resistor de 100k Ω no pino de entrada e um resistor de 10k Ω no terra)". 
Abaixo um esquema de um circuito de resistor pull-down:

Note que não há nenhum resistor entre o o botão e o pino (5v), logo, ao pressionarmos o botão a corrente fluirá por este caminho.
Quando pressionamos o botão, desempenhamos o papel de um pedestre, solicitando que o sinal feche para poder atravessar a rua, como mostra o vídeo abaixo:


Abaixo temos o esquema do hardware e o código utilizado:


//Project 4 - Semaforo interativo
int carRed = 12; // definindo os leds dos carros
int carYellow = 11;
int carGreen = 10;
int pedRed = 9; // definindo os leds de pedestres
int pedGreen = 8;
int button = 2; // pino do botao
int crossTime = 10000; // tempo de travessia
unsigned long changeTime; // tempo desde a ultima vez que o botao foi pressionado

void setup() {
  pinMode(carRed, OUTPUT);
  pinMode(carYellow, OUTPUT);
  pinMode(carGreen, OUTPUT);
  pinMode(pedRed, OUTPUT);
  pinMode(pedGreen, OUTPUT);
  pinMode(button, INPUT);
  digitalWrite(carGreen, HIGH);
  digitalWrite(pedRed, HIGH);
}

void loop() {
  int state = digitalRead(button);
  /*verifica se o botao foi pressionado e se faz mais de 5 seg desde a ultima vez*/
  if (state == HIGH && (millis() - changeTime) > 5000) {
    //chama a funcao que altera as luzes
    delay(4000);
    changeLights();
  }
}

void changeLights(){
  digitalWrite(carGreen, LOW); //apaga carGreen
  digitalWrite(carYellow, HIGH); //acende carYellow
  delay(4000);
  digitalWrite(carYellow, LOW); //apaga carYellow
  digitalWrite(carRed, HIGH); //acende carRed
  digitalWrite(pedRed, LOW); //apaga pedRed
  digitalWrite(pedGreen, HIGH); //acende pedGreen
  delay(crossTime); //aguarda crossTime
  
  //pisca pedGreen
  for (int x=0; x<10; x++) {
    digitalWrite(pedGreen, HIGH);
    delay(250);
    digitalWrite(pedGreen, LOW);
    delay(250);
  }
  
  digitalWrite(pedRed, HIGH); //acende pedRed
  digitalWrite(carRed, LOW); //apaga carRed
  digitalWrite(carGreen, HIGH); //acende carGreen
  
  changeTime = millis();
}