Skip to content

Instantly share code, notes, and snippets.

@m3nd3s
Created March 17, 2012 21:59
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save m3nd3s/2065690 to your computer and use it in GitHub Desktop.
Save m3nd3s/2065690 to your computer and use it in GitHub Desktop.
Contador binário utilizando 3 LEDs
/**
* CONTADOR BINÁRIO COM ARDUINO E 3 LEDS
*
**/
// Pinos dos LEDs
int ledPin1 = 4;
int ledPin2 = 5;
int ledPin3 = 6;
// Pino do botão
int buttonPin = 7;
// contador
int count = 0;
/**
* Na função setup() são inicializadas as variáveis e dispositivos que
* serão utilizados no projeto, em nosso caso foram configurados os pinos
* utilizados pelos LEDs para OUTPUT (saída de dados), também o botão como
* INPUT (entrada de dados) e a comunicação serial para debug.
*/
void setup() {
pinMode(ledPin1, OUTPUT);
pinMode(ledPin2, OUTPUT);
pinMode(ledPin3, OUTPUT);
pinMode(buttonPin, INPUT);
Serial.begin(9600);
}
void loop() {
/**
* Lê o valor do botão, se pressionado (press) é LOW (ou 1), se liberado (release)
* o valor é HIGH (ou 0)
*/
Serial.println(digitalRead (buttonPin));
if ( digitalRead (buttonPin) == LOW) {
Serial.println("Botao pressionado!");
// Incrementa o contador
count = (count == 7) ? 0 : count+1;
Serial.print("Contador em:");
Serial.println(count);
/*
* Aqui é aplicada a lógica para fazer acender cada LED.
*
* O que é feito nessa parte do código chama-se deslocamento de bits,
* usamos essa técnica para identificar o estado que o led ficará
* conforme o número armazenado no contador.
*
* Nosso contador utiliza apenas 3 bits (três LEDs) com isso o valor
* máximo que ele alcançará é o 7 (conforme mostrado no cabeçalho.
*
* Para entender o código (considerando tamanho de 3 bits, no nosso caso 3 leds):
*
* Decimal Binário
*---------------------------
* 0 000
* 1 001
* 2 010
* 3 011
* 4 100
* 5 101
* 6 110
* 7 111
*
* Conforme falei acima, o deslocamento de bits vai mover os bits do número para
* a direita o número de casas que for especificado, olhando para a linha abaixo
* referente ao ledPin2 a operação "count >> 1" move os bits todos uma casa para
* a direita, por exemplo, considere a segunda posição, de número 1:
* 2 = 010 010 >> 1 se transforma em 001
* 3 = 011 011 >> 1 se transforma em 001 (o bit mais a direita é sempre perdido, e adiciona-se um zero a esquerda)
* 4 = 100 100 >> 1 se transforma em 010
* ... ...
* A mesma coisa acontece com a terceira posição:
* 2 = 010 010 >> 2 se transforma em 000
* 3 = 011 011 >> 2 se transforma em 000 (o bit mais a direita é sempre perdido, e adiciona-se um zero a esquerda)
* 4 = 100 100 >> 2 se transforma em 001
* ... ...
*
* Isso tudo é feito para que o respectivo bit (0 ou 1) da posição indicada (primeira, segunda ou terceira) fique
* na posição mais a direita e assim podemos aplicar o % (módulo ou resto) com 2 e ver se aquela posição
* deve ser ligada ou desligada. O operador % faz uma divição de inteiros entre os dois números, sempre em decimal,
* e retorna o seu resto, em nosso caso sempre retornará 1 ou 0 já que estamos dividindo por 2, e isso é enviado
* como sinal HIGH (1) ou LOW(0) para o Arduino, ligando ou desligando os LEDs.
*/
digitalWrite(ledPin1, count % 2);
digitalWrite(ledPin2, (count >> 1) % 2);
digitalWrite(ledPin3, (count >> 2) % 2);
// Delay para evitar a captura repetitiva do botão pressionado
delay (500);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment