Olá pessoal.

Preciso desenvolver um programa no arduino, que vai receber um pacote de dados enviados por um pequeno densímetro,  composto da seguinte maneira:

@!000823.53@!00050.80342@!

@! = Carácter delimitador.

0008 = TAG de identificação do aparelho.

23.53 = Temperatura do aparelho.

@! = Carácter delimitador.

0005 = TAG de identificação de densidade.

0.80342 = Densidade da amostra.

@! = Carácter delimitador.

O que meu arduino precisa, é simplesmente capturar esse pacote pela serial 1, separar a temperatura e a densidade em um vetor e transformar esses valores em float.

A temperatura, vou ter que transforma-la em um valor float, e usar esse valor para controlar um pequeno dispositivo de controle térmico com uma Peltier.

Depois vou usar o valor capturado da temperatura, para mostrar isso em um display 16x2.

A densidade vou mostrar na segunda linha do display 16x2.

O que eu preciso é justamente saber como capturar o pacote enviado ao arduino, separar esses valores e transformar eles em valores float para que eu possa utilizar em outras linhas de comando dentro do programa, ou em outras funções.

Alguém poderia ajudar???

Até agora, eu fiz este código apenas para receber os dados e mostrar os valores no serial monitor do arduino.

-----------------------------------------------------------------------------------------------------------------------------

Tá funcionando, mas preciso agora transformar os vetores de interesse em valores float.

----------------------------------------------------------------------------------------------------------------------------

/*

Programa de captura 

*/

char buffer[30];// Tamanho do buffer de dados recebidos pela porta 1
byte GetData [7] = {0x01, 0x00, 0x00, 0x00, 0x08, 0x02, 0x03};//Pacote de dados de solicitação enviado ao densímetro
int reading = 0;
void setup()
{
//Habilitação da serial
Serial.begin(19200);
Serial1.begin(19200);
Serial2.begin(19200);
Serial.flush();
Serial1.flush();
pinMode(10, OUTPUT);
}
void loop()
{
while (Serial1.available() > 0)
{
int index = 0;
delay(100); // permite o buffer encher
int numChar = Serial1.available();
if (numChar > 27) {
numChar = 27;
}
while (numChar--) {
buffer[index++] = Serial1.read();
}
splitString(buffer);
}
Serial2.write(GetData, sizeof(GetData)); //Send the byte array
delay(500);
}

void splitString(char* data)
{
char* parameter;
parameter = strtok (data, " ,");
while (parameter != NULL) {
setLED(parameter);
parameter = strtok (NULL, " ,");
}
// Limpa os textos e o buffer serial
for (int x = 0; x < 27; x++)
{
buffer[x] = '\0';
}
Serial1.flush();
Serial.flush();
}
void setLED(char* data) {
char* myStrings[10];


if ((data[0] == '@') && (data[13] == '!'))
{
if ((data[18] != 'N') || (data[19] != 'o'))
{


for (int i = 0; i<10; i++){
Serial.print(myStrings[i]);
}


Serial.println('\n');
Serial.print("Density ");
Serial.write(data[18]);
Serial.write(data[19]);
Serial.write(data[20]);//Ponto
Serial.write(data[21]);
Serial.write(data[22]);
Serial.write(data[23]);
Serial.write(data[24]);
Serial.write(data[25]);
Serial.println('\n');
Serial.print("Temp ");
Serial.write(data[6]);
Serial.write(data[7]);
Serial.write(data[8]);//Ponto
Serial.write(data[9]);
Serial.write(data[10]);
Serial.println('\n');
Serial.println('\n');

}
if ((data[18] == 'N') || (data[19] == 'o'))
{
Serial.println('\n');
Serial.print("Tube ");
Serial.write(data[18] = 'n');
Serial.write(data[19] = 'o');
Serial.write(data[20] = 't');//Ponto
Serial.write(data[21] = ' ');
Serial.write(data[22] = ' ');
Serial.write(data[23] = ' ');
Serial.write(data[24] = ' ');
Serial.write(data[25] = ' ');
Serial.println('\n');
Serial.print("Temp ");
Serial.write(data[6]);
Serial.write(data[7]);
Serial.write(data[8]);//Ponto
Serial.write(data[9]);
Serial.write(data[10]);
Serial.println('\n');
Serial.println('\n');

}

if ((data[18] == 'D') || (data[19] == 'e'))
{
Serial.println('\n');
Serial.println('\n');
Serial.print("Density ");
Serial.write(data[18] = 'o');
Serial.write(data[19] = 'u');
Serial.write(data[20] = 't');//Ponto
Serial.write(data[21] = ' ');
Serial.write(data[22] = 'r');
Serial.write(data[23] = 'a');
Serial.write(data[24] = 'n');
Serial.write(data[25] = 'g');
Serial.write(data[25] = 'e');
Serial.println('\n');
Serial.print("Temp ");
Serial.write(data[6]);
Serial.write(data[7]);
Serial.write(data[8]);//Ponto
Serial.write(data[9]);
Serial.write(data[10]);
Serial.println('\n');
Serial.println('\n');
}


}

}

Exibições: 535

Responder esta

Respostas a este tópico

Oi MA, boa noite,


escrevi este code para que você possa incorporar no seu code.


Ele pega os dados da matriz "buffer" que é onde acredito que você guarda os dados lidos do seu densímetro.


Depois ele separa cada digito do Hexa equivalente no buffer e joga a parte baixa em uma variável.


Depois ele agrupa os dígitos para montar os dados como deverão ser, e finamente os transforma em long e float.


Rui

Anexos

Olá Rui.

Agradeço imensamente a ajuda.

Vou montar o código com seu exemplo e ver o resultado.

Assim que conseguir, vou postar todo o programa.

Retorno em breve.

Obrigado.

Segue o pedaço do código que funcionou.
//-----------------------------------------------------------------------
//---------- Tratamento dos caracteres recebidos -----------------------
void splitString(char* data)
{
char* parameter;
parameter = strtok (data, " ,");
while (parameter != NULL) {
setLED(parameter);
parameter = strtok (NULL, " ,");
}

// Limpa os textos e o buffer serial
for (int x = 0; x < 27; x++)
{
buffer[x] = '\0';
}
Serial1.flush();
}
//-----------------------------------------------------------------------
//-------- Identificação dos pacotes que chegam pela serial ------------
void setLED(char* data) {
if ((data[0] == '@') && (data[13] == '!'))
{
if ((data[18] != 'N') && (data[19] != 'o') || (data[18] != 'D') && (data[19] != 'e'))// Caso o densímetro envie para a serial os
// caracteres 'N' e 'o' nas posições 18 ou 19 ou os caracteres 'D' e 'o' nas posições 18 ou 19
{
Den_Am = String(Val_20) + String(Val_21) + String(Val_22) + String(Val_23) + String(Val_24) + String(Val_25); // Concaterna strings
Densi = Den_Am.toInt(); // transforma strint]g em int
Densi = Densi / 1000000;
Temp_Ap = String(Val_05) + String(Val_06) + String(Val_08) + String(Val_09); // Concaterna strings
Temp_Full = Temp_Ap.toInt(); // transforma strint]g em int
Temp_Full = Temp_Full / 100;

if (Densi <= 1.31) {//Se a densidade for > 1.31 mostre:
Serial.println();
Serial.print("Temperatura ");
Serial.println(Temp_Full);
Serial.print("Densidade ");
Serial.println(Densi, 6);
Serial.println();
}
}
if ((data[18] == 'N') || (data[19] == 'o'))// Caso o densímetro envie para a serial os caracteres 'N' ou 'o' nas posições 18 ou 19
{

Temp_Ap = String(Val_05) + String(Val_06) + String(Val_08) + String(Val_09); // Concaterna strings
Temp_Full = Temp_Ap.toInt(); // transforma strint]g em int
Temp_Full = Temp_Full / 100;
Serial.println();
Serial.print("Temperatura ");
Serial.println(Temp_Full);
Den_Am = String(Val_20) + String(Val_21) + String(Val_22) + String(Val_23) + String(Val_24) + String(Val_25); // Concaterna strings
Densi = Den_Am.toInt(); //Converte de String para inteiro
Serial.print("Tubo sem oscilar ");
Serial.println();
}

if ((data[18] == 'D') || (data[19] == 'e'))// Caso o densímetro envie para a serial os caracteres 'D' ou 'e' nas posições 18 ou 19
{
Temp_Ap = String(Val_05) + String(Val_06) + String(Val_08) + String(Val_09); // Concaterna strings
Temp_Full = Temp_Ap.toInt(); // transforma strint]g em int
Temp_Full = Temp_Full / 100;
Serial.println();
Serial.print("Temperatura ");
Serial.println(Temp_Full);
Densi = 0; // transforma strint]g em int
Densi = Densi / 1000000;
Serial.print("Densidade Fora do Range ");
Serial.println();
}
// Variavel float para guardar densidade e temperatura
Val_05 = data[6] & 0x0F; // Remove parte alta do byte buffer 6
Val_06 = data[7] & 0x0F; // Remove parte alta do byte buffer 7
Val_08 = data[9] & 0x0F; // Remove parte alta do byte buffer 9
Val_09 = data[10] & 0x0F; // Remove parte alta do byte buffer 10
Val_18 = data[18] & 0x0F; // Remove parte alta do byte buffer 18
Val_19 = data[19] & 0x0F; // Remove parte alta do byte buffer 19
Val_20 = data[20] & 0x0F; // Remove parte alta do byte buffer 20
Val_21 = data[21] & 0x0F; // Remove parte alta do byte buffer 21
Val_22 = data[22] & 0x0F; // Remove parte alta do byte buffer 22
Val_23 = data[23] & 0x0F; // Remove parte alta do byte buffer 23
Val_24 = data[24] & 0x0F; // Remove parte alta do byte buffer 24
Val_25 = data[25] & 0x0F; // Remove parte alta do byte buffer 25
Val_26 = data[26] & 0x0F; // Remove parte alta do byte buffer 26
}

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço