Caros amigos estou tendo uma demora muito grande na leitura do estoda do botão.
já setei ele com pull-up digital e pull-up convencional e mesmo assim demora, as vezes tenho que ficar pressionando o botão por mais de 5 segundos p/ que o led funcione.
segue meu código. Se alguem puder corrigier, desde já agradeço.
#define led 9 // define que a porta 9 tem o led conectado
Tags:
O problema é o delay(tp);
Utilizando o delay você faz com que o microcontrolador fique preso nesta linha/instrução.
Existem duas formas de contornar o seu problema (devem haver outras).
A mais simples é passar o delay(tp) para dentro do IF.
A outra é deixando de utilizar o delay. Veja o exemplo que vem junto com a IDE de blink led whithout delay.
É uma solução mais trabalhosa porém a melhor solução por não manter o microcontrolador sem fazer nada só esperando os 20 segundos.
Carlos , muito obrigado, coloquei o delay dentro da If e deu certo.
abraços
outra coisa, se acostuma a sempre usar {}, mesmo que teu if tenha apenas uma linha de execucao, pois assim fica mais facil pra quando tu for modifica-lo, saber onde comeca e onde termina a acao do bloco
Carlos,
Estou com um problema semelhate porém no meu programa não estou citando delay, oArdu
ino tem algum delay interno? ou seja próprio?
estou usando um sensor optico como um botão que aciona um rele e do rele para o Arduino.
No caso escutamos o rele chaveando, porém parece que o Arduino tem um retardamento no sinal par poder
receber o sinal.
Vc consegue me dar um auxilio no programa?
Olá ,
o seu codigo sempre passa pelos 20 segundos de delay , portanto ele sempre vai ficar preso dentro deste loop, e não vai ler o botão , exeto quando acabar os 20 segundos , ai ele lê o botão 1 vez e continua esperando.
observe que a com a correta identação , a legibilidade do codigo melhora , mostrando onde estava o bug.
Segue seu codigo , acrescido apenas de espaços e line feeds nos lugares corretos.
void loop()
{
if (digitalRead(bot)==LOW)
{ // condição de leitura de botao se o bt estiver em estado low ou seja pressionado
digitalWrite(led,HIGH);
} //acione o led por
delay(tp); // 20 segundos
digitalWrite(led,LOW);
}
Viu como ficou facil achar o bug ?
Experimente colocar o delay dentro do if , assim:
void loop()
{
if (digitalRead(bot)==LOW)
{
// condição de leitura de botao se o bt estiver em estado low ou seja pressionado
digitalWrite(led,HIGH); //acione o led por
delay(tp); // 20 segundos
}
digitalWrite(led,LOW);
}
espero que resolva , não testei.
Abração
Enio
Muito bem lembrando Enio.
A identação é muito importante na hora de programar, pessoalmente acho tão importante quanto o código em si.
Eu sempre me preocupo muito com a identação,
quando abro uma chave , já abro no local correto , e já fecho na linha seguinte na mesma identação.
Só então coloco o codigo entre as chaves.
Se for um IF , então , coloco logo o IF chaves ELSE chaves , mesmo que não vá colocar codigo nenhum dentro do ELSE , melhora muito a legibilidade , depois de algum tempo ao ler o codigo sabe-se claramente que o programa não faz nada no ELSE.
Tudo isso não gera nenhum byte a mais no objeto que vai para a maquina , pois o compilador retira tudo ! É só alegria ...
abração.
Ormuz,
Isso está acontecendo pois você está utilizando um delay de 20 segundos, que "trava" o Arduino ali naquela instrução por exatos 20 segundos - durante esse tempo ele não lê o botão.
Você precisa utilizar a função millis() para contabilizar melhor o tempo -- esse é um dos problemas que os iniciantes geralmente encontram e que explico bastante durante o Curso de Arduino. ;-)
Bem-vindo a
Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)
© 2024 Criado por Marcelo Rodrigues. Ativado por