Código-Fonte:
obs. 01: O Controle remoto utilizado foi o da Claro TV. Caso for usar outro tipo de controle remoto, é necessário descobrir a codificação de cada uma das teclas e fazer as alterações na função get_tecla. Esse controle remoto, retorna dois códigos diferentes para a mesma tecla (em alguns casos), como pode ser visto no código.
obs. 02: o controle remoto ao ser mantido pressionado, não fica enviando a informação de maneira continua, então o arduino, por um pequeno período de tempo, entende que o botão foi solto e pressionado várias vezes, causando um comportamento indesejado, por isso foi criada a variável global time_read = 150; 150, significa que 150 milissegundos após o botão ser "solto" a função get_tecla, ainda vai continuar retornando o ultimo caractere pressionado. é possível que em diferentes controles remotos, esse tempo varie. Não fiz nenhum teste com outros controles, mas que for usar, é interessante testar isso antes.
obs. 03: é preciso baixar e instalar a biblioteca IRRemote. Não vou entrar em detalhes aqui de como instalar e configurar a biblioteca, pois uma rápida busca no google, certamente irá ajudar.
#include <IRremote.h> const int RECV_PIN = 11; unsigned long last = millis(); IRrecv irrecv(RECV_PIN); decode_results results; unsigned long millis_last_read = 0; char char_last_read = '\0'; unsigned long time_read = 150; char get_tecla() { char c = '\0'; if ( (millis() - time_read) > millis_last_read ){ if (irrecv.decode(&results)) { if (results.value == 2152998656 || results.value == 2153031424){ c = '0'; } if (results.value == 2152998657 || results.value == 2153031425){ c = '1'; } if (results.value == 2152998658 || results.value == 2153031426){ c = '2'; } if (results.value == 2152998659 || results.value == 2153031427){ c = '3'; } if (results.value == 2152998660 || results.value == 2153031428){ c = '4'; } if (results.value == 2152998661 || results.value == 2153031429){ c = '5'; } if (results.value == 2152998662 || results.value == 2153031430){ c = '6'; } if (results.value == 2152998663 || results.value == 2153031431){ c = '7'; } if (results.value == 2152998664 || results.value == 2153031432){ c = '8'; } if (results.value == 2152998665 || results.value == 2153031433){ c = '9'; } if (results.value == 551538735) { c = '*'; } if (results.value == 2152998666 || results.value == 2153031434){ c = '#'; } irrecv.resume(); // Receive the next value millis_last_read = millis(); char_last_read = c; } } else { c = char_last_read; } //Serial.println(c); return c; } const char teclas[][12] = {"1 ", "2abc", "3def", "4ghi", "5jkl", "6mno", "7pqrs", "8tuv", "9wxyz", "*", "0", "#"}; const unsigned long time_char = 1200; //1200 milissegundos pra desconsiderar a ultima tecla class TecladoTelefone{ private: unsigned long _millis_last_char; char _last_char; String _palavra; void _set_last_char(char c, int ind_palavra){ if ( ind_palavra == 1 && _last_char != '\0' ) { _palavra += _last_char; } _last_char = c; _millis_last_char = millis(); } void _back_space(){ if (_palavra.length() >= 1){ _last_char = _palavra[_palavra.length()-1]; _palavra = _palavra.substring(0, _palavra.length()-1); } else { _last_char = '\0'; } } public: TecladoTelefone(){ _millis_last_char = millis(); _last_char = '\0'; } int is_timing(){ return ( (millis() - time_char) < _millis_last_char ); } void add(char c){ int pos = -1; if (c == '1'){ pos = 0;} if (c == '2'){ pos = 1;} if (c == '3'){ pos = 2;} if (c == '4'){ pos = 3;} if (c == '5'){ pos = 4;} if (c == '6'){ pos = 5;} if (c == '7'){ pos = 6;} if (c == '8'){ pos = 7;} if (c == '9'){ pos = 8;} if (c == '*'){ pos = 9;} if (c == '0'){ pos = 10;} if (c == '#'){ pos = 11;} if (pos == -1){ return; } if (pos == 9){ _back_space(); return; } const char * t = teclas[pos]; if ( is_timing() ) { int i = 0; while (t[i] != '\0'){ if (_last_char == t[i]){ _set_last_char( (t[i+1] == '\0') ? _last_char = t[0] : _last_char = t[i+1] , 0 ); return ; } i++; } } _set_last_char ( c, 1); } char get_last_char(){ return _last_char; } String get_palavra( ) { if (_last_char != '\0') { return _palavra + _last_char; } return _palavra; } }; #include <LiquidCrystal.h> LiquidCrystal lcd(9, 8, 10, 7, 6, 5); //Configura os pinos do Arduino para se comunicar com o LCD TecladoTelefone * teclado; void setup() { Serial.begin(9600); irrecv.enableIRIn(); teclado = new TecladoTelefone(); lcd.begin(16, 2); } char tecla_anterior = '\0'; void loop() { char tecla = get_tecla(); if (tecla != tecla_anterior){ if (tecla) { teclado->add(tecla); } } tecla_anterior = tecla; lcd.clear(); lcd.setCursor(0, 0); lcd.print(teclado->get_palavra()); lcd.cursor(); lcd.setCursor(teclado->get_palavra().length() - (teclado->is_timing() ? 1 : 0 ), 0); delay(10); lcd.noCursor(); }