Publicidade:

terça-feira, 31 de outubro de 2017

Arduino - Teclado 4x4 (keypad)

Como ligar um teclado 4x4 no Arduino sem o uso de biblioteca

Vídeo:


Código-fonte:
byte rows[] = {11,10,9,8};
byte columns[] = {7,6,5,4};

char getKey(){
  char keys[4][4] = {
    {'1','2','3','A'},
    {'4','5','6','B'},
    {'7','8','9','C'},
    {'*','0','#','D'}
  };
  
  char k = '\0';
  
  for (int r=0; r<4; r++){
    digitalWrite(rows[r], LOW);
    
    for (int c=0; c<4; c++){
      if (digitalRead(columns[c]) == LOW){
        k = keys[r][c];
        break;
      }
    }
    
    digitalWrite(rows[r], HIGH);
    
    if (k) {
      break;
    }
  }
  
  return k;
}

char getKeyOnce(){
  static char lastVal = '\0';
  static unsigned long m = 0;
  char val = getKey();
  if (lastVal != val && millis() > (m+100) ) { //M+100 -->DEBOUNCING 100ms
    lastVal = val;
    m = millis();
    
    return lastVal;
  } 
  return '\0';
}

void setup() {
  for (int i=0; i<4; i++){
    pinMode(rows[i], OUTPUT);
    pinMode(columns[i], INPUT_PULLUP);
    
    digitalWrite(rows[i], HIGH);
  }
  
  Serial.begin(9600);
}

void loop(){
  
  char k = getKeyOnce();
  if (k) {
    Serial.println(k);
  }
  
  delay(10); //apenas para o simulador. 
}



Exemplo de uma Calculadora utilizando keypad 4x4:


Código-fonte:
#include <LiquidCrystal.h>

LiquidCrystal lcd(13, 12, 11, 10, 9, 8);

byte rows[] = {5,4,3,2};
byte columns[] = {A5,A4,A3,A2};

String valor1 = "";
String valor2 = "";
String resultado = "";
char operacao = '\0';

char getKey(){
  char keys[4][4] = {
    {'1','2','3','A'},
    {'4','5','6','B'},
    {'7','8','9','C'},
    {'*','0','#','D'}
  };
  char k = '\0';
  for (int r=0; r<4; r++){
    digitalWrite(rows[r], LOW);
    for (int c=0; c<4; c++){
      if (digitalRead(columns[c]) == LOW){
        k = keys[r][c];
        break;
      }
    }
    digitalWrite(rows[r], HIGH);
    if (k) { break; }
  }
  return k;
}

char getKeyOnce(){
  static char lastVal = '\0';
  static unsigned long m = 0;
  char val = getKey();
  if (lastVal != val && millis() > (m+100) ) { //M+100 -->DEBOUNCING 100ms
    lastVal = val;
    m = millis();
    
    return lastVal;
  } 
  return '\0';
}

void setup() {
  lcd.begin(16, 2);
  
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("youtube.com/");
  lcd.setCursor(0, 1);
  lcd.print("fabianoallex");
  
  for (int i=0; i<4; i++){
    pinMode(rows[i], OUTPUT);
    pinMode(columns[i], INPUT_PULLUP);
    digitalWrite(rows[i], HIGH);
  }
  
  delay(3000);
  
  lcd.clear();
  lcd.setCursor(0, 0);
}

void loop() {
  execKeypad();
  delay(10); //apenas para o simulador. 
}

void execKeypad(){
  char operacoes[] = {'\0', '*', '/', '+', '-'};
  static byte indexOperacao = 0;
  char k = getKeyOnce();
  
  if (k) {
    if (k >= 48 && k<= 57) {  /*digitos numericos*/
      resultado = "";
      if (operacao){
        valor2 = valor2 + k;
      } else {
        valor1 = valor1 + k;
      }
    }
    
    if (k == '*') {
      if (resultado != "" && valor1 == ""){
        valor1 = resultado;
        resultado = "";
      }
      indexOperacao++;
      if (indexOperacao > 4){ indexOperacao = 0; }
      operacao = operacoes[indexOperacao];
    }
    
    if (k == '#' && valor1 != "" && valor2 != "") {
      double v1, v2, r;
      
      char vchar[10];
      valor1.toCharArray(vchar, 10);
      v1 = atof(vchar); 
      valor2.toCharArray(vchar, 10);
      v2 = atof(vchar); 
      
      if (operacao == '*') { r = v1 * v2; }
      if (operacao == '+') { r = v1 + v2; }
      if (operacao == '-') { r = v1 - v2; }
      if (operacao == '/') { r = (v2 == 0) ? 0 : v1 / v2; }
      
      sprintf(vchar, "%d.%02d", (int)r, (long)(abs(r)*100)%100);
      resultado = (operacao == '/' && r == 0) ? "Div 0" : String(vchar);
      
      valor2 = "";
      valor1 = "";
      indexOperacao = 0;
      operacao = '\0';
    }
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print(resultado != "" ? resultado : valor1);
    
    lcd.setCursor(0, 1);
    lcd.print(valor2);
    
    lcd.setCursor(15, 0);
    lcd.print(operacao ? operacao : ' ');
  }
}