Olá pessoal, boa tarde!
olhem essa programação:
#include <SoftwareSerial.h>
SoftwareSerial mySerial(10, 11); // RX, TX
void setup()
{
// Open serial communications and wait for port to open:
Serial.begin(9600);
mySerial.begin(9600);
}
void loop() // run over and over
{
if (mySerial.available())
{
int inByte = mySerial.read();
Serial.write(inByte);
}
}
Digamos que eu conecte um dispositivo qualquer por essa porta digital que eu criei que apenas envie dados, e eu clique no monitor serial e apareça sempre essa mensagem:
"Olá, o número é: xxxxxxxx"
E o tempo todo o dispositivo ficasse mandando pro arduino essa mensagem só que no lugar dos xxx, seria números variados o tempo todo. Mas se eu só quisesse que aparecesse no Monitor Serial os dados a partir do Dois Pontos? no caso, só os números e excluísse a frase "Olá, o número é:" como eu faria? Me desculpem, sou iniciante em arduino e só pra fazer essa programação tive muita dificuldade. Agradeço desde já!
Tags:
tenta isso aí, infelizmente não tenho como testar aqui. mais acho q vai funcionar.
/*
A informação deve chegar no formato "Olá, o número é: 25"
sendo dessa forma: <mensagem>+<espaço>+<numero>
a mensagem vai ser armazenada em msgChar
o numero vai ser armazenado em msgInt
que vai ser convertido de string para int e armazenar em valor
*/
#include <SoftwareSerial.h>
SoftwareSerial mySerial(10, 11); // RX, TX
String st, msgChar, msgInt;
int valor;
void setup()
{
Serial.begin(9600);
mySerial.begin(9600);
}
void parseData()
{
// Primeiro, vamos olhar para o separador de espaço por este código
if(st.indexOf(" ")>=0)
{
// Se for encontrado, temos o primeiro caractere até o separador
// de espaço e salvá-lo para msgChar por este código
msgChar = st.substring(0,(st.indexOf(" ")));
// Em seguida, temos os personagens do separador de espaço até
// o fim da string e salvá-lo para msgInt por este código
msgInt = st.substring(st.indexOf(" ")+1);
// Por fim, converter a string para inteiro e
// guardá-lo para valor variável por este código
valor = (msgInt.toInt());
}
else
{
msgChar = st;
valor = 0;
}
}
void loop()
{
if (mySerial.available())
{
st = String("");
while(mySerial.available())
{
st = st + char(mySerial.read());
delay(1);
}
parseData();
// imprimir os dados analisados
// convertidos para inteiro
Serial.println(valor);
}
}
abraços !!
Opa, valeu cara!
No caso, os dados que vou receber são de um GPS mas não coloquei os dados porque se não ia ficar muito complicado. Queria entender a lógica e como teria que fazer.
olha os dados que ele manda a cada segundo:
$GPRMC,024442.999,V,0125.5288,S,04827.3755,W,000.0,000.0,190813,,,N*7A
$GPVTG,000.0,T,,M,000.0,N,000.0,K,N*02
$GPGGA,024443.999,0125.5288,S,04827.3755,W,0,00,0.0,17.8,M,0.0,M,,0000*5C
$GPGSA,A,1,,,,,,,,,,,,,0.0,0.0,0.0*30
$GPGSV,3,1,11,02,66,099,27,24,45,199,,15,42,298,,26,35,358,20*75
no caso, eu só ia usar a linha $GPGGA pra pegar o horário em hhmmss.sss, latitude, Hemisfério N/S, longitude e Hemisfério E/W que são "024443.999,0125.5288,S,04827.3755,W" respectivamente.
Ainda não testei, não estou em casa. Onde está "if(st.indexOf(" ")>=0)" eu trocaria por "if(st.indexOf("$GPGGA,")>=0)" e onde tivesse espaço eu colocaria $GPGGA estou certo?
hum, entendo. Não estou com o arduino e o GPS em mãos agora. Assim que eu chegar em casa, eu faço esse teste e te mostro os resultados :D
solução do problema:
como nosso amigo queria receber o conteúdo somente da linha sublinhada
$GPRMC,024442.999,V,0125.5288,S,04827.3755,W,000.0,000.0,190813,,,N*7A
$GPVTG,000.0,T,,M,000.0,N,000.0,K,N*02
$GPGGA,024443.999,0125.5288,S,04827.3755,W,0,00,0.0,17.8,M,0.0,M,,0000*5C
$GPGSA,A,1,,,,,,,,,,,,,0.0,0.0,0.0*30
$GPGSV,3,1,11,02,66,099,27,24,45,199,,15,42,298,,26,35,358,20*75
o código ficou da seguinte forma:
#include <SoftwareSerial.h>
SoftwareSerial mySerial(10, 11); // RX, TX
String st, msgChar;
void setup()
{
Serial.begin(9600);
mySerial.begin(9600);
}
void parseData()
{
// Primeiro, vamos ver se o conteudo possui a linha $GPGGA,
if(st.indexOf("$GPGGA,")>=0)
{
// Se for encontrado, temos os caracteres até o $GPGSA
// 7 quer dizer que vamos anular 7 primeiros caracteres q são '$GPGGA,'
// para ele mostrar somente os numeros que interessa
msgChar = st.substring(7,(st.indexOf("$GPGSA")));
}
}
void loop()
{
if (mySerial.available())
{
st = String("");
while(mySerial.available())
{
st = st + char(mySerial.read());
delay(1);
}
parseData();
// imprimir os dados analisados
// convertidos para inteiro
Serial.println(msgChar);
}
}
Bem-vindo a
Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)
© 2024 Criado por Marcelo Rodrigues. Ativado por