comandos com parâmetros pela serial

Bom,primeiramente obrigado por estar lendo este tópico :slight_smile: ,vamos ao problema:
-Receber um comando do tipo: ligar 13 e executar o seguinte código: digitalWrite(13,HIGH).
Obs: De forma que depois o parâmetro(que é o 13 por exemplo) fosse tratado assim: digitalWrite(pin,parâmetro) e não fosse necessário criar um case no Switch para cada parâmetro que possa ser digitado.
1º: lê a serial e transforma o que foi recebido numa string(já consegui fazer essa parte funcionar), verifica o comando recebido(ex:liga,desliga) e executa uma instrução baseada nesse comando usando o parâmetro fornecido.

Caso mesmo assim fique confuso de entender imagine o Arduíno nesse caso como um interpretador, onde ele recebe as instruções, interpreta-las e as executa.

O código feito até aqui é o seguinte

int led=13;//terminal do led
String rec="";//recebe o valor da funçao que trata a serial
void setup() {
  Serial.begin(9600); //inicia  a serial
  pinMode(led,OUTPUT); //configura o terminal do led como saida
}

String lerserial() { //funço que transforma o que e recebido pela serial em uma string
  String conteudo = ""; // armazena o frase inteira
  char carac; //armazena cada caracter
  while(Serial.available()>0) { // enquando receber caracteres
    carac=Serial.read(); //grava-lo na variavel carac
    if(carac !='/n') { //se o caracter NAO for quebra de linha
      conteudo.concat(carac); //contatenar o caracter na string conteudo
    }
    delay(10); //delay para nova leitura
  }
  Serial.print("Recebi: ");
  Serial.println(conteudo);
  return conteudo; //retorna o valor da string conteudo
}
void loop() {
  if(Serial.available()) { // se estiver recebendo algo pela serial
    rec = lerserial(); //executar a funçao que transforma os caracteres em string e grava a saida na var rec
  }
  if(rec=="on") { //se a string recebida for "on"
    digitalWrite(led,HIGH); //ligar o led
  }
  if(rec=="off") { //se a string recebida for "off"
    digitalWrite(led,LOW); //desligar o led
  }
}//end main loop

Qual é exactamente a dúvida?

Parece que não sabe muito bem o que está a dizer (ou a escrever neste caso).
O que recebe é:

comando parâmetro [\n]

e terá que executar:

digitalWrite(parâmetro, ccomando);

escrevo "ccomando" e não "comando" (que é o que recebe pela série), porque deverá alterar o que chega pela porta série para criar algo válido que a função digitalWrite() entenda.

Exemplo:
se receber pela porta série:

ligar 13

deverá executar:

digitalWrite(13, HIGH);

onde altera o "ligar" para "HIGH".

É possível ser feito mas parece-me que ainda está um pouco longe. Se tiver alguma questão em concreto, apresente-a, talvez assim seja mais fácil.

NOTA: Espero que isto seja apenas um exemplo e que não possa ser aplicado a todos os pinos. Se for assim e puder escolher qualquer pino para ser ligado/desligado, deverá na função setup() proceder de forma adequada para todos os pinos, ou seja deverá alterar a direcção de todos os pinos através da função:

 pinMode(TODOS_OS_PINOS,OUTPUT);

Muito obrigada por ajudar!

Na verdade estou focando mais em separar o que eu mando pela serial (comando parâmetro, liga 13, desliga 13, por exemplo), note que para separar esse dois itens eu utilizei o espaço, pois bem, fiz o seguinte código:

int led=13;//pino do led
String command="";
void setup() {
  Serial.begin(9600);
  pinMode(led,OUTPUT);
}

String lerserial() {
  String comando = ""; // armazena o frase do comando
  String parametro = "";//armazena a frase do parametro
  char carac; //armazena cada caracter
  while(Serial.available()>0) { // enquanto receber caracteres
    carac=Serial.read(); //grava-los na var carac
    if(carac !='/n') { //se o caracter NAO for quebra de linha
      comando.concat(carac);//concatenar o caracter com a string comando
    }
    if(carac ==' ') { //se o caracter for espaço
      parametro.concat(carac); //concatenar o caracter na string parametro
    }
    delay(10);
  }
  Serial.print("Comando: ");
  Serial.println(comando);
  Serial.print("Parametro: ");
  Serial.println(parametro);
  return comando;
}
void loop() {
  if(Serial.available()) { // se estiver recebendo algo pela serial
    command = lerserial();
  }
  // aqui ser tratado os comandos e os parâmetros
}//end main loop

dnc0:
Muito obrigada por ajudar!

Na verdade estou focando mais em separar o que eu mando pela serial (comando parâmetro, liga 13, desliga 13, por exemplo), note que para separar esse dois itens eu utilizei o espaço, pois bem, fiz o seguinte código:

int led=13;//pino do led

String command="";
void setup() {
  Serial.begin(9600);
  pinMode(led,OUTPUT);
}

String lerserial() {
  String comando = ""; // armazena o frase do comando
  String parametro = "";//armazena a frase do parametro
  char carac; //armazena cada caracter
  while(Serial.available()>0) { // enquanto receber caracteres
    carac=Serial.read(); //grava-los na var carac
    if(carac !='/n') { //se o caracter NAO for quebra de linha
      comando.concat(carac);//concatenar o caracter com a string comando
    }
    if(carac ==' ') { //se o caracter for espaço
      parametro.concat(carac); //concatenar o caracter na string parametro
    }
    delay(10);
  }
  Serial.print("Comando: ");
  Serial.println(comando);
  Serial.print("Parametro: ");
  Serial.println(parametro);
  return comando;
}
void loop() {
  if(Serial.available()) { // se estiver recebendo algo pela serial
    command = lerserial();
  }
  // aqui ser tratado os comandos e os parâmetros
}//end main loop

Não me parece que isso funcione.

Agradeço por me ajudar :slight_smile: , consegui fazer o código e vou disponibilizar o mesmo logo abaixo.

String comando="";
String parametro="";

void setup() {
  Serial.begin(9600); //inicia  a serial
}

void lerserial() { //funçao que transforma o que e recebido pela serial em uma string
  comando = "";//reset do valor
  parametro="";//reset do valor
  boolean isCommand=true;//determina aonde salvar o caracter
  char carac; //armazena cada caracter
  while(Serial.available()>0) { // enquando commandeber caracteres
    carac=Serial.read(); //grava-lo na variavel carac
    if(carac ==' ') {//se o caracter for espaco
      isCommand=false;//gravar o restante na var parametro
    }
    if((carac !='\n') && (isCommand==true)) {//se o caracter NAO for quebra de linha e for um comando
      comando.concat(carac);//concatena o valor na var comando
    }
    if((carac !='\n') && (isCommand==false)) {//se o caracter NAO for quebra de linha e for um parametro
      parametro.concat(carac);//concatena o valor na var parametro
    }
    delay(50); //delay para nova leitura
  }
}

void loop() {
  if(Serial.available()) { // se estiver recebendo algo pela serial
    Serial.println("Estou recebendo");
    lerserial(); //executar a funçao que transforma os caracteres em string
    Serial.print("Comando:"); Serial.println(comando);
    Serial.print("Parametro"); Serial.println(parametro);
    // tratar
    if(comando=="on") {
      pinMode(parametro.toInt(),OUTPUT);
      digitalWrite(parametro.toInt(),HIGH); 
      Serial.print("A saida "); 
      Serial.print(parametro.toInt()); 
      Serial.println(" foi ligada"); 
    }
    if(comando=="off"){ 
      pinMode(parametro.toInt(),OUTPUT);
      digitalWrite(parametro.toInt(),LOW); 
      Serial.print("A saida "); 
      Serial.print(parametro.toInt()); 
      Serial.println(" foi desligada"); 
     }
  }//receber algo serial
}//end main loop

DNC oq você esta querendo fazer eu interpretei da seguinte forma, voce quer ligar e desligar a porta 13 do arduino por comandos recebidos via serial?
Se for isso eu tenho um código aqui que funcionou comigo, eu fiz o upload dele em um arduino nano.
No meu projeto ele é controlado por outro arduino mega que envia strings para ele ligar e desligar o led via Xbee. Mas funciona com o serial monitor tbm, voce pode enviar os comandos pelo serial monitor tbm, não esqueça de marcar a Opção "nova linha" no serial monitor porque esse codigo separa a string por meio de um "\n" que seria um "Enter" no caso..

Obrigado wkpedro! Porém eu já tinha conseguido meu objetivo.

dnc0:
Obrigado wkpedro! Porém eu já tinha conseguido meu objetivo.

Que bom, se quiser pode me ajudar com o meu!
Esse é o código que vai no mega, ele tem que receber as strings enquanto uma pagina esta online pelo modulo ethernet.

Desculpa... mas...

Isto:

 if (dados == "ledon") {

Funciona???

sim funciona com a rede xbee perfeito

Esse e o codigo no Mega que esta dando o println desse "ledon" por exemplo.
O problema q nao tenho ideia de onde inserir um codigo pra leitura do que esta chegando para ele, por enquanto so desenvolvi algo para enviar esse codigo, na vdd esse codigo e uma mistura de outros codigos que vi nesse forum tem muita contribuição ai eu realmente sou noob, nao sabia nem fazer o arduino webserver...
Eu atualizei esse codigo ontem, eu tinha postado um aqui que estava mais desorganizado(mais desorganizado rs) espero nao ter feito nada errado ate aqui, voce consegue fazer o upload dessa pagina mesmo sem o xbee, se tiver com serial monitor aberto voce consegue ver q ele ta mandando as strings

Pelo que eu entendi, o nano é responsável por ligar ou desligar o led e o mega é quem comunica com o módulo de internet certo? pois bem o código é o seguinte:

String comando="";
const int led=13; // terminal do led
void setup() {
  Serial.begin(9600);
  pinMode(led,OUTPUT); //configura o terminal do led como saída
}

void tratarSerial() {
  comando="";// reseta o valor de comando
  char letra;//armazena o valor incidvual de cada caracter recebido pela serial
  while(Serial.available()>0) {//enquanto estiver recebendo algo pela serial
    letra=Serial.read();//grava a letra atual na variavel letra
    if(letra !='\n') { //se a letra não for uma quebra de linha
      comando.concat(letra); //junta o valor de letra à variável comando
    }
    delay(50);//tempo para nova leitura
  }
}


void loop() {
  if(Serial.available()) { //se estiver recebendo alguma coisa pela serial
    tratarSerial();//ler os dados recebido
    //tratamento dos dados recebidos
    if(comando=="ledon") {
      digitalWrite(led,HIGH);
    }
    if(comando=="ledoff") {
      digitalWrite(led,LOW);
    }
  }
}

Dnc0, Obrigado pela resposta e pela ajuda,
Então esse codigo que vc me enviou, eu nao sei onde iria inserir ele em uma codigo q esta rodando uma pagina com modulo ethernet entendeu.

Amigo recomendo que baixe essa biblioteca https://github.com/renatoaloi/EtherEncLib/tree/enc28coremerge e use um dos exemplos que vem com ela chamado HelloWorld, esse exemplo faz o acionamento de um led, ou seja, é o que você está buscando fazer.
Tem uma vídeo aula no Youtube comentando o código o link é esse: Como usar o módulo Ethernet ENC28J60 com Arduino - YouTube

Dnc0 Valeu pela ajuda, apesar de ter ficado com duvida se posso usar essa lib, pois o modulo que estou usando é o W5500 da Wiz
Mas vou testar, Obrigado!

dnc0:
Pelo que eu entendi, o nano é responsável por ligar ou desligar o led e o mega é quem comunica com o módulo de internet certo? pois bem o código é o seguinte: