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:
Comentar
Amigo, seu gráfico é ótimo, eu preciso de um desses apenas com uma modificação, o Eixo X (horizontal) precisaria mostrar a Hora:Minuto:Segundo no formato HH:MM:ss.
Como fazer esta alteração?
yure eu novamente estou com uma aplicação envolvendo um controle de temperatura , tenho uma maquete com 2 coolers e uma lampada , preciso controlar a lampada e os colers para ligarem e desligarem para controlar uma temperatura medida atraves de um lm35 , consigo ligar a lampada , os collers mas meu problema é na comunicação entre o microcontrolador e o pc , nao consigo ler a temperatura e tomar uma ação , de vez em quando trava. poderia me auxiliar?
Na rotina eu envio para o PIC e recebo depois de 500 ms , só que está travando a aplicação do visual
o código:
Poste o código se ainda não tiver resolvido.
Yure , hà a possibildiade de enviar e receber o arquivo no mesmo momento sem travar o programa , o meu está travando..
Bem-vindo a
Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)
© 2024 Criado por Marcelo Rodrigues. Ativado por
Você precisa ser um membro de Laboratorio de Garagem (arduino, eletrônica, robotica, hacking) para adicionar comentários!
Entrar em Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)