Ir ao conteúdo
  • Comunicados

    • Gabriel Torres

      Seja um moderador do Clube do Hardware!   12-02-2016

      Prezados membros do Clube do Hardware, Está aberto o processo de seleção de novos moderadores para diversos setores ou áreas do Clube do Hardware. Os requisitos são:   Pelo menos 500 posts e um ano de cadastro; Boa frequência de participação; Ser respeitoso, cordial e educado com os demais membros; Ter bom nível de português; Ter razoável conhecimento da área em que pretende atuar; Saber trabalhar em equipe (com os moderadores, coordenadores e administradores).   Os interessados deverão enviar uma mensagem privada para o usuário @Equipe Clube do Hardware com o título "Candidato a moderador". A mensagem deverá conter respostas às perguntas abaixo:   Qual o seu nome completo? Qual sua data de nascimento? Qual sua formação/profissão? Já atuou como moderador em algo outro fórum, se sim, qual? De forma sucinta, explique o porquê de querer ser moderador do fórum e conte-nos um pouco sobre você.   OBS: Não se trata de função remunerada. Todos que fazem parte do staff são voluntários.
Carlos Zanon

RESOLVIDO Sobre debouncing como funciona

Recommended Posts

Tenho algumas pequenas dúvidas sobre o debouncing.

A dúvida surgiu em um projetinho meu usando um ATTiny85 para uma pequena horta que estou montando em casa e vou fazer ela micro-controlada... Por puro hobby e aprendizado =)

image.png.c737b9cee353baf2da1d255dcb56e74d.png

O Botão ali em A1, ele somente tinha a seguinte estrutura:

 

image.png.d5edb4f2ffd7befbf6066e662cf61d47.png

 

Meu código já estava prevendo o tempo de segurar o botão, pois a cada clock ele ia executar o código novamente e isso ia me dar uma dor de cabeça...

image.png.18d49e82d24769398ee65000096d7792.png

 

 

Mas pelo que entendi do bouncing a melhor forma de eu deixar o botão é dessa forma aqui:

image.png.fdce719af29501d345cb515c912026eb.png

 

A Dúvida é no papel do capacitor... O Capacitor ai no caso, vai funcionar como um "filtro" para os ruídos? É isso que se chama de capacitor de desacoplamento?

No caso do reset, funciona da mesma forma... ele entra com um resistor de pull-up, é interessante eu fazer o mesmo procedimento nele?

 

Editado por Carlos Zanon

Compartilhar este post


Link para o post
Compartilhar em outros sites
35 minutos atrás, Carlos Zanon disse:

O Capacitor ai no caso, vai funcionar como um "filtro" para os ruídos?

sim amigo. Olha o que eu achei pra você

https://www.allaboutcircuits.com/technical-articles/switch-bounce-how-to-deal-with-it/

(paulão kk)

 

37 minutos atrás, Carlos Zanon disse:

No caso do reset, funciona da mesma forma... ele entra com um resistor de pull-up, é interessante eu fazer o mesmo procedimento nele?

sim amigo. Por gentileza consulte o d.s. do seu mc

 

Tem um debounce por sw pra complementar o do hw que elaborei há algum tempo mas mais tarde eu publico

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Isadora Ferraz Eu olhei um monte de links mas nenhum foi tão explicativo quanto o do @aphawk

 

No caso eu preferi fazer de uma segunda forma (ao invés de usar o delay), acabei por colocar um comparativo de timing no código.

 

Meu código final de teste para debouncing ficou:

/**
 * Verifica se o botão foi clicado e verifica o debouncing.
 * @return void
 */
bool btnIsClicked()
{
	// Verifica se o botão foi pressionado, a entrada irá a 0
	// Então, inicia a verificação de debouncing
	if(digitalRead(PIN_BTN) == LOW)
	{
		// Caso os testes "contra" o debouncing mostrem que o botão foi realmente
		// apertado, então retorta informando que o mesmo está em estado HIGH.
		if(BTN_STATE_TIME == HIGH)
			return HIGH;
		
		// Se ainda não foi provado que o mesmo foi clicado, então, marca a hora atual
		// no botão para futura comparação de dados e timing
		if(BTN_TIMER_PRESSED == 0)
			BTN_TIMER_PRESSED = time;
		
		// Este IF será valido num momento futuro onde é provado que o botão continua pressionado
		// Mantendo a entrada em nível 0 durante um certo tempo, então é considerado o click.
		if((time-BTN_TIMER_PRESSED) > 50)
		{
			BTN_STATE_TIME = HIGH;
			return btnIsClicked();
		}
	}
	else
	{
		// Se for apenas ruido, ele irá zerar, a filtragem/desacoplamento o capacitor
		// irá cuidar no circuito até que tudo esteja correto para validar o click.
		BTN_STATE_TIME = LOW;
		BTN_TIMER_PRESSED = 0;
	}

	return LOW;
}

 

E caso o mesmo seja pressionado, quero que apenas 1 vez este seja executado enquanto apertado:

	if(btnIsClicked())
	{
		if(BTN_STATE == LOW)
		{
			BTN_STATE = HIGH;
			btnClicked();
		}
	}
	else
	{
		BTN_STATE = LOW;
	}

 

Aproveitei para colocar durante a inicialização do MCU:

 

/**
 * Configura o MCU para as operações de leitura de porta
 * e realiza os testes iniciais
 */
void setup()
{
	// Número de erros obtidos.
	int errorCount = 0;

	// Tempo inicial de execução do MCU
	time = millis();

	// Configura os pinos de leitura
	pinMode(PIN_BTN, INPUT);
	pinMode(PIN_HGM, INPUT);
	pinMode(PIN_LDR, INPUT);

	// Configura os pinos de escrita
	pinMode(PIN_LIGHT, OUTPUT);
	pinMode(PIN_WATER, OUTPUT);

	// Desliga os pinos de agua e luz
	digitalWrite(PIN_LIGHT, LOW);
	digitalWrite(PIN_WATER, LOW);

	// Somente estará em LOW caso esteja pressionado ou capacitor ainda não carregado.
	while((errorCount++) < 3 && digitalRead(PIN_BTN) == LOW)
		delay(50);

	// Em caso de erro ou sensores sem funcionamento, então
	// Declara estado de ERRO.
	if(errorCount >= 3 || !verificarSensores())
	{
		ERROR_STATE = HIGH;
	}
}

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Algo como um minimalista capacitor virtual (inventei isso agora):

 

#define _TEMPO 128
while (RA0) //se pressionar e ...
{
while(tmp--) if (RA0) tmp=_TEMPO; //e manter por algum _TEMPO, foi alguém
}

Só o conceito. Claro, passível de evolução. O melhor é incorporar isso numa interrupção por mudança de estado, numa varredura de teclas e etc pra não travar o processamento na leitura do botão....

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Sérgio Lembo Isso ocorre em milésimos de segundo correto? Essa variação ocorre tanto no momento que eu pressiono quanto no momento que eu solto o botão, certo?

 

@Isadora Ferraz O Meu código ali faz algo parecido com isso só que com 50ms de intervalo...

Ele só "trava" (máx de 150ms) o MCU quando está inicializando onde ocorre o delay, de resto eu procuro não travar o processamento de nenhuma forma.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não me preocupei em desenhar em escala. No teste adicionei as 2 resistências para visualização do tri-state. Sobre o tempo ser em milisegundos... num é tão rápido assim. Um relé/contator leva entre 40 e 120ms para completar o ciclo de manobra, sendo que a imensa maioria se situa entre 80 e 100ms. Em fim de curso, quando se tem um movimento muito rápido e filtros temporizados não podem ser usados ou em qualquer outra situação em que filtros com efeito de retardo não sejam aceitos, havendo a disponibilidade de um contato reversível fica fácil a filtragem por um simples flip-flop.

Editado por Sérgio Lembo

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário






Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×