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

Valeu José pela dica!! 

Realmente jamais imaginei que houvesse algo do tipo!! Registradores de Portas. Obrigado mesmo!! num pequeno teste ja deu algum resultado aqui! Agora irei aprender mais sobre e volto com novidades!! Agora vai!! E muito bem observado sobre as variáveis Millis() pois gostei de trabalhar com essa função e esta tudo declarado errado!! inclusive isso copiei da própria internet. Mas Agora vi uma luz. Desde ja muito grato pelo sua ajuda, foi de grande valia!!

Meu muito obrigado!! Eu achei que era impossível, ter uma unica porta como entrada e saída, porem não é!! Cheguei a achar que fosse minha placa de qualidade inferior!! Bastou apenas definir como entrada na hora de leitura e saída na hora de funcionar o led! Funcionou perfeitamente chamando apenas uma vez, independente se o LED esta acesso ou não, mesmo quando pressionado por longo ou curto tempo!!! Fiz as correções e ficou muito bom, superou minhas expectativas. 

INPUTeOUTPUT_Led_e_Botao.ino

//com o (Arduino/Genuino Uno) por Thiago Condé

const int E1 = 8; // como output led D8 e como input botao!
int stE1 = 0; // estado da registradora 0 ou 1
unsigned long tempoBaseLED; // Variavel responsavel por controlar o led
unsigned long tempoPressionado = 0; // Variável responsavel por controlar o Erro Bounce (Apenas 1 comando)
int tempoErro = 30; // tempo para estabilizar e minimizar o efeito bouncing

void setup() {
Serial.begin(115200);
}

void loop() {

pinMode(E1, INPUT); // registrador PIN responsavel por definir a leitura de entrada.
if (digitalRead(E1)) { //quando liga o botão 3.3v no pino D8
stE1=1; // marca que foi precionado!
tempoPressionado = millis(); // Reinicia a temporização que valida um unico comando!!
}

piscaLed(); // função de fazer o led pisca, detalhe sem dalay!!

// detectar apenas um comando!!
if (((millis() - tempoPressionado) >= tempoErro) && stE1) {
Serial.println("Apenas uma chamada!!!");
stE1 = 0; // zera o estado para uma nova chamada
}

}

void piscaLed(){
pinMode(E1, OUTPUT); // Define o led como saída
if (millis() - tempoBaseLED < 2000) { // tempo do led desligado
digitalWrite(E1, 0);
}else
digitalWrite(E1, 1);

if (millis() - tempoBaseLED > 4000)// tempo do led ligado
tempoBaseLED = millis();
}

olá Thiago.

      Implementei o Sistema da forma como vc disse que ele deveria funcionar. Inclusive testei com a montagem física do mesmo.

      Também implementei o Sistema no Proteus, de forma que facilite para os testes, possibilitando o pessoal fazer isso sem precisar montar o circuito físico (e claro, fazer as variações conforme cada um queira).

      Sobre o circuito, vc não disse precisamente como estava ligando. Então veja como deve ser ligado:

(clique na figura para "zoom")

      Observe que esta forma de ligar (a topologia do circuito), é muito importante, pois ela evita "contentions" no Hardware que podem danificar permanentemente o pino do Arduino onde o LED/Botão estão conectados. Você pode mudar completamente a polaridade em que o LED é acionado ou o nível lógico que o Botão deve assumir quando pressionado. Mas deve preservar a topologia da ligação, para evitar "contentions". Caso não saiba como fazer isso, avise, que postarei aqui as várias combinações de polaridade, para o LED e Botão.

      Uma nota sobre o Resistor R3:  esse resistor pode até ser dispensado. Mas aconselho mantê-lo, pois ele ajuda a descarregar as capacitâncias parasitas, durante o mínimo instante de tempo que o pino é configurado para leitura do estado do Botão. Os LEDs normalmente tem uma capacitância considerável (pode chegar a centenas de pico-farads). Então manter R3 vai diminuir o efeito dessa capacitância do LED, a qual é "parasita" para o circuito.

      Vendo o post onde vc disse que não sabia que existiam os "Registradores de Porta", entenda o seguinte:  a questão não são os Registradores, pois eles sempre existem em TODOS os Processadores. A questão é como é a topologia de implementação destes Registradores, pois isto é o que vai determinar como se deve utilizá-los (por exemplo: se são ou não do tipo "read and modify", ou se possuem ou não "latched input", ou se possuem ou não "sampled input").

      Sobre a técnica utilizada, olhando o código é fácil entendê-la. Mas como eu prometi dizer como ela funciona, irei fazer isso em outro post, pois neste momento não vai me sobrar tempo (isso sempre toma tempo, pra fazer direito).

      Segue o código, incluindo os arquivos de simulação:   IO_mesma_porta_02.zip

      Caso tenha alguma dúvida ou comentário, não deixe de colocar aqui.

      Abrçs,

      Elcids

Elcids Muito Obrigado pela dica!! Que organização é essa?! Show de bola!! muito bem comentado!! Esse circuito vai ser basicamente para simular um alarme e uma campainha!! Mas a questao da ligação vou me atentar pois ainda nao liguei nada, fisicamente, e vou quebrar muito a cabeça, vou testar o teu codigo aqui e ver como fez tirar ideias!! Valeu mesmo pelo compartilhamento e a impecabilidade de sua organização, eu me perco no que eu faço, preciso melhor e muito!! Obrigado de coração pelo código e pela paciência!! irei testar aqui e te dar um retorno!! 

olá novamente Thiago.

      Se observar, vai ver que procuro empurrar para o lado mais técnico da coisa. Mas tento fazer isso de uma forma que seja acessível (não é uma tarefa tão fácil, mas a gente tenta).

      Também procuro colocar as implementações, de uma forma que atenda mais pessoas.

      Quando eu disse que só havia uma forma de fazer essa implementação, na verdade quis dizer:  a forma adequada e flexível de implementar.

      Muito importante: atente para a questão da "Contention" que mencionei no post anterior. Senão o pino do seu Arduino vai acabar "abrindo o bico" depois de algum tempo, e isso será um dano permanente.

      Abrçs,

      Elcids

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço