Dato erróneo recibido en puerto serie enviado por SMS SIM900

Buenas día, antes que nada saludarlos y felicitarles por su excelentes aportaciones.

Tengo un problema con el código y recurro a ustedes para que me orienten o ayuden a resolverlo, antes que nada conozco poco de programación pero me gusta mucho y quiero aprender esto para hacer proyectos.
Buscando en las redes encontré un sistema de riego por goteo Manual/Automático controlado por SMS (SIM900) y placa Arduino UNO, misma placa Arduino UNO recolecta información de los sensores de humedad/temperatura, Lluvia y activa el rele de riego para que arranque de la bomba anexo liga
de lo antes descrito: SISTEMA DE RIEGO CON ARDUINO GSM + 3 tipos de SENSORES - YouTube

ya tengo montado todo el circuito y ejecuto el código y efectivamente me llegan los SMS a mi celular de los datos obtenidos de los sensores de humedad, temperatura , cantidad de agua en el tanque posterior a ello manda un mensaje de el menú para elegir entre Manual o Automático anexo imagen de lo antes descrito

El problema parte de aquí en adelante, al momento de enviar el SMS desde mi celular con la letra A de Automático o M de Manual para ambos casos no ejecuta la opción mencionada si no que lo que realiza el código manda la instrucción de activar el Rele de la bomba para regar.

ya llevo varios días buscando el error y lo que he encontrado es que al momento de recibir el mensaje de texto en el puerto serie ejecuta el carater 13 (ASCII) correspondiente al salto de linea que llega desde el celular (\n) y no la letra (M o A), el detalle es que no logro quitarle el (\n) al mensaje de texto para que únicamente lea el caracter A de Automático o M de Manual o en su defecto 0 para salir.

anexo lo que muestra el puerto serie cuando lo ejecuto y elijo la opción M o A

SETUP LISTO
DATOS
TEMPERATURA: 28°C
MENSAJE ENVIADO
AT+CMGS="7443096720"
SMS: TEMPERATURA: 28ºC
Enviando
Enviando
Enviado, limpiando serial
HUMEDAD: 55%
MENSAJE ENVIADO
AT+CMGS="7443096720"
SMS: HUMEDAD: 55%
Enviando
Enviando
Enviando
Enviado, limpiando serial
CANTIDAD DE AGUA DISPONIBLE: 510.00ml.
MENSAJE ENVIADO
AT+CMGS="7443096720"
SMS: CANTIDAD DE AGUA DISPONIBLE: 510.00 ml.
Enviando
Enviando
Enviando
Enviando
Enviado, limpiando serial
LLUVIA NO DETECTADA
MENSAJE ENVIADO
AT+CMGS="7443096720"
SMS: LLUVIA NO DETECTADA
Enviando
Enviando
Enviando
Enviado, limpiando serial
SELECCIONE MODO DE RIEGO M(Manual)//A(Automatico)
MENSAJE ENVIADO
AT+CMGS="7443096720"
SMS: SELECCIONE MODO DE RIEGO M(Manual)//A(Automatico)
Enviando
Enviando
Enviando
Enviando
Enviando
Enviando
Enviando
Enviando
Enviando
Enviando
Enviando
Enviando
Enviando
Enviando
Enviado, limpiando serial

REGANDO
MENSAJE ENVIADO
AT+CMGS="7443096720"
SMS: REGANDO
Enviando
Enviado, limpiando serial
SE TERMINO DE REGAR
MENSAJE ENVIADO
AT+CMGS="7443096720"
SMS: SE TERMINO DE REGAR
Enviando
Enviando
Enviando
Enviado, limpiando serial

Anexo la parte del código donde tengo el problema.

void loop() {
  while(cont==0){
    boolean saltoEncontrado=false;
    String ignore=" 20\",.\n\r";
    if(SIM900.available()>0){
    String mensajetemp=(String)SIM900.read();
    Serial.println(mensaje);
    select(mensajetemp);
      if((mensajetemp=="-") && !(saltoEncontrado)){
        saltoEncontrado=true;
        }else{
          if((saltoEncontrado)&&!(ignore.indexOf(mensajetemp)>=0)){
             mensaje+=mensajetemp;
             select(mensaje);
          }
        };
        if(mensaje.equals("0")){
          cont = 0;
          } else {
            cont = cont +1;
          }
    }
  }
  delay(500);
}

void select(String msn){
  if(msn.equals("M")){
     Serial.println("ENTRANDO AL MODO MANUAL");
     envioMensaje("ENTRANDO AL MODO MANUAL");
     Serial.println("SELECCIONE 0 PARA SALIR");
     envioMensaje("SELECCIONE 0 PARA SALIR");
     modoManual();
  }else if(msn.equals("A")){
     Serial.println("ENTRANDO AL MODO AUTOMATICO");
     envioMensaje("ENTRANDO AL MODO AUTOMATICO");
     modoAutomatico();
  }else if(msn.equals("0")){
     //Serial.println("SELECCIONE MODO DE RIEGO M(Manual)//A(Automatico)");  
     Serial.println("DATOS");
     envioMensaje("DATOS");
     datos();
  }else if(msn.equals("No")){
     Serial.println("SELECCIONE MODO DE RIEGO M(Manual)//A(Automatico)");
     envioMensaje("SELECCIONE MODO DE RIEGO M(Manual)//A(Automatico)");  
     Serial.println("DATOS");
     envioMensaje("DATOS");
     datos();
  }else if(msn.equals("Si")){
     Serial.println("Indique la cantidad de segundos que desea regar");
     envioMensaje("Indique la cantidad de segundos que desea regar");  
  }else if(msn.toInt()>0){
     encenderRelay(msn);
  }
}

se encuentra como dato adjunto el código completo.

espero haber sido claro y me puedan ayudar

Riego_manual_y_automatico.ino (6.81 KB)

Veo varios errores, uno esta aquí para mi gusto la opción limpiarSerial(true) conduce a perder datos posiblemente buenos.

void limpiarSerial(boolean temp){
 while(!(SIM900.available()>0)&&temp){
   delay(1000);
   Serial.println("Enviando");
   }
 if(temp){
   Serial.println("Enviado, limpiando serial");
   }
 while(SIM900.available()>0){
   char temp=(char)SIM900.read();
   }
}

usas una variable temp del tipo boolean para indicarle si enviar o recibir y luego redefines temp para leer el estado de lo que envia el SIM900
No entiendo para que esta esa ultima línea, deberías eliminarla.
Para borrar el buffer usa

SIM900.flush();

Otro error que veo es como concatenas la información en el loop.

if(SIM900.available()>0){
    String mensajetemp=(String)SIM900.read();
    Serial.println(mensaje);
    select(mensajetemp);

mensajetemp es un String que debería acumular los caracteres recibidos por SIM900.read() usando algo como
Lo ideal sería algo asi

 String mensajetemp= "";
     char character;

     while(Serial.available()) {
         character = Serial.read();
         mensajetemp.concat(character);
     }

     if (mensajetemp!= "") {
       Serial.println(mensajetemp);  // tu cadena correcta dentro del String.
     }

Tengo que eliminar todo el void loop o solo esa parte

Los programas se deben hacer paso a paso. No se puede presentar un problema de este tipo cuando lo tienes todo hecho.
Si eso pasa quiere decir que te salteaste muchas etapas, en este caso la etapa de prueba de recepción de mensajes SMS.
Cuando miro el programa tal como le dije a @sb8a en su momento veo un código muy desordenado (para mi gusto).
Las cosas deben ser mas claras en un loop para poder entenderlas o para que cuando alguien las lee como nosotros podamos de un vistazo saber que se quiso hacer.
Entonces mira:

Cuando respondí pensé que concatenaba la información, ahora me doy cuenta que no es el caso y solo espera un caracter.
No me gusta como convierte un caracter en String dejando de lado que es correcto pero no me parece adecuado o en otras palabras yo no lo haría asi.
Simplemente seguiría con caracteres.

Asi que hay que buscar el fallo mirando que pasa cuando se recepcionan los SMS.
Porque luce aparentemente bien.

Hi,
Una instruccion que es buena para sacar un cararacter de un string es la instruccion myString.charAt(n) con esta puedes optener el cararcter que quieras del un string. Solamente una sugerencia.

Para que quieres sacar un caracter de un String si lo que leíste inicialmente fue un caracter?

SIM900.read() que devuelve? un caracter ASCII o byte codificado en ASCII, luego lo pasa a String con el (typecase) y lo almacena en una variable String de un solo valor para luego recuperar un caracter? Me parece muy poco o nada eficiente.

hi,
El dice que no puede sacar el caracter A o la M porque tiene incluido el character de retorno /n. Algunas veces no es la eficiencia sino lo que es mas facil. Para ti se te hace facil por tu experiencia como programador pero no todo el mundo tiene la experiencia que tu tienes que a ti se te hace facil pero noo todo el mundo tiene esa experiencia.

Ok, pero yo le respondía a @edito72 ya que el autor original no volvió a responder.
Tienes razón respecto del \n que es la pregunta original.

Sin String esta es la solución:
cuando se lee el caracter se pregunta si es '\n' y entonces se da por terminado el dato ingresado.
De todas formas no tiene importancia porque se responde a caracteres como M, N, etc y los demas caracteres como en este caso '\n' debiera descartarse.

     while(Serial.available()> 0) {
         character = Serial.read();
         if (character == '\n')         // con esto sales del loop
             break;
         mensajetemp.concat(character);
     }