caros amigos, preciso fazer acender o LED após 4 pulsos no botão e se continuar os pulsos o LED continua aceso se após 5 segundos sem pulsos o LED apaga. Alguém poderia me ajudar? Achei um código que talvez poderia ser como base mas não funcionou.

// Colocar os botões e os led nos pinos indicados

int Button1 = 6;

int led1 = 7;


int contacendled = 0;

unsigned long intervalo = 0;

void setup() {
pinMode(Button1, INPUT);

pinMode(led1, OUTPUT);

}

void loop() {

// se o botão 1 é precionado ele soma mais um a variavel contaacendled
if(digitalRead(Button1)==1 ){
contacendled++;
delay(100);
intervalo = millis();}

// se passar mais que 5 segundos entre os pressionar de botao, ele volta a zero e precisa pressionar 4 vezes de novo
if(millis() > intervalo+5000){
contacendled = 0;
}

// se a variavel contacendled chegar a 4 o que dizer que o botão 1 foi pressionado 4 vezes ele acende o led 1
if(contacendled == 4){
digitalWrite(led1, HIGH);

contacendled=0;
}


}

// alguem poderia me ajudar a ajustar para funcionar?

Exibições: 137

Responder esta

Respostas a este tópico

Olá Soares. Sugiro adicionar mais informações ao tópico.

oque por exemplo Tiago

Quando via sua postagem, ela não tinha nenhum texto. Por isso fiz este comentário.

Olá.

  Esse negócio de fazer interface de botão com humanos é simples na teoria.. Na prática a coisa é enrolada mesmo.

  A questão é que o humano pode apertar rápido, lentamente, demoradamente, etc.

  No seu codigo se for apertado demoradamente a cada 100mils vai considerar 1, então um toque longo já acionaria.

  Se vc contar sem o delay() tb fica ruim, pq uma apertada já vai pra 4 o contador.

  Um caminho seria manter sim o delay(), mas em vez de considerar o botão apertado considerar a transição dele para apertado, digo: Quando ele era LOW e passou a ser HIGH. Isso elimina a confusão entre apertado demoradamente e apertado 4x.

  Outra coisa. No Arduino o nivel 0 é chamado LOW e o nivel 1 é chamado HIGH. Não é recomendado usar o "==1". Parece obvio que pode, na maioria das vezes funciona, mas contraria a especificação do manual. 

   

  Minha sugestão seria o trecho:

"

if(digitalRead(Button1)==1 )...

"

  Virar:

"

Botaoa=Botao; //Armazena o estado anterior de Botao em Botaoa

Botao=digitalRead(Button1); // Atualiza Botao

if((Botaoa==LOW) && (Botao==HIGH) ) ... // Aciona detectar a transição

"

Criando as 2 variaveis Botao e Botaoa antes.

Ainda assim pode não ficar 100% pq conforme a pessoa apertar, a qualidade dos fios, do botão, se vc colocou o pullup adequado e se colocou um capacitor pra ajudar a tirar ruidos, pode acontecer da pessoa apertar o botão e na hora de soltar ele considerar mais um pulso. Ficaria contando quando aperta e quando solta, pq o soltar vem com ruido interpretável como transição.

Enfim, veja se melhorou e se ficou ao contento.

Caso negativo é possível melhorar fazendo o delay só ser considerado depois que a pessoa solta a tecla.

boa tarde Eduardo

então na verdade eu quis simplificar a ideia e acabei complicando

Esses pulso serão disparados por uma central conforme imagem do osciloscópio abaixo de 1 em 1 segundo.

poderia me ajudar a montar o código?

Boa tarde Soares, fiz o código, dá uma olhada pra vê se te atende:
O código espera que o botão seja pressionado quatro vezes e, em seguida, inicia uma contagem de tempo de 5 segundos. Durante essa contagem, um LED é mantido aceso. Após 5 segundos, o LED é desligado e a contagem é reiniciada. E se durante a contagem houver mais pulsos a contagem de LigaTimer é zerada mantendo o led acesso até que não tem mais pulsos e dai volta a contar 5 segundos.
Clica no link a baixo para baixar o código, e é sempre interessante anexar os códigos antes de postar aqui, assim não fica tudo bagunçado. 

4Pulsos.ino

O código que eu fiz é para botão, Qual a tensão desse pulso?

então a tensão do pulso seria 24v, mas essa eletrônica eu consigo resolver e transformar ele para 5v.

mas valeu muito.

valeu demais Yuri, você e fera.

Yuri, boa tarde

tem uma coisa que verifiquei que se eu por exemplo der só 3 pulsos ele armazena a quantidade ate que seja dado o próximo pulso para continuar a contagem.

Teria como ele resetar a contagem se após 5 segundos não for gerado outro pulso?

ele já faz isso quando atinge os 4 pulsos ele faz a contagem e reseta.

Boa noite Yuri

coloquei o resistor de Pullup e o código ficou show, funcionando conforme proposto, tem hora que da uma encavalada na contagem talvez devido a sensibilidade do push boton , da pra ajustar no código um tempo de botão pressionado pra evitar esse encavalamento?

mas já está bom demais .

Resolvido

coloquei um delay(400);

Olá Soares, este problema ocorre por causa da mecânica do botão.

Como você deve saber, o sinal de um botão é ativado após 2 superfícies/contatos (que estão dentro do botão) serem tocados. Entretanto, essas superfícies não são perfeitas, então, durante o "pressionar do botão", erros de sinais se tornam muito comuns.

Faça uma pesquisa rápida sobre "debounce", você irá compreender melhor.

Depois de compreender, recomendo fortemente que veja esta postagem: https://labdegaragem.com/forum/topics/aula-fun-o-millis

Acredite, vale a pena a pesquisa rápida e a leitura. Esse será um conhecimento que vai lhe ajudar em TODOS os seus projetos, e vai consumir pouco tempo.

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço