Tags:
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..
Bem-vindo a
Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)
© 2024 Criado por Marcelo Rodrigues. Ativado por