21 janeiro 2015

Contador com botão de reset

Recebi alguns pedidos aqui no blog sobre contadores com botão de reset. No post Contador Display 7 segmentos - 3 dígitos, por exemplo, o contador era incrementado cada vez que o sensor óptico TCRT5000 era acionado, mas para zerar o contador era preciso reiniciar o Arduino.

Vou mostrar nesse post como implementar facilmente esse botão de reset do contador em dois circuitos : um utilizando display 7 segmentos de 3 dígitos, e outro utilizando um display LCD 16x2.



Contador com display 7 segmentos

Vou usar o mesmo circuito do post anterior do contador com display 7 segmentos, acrescentando apenas um push-button para resetar o contador. A lista de material desse circuito fica assim :
  • 3 resistores de 1 K (um para cada dígito/anodo)
  • 1 resistor de 220 ohms (led IR do sensor óptico)
  • 1 resistor de 10 K (ligado ao sensor óptico - receptor)
  • 1 resistor de 10 K (pull up do botão de reset)
  • Display 7 segmentos de 3 dígitos CPS03631BR
  • Sensor óptico reflexivo TCRT5000
  • 1 push-button


contador com botão de reset - display 7 segmentos


No programa, acrescentei a definição do pino do botão (pino_botao_reset), ligado ao pino analógico A0

Um IF verifica se o botão foi pressionado, e caso isso aconteça o valor da variável contador é zerada, e o display é atualizado (linhas 41 a 47). Esse programa utiliza a biblioteca SevSeg, que você pode baixar nesse link.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
// Programa : Contador utilizando display 7 segmentos,
//            TCRT5000  e botao reset
// Autor : Arduino e Cia  
  
// Carrega a biblioteca SevSeg
#include "SevSeg.h"   

SevSeg sevseg;  

// Cria variaveis globais  
int contador = 0;  

// Ligado ao pino "coletor" do sensor óptico - Porta A5 ao Arduino  
int pinosensor = 19; 
// Pino ligado ao botao de reset
int pino_botao_reset = A0;
// Armazena o valor lido pelo sensor optico
int leitura; 
// Armazena o estado do botao reset
int estadobotao = 0; 

void setup() 
{  
  // Utilizando display de anodo comum, 
  // pinos dos digitos : 10 a 13  
  // Pino dos segmentos : 2 a 9  
  sevseg.Begin(1,13,10,11,12,2,3,4,5,6,7,8,9);  
  // Controla a luminosidade - 0 a 100  
  sevseg.Brightness(20);  
  // Define o pino do sensor optico como entrada 
  pinMode(pinosensor, INPUT);  
  // Define o pino do botao reset como entrada
  pinMode(pino_botao_reset, INPUT);
}  
   
void loop() 
{  
  sevseg.PrintOutput();  
  sevseg.NewNum(contador,(byte) 2);
  
  // Verifica se o botao reset foi pressionado
  estadobotao = digitalRead(pino_botao_reset);
  if (estadobotao != 1)
  {
    // Zera o contador
    contador = 0;
  }

  // Le as informações do pino do sensor optico
  leitura = digitalRead(pinosensor);
  // Verifica se o objeto foi detectado pelo sensor
  if (leitura != 1) 
  {  
    // Incrementa o valor do contador
    contador = contador++;   

    // Loop caso o objeto pare sobre o sensor 
    while(digitalRead(pinosensor) != 1)  
    {  
     sevseg.PrintOutput();  
     sevseg.NewNum(contador,(byte) 2);  
    }  
  }   
}

Contador LCD 16x2 e botão de reset

Para utilizar o contador com botão de reset no display LCD 16x2, utilizei o mesmo circuito, substituindo o display 7 segmentos pelo LCD. Lista de material :
  • 1 resistor de 220 ohms (led IR do sensor óptico)
  • 1 resistor de 10 K (ligado ao sensor óptico - receptor)
  • 1 resistor de 10 K (pull up do botão de reset)
  • LCD 16x2 HD44780
  • 1 potenciômetro 10 K (ajuste contraste LCD)
  • Sensor óptico reflexivo TCRT5000
  • 1 push-button

Informações específicas sobre o display LCD utilizado, como pinagem, datasheet e outras informações você encontra no artigo Display LCD 16x2 - Backlight azul - HD44780.

contador lcd 16x2 com botão de reset



O programa é o mesmo que eu utilizei para o display 7 segmentos, retirando o uso da biblioteca SevSeg e utilizando a biblioteca LiquidCrystal para controle do LCD :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
// Programa : Contador utilizando LCD 16x2 e botao reset
// Autor : Arduino e Cia  
  
#include <LiquidCrystal.h>   

LiquidCrystal lcd(12,11,5,4,3,2);

// Cria variaveis globais  
int contador = 0;  

// Ligado ao pino "coletor" do sensor óptico - Porta A5 ao Arduino  
int pinosensor = 19; 
// Pino ligado ao botao de reset
int pino_botao_reset = A0;
// Armazena o valor lido pelo sensor optico
int leitura; 
// Armazena o estado do botao reset
int estadobotao = 0; 

void setup() 
{  
  lcd.begin(16,2);
  // Define o pino do sensor optico como entrada 
  pinMode(pinosensor, INPUT);  
  // Define o pino do botao reset como entrada
  pinMode(pino_botao_reset, INPUT);
  // Informacoes iniciais no LCD
  lcd.print("Contador : 0");
}  
   
void loop() 
{  
  // Verifica se o botao reset foi pressionado
  estadobotao = digitalRead(pino_botao_reset);
  if (estadobotao != 1)
  {
    // Zera o contador
    contador = 0;
    // Apaga o valor anterior
    lcd.setCursor(11,0);
    lcd.print("   ");
    // Mostra o valor zerado
    lcd.setCursor(11,0);
    lcd.print(contador);
  }

  // Le as informações do pino do sensor optico
  leitura = digitalRead(pinosensor);
  // Verifica se o objeto foi detectado pelo sensor
  if (leitura != 1) 
  {  
    // Incrementa o valor do contador
    contador = contador++;
    // Apaga o valor anterior
    lcd.setCursor(11,0);
    lcd.print("   ");
    // Mostra o valor do contador
    lcd.setCursor(11,0);
    lcd.print(contador);

    // Loop caso o objeto pare sobre o sensor 
    while(digitalRead(pinosensor) != 1)  
    {}  
  }   
}  


62 comentários:

  1. Muito Bom, me ajudou muito, seria possivel como seria para gravar o numero atual na EEPROM?

    ResponderExcluir
    Respostas
    1. Bom dia,

      Boa ideia. Apesar da EEPROM do Arduino ser relativamente pequena, dependendo da placa, salvar o valor do contador nessa memória não iria ocupar muito espaço.

      Vou tentar montar um post sobre isso.

      Abraço e obrigado !

      Excluir
    2. Bom dia
      preciso fazer um circuito com arduino
      que va contar de 0 a 9 por pulsos, qando chegar no 9, ele vai soar uma sirene, e eu tenho que apertar um botão reset pra ele iniciar novamente.
      pode me ajudar com isso ?
      obrigado

      Excluir
  2. Bom dia, Arduino e Cia.
    Você venderia um contador desse, com reset e o display backlight azul ?
    Pretendo adquirir um contador de pulsos.
    Da seguinte forma:
    Valor de cada pulso = 0,03571429
    Ou seja:
    A cada 28 pulsos = 1,0
    Eu precisaria que o display me mostrasse no mínimo, (00,00) ou (000,00)
    Por favor, entre em contato comigo.
    rctacografos@ig.com.br
    Renato

    ResponderExcluir
    Respostas
    1. Boa tarde,

      Mandei um email para você.

      Abraço !

      Excluir
    2. Olá Amigo, queria o seu contato que estou precisando de um desses também. teria como ter seu contato ? Abraços

      Excluir
    3. Oi Carlos,

      Por favor entre em contato utilizando o formulário de contato no lado direito da página. Conversamos por email.

      Abraço!

      Excluir
  3. gostei muito do seu video mostrando um o trabalho com arduino!
    mas meu motivo de estar entrando em contato com vc, é :recebi um trabalho para fazer do meu curso de eletronica no prazo de uma semana para entrega, com arduino como sou iniciante nao tenho ideia como começar a fazer e preciso de uma ajuda.
    vamos ver se voce pode me ajudar

    o trabalho é facil pra quem intende bem, tenho que fazer um contador de peça usando o arduino, esse contador tem que contar tres tipos de peça(sendo que terei que usar tres botoes),e mais um para reset. os resultados da contagem tem que aparecer na tela do pc,
    quando for zerar ele tem que mostrar as contagem totais de cada peça separado. a placa com botoes eu me viro em fazer o problema é o codigo do arduino.
    meu arduino e o uno.

    ex:
    quero contar tipos de bolinhas, quando as bolinhas que eu peguei forem de tamanho pequena eu adiciono no primeiro botao um click, quando a bolinha for media no segundo botao, e grande no terceiro botao, tem que constar os tres valores na tela quando mudar de especie de bolinhas eu zero, para continuar outra contagem.

    se voce tiver tempo, e querer me ajudar blz eu ficarei muito agradecido, se voce nao quiser desconsidere essa mensagem.

    jhone_cidral@hotmail.com

    ResponderExcluir
    Respostas
    1. Boa noite Jhone,

      Meu problema realmente é o tempo. rs... Mas se quiser me mandar o código depois que conseguir programar, podemos discutir se falta algum detalhe no programa.

      Abraço !

      Excluir
  4. como posso trocar trocar o sensor por apenas um push button?

    ResponderExcluir
    Respostas
    1. Boa noite,

      Pode ser feito sim. Troque o sensor por um push button, fazendo a mesma ligação que eu fiz no botão de reset, mas ligando o "novo" botão na porta A5.

      Abraço!

      Excluir
    2. Boa noite trabalho com calibração de pluviometros que usam reed switches, capazes de gerar pulsos de 5Vdc, você pode entrar em contato via email e me mandar um preço para fazer um contador que use bateria, trabalho sempre no campo. Obrigado

      Excluir
    3. Boa tarde,

      Por favor utilize o formulário de contato no lado direito da página, assim podemos conversar por email.

      Abraço!

      Excluir
  5. Olá amigo, fiz um projeto com 3 displays de 7 segmentos que utiliza um sensor de temperatura LM35, também utilizando a biblioteca Sevseg do seu projeto e funcionou, porém os displays não mostram a parte decimal da temperatura mostrando somente a parte inteira, há alguma forma de corrigir esse problema com a biblioteca Sevseg que vc utilizou? Abraços!!!

    ResponderExcluir
    Respostas
    1. Boa noite Rafael,

      Você está enviando esse valor de temperatura para o serial monitor ? lá aparece a parte decimal ?

      Abraço!

      Excluir
    2. Exatamente, o valor decimal aparece normalmente no serial monitor, porém nos displays aparece somente a parte inteira do valor.

      Excluir
  6. E possivel no lugar do sensor colocar um botao

    ResponderExcluir
    Respostas
    1. Boa noite,

      É possível sim. Faz o mesmo efeito.

      Abraço!

      Excluir
  7. Olá Amigo!!!
    Alguem sabe informar se esta biblioteca é possível fazer um projeto com mais do que 4 display de 7 segmentos?
    Abraços!!!

    ResponderExcluir
    Respostas
    1. Bom dia Rafael,

      Nesse caso você vai precisar de um CI como o Max7219, para gerenciar essa quantidade de display e "economizar" portas do Arduino:

      http://www.arduinoecia.com.br/2013/07/ligando-2-displays-7-segmentos-ao.html

      Abraço!

      Excluir
  8. Obrigado por esta boa explicação, eu gostaria de usá-lo em combinação com um SSD Adafruit 1306 IC2. talvez você possa me ajudar com o código e explicação?

    ResponderExcluir
    Respostas
    1. Bom dia,

      O ideal seria eu ter um desses para testar, infelizmente (ainda) não tenho. :)

      Abraço!

      Excluir
  9. Olá cara! Eu usei este exemplo como base para fazer um projeto bem legal. Porém encontrei alguns probleminhas que me parecem bem bestas mas ainda não sei resolver. Eu substitui o pino 19 (sensor) pelo 15(A1), declarando ele no modo pull-up, e deixei o pino do botao do mesmo jeito por que estou sem resistores. :)
    Depois eu configurei uma mensagem de lcd diferente, lá no início (linha 27) e mudei o nome da variavel contador para atuacoes.
    O propósito é que ele conte um evento toda vez que um rele meu, NA, atuar. Envio o gnd pro rele e quendo o mesmo fecha a porta A1 zera, contando mais um. e o botão de reeste é o gnd com o pino A0, tamebm declarado pull-up.

    Resultado: aparece tudinho na tele mas nao responde aos aterramentos dos pull-up. As mensagens ficam estáticas.

    Usei um Pro-mini (Beestore) + Conversor serial USB (BTE13-009) + IC2 (CH340) e o LCD 16x9 (HD44780).

    Espero que não tenha incomodado. Muito obrigado desde já! :)

    ResponderExcluir
    Respostas
    1. Oi Rafael!

      Cara, você já tentou testar esse programa por partes ? Assim acho que fica mais fácil de vc isolar esse problema de aterramento do pull-up, pq pode ser que nem seja esse o problema, às vezes é alguma coisa errada no software mesmo.

      Abraço!

      Excluir
  10. // Programa : atuacoes utilizando LCD 16x2 e botao reset
    // Autor : Arduino e Cia

    #include
    #include

    // Inicializa o display no endereco 0x27 por causa do IC2
    LiquidCrystal_I2C lcd(0x27,2,1,0,4,5,6,7,3, POSITIVE);

    // Cria variaveis globais
    int atuacoes = 0;

    // Ligado ao pino A1 (pull-up) - Porta A1 ao Arduino
    int pinocontato = 15;
    // Pino ligado ao botao de reset
    int pino_botao_reset = A0;
    // Armazena o valor lido pelo pino A1 (pull-up)
    int leitura;
    // Armazena o estado do botao reset
    int estadobotao = 0;

    void setup()
    {
    lcd.begin(16,2);
    // Define o pino A1 (pull-up) como entrada
    pinMode(pinocontato, INPUT);
    digitalWrite(15, HIGH); //ativando o pull-up do pino A1
    // Define o pino do botao reset como entrada
    pinMode(pino_botao_reset, INPUT);
    digitalWrite(14, HIGH); //ativando o pull-up do pino A0
    // Informacoes iniciais no LCD
    lcd.print("Power Engenharia");

    }

    void loop()
    {
    // Verifica se o botao reset foi pressionado
    estadobotao = digitalRead(pino_botao_reset);
    if (estadobotao != LOW)
    {
    // Zera o atuacoes
    atuacoes = 0;
    // Apaga o valor anterior
    lcd.setCursor(11,1);
    lcd.print(" ");
    // Mostra o valor zerado
    lcd.setCursor(0,1);
    lcd.print("atuacoes: ");
    }

    // Le as informações do pino A1
    leitura = digitalRead(pinocontato);
    // Verifica se houve aterramento do pino A1
    if (leitura != LOW)
    {
    // Incrementa o valor do atuacoes
    atuacoes = atuacoes++;
    // Apaga o valor anterior
    lcd.setCursor(11,1);
    lcd.print(" ");
    // Mostra o valor do atuacoes
    lcd.setCursor(0,1);
    lcd.print("atuacoes: ");

    // Loop caso o objeto pare sobre o sensor
    while(digitalRead(pinocontato) != HIGH)
    {}
    }
    }

    ResponderExcluir
  11. ola o meu lcd e 16x2 porém ja vem com teclado o que muda na ligação?

    ResponderExcluir
    Respostas
    1. Boa noite Anizio,

      Qual o modelo do seu LCD ? Eu tenho um post sobre lcd com teclado: http://www.arduinoecia.com.br/2013/08/shield-lcd-16x2-com-keypad.html

      Abraço!

      Excluir
    2. Olá, se o seu modelo, for (provavelmente) o citado na resposta, você poderá inclusive configurar os botoes do seu LCD para resetar o contador, com estes botoes voce podera fazer menus e tudo mais. observe a resposta do blog. :) FlW!

      Excluir
  12. Haaa, inclusive já foi resolvido o post sobre um probleminha que tive com o código. Obrigado pelo post, muito útil.

    ResponderExcluir
  13. Olá, mesmo depois de ter realizado todo projeto, as letras não são impressas no display, porem consigo regular o brilho pelo segundo potenciômetro, gostaria de saber ser pode me ajudar.

    ResponderExcluir
    Respostas
    1. Oi Ryumou,

      Tente utilizar um LCD com um exemplo básico, para testar a ligação. Veja este post, por favor: http://www.arduinoecia.com.br/2013/12/lcd-16-x-2-backlight-azul-hd44780.html

      Abraço!

      Excluir
  14. Boa noite arduino e cia. Estou fazendo um contador de peças de uma estera porém meu programa está apresentando problema na hora que a peça para de frente o sensor o contador dispara usei o comando while porém ele finaliza o programa quando sua satisfação é falsa conto com sua ajuda

    ResponderExcluir
    Respostas
    1. Boa tarde,

      O programa já prevê essa condiçao (linha 61). você chegou a alterar algo ?

      Abraço!

      Excluir
    2. Estou com o mesmo problema. Obs: não alterei nada do código.

      Excluir
  15. oi boa tarde
    estou querendo fazer um com 10 botoes e cada um dele quando eu aperta me mostre um numero como eu poderia faz me dar uma ideia ai se for positivável

    ResponderExcluir
  16. Olá amigo,
    Primeiro, parabens pela aula... sou iniciante nos Arduinos.
    A minha intenção é usar um arduino para fazer contagem mas, precisa ser Up e Down... Incrementar o contador no sentido horário e decrementar no anti-horário, para leitura de um eixo de motor ( Tipo um contador de Tape Deck ).
    Como incluir isso em seu contador ?

    obrigado

    ResponderExcluir
    Respostas
    1. Oi Marcos,

      É possível fazer sim, mas será necessário dar uma olhada no tipo de motor, eixo, etc, para ver como isso será feito.

      Abraço!

      Excluir
  17. Olá amigo,
    Primeiro, parabens pela aula... sou iniciante nos Arduinos.
    A minha intenção é usar um arduino para fazer contagem mas, precisa ser Up e Down... Incrementar o contador no sentido horário e decrementar no anti-horário, para leitura de um eixo de motor ( Tipo um contador de Tape Deck ).
    Como incluir isso em seu contador ?

    obrigado

    ResponderExcluir
  18. Boa noite obrigado pelo site me ajudou muito. Gostaria de saber se tem como fazer o contador contar decrescente estou precisando fazer um contador de pesas com pulsos manual com botões. Tambem gostaria de saber quanto eu poderia cobrar por este serviço com o programa e montagem. Se puderem me ajudar agradesso desde já. Se puder me responder no meu email amarildodsm@gmail.com. obrigado.

    ResponderExcluir
  19. Respostas
    1. Boa noite,

      Entre em contato utilizando o formulário de contato no lado direito da página. Combinamos por email.

      Abraço e obrigado!

      Excluir
  20. Boa tarde parabéns pelo projeto como sou novo no mundo do arduino gostei muito de sua pagina pois então posso colocar mais um display nesse projeto qual seria a mudança abraços.

    ResponderExcluir
  21. Olá, meu nome é Lucas e estou trabalhando em um projeto onde utilizo este mesmo sensor com um circuito de precisão ajustável. Ele possui uma entrada analógica e outra digital. Utilizei este mesmo código nele, mas ele está incrementando a variável "contador" somente uma vez. É como se ficasse preso na função while() e quando eu tiro a variável é incrementada várias vezes com 1 único objeto. Se puder me ajudar ficarei muito agradecido, pois preciso resolver isso urgentemente! Abraço!

    ResponderExcluir
  22. Olá, estou fazendo um projeto onde utilizo esse mesmo sensor com um circuito de precisão ajustável. Ele possui uma entrada digital e outra analógica. Utilizei este mesmo código, porém ele incrementa a variável "contador" somente 1 vez. É como se ficasse preso na função while() que é justamente o problema que ela deveria resolver, já que se eu tirá-la, a variável é incrementada várias vezes se o objeto parar sobre o sensor. Se você puder me ajudar ficarei muito agradecido, pois preciso resolver isso urgentemente! Abraço!

    ResponderExcluir
  23. Bom dia, acredito que o que eu quero fazer seja muito simples, eu quero executar um programa no arduino e ele mande um pulso para um outro aparelho e pare.
    Eu quero interromper esse pulso...
    Tem como? Agradeço muito qualquer ajuda.

    ResponderExcluir
    Respostas
    1. Oi Erick,

      Você quer mandar um dado de um Arduino para outro, é isso ? Você pode simplesmente usar as portas digitais pra isso.

      Abraço!

      Excluir
  24. Respostas
    1. Boa noite,

      Está usando o valor correto para a resistência do TCRT5000 ?

      Excluir
  25. Você consegue mudar esse projeto. com a opção de eu determinar a quantidade de objetos por exemplo quando der 10 objetos o Arduíno ligar um rele por exemplo?. e porque tom uma ideia de colocar isso numa bobinadeira ai quando der a quantidade de voltas que eu estabelecer ele desliga meu rele que liga o motor da bobinadeira. Tem você me ajudar com isso.

    ResponderExcluir
    Respostas
    1. Oi Anizio,

      Posso desenvolver isso sim, por favor entre em contato utilizando o formulário de contato no lado direito da página, e vamos combinar por email.

      Abraço!

      Excluir
  26. Ola, como eu faria para ligar um display (7segmentos) e ele apresentar o numero 0 e quando eu pressionar o botão apresentar outro número? me ajuda!!! emanuel-tig@hotmail.com

    ResponderExcluir
  27. Boa noite, eu gosta de saber se é possível vocês elaborar um projeto de um botão que apertando uma vez acenda um led, apertando o mesmo pela 2ª vez acenda um 2º led, e na 3ª acenda um 3º led e na 4ª vez que apertar apague todos os leds.

    ResponderExcluir
    Respostas
    1. Boa noite,

      Seria um loop simples ? Ao apertar o botão novamente ele reiniciaria o processo ?

      Abraço!

      Excluir
  28. BOM DIA ! GOSTARIA DE SABER COMO FAÇO PARA QUE QUANDO EU DESLIGUE O ARDUINO ELE MATENHA A CONTAGEM E NÃO ZERE O CONTADOR ?

    ResponderExcluir
    Respostas
    1. Oi André,

      Grave esses dados na memória EEPROM do Arduino. Tenho um post sobre isso: http://www.arduinoecia.com.br/2015/03/gravar-dados-memoria-eeprom-arduino.html

      Abraço!

      Excluir
  29. Ola, quero fazer este projeto.
    Pretendo aprender um pouco sobre o Arduíno.

    Pode me informar o nome ou modelo?
    Indica alguem confiavel para que eu compre?

    Obrigado
    Sou Robson... email robson1976.silva@gmail.com

    ResponderExcluir
  30. Ola!
    Sou iniciante no assunto, mas quero praticar para apreender.
    Quero comprar o Arduino, mas não sei qual o modelo.
    Podem me ajudar?

    ResponderExcluir
    Respostas
    1. Boa noite Robson,

      Eu começaria com um Arduino Uno, é a placa mais usada da linha Arduino, e possui muita documentação. Aqui no blog, por exemplo, eu uso o Uno como base para a maioria dos posts.

      Depois que você adquirir conhecimento, pode partir para um Mega, um Leonardo ou até mesmo o novo Genuino 101.

      Abraço!

      Excluir
  31. Ola! Fiz a montagem com o LCD.
    Usei o mesmo código, não fiz alteração alguma.
    Mas não esta contando.
    O contador fica sempre em ZERO.
    Tem alguma ideia do que pode ter acontecido?

    ResponderExcluir
    Respostas
    1. Oi Robson,

      Tentou alterar o valor do resistor ligado ao sensor óptico ?

      Abraço!

      Excluir
    2. Fiz algumas mudanças no codigo.
      Acredito que estava com algum erro de sintaxe.
      Tirei o ++ e troquei por +1 ele começou a contar.
      Sei que é a mesma coisa, mas funcionou!

      Excluir