Ajuda com código: String to Char and Others for Fake Paintball Bomb

Pessoal, esse é meu primeiro post aqui e espero estar fazendo da forma correta. :grin:

Estou desenvolvendo um código onde no Setup() preciso colocar um password e um tempo para uma contagem regressiva, no entanto, já tive problemas com o password.

Como não manjo muito de C/C++, estou meio que fazendo na tora e conto com a ajuda de vocês.
Tenho uma sessão de variáveis, onde achei mais fácil trabalhar com elas via String, no entanto o código exibido no LCD ou porta Serial, é apenas o código da tecla do keyboard.

Ex: Ao apertar 1, aparece 050, ao apertar 2, aparece 052...

Gostaria de guardar a variável como ela foi digitada: 1, guarda 1... e mostra 1 também...

Segue código para ajuda e peço descupas antes de qualquer coisa...

#include <LiquidCrystal.h>
#include <PS2Keyboard.h>
#include <stdlib.h>

PS2Keyboard keyboard;
LiquidCrystal lcd(22,25,26,27,28,29); // START LCD

String key="0";
char showKey='0';
String configs="0";
String c="0";
char digito;
int i=0;
int situacao=0;
unsigned int timerSeconds = 7000; // 4horas e 30segundos
const int DataPin = 4;
const int IRQpin = 3;
String password;

void setup() {

Serial.begin(9600);
// pinMode(LED_RED, OUTPUT); // sets the digital pin as output
// pinMode(LED_GREEN, OUTPUT); // sets the digital pin as output
pinMode(45,OUTPUT); // bg display
analogWrite(45,100);
lcd.begin(16, 2);
lcd.print(">NOVO CODIGO:");
lcd.cursor();
lcd.setCursor(0, 1);
keyboard.begin(DataPin, IRQpin);
Serial.begin(9600);
// Variável para verificação do While
while (situacao!=1) {

if (keyboard.available()) {
digito=keyboard.read();
c+=String(keyboard.read());
key=c;
password=key;
//kSerial.print(key);
// Serial.println(key);
// Serial.print(password);
lcd.setCursor(i,1);
lcd.print(digito);
i++;
// key = Serial.read();
// lcd.setCursor(currentLength + 6, 1);
}
else delay(10);
if (c == String(PS2_ENTER)) {
Serial.print("--");
// key = digito.substring(0, digito.length() - 2);
//Finaliza comando
Serial.println(key);
situacao=1;

}
}
lcd.noCursor();
lcd.clear();
lcd.print("VOCE USOU:");
lcd.setCursor(12, 1);
lcd.print(key);
delay(2500);
lcd.clear();
lcd.print("FIM!");
}

void loop(){

// tecladoIn();
}

O resto do código foi comentado e acho que isso não interfere em nada aqui

Ola bem vindo ao forum
Vamos entao por partes na password.

Ex: Ao apertar 1, aparece 050, ao apertar 2, aparece 052...

Tens a certeza que se primires a tecla 1 escreve 50? Nao será que esta a escrever 49?

Tenho uma sessão de variáveis, onde achei mais fácil trabalhar com elas via String,

Sem duvida que nao será o melhor.Muda tudo antes um char array correctamente terminado com o caracter nulo '\0'

...
unsigned char minhaPassword[5];//Array de chars com 5 elementos.Irá servir para armazenar uma password com 4 digitos + o carater terminador
if(keyboard.available()) {
minhaPassword[0] = keyboard.read();//Se tenho digito entao armazeno o caracter no array e de seguida termino o array
minhaPassword[1] = '\0';
....
Serial.println(minhaPassword);//Isto ira imprimir na serie a password final
Lcd.print(minhaPassword);//Imprime no LCD
//Isto so ira dar para o primeiro caracter.Para os restantes caracteres é o teu desafio :slight_smile:
...

unsigned int timerSeconds = 7000; // 4horas e 30segundos

Nao vi o restante do codigo onde usas isto mas cheira me a problema ...

Primeiro quero agradecer HugoPT, sempre é bom ser bem recebido e ter ajuda. Muito obrigado mesmo.

No caso do 1 realmente é 49. Eu havia errado, mas apenas no primeiro digito aparecia 049, depois aparece apenas os dígitos sem o zero. Não conseguir entender/ identificar o motivo.

Quanto ao char, estava tendo vários problemas. Um deles é não saber como seria o Null do char. Logo, sempre ficaria dando erro na compilação. O segundo é que por algum motivo, o que digito não ficava saindo correto. Quanto ao tempo "setado" ali, já funciona. Se eu colocar o código na mão, ele vai funcionar 100%, o problema é que eu queria configurar tudo antes de executar o loop() usando um teclado PS2;

#include <LiquidCrystal.h>
#include <PS2Keyboard.h>
#include <stdlib.h>

PS2Keyboard keyboard;
LiquidCrystal lcd(22,25,26,27,28,29); // START LCD

char key='\0';
char showKey='\0';
char configs='\0';
char c;
char digito;
int i=0;
int loops=0;
int situacao=0;
unsigned int timerSeconds = 7000; // 4horas e 30segundos
const int DataPin = 4;
const int IRQpin = 3;
char password;

void setup() {

Serial.begin(9600);
pinMode(45,OUTPUT); // bg display
analogWrite(45,100);
lcd.begin(16, 2);
lcd.print(">NOVO CODIGO:");
lcd.cursor();
lcd.setCursor(0, 1);
keyboard.begin(DataPin, IRQpin);
Serial.begin(9600);
while (situacao!=1) {
if (keyboard.available()) {
digito=keyboard.read();
c+=byte(digito);//keyboard.read();
Serial.print("c=");
Serial.println(c);
if (digito == PS2_ENTER) {
Serial.print(char(c));
password=key;
lcd.clear();
situacao=1;
}
if(digito!='13'){
lcd.print(digito);
}

}
else delay(10);
}
lcd.noCursor();
lcd.clear();
lcd.print("VOCE USOU:");
lcd.setCursor(0, 1);
lcd.print(c);
delay(2500);
lcd.clear();
lcd.print("FIM!");
lcd.setCursor(0,1);
lcd.print(String(c));
}
void loop(){

}

MONITOR SERIAL (foi digitado no teclado 1,2 e 3):
c=1
c=c
c=?
c=£
£

Funcionou quase que 100% usar o char (muito obrigado pela dica), mas...
Senha final está mostrando 163... mas queria que fosse 123.

Alguma sugestão de fazer isso sem usar String e sem ter que modificar o código para usar uma Array (que daria bastante trabalho no loop para recuperar isso)?

MONITOR SERIAL:
1
49
2
99
3
150
163

A razao de isto acontecer é muito simples.Se reparares na tabela do codigo ascii o codigo parao caracter 1 é 49 em decimal, caracter 2 é 50 em decimal e caracter 3 é 51.Isto quer dizer que estas a tratar os dados em decimal e nao em ascii.Para resolveres tens duas soluçoes, ou enganas o compilador e fazes um cast para ele tratar a variavel como char ou entao ao resultado lido subtrais 48(é o valor do 0 em decimal)
Em resumo algo assim

digito=char(keyboard.read());//Usando um cast
c+=digito;// isto é o motivo dos 163. c+= e estares a sumar o valor de c ao novo valor de digito.Resultado 49+50....
//Isto c+= nao concatena strings! Um char apenas consegue armazenar um caracter! Volta aos arrays :slight_smile:

Outra forma
digito=keyboard.read();
char numeroPretendido = digito-48;//Isto ira te dar o numero

Quanto ao tempo "setado" ali, já funciona

Uhmm e como fizeste?Teras isso mesmo bem?
Espreita a tabela do codigo ascii para entenderes
Aqui a tens:
http://www.google.pt/imgres?imgurl=http://www.asciitable.com/index/asciifull.gif&imgrefurl=http://www.asciitable.com/&h=488&w=715&sz=28&tbnid=2U31hF4tTw886M:&tbnh=90&tbnw=132&zoom=1&usg=__QKvmFTxkkNLdnI4XSnlKseHqfJw=&docid=JMtOixefP_tDJM&sa=X&ei=CF6jUqzaOcWK7Aa14IG4Dw&ved=0CD8Q9QEwAQ

Vou tentar aqui...

Acho dá para resolver isso...

Modifiquei com o "cast" que falastes, mas o resultado foi:

c=1
c=c
c=p
p

Mas digitei "1" e "2", depois apertei ENTER.

:~

c=1
c=c
c=p
p

Mas digitei "1" e "2", depois apertei ENTER.

Porque continuas sem entender o que te respondi.Estas a sumar os valores lidos.Tens de usar um array para armazenar cada caracter e nao suma-los todos no mesmo byte!

Tenta isto

#include <LiquidCrystal.h>
#include <PS2Keyboard.h>
#include <stdlib.h>

PS2Keyboard keyboard;
LiquidCrystal lcd(22,25,26,27,28,29); // START LCD

unsigned char password[5];
unsigned char digito;
int situacao=0;
int i = 0;





const int DataPin = 4;
const int IRQpin =  3;


void setup() 
{
  
  Serial.begin(9600);
  pinMode(45,OUTPUT); // bg display
  analogWrite(45,100);
  
  lcd.begin(16, 2);
  lcd.print(">NOVO CODIGO:");
  lcd.cursor();
  lcd.setCursor(0, 1);
  
  keyboard.begin(DataPin, IRQpin);

  while (situacao!=1) 
{  
 if (keyboard.available()) 
 {
      password[i]=char(keyboard.read());
      if (password[i++] == PS2_ENTER) 
      { 
        password[i] = '\0';
        Serial.print(password);
        lcd.print(password);
        delay(500);
        lcd.clear();
        situacao=1;
        i=0;
      }     
 }         
}
void loop()
{
}

Nao testei porque nem sequer tenho a lib nem teclado ps2 desmontado para testar.
Mas ja agora presupondo que vais ter sucesso em armazenar a password do teclado o que vais fazer com ela?
Nao querias antes gravar isso na eeprom para quando perderes a energia no arduino ela nao se perder?
Assim dessa forma teras sempre de configurar a password, o que é um bocado sem logica ...

Testei e aparece uma mensagem de erro de compilação.
call of overloaded 'print(unsigned char[5])' is ambiguous.

Pelo que entendi, em C/C++ isso quer dizer que algum valor como o Zero pode ter dois significados no C/C++.
É isso?

Retirei o unsigned e ai sim funcionou. Realmente não havia entendido. Agora fez mais sentido. Eu colocaria então um caracter (um código de caracter) no vetor. Ai depois faço a junção, correto?

Segue o código funcionando parcialmente.

#include <LiquidCrystal.h>
#include <PS2Keyboard.h>
#include <stdlib.h>

PS2Keyboard keyboard;
LiquidCrystal lcd(22,25,26,27,28,29); // START LCD

char key='\0';
char showKey='\0';
char configs='\0';
char pwd[16]={};
char c;
char digito;
int i=0;
int loops=0;
int situacao=0;
unsigned int timerSeconds = 7000; // 4horas e 30segundos
const int DataPin = 4;
const int IRQpin = 3;
char password;

void setup() {

Serial.begin(9600);
pinMode(45,OUTPUT); // bg display
analogWrite(45,100);
lcd.begin(16, 2);
lcd.print(">NOVO CODIGO:");
lcd.cursor();
lcd.setCursor(0, 1);
keyboard.begin(DataPin, IRQpin);
Serial.begin(9600);

while (situacao!=1) {
if (keyboard.available()) {
digito=char(keyboard.read());
pwd*=char(digito);*

  • Serial.print("pwd=");*
    _ Serial.println(pwd*);_
    if (digito == PS2_ENTER)
    _
    {_
    _ pwd = '\0';
    Serial.print(pwd);
    lcd.print(pwd);
    // password=pwd;
    lcd.clear();
    situacao=1;
    }
    if(digito!='13'){
    lcd.print(digito);*_

* }*
* i++;*
* }*
* else delay(10); *
* }*
* lcd.noCursor();*
* lcd.clear();*
* lcd.print("VOCE USOU:");*
* lcd.setCursor(0, 1);*
* lcd.print(pwd);*
* delay(5000);*
* lcd.clear();*
* lcd.print("FIM!");*
* lcd.setCursor(0,1);*
}
void loop(){
}
O único problema agora é que fui fazer com que a variável password (que já estava no meu código) fosse igualada ao pwd (que foi a sua password que modifiquei o nome) e dá erro de tipo de conversão.
invalid conversion from 'char*' to 'char'
Quanto ao código do que me perguntou... estarei publicando o código aqui para todos. Pode ser útil para muita gente.

Pelo que entendi, em C/C++ isso quer dizer que algum valor como o Zero pode ter dois significados no C/C++.

Nao entendi esta tua afirmaçao.Tens mesmo de remover o unsigned pois o metodo print nao funciona com ele.
Olhaste bem para o que eu fiz no codigo?
Quando o corres corrigindo o que unsigned faz o que prentendes?
Entendeste a mecanica do array?

Sim, entendi sim... muito obrigado.

Cheguei a terminar o código, mas fiz todo num sketch novo e acabei não salvando.. ai fiquei apenas com o HEX. Como acho que não tem como recuperar o fonte (tentei bastante ontem a noite), acabei que estou redigitando tudo agora.

É um código de um contador regressivo para jogo de paintball e airsoft.

Assim que terminar, coloco aqui (caso não tenha mais nenhuma dúvida rsrs.)

Antes que perguntem por aqui, o código que estou a fazer, é para utilizar um teclado PS2 no lugar de um keypad. Acho que um keypad não daria tanta segurança como um teclado, além de ser mais uma coisa para recuperar na missão.

Muito obrigado HugoPT. Ajudou bastante mesmo. Se quiser ver como ficou, posso até mandar o Hex do arquivo que eu sem querer perdi... Ou aguardar o código final. Só dizer.

Abraços.

Muito obrigado HugoPT. Ajudou bastante mesmo. Se quiser ver como ficou, posso até mandar o Hex do arquivo que eu sem querer perdi... Ou aguardar o código final. Só dizer.

Optimo fico a aguardar para ver o final :grin:

Deixa eu te incomodar mais uma vez.

void teclado(alguma_coisa,tipo){
if (keyboard.available()) {
digito=char(keyboard.read());
if(tipo=="string"){
alguma_coisa=String(digito);
}else if(tipo=="int"){
alguma_coisa=String(digito).toInt();
}

}

Como fazer isso no arduino?

if(tipo=="string"){

Se queres comparar strings podes usar o strcmp()
http://www.robotc.net/wiki/ARDUINO_328_Functions_Strings

}else if(tipo=="int"){
alguma_coisa=String(digito).toInt();

Se queres converter de string para int podes usar o atoi()

Nesse caso não seria isso... seria como reconhecer na função a variável. Deixa ver se consigo me expressar melhor.

void teste(valor_A,tipo_A){

[valor_A]=String(tipo_A);

}

Assim, quando usar a função teste(comparador,22), a função vai fazer:
comparador = String(22);

void teste(valor_A,tipo_A){

[valor_A]=String(tipo_A);

}

Nao vejo um motivo bom para quereres fazer isso, penso que te vais meter num molho de espinhos.
Vejo que nos teus posts insistes em usar Strings.Secalhar vou ser um pouco radical mas esquece que no arduino existem Strings porque elas provavelmente vao te causar mais problemas que soluçoes.Strings sao objectos e elas devoram a RAM do arduino.Como vens do Java acredito que isso te faça confusao mas tudo que fazes com Strings consegues fazer com array de chars(99% dos casos).So tens de entender a mecanica.
Quanto a tua funçao porque queres fazer açoes dependendo do tipo de dados?
Quanto a mim isso nao faz muito sentido.Explica o que pretendes na pratica

Terminei:

https://code.google.com/p/arduino-fake-regressive-paintball-or-airsoft-bomb/

O código é esse:

/*Airsoft and Paintball TIMER Bomb
Version 1.2
Creators:
Roberto Santos Reis
Turned into usable code, 12/09/2013:
Aracaju/ Brazil
*/

#include <LiquidCrystal.h>
#include <PS2Keyboard.h>
#include <stdlib.h>

PS2Keyboard keyboard;
LiquidCrystal lcd(22, 25, 26, 27, 28, 29); // START LCD

// Definições
#define LED_RED 7
#define LED_GREEN 6

//Strings
String key;
String password;
// Chars
char entered[15];
char confirma[1] = {};
char pwd[15] = {};
char tmp[15] = {};
char digitado[15] = {};
char startTime[15] = {};
char verifica[15] = {};
char digito;
// Ints
int i = 0;
int loops = 0;
int situacao = 0;
unsigned int timerSeconds;
const int DataPin = 4;
const int IRQpin = 3;
int currentLength = 0;
int qntErros=1;
//long
long interval=1000;
long present;
long previousMillis = 0;

void setup() {

Serial.begin(9600);
pinMode(45, OUTPUT); // bg display
analogWrite(45, 100);
lcd.begin(16, 2);
lcd.print(">NOVO CODIGO:");
lcd.cursor();
lcd.setCursor(0, 1);
keyboard.begin(DataPin, IRQpin);
Serial.begin(9600);
pinMode(LED_RED, OUTPUT); // sets the digital pin as output
pinMode(LED_GREEN, OUTPUT); // sets the digital pin as output
// CONFIGURAÇÃO DO PASSWORD

while (situacao == 0) {
if (keyboard.available()) {
digito = char(keyboard.read());
pwd = char(digito);

  • if (digito == PS2_ENTER)*
  • {*
    _ pwd = '\0';_
    * Serial.println(pwd);*
    * key = String(pwd);*
    * Serial.println("pwd=");*
    * Serial.print(pwd);*
    * lcd.clear();*
    * situacao = 1;*
    * }*
    * if (digito != '13') {*
    * lcd.print(digito);*
    * }*
    * i++;*
    * }*
    * else delay(10);*
    * }*
    * lcd.noCursor();*
    * lcd.clear();*
    * lcd.print("PWD DEFINIDO");*
    * lcd.setCursor(0, 1);*
    * lcd.print(pwd);*
    * delay(2000);*
    * lcd.clear();*
    * lcd.print("DEFINIR MINUTOS");*
    * lcd.setCursor(0, 1);*
    * i = 0;*
    * // CONFIGURAÇÃO DO TEMPO*
    * while (situacao == 1) {*
    * if (keyboard.available()) {*
    * digito = char(keyboard.read());*
    _ tmp = digito;
    * Serial.print("tempo=");
    Serial.println(tmp);_

    if (digito == PS2_ENTER)
    _ {
    tmp = '\0';
    Serial.print(tmp);
    lcd.print(tmp);
    timerSeconds = ((String(tmp).toInt()) * 60);
    lcd.clear();
    situacao = 2;
    }
    if (digito != '13') {
    lcd.print(digito);
    }
    i++;
    }
    else {
    delay(10);
    }
    }
    lcd.noCursor();
    lcd.clear();
    lcd.print("TEMPO DEFINIDO");
    lcd.setCursor(0, 1);
    lcd.print(timerSeconds / 60);
    lcd.print(" minutos");
    delay(2000);
    lcd.noCursor();
    lcd.clear();
    // Contagem Regressiva para começar o jogo*

    * for (loops = 10; loops > 0; loops--) {
    lcd.setCursor(0, 0);
    lcd.print("Iniciando em:");
    lcd.setCursor(14, 0);
    lcd.print(loops);
    delay(1000);
    lcd.clear();
    }
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("DIGITE O CODIGO");
    lcd.cursor();
    lcd.setCursor(0, 0);
    i=0;
    }
    void loop() {
    if (keyboard.available()) {
    lcd.setCursor(0, 0);
    Serial.print(" ");
    digito = char(keyboard.read());
    entered[currentLength] = char(digito);_

    if (digito != PS2_ENTER) {
    _ lcd.setCursor(i, 0);
    lcd.print(" ");

    // lcd.print(digito);
    * i++;
    currentLength++;*_

* }else if (digito == PS2_ENTER) {
_ lcd.setCursor(0, 0);
entered[currentLength] = '\0';
Serial.println(entered);
key = entered;
lcd.clear();
i = 0;// Reiniciando posicionamento (para o loop)
currentLength=0; //Reiniciando a coleta de dados do teclado para a variável*_

* if (String(entered) == String(pwd)) { // shortcut to compare an array of bytes, use memcmp(A, B, length), will return 0 if match.*
* lcd.noCursor();*
* lcd.clear();*
* lcd.setCursor(5, 0);*
* lcd.print("BOMBA");*
* lcd.setCursor(3, 0);*
* lcd.print("DESARMADA!");*

* tone(9, 1200, 4000); //*
* delay(10000);*
* lcd.clear();*
* lcd.setCursor(0, 0);*
* lcd.print("REINICIANDO");*
* delay(5000);*
* lcd.setCursor(0, 1 );*
* lcd.print("OK! BOM DIA!");*
* currentLength = 0;*
* delay(4000); // hold that on screen for 2.5 seconds*
* lcd.clear();*
* currentLength = 0;*
* software_Reset();
_ } else if (entered != pwd) {
if(qntErros<1){
msgErro();
lcd.print("PENALIDADE-2:00"); // Display time penalty*

* if (timerSeconds > 120) timerSeconds -= 120;
else timerSeconds = 1; // will trigger BOOM next cycle*

* currentLength = 0;
delay(2500); // hold that on screen for 2.5 seconds*

* lcd.clear();
situacao = 3;
lcd.setCursor(0,0);
lcd.print("DIGITE O CODIGO");
}else if(qntErros==1){
msgErro();
interval=50;
situacao = 3;
lcd.clear();
lcd.setCursor(0,0);
lcd.print("DIGITE O CODIGO");
}else if(qntErros==2){
timerSeconds=1;
}
qntErros+=1;
}
}
}
timer();
}
void msgErro(){
lcd.noCursor();
lcd.clear();
lcd.print(" ERRO! ");
tone(9, 110, 2500);
lcd.setCursor(0, 1);
}
void presentTime(void){ // registra o tempo presente quando solicitado
present = millis()/1000;
return;
}
void timer() {
long tempoAtual=millis();*_

* if(tempoAtual - previousMillis > interval) {*
* previousMillis = tempoAtual;*

* lcd.setCursor(0, 1); // sets cursor to 2nd line*
* lcd.print(" Tempo: ");*
* lcd.print(timerSeconds / 60); // integer number of minutes on clock*
* lcd.print("m");*
* lcd.print(timerSeconds % 60); // mod 60; gives us number of seconds outside of 60sec/min*
* lcd.print("s ");*
* long tempoAtual=millis();*
// delay(950); // hold us here for 0.950 seconds
* {*
* digitalWrite(LED_RED, !digitalRead(LED_RED)); // toggle the green LED once a second*
* }*
* tone(9, 800, 250); // play bleep for 50ms*
* delay(10); // and there's the rest of that 1 second (not counting LCD delay)*
* timerSeconds--;*
* if (timerSeconds == 0) explodeBomb();*
* }*
}
void explodeBomb() {
* // routine for making ze BOMB GOEZ OFF!!!1 :D*
* lcd.noCursor();*
* lcd.clear();*
_ lcd.print(" -BoOo0o0o0oMm- ");
* lcd.setCursor(0, 1);
lcd.print(" SOLDADO MORTO!");
tone(9, 110, 100);_

digitalWrite(LED_RED, HIGH); // sets the red LED on*

* delay(500); // waits half a second*
* tone(9, 110, 100);*
* delay(500); // waits half a second*
* digitalWrite(LED_RED, LOW); // sets the red LED off*
* digitalWrite(LED_GREEN, HIGH); // sets the green LED on*
* tone(9, 110, 100);*
* delay(500); // waits half a second*
* digitalWrite(LED_RED, HIGH); // sets the red LED on*
* digitalWrite(LED_GREEN, LOW); // sets the green LED off*
* tone(9, 110, 100);*
* delay(500); // waits half a second*
* digitalWrite(LED_RED, LOW); // sets the red LED off*
* digitalWrite(LED_GREEN, HIGH); // sets the green LED on*
* tone(9, 110, 100);*
* delay(500); // waits half a second*
* key = ""; // enter the while() loop, otherwise it'll skip. i could use do { } while();, but I'm lazy.*
* {*
* while (key==""){*
* if (key=="#")*
* {*
* lcd.clear();*
* lcd.print("Reiniciando:");*
* lcd.setCursor(6, 1);*
* lcd.print("a bomba!");*
* delay(3000); // 3 sec delay*
_ void (softReset) (void) = 0; //declare reset function @ address 0_
_ softReset();
//timerSeconds = 300; // put 5 minutes on the clock*

* // and we break the loop and go back to timer.
}
else key = ""; // continue looking for pound key*

* }
}
}
void software_Reset() // Reinicia o software para o primeiro estágio, mas não reinicia os periféricos nem registros
{
asm volatile (" jmp 0");
}
void tecladoIn() {
if (keyboard.available()) {
digito = char(keyboard.read());
verifica = char(digito);
Serial.print("verifica=");
Serial.println(verifica);_

if (digito == PS2_ENTER)
_ {
verifica = '\0';
Serial.println(verifica);
key = String(verifica);
Serial.println("verifica=");
Serial.println(verifica);
lcd.clear();
situacao = 4;
}
if (digito != '13') {
lcd.print(digito);
}
i++;
}
}*

Quanto a função, estava querendo colocar uma coisa mais "dinâmica" para reduzir o código a depender do que a pessoa tente fazer. Vou deixar isso para uma versão 2.0
Acabei utilizando o milis(); para fazer comparativo de tempo e não precisar ficar dando lag durante a digitação do teclado_

Bem, acho que é isso ai. as atualizações do código estão sendo colocadas no

svn checkout http://arduino-fake-regressive-paintball-or-airsoft-bomb.googlecode.com/svn/ arduino-fake-regressive-paintball-or-airsoft-bomb-read-only

Em breve posto um vídeo de como ficou o projeto.

Agradecer a HugoPT. Assim que terminado, estarei colocando um agradecimento dentro do código para que possa ser visto quando baixado.

Abraços.