Boas senhores, eu gostaria de monitorar via aplicativo feito em delphi valores de algumas variáveis que está no arduino..a comunicação é tranquila, inclusive já está feito isso, uso um componente chamado comport, daí ficou tranquilo.

eu usei no delphi um caption normal para exibir, más o valor fica muito estranho, a variável tem um valor fixo de 240, más no caption tem hora que aparece 0 ou 24 ou mesmo os 240

no arduino coloquei somente esta linha;

Serial.print(ConRegreReg, 1);

e no deplhi ficou assim

procedure TForm1.ComPort1RxChar(Sender: TObject; Count: Integer);
var
RxCount: Integer;
RxComport: String;
begin
RxCount:=comport1.InputCount;
comport1.ReadStr(RxComport,RxCount);
RecContador := RxComport;
Label3.Caption := RecContador + ' Seg.';
end;

alguém já fez alguma coisa do tipo ? vlw meu povo t+

Exibições: 726

As respostas para este tópico estão encerradas.

Respostas a este tópico

Provavelmente vc está enviando dados delimitados por CR+LF e essa rotina le apenas um pedaço aleatório dos dados sem respeitar delimitador algum.

Vc teria que acumular um pouco de dados e tirar deles trechos que são terminados em CR+LF.

Um jeito simples seria ir somando o que vem em uma strin e jogar essa string em um TMemo. aih vc vai ver que as linhas vão aparecendo embaixo.

Por ex sempre que tiver 2 linhas ou mais pegue a primeira para jogar no Label3 e delete essa linha.

Acho que nem precisa da string, vc pode ir somando na TMemo direto.

Esse é o jeito fácil.

O jeito bom seria vc ir somando em uma string e procurar pelo caracter #13. Quando achar tudo que estiver antes dele é um dado. Vc copia para outra variável e deleta da string. Se vier um caracter #10 vc ignora pq é o LF.

Se sua biblioteca tiver um comando direto para leitura delimitada (input em vez de read) quem sabe sai direto tb.

Serial.print(ConRegreReg, 1); desta forma os valores aparecem uma na frente do outro colado

Serial.println(ConRegreReg, 1);um debaixo do outro..

tem como usando o millis de 1 em 1 segundo envia os dados?, acho que ví algo parecido com o delay até acha..más o delay travaria meu sistema.

Gilmar, bom dia!

Porque você está colocando o segundo parâmetro "1" no Serial.print do código do Arduino?

Esse 1 vai indicar que você quer enviar um número com uma casa decimal depois da vírgula.

Mas esse número não é inteiro? Pelo menos no Delphi, você está esperando um inteiro.

O certo seria:

Serial.print(ConRegreReg);

Ou:

Serial.print(ConRegreReg, 0); // Zero casa decimais

Então, este material achei na net, e o código não está comentado, más de toda forma tirei o 1 e coloquei como sugestionou, e realmente não funcionou, ficou da mesma forma, eu preciso mandar outros dados e qualquer ajuda de como fazer isso seria bem vindo. valeu.

Bom dia Gilmar,

Para usar o millis() você precisa declarar uma variável global no inicio do programa do arduino do tipo uint32_t e depois você pode usar uma função if para comparar o valor de millis() com o valor que está salvo na variável. Ficaria assim:

uint3_t tempoDecorrido;

void setup ()

{ ...

}

void loop ()

{

//inserir esse trecho dentro da função loop do seu progrm do arduino

//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++

if (millis() - tempoDecorrido > 1000) {
tempoDecorrido = millis();  //Se passou mais de 1s zera o contador de tempo

Serial.print(ConRegreReg);

}

//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++

}

Dessa forma ele só enviará pela serial os dados a cda 1 segundo sem travar o programa.

Outra forma de usar o millis() é através da library "Timing".

Com ele você pode programar facilmente certas atividades para serem executadas em intervalos de tempo predefinidos. Internamente, ela usa o millis() para fazer isso.

Veja um exemplo aqui:

http://josecintra.com/blog/arduino-controlando-intervalos-tempo/

vlw más meu projeto está muito grande, estou evitando livrarias.o millis é uma boa opção.

uint3_t tempoDecorrido; isso esta certo ? deu erro justamente aqui.

resolví o millis na serial adicionei o 

if (millis() - tempoDecorrido > 1000) {
tempoDecorrido = millis(); //Se passou mais de 1s zera o contador de tempo
Serial.println(ConRegreReg);

e agora no serial print aparece assim

240

240

240

antes estava assim 240240240

más no delphi não aparece de forma adequada tem hora que aparelce 0 tem hora que nada ou tem hora que aparece 240

Atualização: agora está funcionando certinho, más apenas para uma varável, tenho umas 5 no minimo para monitorar, alguém sabe de alguma forma de faze-lo ?

 no delphi ficou assim:

procedure TForm1.ComPort1RxChar(Sender: TObject; Count: Integer);
var
buffer,conversao: AnsiString;
contador: integer;
valor: real;
temperatura:real;
begin
buffer:='';
Sleep(250);
contador:=comport1.InputCount;
comport1.ReadStr(buffer,contador);
conversao := StringReplace(buffer, '.', ',', []);
valor:=strtofloat(ansistring(conversao));
temperatura:=valor;
Label3.Caption := FloatToStr(temperatura);
end;

No arduino assim

if (millis() - tempoDecorrido > 1000) {
tempoDecorrido = millis(); //Se passou mais de 1s zera o contador de tempo
Serial.print(ConRegreReg, 1);
}

na verdade não entendi muito bem o código do delphi..principalmente nestes pontos.

comport1.ReadStr(buffer,contador);
conversao := StringReplace(buffer, '.', ',', []);
valor:=strtofloat(ansistring(conversao));

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço