cadena caracteres arduino

Hola tengo el siguiente programita sencillo:

int entrada = 0;
const int ledPin = 13;

void setup() {

pinMode(ledPin,OUTPUT);
Serial.begin(9600);

}

void loop() {
if (Serial.available()>0)
{

entrada = Serial.read();

if(entrada=='a')
{

digitalWrite(ledPin,HIGH);
Serial.write( "LED ENCENDIDO");
Serial.write("\n");
}

if (entrada == 'b')
{
digitalWrite(ledPin,LOW);
Serial.write( "LED APAGADO");
Serial.write("\n");
}

if((entrada != 'a') & (entrada != 'b'))
{
Serial.write( "ERROR!");
Serial.write("\n");
}

}
}

Pero la idea principal no es encender el led con una letra si no, escribiendo "led 1 on"
"led 2 off"
Y no he encontrado la forma de poder hacerlo, si alguien me pudiese echar una mano.

Un saludo.

Hola!
No se si la solución que te voy a dar es la más correcta, pero al menos funcionaría.
Para que se encienda al escribir “led1 on”, yo crearía una cadena de caracteres con esa mima cadena, al saber que cadena vas a recibir, en un bucle for llamas a Serial.read() tantas veces como caracteres tiene la cadena y vas concatenando lo leido. Al final comparas ambas cadenas y si son iguales, enciendes el led.

El código quedaría algo como así:

String entrada;
String enciende = "led1 on";
String apaga = "led1 off";

int numbits;

const int ledPin = 13;

void setup() {

pinMode(ledPin,OUTPUT);
Serial.begin(9600);


}

void loop() {
if ((numbits = Serial.available())>0)
 {
 
 for(int i =0; i<numbits; i++){
   entrada = entrada+Serial.read();
 }
    if(entrada==enciende)
     {
     
      digitalWrite(ledPin,HIGH);
      Serial.write( "LED ENCENDIDO");
      Serial.write("\n");
     }
   
   if (entrada == apaga)
    {
      digitalWrite(ledPin,LOW);
      Serial.write( "LED APAGADO");
      Serial.write("\n");
    }

 if((entrada != enciende) & (entrada != apaga))
   {
     Serial.write( "ERROR!");
     Serial.write("\n");
   }
  
 }
}

La verdad es que no se si funcionará bien ya que soy novato en esto del arduino y la concatenación de cadenas no la tengo muy clara. Pero la idea es más o menos así.

Espero haberte ayudado aunque sea algo.

muchas gracias por contestar,

Pues si no es la solución definitiva es una gran ayuda para poder manejar bien el string.

Cuando lo pruebe lo comento.

Un saludo.

no funciona como debería, imprime 6 veces encendido y apagado, seguramente el problema sea a la hora de leer la cadena.

Así es, la lectura está mal. Investigando he visto que la concatenación de cadenas no se hace así, se realiza usando la función concat(). Por lo que el bucle for que se usa para la lectura quedaría así:

for(....){
   letra=Serial.read();
   cadena.concat(letra);
}

Así se concatena lo que se va leyendo, con la cadena que tienes obteniendo al final la cadena que necesitas.

En principio, podrías ir leyendo el puerto serie y concatenando cadena, hasta que detectes un carácter de salto de línea, o un caracter especial (a veces he usado el asterisco: * como identificador de final de comando.

Luego, cuando tengas la cadena leída, la comparas con el patrón del comando, usando indexOf, y si coincide, pues actúa.

Échale un ojo a este sketch, que hace algo parecido, lo usa para activar o desactivar la digital 6, y para ajustar fecha y hora en un reloj.

//chema_zgz - Feb 2016
//Arduino Nano
//Transistor conectado en D6 para intentar encender un led cuando se activa

// Importamos las librerias necesarias
#include <Wire.h> //Para el manejo del I2C
#include <DS1307RTC.h> //Para manejo del RTC
#include <Time.h>
//#include <TimeAlarms.h>

unsigned long tiemporef;

tmElements_t t;  //Declaración de t como el tipo que devuelve la libreria DS1307
time_t tt; //Declaración de tt como el tipo que gestiona la librería Time

int leidoSerie;
String scadena="";

void setup() {
  Serial.begin(9600);

  pinMode(6, OUTPUT); //Pin que controla el transistor
  digitalWrite(6, LOW); //Empieza con el pin en bajo
    
 Serial.println("ARRANCA LA PLACA");
 //Ajusta la hora del "sistema" en el arranque
  RTC.read(t); //Lee la hora del RTC
  //Ajusta la hora al sistema
  setTime(t.Hour, t.Minute, t.Second, t.Day, t.Month, t.Year+1970);
  Serial.println("Leida la hora del RTC y ajustada la del sistema");
  Serial.println("");
  Serial.println("Los comandos acaban en asterisco *");
  Serial.println("D6 ON* O D6 OFF* pone en alta o baja el pin D6");
  Serial.println("SET DATE yyyy/mm/dd* ajusta la fecha a la indicada");
  Serial.println("SET TIME hh:mm:ss* ajusta la hora a la indicada");
  tiemporef=millis();
}  
  
void loop() {
      
      
      if(Serial.available()>0){
         leidoSerie = Serial.read();
         if (leidoSerie==42) { //Fin de cadena, un asterisco
             Procesa_cadena(scadena);
             scadena="";
         }
         else {
             scadena+= char(leidoSerie);
         }

        
        
      }
      //Cada 5 segundos muestra la hora
      if ((millis()-tiemporef)>=5000) {
          tiemporef=millis();
          //Fecha y hora
          tt=now();
          Serial.print(FormatDate(tt));
          Serial.print(F(" "));
          Serial.println(FormatTime(tt));
       }
  //FIN DE MODO DE VISUALIZACIÓN
  
}

String FormatDate(time_t tr){
  String cadena;
  int mes,dia;
  mes=month(tr);dia=day(tr);
  cadena="";
  cadena+=year(tr);
  cadena+="/";
  cadena+=mes/10;
  cadena+=mes%10;
  cadena+="/";
  cadena+=dia/10;
  cadena+=dia%10;
  return cadena;
}

String FormatTime(time_t tr){
  String cadena;
  byte hora, minuto, segundo;
  hora=hour(tr);minuto=minute(tr);segundo=second(tr);
  cadena="";
  cadena+=hora/10;
  cadena+=hora%10;
  cadena+=":";
  cadena+=minuto/10;
  cadena+=minuto%10;
  cadena+=":";
  cadena+=segundo/10;
  cadena+=segundo%10;
  return cadena;
}

void Procesa_cadena(String sc){
  if (sc.indexOf("D6 ON") !=-1){
            Serial.println("Pondra D6 en alta");
            digitalWrite(6,HIGH);
            
        }
        else if (sc.indexOf("D6 OFF") !=-1){
            Serial.println("Pondra D6 en baja");
            digitalWrite(6,LOW);
            
        }
        else if (sc.indexOf("SET DATE ") !=-1){
            Serial.println("Ajuste de fecha");
            if (Ajusta_Fecha(sc)==-1){
                Serial.println("Fallo en el ajuste de fecha");
            }
            else {
                Serial.println("Ajuste de fecha correcto");
            }
            
        }
        else if (sc.indexOf("SET TIME ") !=-1){
            Serial.println("Ajuste de hora");
            if (Ajusta_Hora(sc)==-1){
                Serial.println("Fallo en el ajuste de hora");
            }
            else {
                Serial.println("Ajuste de hora correcto");
            }
        }
}

byte Ajusta_Hora (String sc){
    byte pos, hora,minuto,segundo;
    String shora,sminuto,ssegundo;
    Serial.println(sc);
    pos=sc.indexOf("SET TIME ");
    if (pos==-1){
        Serial.println("Cadena de entrada erronea");
        return -1;
    }
    shora=sc.substring(pos+9,pos+11);
    sminuto=sc.substring(pos+12,pos+14);
    ssegundo=sc.substring(pos+15,pos+17);
    
    hora=string2long(shora);
    minuto=string2long(sminuto);
    segundo=string2long(ssegundo);
    
    Serial.print("Se ajustara hora a: ");
    Serial.print(hora);
    Serial.print(":");
    Serial.print(minuto);
    Serial.print(":");
    Serial.println(segundo);
    
    //Ajusta la hora del sistema
    setTime(hora, minuto, segundo, day(), month(), year());
    //Ajusta la hora del RTC
    //Con RTC.set, ajusta con un time_t
    if ( !RTC.set(now()) ){Serial.println("Fallo en el ajuste del RTC");return -1;}
    
   return 0;
}

byte Ajusta_Fecha (String sc){
    int pos, anyo, mes, dia;
    String sanyo,smes,sdia;
    Serial.println(sc);
    pos=sc.indexOf("SET DATE ");
    if (pos==-1){
        Serial.println("Cadena de entrada erronea");
        return -1;
    }
    sanyo=sc.substring(pos+9,pos+13);
    smes=sc.substring(pos+14,pos+16);
    sdia=sc.substring(pos+17,pos+19);
    
    anyo=string2long(sanyo);
    mes=string2long(smes);
    dia=string2long(sdia);
    
    Serial.print("Se ajustara fecha a: ");
    Serial.print(anyo);
    Serial.print("/");
    Serial.print(mes);
    Serial.print("/");
    Serial.println(dia);
    
    //Ajusta la fecha del sistema
    setTime(hour(), minute(), second(), dia, mes, anyo);
    //Ajusta la fecha-hora del RTC
    //Con RTC.set, ajusta con un time_t
    if ( !RTC.set(now()) ){Serial.println("Fallo en el ajuste del RTC");return -1;}
    
   return 0;
}

long string2long(String string){
  char cadena[string.length()+1];
  string.toCharArray(cadena, string.length()+1);
  return atol(cadena);
}