Hoje irei explicar como montar um relógio binários utilizando apenas LEDs, Resistores e um Arduino. Este projeto foi feito durante uma noite, onde eu e um grande amigo pedro desistimos de assistir um filme e decidimos montar algo legal com leds e arduino. Passamos a noite inteira montando/programando/melhorando o circuitos e o resultado final foi muito bom, então resolvi explicar como você pode montar um na sua casa. Espero que goste. :P

Binary Clock II

Partes:
- Arduino
- 13x Leds
- 13x Resistores de 220 Ω
- 3x Resistores de 2.2 KΩ
- 2x Push-Buttons
- 1x Botão normal
- Protoboard
- Cabos

Este projeto é bem simples, porém pode ser complicado para pessoas com pouca experiência com eletrônica, então vou tentar explicar detalhadamente como montar.

Como funciona

leds1.png

binary-example.png

Acredito que imagens valem mais do que mil palavras. Para saber a hora, você deve somar o valor de cada LED que esteja ligado em cada coluna, isso resultará na hora atual.

Montando
Para montar o circuito, você deve primeiro conectar os leds e resistores nos pinos de saída do arduino do 1 ao 13. Lembre-se que a pena maior do LED é sempre o positivo, e a outra perna do LED é o terra, e deve ser conectado ao terra do arduino.
Para que o circuito funcione, você deve conectar o LED 1 no PINO 1, LED 2 no PINO 2…

imagem-binario.png

Para conectar os botões, utilizei uma entrada digital e duas analógicas. Para alterar as horas/minutos, você terá que usar dois botões do estilo push-buttons. E eles serão ligados às entradas analógicas 0 e 5. E para LIGAS/DESLIGAR os LEDs usei um botão normal conectado na entrada digital 0. Para montar o botão, você deve conectar uma perna do mesmo a um resistor de 2.2 KΩ e conectá-lo a saída de 5 Volts junto com a entrada digital/analógica. E a outra pena do botão vai para o terra. Algo como a imagem abaixo:

button1.png

Se você não conseguiu entender minha explicação, tem informações mais detalhadas (em inglês) no site oficial do arduino.AQUI.

Imagens + Video

Binary Clock II

Binary Clock I

Código
O código do relógio é baseado no open-source-arduino-clock feito pelo Rob Faludi. Fiz algumas alterações, mas o função do relógio é basicamente o mesmo. Se o código abaixo não estiver funcionando, você pode baixá-lo em .txt AQUI.


/*
An open-source binary clock for Arduino.
Based on the code from by Rob Faludi (http://www.faludi.com)
Code under (cc) by Daniel Spillere Andrade, www.danielandrade.net

http://creativecommons.org/license/cc-gpl

*/

int second=0, minute=0, hour=0; //start the time on 00:00:00
int munit,hunit,valm=0,valh=0,ledstats,i;

void setup() { //set outputs and inputs
pinMode(1, OUTPUT);pinMode(2, OUTPUT);pinMode(3, OUTPUT);pinMode(4, OUTPUT);pinMode(5, OUTPUT);
pinMode(6, OUTPUT);pinMode(7, OUTPUT);pinMode(8, OUTPUT);pinMode(9, OUTPUT);pinMode(10, OUTPUT);
pinMode(11, OUTPUT);pinMode(12, OUTPUT);pinMode(13, OUTPUT);

pinMode(0, INPUT);
}

void loop() {

static unsigned long lastTick = 0; // set up a local variable to hold the last time we moved forward one second
// (static variables are initialized once and keep their values between function calls)
// move forward one second every 1000 milliseconds

if (millis() - lastTick >= 1000) {
lastTick = millis();
second++;

}

// move forward one minute every 60 seconds
if (second >= 60) {
minute++;
second = 0; // reset seconds to zero
}

// move forward one hour every 60 minutes
if (minute >=60) {
hour++;
minute = 0; // reset minutes to zero
}

if (hour >=24) {
hour=0;
minute = 0; // reset minutes to zero
}

munit = minute%10; //sets the variable munit and hunit for the unit digits
hunit = hour%10;

ledstats = digitalRead(0); // read input value, for setting leds off, but keeping count
if (ledstats == LOW) {

for(i=1;i< =13;i++){
digitalWrite(i, LOW);}

} else {

//minutes units
if(munit == 1 || munit == 3 || munit == 5 || munit == 7 || munit == 9) { digitalWrite(1, HIGH);} else { digitalWrite(1,LOW);}
if(munit == 2 || munit == 3 || munit == 6 || munit == 7) {digitalWrite(2, HIGH);} else {digitalWrite(2,LOW);}
if(munit == 4 || munit == 5 || munit == 6 || munit == 7) {digitalWrite(3, HIGH);} else {digitalWrite(3,LOW);}
if(munit == 8 || munit == 9) {digitalWrite(4, HIGH);} else {digitalWrite(4,LOW);}

//minutes
if((minute >= 10 && minute < 20) || (minute >= 30 && minute < 40) || (minute >= 50 && minute < 60)) {digitalWrite(5, HIGH);} else {digitalWrite(5,LOW);}
if(minute >= 20 && minute < 40) {digitalWrite(6, HIGH);} else {digitalWrite(6,LOW);}
if(minute >= 40 && minute < 60) {digitalWrite(7, HIGH);} else {digitalWrite(7,LOW);}

//hour units
if(hunit == 1 || hunit == 3 || hunit == 5 || hunit == 7 || hunit == 9) {digitalWrite(8, HIGH);} else {digitalWrite(8,LOW);}
if(hunit == 2 || hunit == 3 || hunit == 6 || hunit == 7) {digitalWrite(9, HIGH);} else {digitalWrite(9,LOW);}
if(hunit == 4 || hunit == 5 || hunit == 6 || hunit == 7) {digitalWrite(10, HIGH);} else {digitalWrite(10,LOW);}
if(hunit == 8 || hunit == 9) {digitalWrite(11, HIGH);} else {digitalWrite(11,LOW);}

//hour
if(hour >= 10 && hour < 20) {digitalWrite(12, HIGH);} else {digitalWrite(12,LOW);}
if(hour >= 20 && hour < 24) {digitalWrite(13, HIGH);} else {digitalWrite(13,LOW);}

}

valm = analogRead(0); // add one minute when pressed
if(valm<800) {
minute++;
second=0;
delay(250);
}

valh = analogRead(5); // add one hour when pressed
if(valh<800) {
hour++;
second=0;
delay(250);
}

}

Binary Clock III

Espero que gostem, qualquer coisa só comentar abaixo ou enviar um email.