problema com caracteres

Boa noite galera, estou tendo um problema em imprimir alguns caracteres, o teclado esta correto, ate por que em 1 dos códigos ele imprime todos sem nenhum erro, mas quando utilizo o segundo ele imprimi uma figura estranha, sendo que nao tem nem na tabela de caracteres especias.

aqui é o código que imprime todos os caracteres do mapa sem nenhum erro, o segundo vou postar abaixo por que excedeu o limite de caracteres hehe

/*
Keypad sketch
prints the key pressed on a keypad to the serial port
*/
#include <LiquidCrystal.h>

#include<stdlib.h>

LiquidCrystal lcd(76,77,14,15,16,17);
const int numRows = 5; // number of rows in the keypad
const int numCols = 3; // number of columns
const int debounceTime = 100; // number of milliseconds for switch to be stable
const int debounce = 50;
const int backlight = 70;
unsigned char key;
 char valor[5];//isto é na realidade um ponteiro...
//char valor_anterior[4]; 
//char *ponteiro_valor = &valor[0]; //isto está errado... 
 char valor_index = 0;

 String menu = "aplicacao";
 String str1 = " temperatura";
 String str2 = " umidade ";
 String str3 = " irrigacao";
 String str4 = " luminosidade";
 unsigned int inc=0;


// keymap defines the character returned when the corresponding key is pressed
const char keymap[numRows][numCols] = {
    { '1', '2', '3' } ,
    { '4', '5', '6' } ,
    { '7', '8', '9' } ,
    { 'F', '0', 'T' } ,
    { 'E', '.', 'V'}  , 
};
// this array determines the pins used for rows and columns
const int rowPins[numRows] = { 81,82,83,84,85 }; // Rows 0 through 3
const int colPins[numCols] = { 78,79,80 }; // Columns 0 through 2


  void setup(){
      pinMode (backlight, OUTPUT);
      digitalWrite (backlight,HIGH);
      lcd.begin (16,2);
      valor[4] = '\0';//terminar a string. 
    
      for (int row = 0; row < numRows; row++)
    {
      pinMode(rowPins[row],OUTPUT); // Set row pins as input
      digitalWrite(rowPins[row],HIGH); // turn on Pull-ups
    }
      for (int column = 0; column < numCols; column++)
    {
      pinMode(colPins[column],INPUT); // Set column pins as outputs for writing
      digitalWrite(colPins[column],LOW); // Make all columns inactive
    }
  }
  void loop(){
     key = getKey();


      if( key ==  'F' && key != 0 || key ==  'T' && key != 0 ){ 
          lcd.clear();
          lcd.setCursor(0,0);
          lcd.print("selecao");

          valor_index = 0; 
          valor = {};
  
     // void Menu();
          delay (1000);
          lcd.clear();}
       //delay(500);
       else if( key !=  'F' && key != 0 || key !=  'T' && key != 0 ){  
          valor[valor_index++] = key ;
              if (valor_index <= 5 ) { //indice 4 é o terminador de string, logo apenas vais imprimir 4 digitos. 
                  lcd.clear();  
                  lcd.print(valor);
                  delay(1000);
                  if (valor_index == 4 ){
                       delay(1000);
                       lcd.clear();
                       valor_index = 0; 
                       valor = {};
                   }
             }
        delay(100);
        }//lcd.clear();
   //lcd.print("teste");
  }


// returns with the key pressed, or 0 if no key is pressed
  char getKey(){
      char key = 0; 
      delay(100);// 0 indicates no key pressed
      for(int row = 0; row < numRows; row++){
          digitalWrite(rowPins[row],LOW);// Activate the current column.
           for(int column = 0; column < numCols; column++){ // Scan all rows for a key press.

                if(digitalRead(colPins[column]) == LOW){ // Is a key pressed?

    //boolean debounce(int pin); 
                    delay(debounce); // debounce
                    while(digitalRead(colPins[column]) == LOW); // wait for key to be released
                        key = keymap[row][column];
//delay(60);// Remember which key was pressed.
                }      
            }
            digitalWrite(rowPins[row],HIGH); // De-activate the current column.
        }



        return key; // returns the key pressed or 0 if none
} 

  void Menu(){
      if ( key == 'F'){
           inc +=1;
           void submenu();
           lcd.clear();
           lcd.setCursor(0,0);
           lcd.print(menu);
           delay (1000);
       }

      if (key == 'T'){
          inc -=1;
          void submenu();
          lcd.clear();
          lcd.setCursor(0,0);
          lcd.print(menu);
          delay (1000);
      }
      else{}
        return;
}

  void submenu(){
  
        if ( inc == -1){
             inc = 4;
             menu = str4;
             return;}
        else if ( inc == 1 ){                    // seleciona temperatura
             menu = str1;
             return;
        }
        else if ( inc == 2){                    // seleciona umidade
              menu = str2;
              return;
        }
        else if ( inc == 3){                    // seleciona irrigação
             menu = str3;
             return;
        }
        else if ( inc == 4){                    // seleciona luminosidade
          menu = str4;
          return;
        }
        else ( menu == 5);{                 // imprime aplicação
           inc = 0;
           menu = "aplicacao";
           return;
         }
         return;
  }
Aqui é o código onde acontece o erro, vou tirar algumas coisa que nao estão sendo usadas ainda e deixar só a parte do teclado e display, setup é igual ao outro
          
            
           
           
            void loop(){
              
               key = get_key();
               Menu();delay(1000);
               lcd.clear();
               //lcd.setCursor(0,0);
               //lcd.print("selecione");
               //lcd.setCursor(0,1);
              // lcd.print(menu); //delay(3000);
          
              
            }
                     
            char get_key(){
              
                key = {}; 
                delay(100);// 0 indicates no key pressed
                
                for(int row = 0; row < numRows; row++){
                    digitalWrite(rowPins[row],LOW);// Activate the current column.
                     for(int column = 0; column < numCols; column++){ // Scan all rows for a key press.
          
                          if(digitalRead(colPins[column]) == LOW){ // Is a key pressed?
                                             
                              delay(debounceTime); // debounce
                              while(digitalRead(colPins[column]) == LOW); // wait for key to be released
                              key = keymap[row][column];
                              delay(60);// Remember which key was pressed.
                          }      
                      }
                      
                      digitalWrite(rowPins[row],HIGH); // De-activate the current column.
                  }
                   
                  return key; // returns the key pressed or 0 if none
          } 
          
 
           
           
            char Menu(){
       
                  confirma = 0;                  
                  key = get_key();
                  while ( key != 'v' ){ 
                    key = get_key();
                    
                    if( key == 'f' ){ 
                       
                       inc +=1;
                       submenu();
                       lcd.setCursor(3,0);
                       lcd.print("selecionar"); 
                       delay (10);
                 }
          
                    if (key == 't'){
                      
                      inc -=1;
                      submenu();
                      lcd.setCursor(3,0);
                      lcd.print("selecionar"); 
                      delay (10);
                }
                    if ( key == 'e' & confirma == 1 ){
                      
                         if ( key != 'f' || key != 'v'){
                           
                         lcd.setCursor(1,0);
                         lcd.print("digite valor");
                         lcd.setCursor(3,1); 
                         delay(10);
                         escreve_valor_lcd();
                         delay(1500);
                         }
                         //return 0;
                      }
                }
                return 0;
              }
                      
            String submenu(){
                
                  if ( inc < 0 ){
                    confirma = 1;
                    inc = 5;
                    escreve_mensagem_lcd(texto5, 2 , 1);
                    return inc;
                  }
                   else if ( inc == 0 )
                  {
                    confirma = 1;
                    escreve_mensagem_lcd(texto5, 2 , 1); 
                    return inc;
                  }
                  
                  else if ( inc == 1 )                    // seleciona funçao
                  {
                    confirma = 1;
                   escreve_mensagem_lcd(texto1, 5 , 1); 
                    return inc;
                  }
                  else if ( inc == 2)                    // seleciona temperatura
                  {
                    confirma = 1;
                    escreve_mensagem_lcd(texto2, 2 , 1);
                   
                   return inc;
                  }
                  else if ( inc == 3)                    // seleciona umidade
                  {
                    confirma = 1;
                    escreve_mensagem_lcd(texto3, 4 , 1);
                   
                   return inc;
                  }
                  else if ( inc == 4)                    // seleciona irrigação
                  {
                    confirma = 1;
                    escreve_mensagem_lcd(texto4, 3 , 1);
                   
                   return inc;
                  }
                  else if ( inc == 5)                 // luminosidade 
                  {
                    confirma = 1;
                    escreve_mensagem_lcd(texto5, 2 , 1);
                    
                   return inc; 
                   }
                   else if ( inc >5){
                     confirma = 1;
                     inc = 0;
                     escreve_mensagem_lcd(texto1, 5 , 1);
                     return inc;
                   }
                   return 0; 
            }
            
 
             
             
             void escreve_mensagem_lcd(String t, unsigned int coluna, unsigned linha){
                 lcd.clear();                 
                 lcd.setCursor(0,linha);
                 lcd.print ("                  ");
                 lcd.setCursor(coluna,linha);
                 lcd.print(t);
                 
             }   
   
            void escreve_valor_lcd(){
              
                  key = get_key();
                  if ( key != 0X00 || key!= 'f' || key != 't'){
                    
                    lcd.clear();
                    lcd.setCursor(0,0);  
                    lcd.print(key);
                  }
            }
 
        /*     unsigned char get_valor(){
             
             
             if( key !=  'F' && key != 0 || key !=  'T' && key != 0 ){  
                    valor[valor_index++] = key ;
                        if (valor_index <= 5 ) { //indice 4 é o terminador de string, logo apenas vais imprimir 4 digitos. 
                            //lcd.clear();  
                            //lcd.print(valor);
                            delay(1000);
                            if (valor_index == 4 ){
                                 delay(1000);
                                 lcd.clear();
                                 valor_index = 0; 
                                 valor = {};
                             }
                       }
                   return valor;
                  delay(100);
                  }
             }*/

Alguem ae pode me ajudar?

valew

Eu não consigo sequer imaginar o que pretendes atingir… mas vejo imensas coisas “erradas” em ambos os códigos.

Uma delas e provavelmente o que te está a causar problemas é isto:

  confirma = 0;                  
                  key = get_key();
                  while ( key != 'v' ){ 
                    key = get_key();

O problema aqui, e no código em geral é que estás sempre a chamar a get_key. Isso está mal. Ou chamas em intervalos regulares de 20 em 20 ms por exemplo, ou chamas uma vez por ciclo e corres o ciclo com o valor retirado inicialmente.

Outra coisa que está completamente errada são os vários delays que tens no código. Um delay de 100 ou menos ainda é aceitável… um delay de 3000 é ridículo. Tira todos os delays do código uma vez que os delays fazem com que não saibas se o programa está à procura de teclas pressionadas ou a processar o delay.

Para terminar, tem cuidado com o que fazes com as variáveis.

  char get_key(){
              
                key = {}; //  <-------------------------------------- key passa a ser igual a NULL. Experimenta colocar key = '0';
                delay(100);// 0 indicates no key pressed  ISTO NÃO SEI PARA QUE ESTÁ AQUI.
                
                for(int row = 0; row < numRows; row++){
                    digitalWrite(rowPins[row],LOW);// Activate the current column.
                     for(int column = 0; column < numCols; column++){ // Scan all rows for a key press.
          
                          if(digitalRead(colPins[column]) == LOW){ // Is a key pressed?
                                             
                              delay(debounceTime); // debounce
                              while(digitalRead(colPins[column]) == LOW); // wait for key to be released
                              key = keymap[row][column];   // <---------------------------------------------Se uma tecla pressionada, muda o valor de key
                              delay(60);// Remember which key was pressed.
                          }      
                      }
                      
                      digitalWrite(rowPins[row],HIGH); // De-activate the current column.
                  }
                   
                  return key; // returns the key pressed or 0 if none //<--------------------- retorna 0, não '0' que é o que estás à espera de receber. 
          }

Mas o problema deste código é que tu fazes return duma variável global para a mesma variável. Ou seja, quando fazes

key = get key();

E depois dentro da get_key fazes:

return key;

Estás na realidade a fazer 

key = key;

Tenta evitar variáveis globais e faz a funcão com variáveis locais. Isso previne que coisas como a que está em cima acontecam e mais problemas aparecam sem perceberes porquê.
Dares uma vista de olhos a funcões e variáveis globais e locais não seria de todo um desperdício.

Valeu cara, sou novo em programação e ainda não manjo muito, suas dicas foram bem uteis, mais cntinuei tendo o mesmo problema, o display ainda assim continuava imprimindo "lixo" . Tive que mudar a forma de como seria o retorno, porque quando retornava 0, por algum motivo não aparecia no display como se fosse NULL da tabela ascii, então tive que alterar para um espaço vazio.
Agora gostaria de saber como isso é possivel??? O código do teclado foi retirado do cookbook e feito algumas alterações porque eu aumentei o teclado.

She vires o codigo que deixei no primeiro post que escrvi vais perceber due once gem onull.....

Eu dei uma olhada sim e fiz a modificação, mas mesmo assim o erro ainda acontecia, e sinceramente não sei porque. Agora estou usando ' ' na funçao para não imprimir nada.

bubulindo:
She vires o codigo que deixei no primeiro post que escrvi vais perceber due once gem onull.....

Merda de android...

Se vires o codigo que deixei no primeiro post que escrevi vais perceber de onde vem o null.

Mas havia mais dicas lá, alteraste isso?

Sim eu alterei e mesmo assim continuou dando erro, eu testei so a funçao do teclado e mandava imprimir para ver, e continuava impriminto lixo, dei uma olhada nas outras alteraçoes e foram de boa ajuda