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!!!

Exibições: 976

Responder esta

Respostas a este tópico

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.

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço