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