Untitled
unknown
plain_text
6 months ago
6.9 kB
11
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