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
#define bot 10 // define que o botão está na porta 10
#define bz 11 // define que o piezo está na porta 11
int tp= 1000*20; // varialvel de tempo dos 20 segundos


void setup()
{
pinMode(led, OUTPUT); //deine o led como saída
pinMode(bot, INPUT);// define o bt como entrada
pinMode(bz, OUTPUT);// define o piezzo como saida
digitalWrite (bot, HIGH);//pull-up interno p/ que esteja em estado alto
}

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);
}

Exibições: 791

Respostas a este tópico

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 obrigado 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. ;-)

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço