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);
}