Pessoal estou querendo fazer um programa onde o microcontrolador receba a informacaode um botao, tipo um pulso ou ficar pressionado por tantos segundos, ele reconheca a acao do botao e tome uma decisao tipo acionar ou desarmar um rele.. Alguem sabe que comando usar

Exibições: 506

Responder esta

Respostas a este tópico

Olha veio não testei não mas você tentar fazer dentro de um while testando se o botão está prescionado, se tiver vc incrementa um int e implementa um delay de 1 segundo. No final da brincadeira vc pode testar quanto vale o int e saber por quantos segundos o botão ficou prescionado.

Rafael acho que com o while e millis fica mais fácil. O millis fornece o tempo em milisegundos desde que o arduino foi ligado ou resetado. Quando o botão for precionado, vc envia para uma variável esse tempo e aí entra no while até o botão ser liberado. Nesse instante (quando o botão for liberado) vc envia o tempo para outra variável. Fazendo a diferênça entre as duas variáveis, vc tem o tempo em que o botão ficou pressionado.

poderiam me postar um exemplo de programa? sou novo em programação e essa ta meio dificil...

obrigado pela atencao pessoal

Então a dica do colega Francisco Lucena é mesmo 1000x mais precisa. Implementada:

 

void loop()
{
    long tmp = millis();
    while(digitalRead(pin8));
    if((millis() - tmp) >= 3000)
    {
        digitalWrite(pin13, HIGH);
        Serial.print("Pode executar foram ");
        Serial.println((millis() - tmp)/1000);
    }
    delay(100);
}

Bom antes pega o tempo e então fica processando o while ate que o pino 8 esteja descarregado. Quando o botão for solto e o pino 8 descarregado testa-se a diferença entre o tempo da variável com o tempo decorrido. Se ele for o valor que vc quer então execute algo. Nesse casso estou executando se for maior ou igual a 3 segundos.

no codigo postado, quando o botao pressionado por 3s acende o led, porém quero que ele apague atravez de outro comando, botao 1s por exmplo, tentei implementar usando o else na funcao porem agora mesmo depois de pressionar por 3s o led so da uma piscada rapida e apaga, olhem o que fiz

#define botao 8
#define led 13

void setup() {
pinMode(botao, INPUT);
pinMode(led, OUTPUT);
}

void loop()
{
long tmp = millis();
while(digitalRead(botao));
if((millis() - tmp) >= 3000)
{
digitalWrite(led, HIGH);
Serial.print("Pode executar foram ");
Serial.println((millis() - tmp)/1000);

}
else(digitalWrite(led, LOW));
delay(100);
}

alguem sabe o que esta errado?

valeu

Essa parte deveria ser:

if((millis() - tmp) >= 3000)
{
digitalWrite(led, HIGH);
Serial.print("Pode executar foram ");
Serial.println((millis() - tmp)/1000);
}else if((millis() - tmp) == 1000){

digitalWrite(led, LOW);
delay(100);
}

 

else não é função é um bloco de código

assim continua mantendo aceso, nao apaga mesmo pressionando por menos de 3s

é então ele só vai apagar se for exatamente 1 segundo... troca essa parte aqui:

}else if((millis() - tmp) <= 1000){

 

agora ele vai acender se for um tempo maior ou igual a 3 segundos, e vai apagar se for um tempo menor ou igual a 1 segundo.

assim tambem o led so da uma piscada e apaga com 3s nao mantendo aceso

nao estou usando resitor no botao, pode ser isso?

ja tentei tirar o delay tbm porque parece que a piscada é no tempo de delay, conforme aumenta o delay o tempo aceso tbm aumenta, mais se tira o delay a piscada é mais rapida

mudei um pouco o jeito do programa, decidi usar o switch case;;

desta forma ficou assim.

#define botao 8
#define led 13

typedef enum {
BOTAO_OFF,
BOTAO_ON} t_estados;

t_estados estado;

int time;

void setup() {
pinMode(botao, INPUT);
pinMode(led, OUTPUT);

digitalWrite(led, LOW);
estado = BOTAO_OFF;}

void loop()
{
switch (estado)
{
case BOTAO_OFF:
if(digitalRead(botao) != 0)
{
time= millis();
estado = BOTAO_ON;
}
break;
case BOTAO_ON:
if(digitalRead(botao) == 0)
{
time= millis() - time;
if(time >= 3000)
digitalWrite(led, HIGH);
else if(time <= 1000)
digitalWrite(led, LOW);
estado = BOTAO_OFF;
}
break;
default:
break;
}
}

porém ainda tenho o mesmo problema do led apenas dando uma piscada rápida, mas se eu tirar a linha da condição <=1000, funciona beleza, mas ai nao consigo apagar o led por nao ter este comando no programa..

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço