Untitled
unknown
plain_text
a year ago
6.9 kB
13
Indexable
using System;
using System.IO.Ports;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace Gaficando_datos_de_arduino
{
public partial class Form1 : Form
{
private string StrBufferIn;
private int contador = 0; // Contador para las posiciones en el gráfico, empieza en 0
public Form1()
{
InitializeComponent();
}
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
if (SerialPort1.IsOpen)
{
SerialPort1.Close(); // Asegúrate de cerrar el puerto al salir
}
}
private void Form1_Load(object sender, EventArgs e)
{
// Verificar que la serie "DatosSerial" existe, si no, agregarla
if (ChartTemperatura.Series.IndexOf("DatosSerial") == -1)
{
ChartTemperatura.Series.Add("DatosSerial");
ChartTemperatura.Series["DatosSerial"].ChartType = System.Windows.Forms.DataVisualization.Charting.SeriesChartType.Line;
}
// Configurar los ejes de la gráfica
ChartTemperatura.ChartAreas[0].AxisX.Title = "Tiempo (s)";
ChartTemperatura.ChartAreas[0].AxisY.Title = "Temperatura (°C)";
ChartTemperatura.ChartAreas[0].AxisX.Minimum = 0;
// Asegurarse de que el evento Timer1.Tick está vinculado
Timer1.Tick += new EventHandler(Timer1_Tick);
Timer1.Interval = 1000; // Actualización cada segundo
Timer1.Enabled = true; // Habilitar el temporizador
}
private void Conectar_Click(object sender, EventArgs e)
{
if (Conectar.Text == "Conectar")
{
Conectar.Text = "Desconectar";
Conectar.BackColor = System.Drawing.Color.Red;
SerialPort1.PortName = ComboPuertos.Text; // Selecciona el puerto COM correcto
SerialPort1.BaudRate = 9600; // Asegúrate de que el baud rate coincida con el de Arduino
// Configurar y habilitar el temporizador
Timer1.Interval = 1000; // Intervalo de 1 segundo
Timer1.Enabled = true; // Habilitar el temporizador
SerialPort1.Open(); // Abrir el puerto serial
}
else
{
Conectar.BackColor = System.Drawing.Color.Green;
Conectar.Text = "Conectar";
SerialPort1.Close(); // Cerrar puerto serial
Timer1.Enabled = false; // Deshabilitar el temporizador
}
}
private void DeterminarConexion_Click(object sender, EventArgs e)
{
// Limpia los puertos existentes en el ComboBox
ComboPuertos.Items.Clear();
// Ejecutar la detección de puertos en un hilo separado para no bloquear la interfaz de usuario
Task.Run(() =>
{
// Obtener la lista de puertos disponibles
string[] puertosDisponibles = SerialPort.GetPortNames();
// Usar Invoke para actualizar la interfaz gráfica desde el hilo de la UI
this.Invoke(new Action(() =>
{
if (puertosDisponibles.Length > 0)
{
// Añadir los puertos disponibles al ComboBox
foreach (string puerto in puertosDisponibles)
{
ComboPuertos.Items.Add(puerto);
}
ComboPuertos.Text = ComboPuertos.Items[0].ToString(); // Seleccionar el primer puerto
Conectar.Enabled = true; // Habilitar el botón "Conectar"
Conectar.BackColor = System.Drawing.Color.Green; // Cambiar color del botón a verde
}
else
{
Conectar.Enabled = false; // Deshabilitar el botón "Conectar"
ComboPuertos.Text = "Sin opciones válidas";
}
}));
});
}
private void Timer1_Tick(object sender, EventArgs e)
{
try
{
if (SerialPort1.IsOpen && SerialPort1.BytesToRead > 0)
{
// Leer los datos desde el puerto serial
string StrBufferIn = SerialPort1.ReadLine().Trim();
double temperatura = 0;
// Verificar que los datos son de temperatura (empiezan con "T:")
if (StrBufferIn.StartsWith("T:"))
{
// Extraer el valor numérico después de "T:"
string value = StrBufferIn.Substring(2).Trim();
if (double.TryParse(value, out temperatura))
{
// Mostrar los datos recibidos en el TextBox1
TextBox1.Text = "Datos recibidos: " + StrBufferIn;
TextBox1.AppendText("\nTemperatura: " + temperatura + " °C");
// Agregar los datos de temperatura a la gráfica en la serie "DatosSerial"
ChartTemperatura.Series["DatosSerial"].Points.AddXY(contador, temperatura);
// Incrementar el contador para el tiempo
contador += 1;
// Ajustar el rango del eje X para mostrar solo los últimos 10 puntos
if (ChartTemperatura.Series["DatosSerial"].Points.Count > 10)
{
ChartTemperatura.ChartAreas[0].AxisX.Minimum = contador - 10;
ChartTemperatura.ChartAreas[0].AxisX.Maximum = contador;
}
else
{
// Si hay menos de 10 puntos, mostrar desde 0 hasta el contador actual
ChartTemperatura.ChartAreas[0].AxisX.Minimum = 0;
ChartTemperatura.ChartAreas[0].AxisX.Maximum = contador;
}
// Forzar actualización de la gráfica
ChartTemperatura.Invalidate(); // Redibujar la gráfica
ChartTemperatura.Update(); // Refrescar la gráfica inmediatamente
}
}
}
}
catch (Exception ex)
{
TextBox1.Text = "Error: " + ex.Message;
}
}
}
}Editor is loading...
Leave a Comment