Bom,primeiramente obrigado por estar lendo este tópico ,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
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:
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
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:
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
Agradeço por me ajudar , 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..
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.
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.
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: