Este é o primeiro tutorial que escrevo, um cronometro regressivo, este tutorial é parte de um projeto maior um alarme ativado por sensor de presença, em breve publicarei-o.
Tentei descrever o máximo possível cada parte do código, qualquer dúvida é só deixar nos comentários.
O código está disponível para download neste link
Utilizei a lib MsTimer2 após baixa-la descompacte-a no diretório \libraries da IDE do seu arduino,
ex:
c:\arduino-1.0.3-windows\arduino-1.0.3\libraries\MsTimer2
Recomendo o hábito de ler os datasheets dos componentes, o do display utilizado está nesse link
A visão da protoboard foi feita com 4 unidades de display (uma para cada dígito), porém a utilizada é uma única com 4 dígitos.
Material utilizado
- (1) 4 Digits 7 segment display 12 pins mod TOF 5461BH (common anode )
- (12) Resistores de 300 ohms
/* projeto: Cronometro regressivo autor: Ilderado Idriis - seja bacana! Mantenha os créditos! site: http://ardoit.blogspot.com - Visite, comente, contribua com suas idéias! data: 29/dez/2012 hardware:(1) four digits seven segment display - mod: TOF-5461BH - common anode (12) resistores de 300 ohms */ /* digitPins[]: pinos que controlam os digitos segmentPins[]: pinos que controlam cada segmento que forma os números, segmentos vão de A-G mais o ponto numbers[10][8]: matriz bidimensional 10 números (0-9) e 8 segmentos, como cada número é formado por até 8 segmentos (ligados ou desligados) por isso a necessidade desta matriz, cada 1 e 0 corresponde a um segmento ligado ou desligado (depende do tipo do seu display se é anodo ou cathodo). Os segmentos são nomeados de A-G mais o ponto (consulte o datasheet em anexo). */ // bibliotecas #include <MsTimer2.h>// configuração I/O e variaveis globais byte pinosDigitos[] = { // 12, 9, 8, 6 // pinos dos digitos no display de sete segmentos 13, 10, 8, 7}; byte pinosSegmentos[] = { // 11, 7, 4, 2 , 1, 10, 5, 3 pinos dos segmentos no display de sete segmentos 12, 9, 5, 3 , 2, 11, 6, 4}; // pinos no arduino boolean algarismos[10][8]={ // a b c d e f g . { 1, 1, 1, 1, 1, 1, 0, 0}, // 0 { 0, 1, 1, 0, 0, 0, 0, 0}, // 1 { 1, 1, 0, 1, 1, 0, 1, 0}, // 2 { 1, 1, 1, 1, 0, 0, 1, 0}, // 3 { 0, 1, 1, 0, 0, 1, 1, 0}, // 4 { 1, 0, 1, 1, 0, 1, 1, 0}, // 5 { 1, 0, 1, 1, 1, 1, 1, 0}, // 6 { 1, 1, 1, 0, 0, 0, 0, 0}, // 7 { 1, 1, 1, 1, 1, 1, 1, 0}, // 8 { 1, 1, 1, 1, 0, 1, 1, 0} // 9 }; // Minutos:Segundos ex: d0d1:d02d3 / 11:15 int d0 = 6; int d1 = 0; int d2 = 0; int d3 = 0; void setup() { for (int x = 0; x < 4; x++){ // uso de loops para evitar repetir linha por linha pinMode(pinosDigitos[x], OUTPUT); } for(int y = 0; y < 9; y++){ // uso de loops para evitar repetir linha por linha pinMode(pinosSegmentos[y], OUTPUT); } MsTimer2::set(1000, countdown); // define intervalo para chamada da função de contragem regressiva MsTimer2::start(); // inicia chamada da função de contagem regressiva } void loop(){ // chama função que mostra os digitos ligar(0,d0); ligar(1,d1); ligar(2,d2); ligar(3,d3); } // exibe digitos void ligar(byte digito, byte numero){ delay(3); // pausa para refresh do display apaga(); // chama função desativa todos os pinos de display para poder atualizar os segmentos dos outros digitos digitalWrite(pinosDigitos[digito], HIGH); // ativa o digito que terá o número atualizado for(int coluna = 0; coluna < 8; coluna++){ // ativa os segmentos digitalWrite(pinosSegmentos[coluna],!algarismos[numero][coluna]); } } void apaga(){ // desativa todos os digitos, esse procedimento é necessário pois todos os digitos utilizam os mesmos pinos for (int x = 0; x < 4; x++){ digitalWrite(pinosDigitos[x], LOW); } } void countdown(){ // função da contagem regressiva, d0d1:d02d03 ex: 15:45 if(d3 > 0){ d3--; }else{ if(d2 > 0){ d2--; d3 = 9; }else{ if(d1 > 0){ d1--; d2 = 5; d3 = 9; }else{ if(d0 > 0){ d0--; d1 = 9; d2 = 5; d3 = 9; } } } } }
Lembro-me do tempo em que para fazer um desse utilizei somente portas lógias, dei 2 protos desse com um contador de segundos utilizando um 555 para o circuito de flip-flop.
ResponderExcluirHoje, com essas placas programáveis, fica tudo mais simples!!! Ficou ótimo o POST!