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
  • Autor do tópico
  • @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
  • Autor do tópico
  • @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

    ×