Untitled

 avatar
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