Fala galera faz um bom tempo que não trabalho com Arduíno e esses dias voltei a brincar!! 

O que eu quero é aproveitar uma porta como entrada e saída! O led vai indicar o funcionamento correto do circuito e o botão chamar apenas uma vez uma função independente do tempo pressionado e o efeito bounce tbm foi corrigido! O código ate funciona, mas no momento que o led acende e for acionado o botão minha variável de estado é zerada e nunca chama a função. Mesmo com o tempo reduzido do led acesso 50 milissegundos consigo nao chamar a função. O intuito é usar apenas uma porta indicar o funcionamento com o led, e chamar a função. Alguém tem alguma ideia? ou sugestão? ja quebrei a cabeça pra chegar ate aqui.. brink_led_millis.ino

// por Thiago Condé
const int E1 = 8; // Sainda e entrada do Led
int stE1 = 0; // estado ativo ou desativo

long previousMillis; // O valor atual da chave no circuito

long lastDebounceTime = 0; // Variável utilizada na temporização
long debounceDelay = 30; // tempo para estabilizar e minimizar o efeito bouncing

void setup() {
pinMode(E1, OUTPUT); // Define o led como saída
Serial.begin(115200);
}

void loop() {

if ( digitalRead(E1)) { //quando chega 3.3v estado ativo
stE1=1;
lastDebounceTime = millis(); // Reinicia a variável de temporização
}

if (millis() - previousMillis < 2000) { // tempo do led desligado
digitalWrite(E1, 0);
}else{
stE1 = 0; // Aqui eu Zaro o estado pois senao detecta sempre nesse tempo!!
digitalWrite(E1, 1);
}

if (millis() - previousMillis >= 2050)// tempo do led ligado
previousMillis = millis();

// faço todas as verficações para realmente detectar apenas um comando!!
if (((millis() - lastDebounceTime) > debounceDelay)&& stE1 && digitalRead(E1) ) {
Serial.println("Agora sim!!!");
stE1=0;
}

}

Exibições: 905

Responder esta

Respostas a este tópico

Thiago,

Usando a analogia de que o arduíno é um CLP (até mesmo utilizado como tal), o principio de funcionamento dele é o seguinte:

1 - Leitura das entradas;

2 - montagem do espelho de entrada;

3 - Processamento;

4 - montagem do espelho de saídas;

5 - Atualização das saídas.

Este é 1 scan....

Você nunca conseguirá modificar nada, durante o scan, somente após ele.

Sds,

Entendi, impossível fazer isso do jeito que eu quero fazer. Apertar o botão no momento que ele escreve ele não pode ler o estado.. vou ver se reduzo ainda mais o tempo do led pra ver se melhora a resposta! O codigo ate funciona legal, o engraçado é quando aciono no tempo que o led esta acesso, queria que ele fizesse a leitura apos o leda apagar e fazer a chamada da função, porem isso nao acontece!!

Se você perceber bem... pensar bem... vai ver o seguinte:

se você contar tempo... isso acontecerá num único scan...

Portanto esqueça o tempo, pois ele é irrelevante, para esse caso...

se concentre no EVENTO.

Sds,

O que me intriga é que se eu ficar com o botão acionado por mais tempo ele não faz a chamada. E olhando o código nao vejo erro algum.. 

Isso mereceria uma análise mais apurada...

olá Thiago.

      A descrição do que vc está querendo implementar, está um tanto confusa.

      Vamos ver se entendi. Vc está querendo fazer o seguinte:

      1) um pino do Arduino, será tanto entrada como saída. Neste pino estará ligado um LED que indicará se o pino está em "HIGH" ou "LOW". Mas também estará ligado um Botão, cujo estado (pressionado ou "solto"), poderá ser lido pelo seu código a qualquer instante, independente se o LED está acesso ou não.

      2) quando vc pressionar o Botão, então quer que uma função seja executada. Claro, esta função poderá até desligar o LED (ou mesmo ligar), mas ainda assim o processo com o Botão deverá continuar funcionando normalmente (ou seja: apertando o Botão, chama a função, independente se o LED está ligado ou desligado).

      É isto?

      Se for, posso te dizer que é perfeitamente possível de fazer, e bem simples. E é uma ótima oportunidade para que eu possa demonstrar uma técnica pouco utilizada em   Hardware/Firmware (e 100% confiável).

      Mas tenho que te dizer: parece que vc está com conceitos equivocados sobre como funciona o I/O desses processadores (em 99.99% das CPUs existentes no mercado). Inclusive, provavelmente é esse o motivo de seu código não estar funcionando como vc espera. Assim que vc responder, no próximo post irei te mostrar isso.

      Uma pergunta:  qual Arduino vc está utilizando ?

      Ah, quase me esqueci:  pode postar uma figura ou foto mostrando o circuito, ou seja, como está ligando o LED e o Botão ?

      Abrçs,

      Elcids

Obrigado por me responder Elcids!! 

1) isso mesmo!! O led vai indicar o funcionamento, o botão sera para chamar uma função qualquer nesse caso o Serial.println("Agora sim!!!"); 

2) isso! Mas nesse caso o led vai sempre piscar me indicando que a placa esta funcionando!!

Eu isolei as linhas que faz o led piscar e realmente da falha! estou usando um placa UNO CH340G e so agora lendo isso percebi que é a placa. pois o erro persiste mesmo sem a linha principal do que faz o led piscar.  

fiz uma ligação simples, led ligado diretamente no GND e no D8 e com um JAMP ligo 3.3V esbarro na porta D8, eu queimei um led ja, mas o led vermelho funciona legal! 

Eu gostaria de ver sua sugestao, tenho poucos recursos, e qualquer ideia sera bem vinda!!

ok Thiago.

      Ainda bem que eu consegui entender o que vc queria fazer. Então posso confirmar que é totalmente possível e simples. Vou implementar o código e postarei aqui. E então explicarei o conceito por trás disso.

      Mas de qualquer forma, parece que vc está fazendo as ligações elétricas da forma errada. Vc pode postar aqui um desenho simples de como está ligando, ou então aguardar eu fazer um desenho te mostrando a forma correta. Se vc fizer um desenho, pode ser no Paintbrush mesmo (ou qualquer outra forma), o importante é mostrar exatamente como está ligando o LED e o Botão (principalmente o Botão). Assim posso comentar sobre a forma como está fazendo, o que ajudaria outras pessoas aqui.

     Abrçs,

     Elcids

Engraçado que eu peguei um UNO original e mesmo com o código isolado o erro continua, nao faz a chamada!!

// por Thiago Condé
const int E1 = 8; // Sainda e entrada do Led
int stE1 = 0; // estado ativo ou desativo
long previousMillis; // O valor atual da chave no circuito
long lastDebounceTime = 0; // Variável utilizada na temporização
long debounceDelay = 30; // tempo para estabilizar e minimizar o efeito bouncing

void setup() {
pinMode(E1, OUTPUT); // Define o led como saída
Serial.begin(115200);
}

void loop() {

if ( digitalRead(E1)) { //quando chega 3.3v estado ativo
stE1=1;
lastDebounceTime = millis(); // Reinicia a variável de temporização
}

//piscaLed();

// faço todas as verficações para realmente detectar apenas um comando!!
if (((millis() - lastDebounceTime) >= debounceDelay)&& stE1 && digitalRead(E1)) {
Serial.println("Agora sim!!!");
stE1=0;
}

}

void piscaLed(){

if (millis() - previousMillis < 2000) { // tempo do led desligado
digitalWrite(E1, 0);
}else {
stE1 = 0; // Aqui eu Zaro o estado pois senao detecta sempre nesse tempo!!
digitalWrite(E1, 1);
//Serial.println(".");
}
if (millis() - previousMillis > 4000)// tempo do led ligado
previousMillis = millis();

}

Thiago,

      Entenda: só há uma forma de fazer isso. E é utilizando uma técnica pouco conhecida, e por isso mesmo pouco utilizada.

     Então não adianta vc insistir na metodologia que está usando, principalmente porque tem conceitos equivocados, como eu já disse.

      Veja o post que respondi acima, depois que vc confirmou a forma como deve funcionar o Sistema.

      Abrçs,

      Elcids

Boa tarde, 

Por regra da Biblioteca Arduino, as variáveis Millis() tem que ser do tipo unssigned long. 

https://www.arduino.cc/reference/en/language/functions/time/millis/

Number of milliseconds passed since the program started. Data type: unsigned long.

Incorreto:

long previousMillis;                 // O valor atual da chave no circuito

long lastDebounceTime = 0;    // Variável utilizada na temporização
long debounceDelay = 30;      // tempo para estabilizar e minimizar o efeito bouncing

Referência do exemplo da Arduino IDE:

https://www.arduino.cc/en/Tutorial/Debounce

pinMode(E1, OUTPUT);          //  o pino E1 foi definido com saída   

Em momento algum você redefiniu o pino E1 como entrada !

if (((millis() - lastDebounceTime) > debounceDelay)&& stE1 && digitalRead(E1)

Veja como fazer :

https://stackoverflow.com/questions/6160963/how-can-i-digitalread-a...

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço