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+
Tags:
As respostas para este tópico estão encerradas.
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));
Bem-vindo a
Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)
© 2024 Criado por Marcelo Rodrigues. Ativado por