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 16×2.
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
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.
// 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 16×2 e botão de reset
Para utilizar o contador com botão de reset no display LCD 16×2, 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 16×2 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 16×2 – Backlight azul – HD44780.
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:
// 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)
{}
}
}