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!