Depois de tanto tempo um tutorial sobre leitura, após muita pesquisa e uma força de um membro da comunidade este tutorial saiu.
Queria agradecer ao Marlon Tiedt que sugeriu a forma de leitura que será usada aqui, a forma mais simples e eficiente que encontrei até agora.
No tutorial de hoje além de ler a porta serial, vamos trabalhar com o controle Chart afim de plotar gráficos dos valores que forem chegando.
Hoje serão usados os seguintes controles:
O Chart só foi adicionado a partir do Visual Studio 2010, espero que tenham seguido a dica que dei no primeiro tutorial!
O programa do arduino é o exemplo Graph, aumentem o delay para mais de 50, para melhorar a visualização.
Chart pode ser encontrado em dados.
Redimensionem para que cubra todo o formulário.
Logo após ancorem o chart1 marcando todas as quatro barras na propriedade Anchor.
Isso fará com que ele seja redimensionado acompanhando o tamanho do formulário.
Retirem a legenda, pois achei desnecessário para este exemplo.
Na rotina de DataReceived é a que usaremos para ler a porta serial.
Nesta rotina temos que ler o buffer e atualizar o gráfico, então a rotina de vê ficar parecida com essa:
private void Porta_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
BeginInvoke(new Action(() =>
{
try
{
int limite = 50;//Número máximo de pontos que o gráfico pode ter.
string dados = Porta.ReadLine();//Pegue o que tem no buffer até um '\n'.
Text = dados;//Mostrar o valor na barra de titulo.
int num = Convert.ToInt16(dados);//Converta a string para int.
chart1.Series[0].Points.AddY(num);//Adiciona o valor lido como um novo Y;
//Se o gráfico tiver número de pontos maior que o limite...
if (chart1.Series[0].Points.Count > limite)
{
chart1.Series[0].Points.RemoveAt(0);//Remova o primeiro ponto.
chart1.Update();//Atualiza o grafico.
}
}
catch { }
}));
}
O funcionamento é simples, caso chegue algo pela serial (uma string do valor contendo '\n' no final) a rotina adiciona um ponto ao gráfico, com Y equivalente ao valor lido.
O variável limite esta relacionada ao limite de quantos pontos o gráfico mostrará, ao superar este limite o primeiro ponto do gráfico é apagado e este é atualizado.
BeginInvoque(new Action(()=>{//rotina...})); faz essa tarefa “paralelamente” ao fluxo(thread) principal do programa, pois caso fosse feito no principal o usuário perderia o controle sobre sua aplicação causando travamentos.
Apesar de ser orientado a eventos, um evento só pode ser atendido caso o programa esteja disponível para atendê-lo. Imaginem se chegassem dados tão rápido que não houvesse tempo nem mesmo de mover o aplicativo! Por isso fez o uso de outro seguimento que pode executar suas instruções “ao mesmo tempo” do seguimento principal.
Ao final, o resultado será parecido com esse:
Mudem o estilo do gráfico para Range, acessando a propriedade Series .
O aspecto mudou, parecendo uma função continua:
Para mudar a cor do gráfico escolham uma cor em PaletteCustonColors:
E depois mudem Palette para none
O resultado:
Assim conseguimos plotar gráficos com dados vindos do arduino, adaptem a suas necessidades. Até a próxima.
Código completo:
Tags:
Po cara , valeu , esperei ansiosamente por este tutorial , Parabéns !!
Parabéns pela iniciativa e pela qualidade do tuto!
Ola.
um help, please.
o programa esta funcionando 100%, porém esta travando quando escrevo o dado recebido em um richtext. Poderia me ajudar?
Obrigado.
Você esta escrevendo no richtext antes ou depois que o dado recebido foi tratado ? tenta escrever apos receber o dado e armazenar na String , leia o dado puro.
Também não estou conseguindo...está travando tudo.Também estou utilizando um richtext
OBRIGADUUUU!!!!
Bem-vindo a
Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)
© 2024 Criado por Marcelo Rodrigues. Ativado por