estou tentando fazer um bloqueador de carro q funciona assim:
ao abrir a porta do carro inicia uma contagem . se nao pressionar um botao nesse meio tempo aciona uma saida com um rele e bloqueia o carro
consegui fazer em partes mas estou com um problema q nao consigo resolver
se eu aciono pela primeira vez ele funciona legal conta o tempo e dps aciona a porta se eu pressionar o botao para a contagem
mas na segunda vez q esta o problema. se eu acionar logo em seguida ele funciona normal mas se eu demorar para acionar ele nao para a contagem do tempo entao se eu acionar a entrada o led liga na mesma hora e nao era pra ser assim ele teria q iniciar a contagem dnv
o codigo q tenho ate agr eh esse:
int ledPin = 13;
long tempo_acionado = 3000;
unsigned long ultimo_tempo = 0;
int aciona = false;
void setup()
{
pinMode(ledPin,OUTPUT);
pinMode(9,INPUT);
pinMode(8,INPUT);
}
void loop()
{
unsigned long tempo_atual = millis();
if (digitalRead(9)==HIGH )
{
aciona = true;
}
if(aciona == true && tempo_atual - ultimo_tempo >= tempo_acionado)
{
digitalWrite(ledPin,HIGH);
ultimo_tempo = tempo_atual;
aciona = false;
}
if (digitalRead(8)== HIGH )
{
digitalWrite(ledPin,LOW);
ultimo_tempo = tempo_atual;
aciona = false;
}
}
se puderem me ajudar ficarei grato !!!
desde ja obrigado!!!
Tags:
Tente dessa forma
int ledPin = 13;
long tempo_acionado = 3000;
unsigned long ultimo_tempo = 0;
int aciona = false;
void setup()
{
pinMode(ledPin,OUTPUT);
pinMode(9,INPUT);
pinMode(8,INPUT);
}
void loop()
{
if (digitalRead(9)==HIGH )
{
ultimo_tempo = millis();
aciona = true;
}
if(aciona == true && millis() - ultimo_tempo >= tempo_acionado)
{
digitalWrite(ledPin,HIGH);
aciona = false;
}
if (digitalRead(8)== HIGH )
{
digitalWrite(ledPin,LOW);
aciona = false;
}
}
Aparentemente isso resolveria a instabilidade que você comentou, porem, como esta o seu codigo ao pressionar o botao do pino 8, o carro estará desbloqueado mesmo que passe do tempo.
Oi José,
Só para ver se entendi a logica eletrônica para tentar simular aqui. Devo supor que 8 e 9 devem estar sempre em nível alto para que 13 esteja sempre baixo, desta forma nada se aciona, então ao abrir a porta do carro, devo assumir que 8 foi para nível baixo, e se estourar o lapso que você determinou e eu não mandar pino 8 para nível alto dentro do lapso, 13 vai para nível alto acionando o rele, e se 8 for para nível alto novamente mesmo com rele acionado, reseta 13, desliga rele acionado, e deixa tudo armado novamente.
É isso mesmo? Corrija-me se estiver errado por favor.
Abraço.
Boas Jose, no outro dia tive o mesmo problema, depois fui ver ao certo o que faz a função millis() e cheguei a brilhante conclusão que a função millis é um contador interno do arduino, que começa a contar desde que ligas ate reiniciar, que pode ser manual ou por ele passado +- 50 dias... depois de passar algum tempo não funciona pq a condição e sempre verdadeira... testa assim que deve funcionar
int ledPin = 13;
unsigned long ultimo_tempo = 0;
int aciona = false;
void setup()
{
pinMode(ledPin,OUTPUT);
pinMode(9,INPUT);
pinMode(8,INPUT);
}
void loop()
{
if (digitalRead(9)==HIGH )
{
aciona = true;
ultimo_tempo = millis();
}
if(aciona == true && millis() - ultimo_tempo >= 3000)
{
digitalWrite(ledPin,HIGH);
aciona = false;
}
if (digitalRead(8)== HIGH )
{
digitalWrite(ledPin,LOW);
aciona = false;
}
}
fala pessoal!!
funcionou legal eim obrigado !!!
Carlos so explicando
quando abro a porta envia um sinal high na porta 9
se nao tiver sinal high na porta 8 nesse meio tempo aciona a saida 13 e liga o rele
simples assim :)
obrigado a todos!!!!
Valeu José!
Abs.
Bem-vindo a
Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)
© 2024 Criado por Marcelo Rodrigues. Ativado por