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 : ' '); } }
estou tentando fazer que arduino nano vire um keyboard para algumas teclas e ainda não consegui por acaso já conseguiste este feito?
ResponderExcluir