Publicidade:

terça-feira, 14 de novembro de 2017

Arduino - Botão com múltiplas funções

Nesse vídeo mostro como executar em um único botão diversas funções distintas.

Vídeo


Código-fonte
byte inputPin = 10;
byte ledPin = 13;
byte redPin = 6;
byte greenPin = 4;
byte bluePin = 3;


byte digitalReadOnce(byte val){
  static byte lastVal = HIGH;
  static unsigned long m = 0;
  if (lastVal != val && millis() > (m+100) ) { //M+100 -->DEBOUNCING 100ms
    lastVal = val;
    m = millis();
    return lastVal;
  } 
  return HIGH;
}

int getCommand(){
  static unsigned long m1 = 0;  //millis no momento inicia de pressionar o botão 
  static unsigned long m2 = 0;  //millis após soltar o botão 
  static byte count = 0;
  
  byte r = digitalRead(inputPin);
  
  if (digitalReadOnce(r) == LOW){
    m1 = millis();
    count++;
  }
  
  if (r == LOW){
    m2 = millis();
  } else {
    if (! (m2>0 && m2-m1 < 1000) ){  //o botão deve ser pressionado por menos de 1 segundo, senão cancela o comando
      count = 0;
      m1 = 0;
      m2 = 0;
    }
    
    if (m2>0 && millis()-m2 > 1500){  //após a ultima vez pressionado o botao, aguarda 1,5 segundos para finalizar e retornar o comando.
      byte c = count;
      count = 0;
      m1 = 0;
      m2 = 0;
      
      return c;
    }
  }
  
  return 0;
}


void setup() {
  Serial.begin(9600);
  pinMode(inputPin, INPUT_PULLUP); //internal pullup resistor is used to simplify the circuit
  pinMode(bluePin, OUTPUT);
  pinMode(greenPin, OUTPUT);
  pinMode(redPin, OUTPUT);
  pinMode(ledPin,OUTPUT);
}

void loop() {
  
  int command = getCommand();

  if (command == 1){
    digitalWrite(redPin, !digitalRead(redPin));
  }
  
  if (command == 2){
    digitalWrite(greenPin, !digitalRead(greenPin));
  }
  
  if (command == 3){
    digitalWrite(bluePin, !digitalRead(bluePin));
  }
  
  if (command == 4){
    digitalWrite(redPin, HIGH);
    digitalWrite(greenPin, HIGH);
    digitalWrite(bluePin, HIGH);
  }
  
  if (command == 5){
    digitalWrite(redPin, LOW);
    digitalWrite(greenPin, LOW);
    digitalWrite(bluePin, LOW);
  }
  
  digitalWrite(ledPin, !digitalRead(inputPin));
  
  delay(10);  //apenas utilizado no simulador
}







Comandos via LDR

Baseado no exemplo anterior, foi substituido o botão por um LDR, onde é possível enviar comandos pro Arduino através de luz.

Vídeo:


Código-Fonte:
byte ledPin = 13;
byte redPin = 6;
byte greenPin = 4;
byte bluePin = 3;


boolean hasLightOnce(byte val){
  static boolean lastVal = false;
  static unsigned long m = 0;
  if (lastVal != val && millis() > (m+100) ) { //M+100 -->DEBOUNCING 100ms
    lastVal = val;
    m = millis();
    return lastVal;
  } 
  return false;
}

boolean hasLight(){
  return (analogRead(A0) < 100);
}


int getCommand(){
  static unsigned long m1 = 0;  //millis no momento inicia de pressionar o botão 
  static unsigned long m2 = 0;  //millis após soltar o botão 
  static byte count = 0;
  
  boolean light = hasLight();
  
  if (hasLightOnce(light)){
    m1 = millis();
    count++;
  }
  
  if (light){
    m2 = millis();
  } else {
    if (! (m2>0 && m2-m1 < 1000) ){  //o botão deve ser pressionado por menos de 1 segundo, senão cancela o comando
      count = 0;
      m1 = 0;
      m2 = 0;
    }
    
    if (m2>0 && millis()-m2 > 1500){  //após a ultima vez pressionado o botao, aguarda 1,5 segundos para finalizar e retornar o comando.
      byte c = count;
      count = 0;
      m1 = 0;
      m2 = 0;
      
      return c;
    }
  }
  
  return 0;
}


void setup() {
  Serial.begin(9600);
  pinMode(bluePin, OUTPUT);
  pinMode(greenPin, OUTPUT);
  pinMode(redPin, OUTPUT);
  pinMode(ledPin,OUTPUT);
}

void loop() {
  
  int command = getCommand();

  if (command == 1){
    digitalWrite(redPin, !digitalRead(redPin));
  }
  
  if (command == 2){
    digitalWrite(greenPin, !digitalRead(greenPin));
  }
  
  if (command == 3){
    digitalWrite(bluePin, !digitalRead(bluePin));
  }
  
  if (command == 4){
    digitalWrite(redPin, HIGH);
    digitalWrite(greenPin, HIGH);
    digitalWrite(bluePin, HIGH);
  }
  
  if (command == 5){
    digitalWrite(redPin, LOW);
    digitalWrite(greenPin, LOW);
    digitalWrite(bluePin, LOW);
  }
  
  digitalWrite(ledPin, hasLight() );
  
  delay(10);  //apenas utilizado no simulador
}






3 comentários:

  1. Dai eu acho o que estava procurando pra que o arduino possar fazer e vejo esses comandos que sei que nao vou conseguir modificar. huahauha mas ficou top era justamente isso que estava procurando, mas depois desse codigo desisto. Valeu Forte abraço.

    ResponderExcluir
  2. Obrigado por disponibilizar este código, usei como um conceito para outro código e me ajudou muito.

    ResponderExcluir
  3. Muito obrigado. Com mudanças que pretendo fazer caiu como uma luva!- Me inscrevi no seu canal..Valeu!

    ResponderExcluir