(RESOLVIDO) Habiltando ou desabilitando recebimento de sinais

Olá a todos! Pessoal, estou com uma dúvida! O arduino Uno tem algum pino que possibilitar o chip aceitar ou não sinais? Ex: tenho um botão ligado no pino A0 pra acender um led ligado no pino 8, o arduino só vai aceitar esse comando se o pino 2 estiver em LOW, caso contrário o led não se acende.

Exibições: 277

Responder esta

Respostas a este tópico

Até deletei minha resposta, já que vc mudou a pergunta... Ficou sem sentido.

Pode fazer através de HW, mas teria que ter um chip bidirecional para leitura ou escrita, ou unidirecional dependendo da sua necessidade. 

Marconde, mauricio e gustavo,

   Acho que vocês não entenderam bem o pedido do matta,  tudo que ele quer depende de programação, não de um botão fisico especifico,  veja abaixo o codigo pra funcionar exatamente o que ele deseja:

void setup() {
   pinMode(2, INPUT_PULLUP);  // Seta o pino 2 como entrada pullup
   pinMode(A0, INPUT);  // seta o pino A0 como entrada digital, se não me engano não pode ser pullup
   pinMode(8, OUTPUT);   // seta o pino 8 como saida digital para o led   
 }

void loop() {
  if(digitalRead(2)==0){  // cria uma condição de apenas funcionar todo o sistema se o pino 2 estiver em LOW
   
   if(digitalRead(A0)==1){  // estando o pino 2 em low e o A0 em high ele aciona o led
      digitalWrite(8,HIGH);  // acende o eld
   }
   else{
   digitalWrite(8,LOW);  // se a0 deixar de ser high apaga o led
   }
   
 
 }
 
}

os dois comandos que eu criei um if, dentro de outro if,  pode ser colocado tudo em um IF só, com condicionais,   mas achei que da forma acima foi mais didatico.

Putz, entendi outra coisa. 

O seu problema é simples. Os colegas o ajudarão.

Ao CK carlos kwiek,

    Cara, é engraçado o que são costumes,  comecei nos computadores programando algo como basic num TK2000, indo depois pra um MSX e por ai pra frente.

    Passei anos programando em C e em clipper tudo pra DOS,  dai veio o mundo gráfico, as linguagens como Delphi e VB revolucionaram a cena e criando a programação voltada a objetos,  dai perdi o tesão e resolvi pular fora do mundo da programação, indo pra o nascente mundo da computação gráfica.

    Dai veio a eletrônica,  depois os microcontroladores, iniciando pelo PIC e ai eu descobri o Arduino, me apaixonei pela produtividade e larguei todo o resto.

    Porem, você não larga seus costumes e hábitos.

    Um dos lances curiosos de quem vem do mundo PIC e acredito outros microcontroladores é o uso frequente das interrupções.

     Eu nunca as aprendi a usa-las.

     Resolvo tudo com lógica de programação.

     Mas é engraçado ver gente que não sai do mundo pic pra o arduino dizendo que aqui não há interrupções, o que é um erro pois há sim,   só que assim como no meu caso,   muitos preferem não utiliza-las.

    Quando vejo exemplos como esses é como vejo que toda a coisa são apenas ferramentas,  quem realmente faz a diferença somos nós.

AO MAURIOCIO MATTA:

   Cara, aqui no Lab não é comum darmos respostas prontas,  aqui estimulamos a galera a pensar,  mas no seu caso vou abrir uma excessão, visto que até mesmo grandes mestres ficaram um pouco confusos com seu problema,  mas na próxima tente só usar um pouco de raciocino pois a resposta já tava dada.

     A solução:   Tudo que fiz, foi pegar seu código,  encapsular ele dentro de uma função, a qual chamei de seucodigo()  e só deixei ela funcionar se o botão2 estivesse em zero fechando o laço loop geral.

     A questão de criar a função foi apenas didática,  apenas pra organizar o código,  você poderia ter feito o mesmo apenas colocando o condicional IF antes de todo processo,  tá aqui o código:

    Testa ele ai, pois tô sem arduino agora pra testar e informa se funcionou ok.

// Teste leds + Teclado
// Configurando os pinos:
 
    //LEDS
const int leD6    =  8;      // the number of the LED pin
const int leD5    =  9;      // the number of the LED pin
const int leD4    =  10;      // the number of the LED pin
const int leD3    =  11;      // the number of the LED pin
const int leD2    =  12;      // the number of the LED pin
const int leD1    =  13;
   //Botoes
const int K4      =  A0;     // the number of the pushbutton pin 
const int K3      =  A1;     // the number of the pushbutton pin 
const int K2      =  A2;     // the number of the pushbutton pin 
const int K1      =  A3;     // the number of the pushbutton pin
const int K5      =  A4;
const int K6      =  A5;
 
   //Energia Botoes
const int tecl    =  A6;     // the number of the pushbutton pin 
 
// variables will change:
int ledstate = LOW;         // variable for reading the pushbutton status
unsigned long previousMillis = 0;
 
//timer dos leds
unsigned long TleD6;     // quarda millis (tempo) do led
unsigned long TleD5;     
unsigned long TleD4;   
unsigned long TleD3;   
unsigned long TleD2;     
unsigned long TleD1;
 
 
const long tempoled =10000;
 
void setup() {
 
  pinMode(2, INPUT_PULLUP);  // Seta o pino 2 como entrada pullup
 
    pinMode(leD1, OUTPUT);
    pinMode(leD2, OUTPUT);
    pinMode(leD3, OUTPUT);
    pinMode(leD4, OUTPUT);
    pinMode(leD5, OUTPUT);
    pinMode(leD6, OUTPUT);
  
    pinMode(K1, INPUT);
    digitalWrite(K1, HIGH);
    pinMode(K2, INPUT);
    digitalWrite(K2, HIGH);
    pinMode(K3, INPUT);
    digitalWrite(K3, HIGH);
    pinMode(K4, INPUT);
    digitalWrite(K4, HIGH);
    pinMode(K5, INPUT);
    digitalWrite(K5, HIGH);
    pinMode(K6, INPUT);
    digitalWrite(K6, HIGH);  // habilita pullup 
 
    pinMode(tecl, OUTPUT);
  
    digitalWrite(tecl, LOW); //para usar o tecladinho
 
}
 
void loop() {
 
  if(digitalRead(2)==0){  // Somente funciona qualquer coisa se o pino 2 estiver em 0
     seucodigo(); 
  }
 
}


void seucodigo(){

 if (digitalRead(K1) == LOW) {
    digitalWrite(leD1, HIGH);
    TleD1 = millis();
    }
      else if (TleD1 + tempoled < millis()) {
         // turn LED off:
        
         digitalWrite(leD1, LOW);
    } 
 
      if (digitalRead(K2) == LOW) {
    digitalWrite(leD2, HIGH);
    TleD2 = millis();
    }
      else if (TleD2 + tempoled < millis()) {
         // turn LED off:
        
         digitalWrite(leD2, LOW);
    } 
 
      if (digitalRead(K3) == LOW) {
    digitalWrite(leD3, HIGH);
     TleD3 = millis();
    }
      else if (TleD3 + tempoled < millis()) {
         // turn LED off:
        
         digitalWrite(leD3, LOW);
    } 
 
 
      if (digitalRead(K4) == LOW) {
    digitalWrite(leD4, HIGH);
     TleD4 = millis();
    }
      else if (TleD4 + tempoled < millis()) {
         // turn LED off:
              digitalWrite(leD4, LOW);
    } 
   
    if (digitalRead(K5) == LOW) {
    digitalWrite(leD5, HIGH);
    TleD5 = millis();
    }
      else if (TleD5 + tempoled < millis()) {
         // turn LED off:
        
         digitalWrite(leD5, LOW);
    } 
   
    if (digitalRead(K6) == LOW) {
    digitalWrite(leD6, HIGH);
    TleD6 = millis();
    }
      else if (TleD6 + tempoled < millis()) {
         // turn LED off:
        
         digitalWrite(leD6, LOW);
    }
   
 
   unsigned long currentMillis = millis();
 
  if(currentMillis - previousMillis >= 500) {
    previousMillis = currentMillis; 
 
    if (ledstate == LOW)
      ledstate = HIGH;
    else
      ledstate = LOW;
 
 
  }
}

Sim, sim,

pelo que vi o codigo tá legal.
Você tem que entender só uma coisa, lógica é uma coisa propria a cada um, as vezes várias pessoas chegam ao mesmo resultado programando de formas diferentes.
No caso da programação acima, o que ele fez foi colocar o condicional individual a cada botão, eu coloquei uma vez só pra todo o sistema.

Sobre a questão que no que fiz os leds não são desligados, é porque vocÊ não especificou isso no seu pedido, dai só impedi o acesso se o 2 tivesse diferente de 0, mas não mexia na condição atual.
Para apagar tudo como você pediu, era muito facil no meu codigo, bastava colocar um else geral no final do if geral dando digitalwrite LOW em todos os pinos.
Ou seja, faria a mesma coisa, mas por outro caminho.

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço