C#的Chart控件实现温湿度实时曲线显示

C#的Chart控件实现温湿度实时曲线显示


1. Chart控件初始化配置

基础设置

// 清除默认系列
chart1.Series.Clear();

// 创建温度系列(红色曲线)
Series tempSeries = new Series("温度");
tempSeries.ChartType = SeriesChartType.FastLine; // 高性能折线
tempSeries.Color = Color.Red;
tempSeries.BorderWidth = 2;
chart1.Series.Add(tempSeries);

// 创建湿度系列(蓝色曲线)
Series humidSeries = new Series("湿度");
humidSeries.ChartType = SeriesChartType.FastLine;
humidSeries.Color = Color.Blue;
chart1.Series.Add(humidSeries);

// 坐标轴设置
chart1.ChartAreas[0].AxisX.Title = "时间";
chart1.ChartAreas[0].AxisY.Title = "数值";
chart1.ChartAreas[0].AxisX.IntervalType = DateTimeIntervalType.Seconds;
chart1.ChartAreas[0].AxisX.LabelStyle.Format = "HH:mm:ss"; // 时间格式

滚动显示优化

// 自动滚动时间轴(显示最近60秒)
chart1.ChartAreas[0].AxisX.ScaleView.Size = 60; 
chart1.ChartAreas[0].AxisX.ScrollBar.IsPositionedInside = true;
chart1.ChartAreas[0].AxisX.ScaleView.Scroll(DateTime.Now); // 初始定位到最新

2. 实时数据更新机制

定时器配置

System.Windows.Forms.Timer dataTimer = new System.Windows.Forms.Timer();
dataTimer.Interval = 1000; // 1秒更新一次
dataTimer.Tick += DataTimer_Tick;
dataTimer.Start();

数据更新逻辑

private void DataTimer_Tick(object sender, EventArgs e)
{
    // 1. 获取实时数据(此处用随机数模拟)
    double temp = new Random().Next(20, 35);    // 模拟温度值(20~35℃)
    double humidity = new Random().Next(30, 80); // 模拟湿度值(30~80%RH)
    
    // 2. 添加新数据点
    DateTime now = DateTime.Now;
    chart1.Series["温度"].Points.AddXY(now, temp);
    chart1.Series["湿度"].Points.AddXY(now, humidity);
    
    // 3. 限制数据量(保留最近100个点)
    foreach (Series series in chart1.Series)
    {
        if (series.Points.Count > 100)
            series.Points.RemoveAt(0);
    }
    
    // 4. 自动滚动时间轴
    chart1.ChartAreas[0].AxisX.ScaleView.Scroll(now);
}

3. 性能优化技巧

  1. 数据点数量控制

    保留固定数量数据点(如100个),避免内存无限增长:

    if (series.Points.Count > 100) series.Points.RemoveAt(0);
    
  2. 双缓冲技术

    减少绘图闪烁:

    chart1.GetType().GetProperty("DoubleBuffered")
         .SetValue(chart1, true, null);
    
  3. 批量更新模式

    关闭重绘直到更新完成:

    chart1.BeginInit();
    // 更新数据点...
    chart1.EndInit(); // 触发一次重绘
    
  4. 禁用非必要特效

    提升渲染速度:

    chart1.ChartAreas[0].AxisX.MajorGrid.Enabled = false; // 关闭网格线
    foreach (Series s in chart1.Series)
    {
        s.ShadowOffset = 0; // 禁用阴影
    }
    

参考代码 C#_温湿度实时曲线显示(chart控件) www.youwenfan.com/contentcne/101756.html

4. 扩展功能实现

数据源切换(真实传感器)

// 替换随机数为真实传感器读取(示例:串口读取)
private (double temp, double humid) ReadSensorData()
{
    using (SerialPort port = new SerialPort("COM3", 9600))
    {
        port.Open();
        string data = port.ReadLine(); // 格式 "25.5,60.2"
        string[] values = data.Split(',');
        return (double.Parse(values[0]), double.Parse(values[1]));
    }
}

报警阈值标记

// 温度超限时标记数据点(>30℃标红)
if (temp > 30)
{
    DataPoint point = chart1.Series["温度"].Points.Last();
    point.MarkerColor = Color.Red;
    point.MarkerSize = 8;
    point.MarkerStyle = MarkerStyle.Circle;
}

图表保存功能

// 保存当前图表为PNG
chart1.SaveImage("温湿度记录_" + DateTime.Now.ToString("yyyyMMdd_HHmmss") + ".png", ChartImageFormat.Png);

5. 完整代码结构

public partial class MainForm : Form
{
    public MainForm()
    {
        InitializeComponent();
        InitChart(); // 初始化图表
        InitTimer(); // 启动定时器
    }

    private void InitChart() { /* 图表配置代码 */ }
    
    private void InitTimer()
    {
        Timer timer = new Timer { Interval = 1000 };
        timer.Tick += (s, e) => {
            var (temp, humid) = ReadSensorData(); // 实际项目需替换为真实数据源
            UpdateChart(temp, humid);
        };
        timer.Start();
    }
    
    private void UpdateChart(double temp, double humid)
    {
        chart1.BeginInit();
        // 添加数据点并优化显示
        chart1.EndInit();
    }
}

实现高性能的温湿度实时曲线显示系统,适用于工业监控、实验室记录、智能家居等场景。

posted @ 2025-08-27 15:39  w199899899  阅读(301)  评论(0)    收藏  举报