服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C# - 基于C#实现一个温湿度监测小工具

基于C#实现一个温湿度监测小工具

2023-02-28 14:04Vector_LI C#

这篇文章主要为大家详细介绍了如何基于C#实现一个温湿度监测小工具,文中的示例代码讲解详细,具有一定的借鉴价值,需要的可以参考一下

概述

这一章节,我们主要实现的功能是为软件增加实时显示曲线。

winform在4.x版本的时候,还有charts组建,到了5.0时代,没有了原生的charts组件

我这边选择第三方曲线包。ScottPlot

 

安装插件包

比较简单,已经提了很多次了。工具,nuget包管理。搜索scottplot,之后点击安装

注意安装的是scottplot.winform

基于C#实现一个温湿度监测小工具

 

修改界面,增加曲线显示

在表格下方,增加一个曲线。在工具栏中搜索plot

基于C#实现一个温湿度监测小工具

如果没有搜索到,可以重新启动一下vs修改完毕的界面如图

基于C#实现一个温湿度监测小工具

 

修改代码

增加曲线初始化

具体的曲线配置我们可以参考scottplot的demo,这里我直接给出code

本次窗口比较小,因此我禁止了x轴的显示

        /// <summary>
      /// 初始化曲线
      /// </summary>
      private void InitPlot()
      {
          //line
          formsPlot1.Plot.Style(Style.Seaborn);
          formsPlot1.Plot.Title("数据曲线");
          //不显示x轴
          formsPlot1.Plot.XAxis.Ticks(false);
          formsPlot1.Plot.XAxis.Line(false);
          formsPlot1.Plot.YAxis2.Line(false);
          formsPlot1.Plot.XAxis2.Line(false);
      }

增加曲线刷新

scottplot的刷新目前没有找到合适的办法

使用了比较笨的办法,就是先clear然后重新赋值

有什么好的办法,欢迎交流

        /// <summary>
      /// 刷新曲线
      /// </summary>
      private void RefreshLine(DataTable ThisData)
      {
          try
          {
              if (ThisData.Rows.Count < 1)
                  return;
              //清空
              formsPlot1.Plot.Clear();
              //温度
              string[] data = ThisData.AsEnumerable().Select(d => d.Field<string>("温度")).ToArray();
              double[] ys = Array.ConvertAll<string, double>(data, s => double.Parse(s));
              //湿度
              string[] data2 = ThisData.AsEnumerable().Select(d => d.Field<string>("湿度")).ToArray();
              double[] ys2 = Array.ConvertAll<string, double>(data2, s => double.Parse(s));
              formsPlot1.Plot.AddSignal(ys);
              formsPlot1.Plot.AddSignal(ys2);
              formsPlot1.Refresh();
          }
          catch (Exception ex)
          {
              MessageBox.Show(ex.Message + ex.StackTrace);
              MyLogger._.Error(ex.Message + "\r\n" + ex.StackTrace);
          }
      }

修改load函数,增加曲线初始化

        /// <summary>
      /// 界面加载函数
      /// </summary>
      /// <param name="sender"></param>
      /// <param name="e"></param>
      private void Form1_Load(object sender, EventArgs e)
      {
          MyLogger._.Debug("程序启动");
          //扫描串口
          string[] comlist = ComPort.V_ScanPort();
          if (comlist.Length < 1)
          {
              MessageBox.Show("没有扫描到串口,请检查硬件连接");
              return;
          }
          else 
          {
              foreach (string name in comlist)
              {
                  this.comboBox1.Items.Add(name);
              }
              //默认
              this.comboBox1.Text = comlist[0];
          }
          //波特率初始化
          this.comboBox2.Items.Add("4800");
          this.comboBox2.Items.Add("9600");
          this.comboBox2.Items.Add("115200");
          //默认
          this.comboBox2.Text = "9600";
          //默认地址
          this.textBox1.Text = "01";
          //默认背景色
          this.button1.BackColor = Color.LightGreen;
          //初始化数据
          InitDataTable();
          InitDataGrid();
          InitPlot();
      }

修改定时器函数,增加曲线实时刷新

 /// <summary>
      /// 定时器回调
      /// </summary>
      /// <param name="sender"></param>
      /// <param name="e"></param>
      private void timer1_Tick(object sender, EventArgs e)
      {
          if (Runport.IsOpen)
          {
              //获取地址
              byte addr = byte.Parse(this.textBox1.Text);
              string ret = THSensor.ReadTHDataFromSensor(Runport, addr);
              if (!string.IsNullOrEmpty(ret))
              {
                  string temp = ret.Split('&')[0];
                  string humi = ret.Split('&')[1];
                  //入库操作
                  DB_SerAPI.SaveTHData(temp, humi);
                  //刷新列表
                  string time = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
                  if (DataBuffer != null)
                  {
                      Index++;
                      DataRow row = DataBuffer.NewRow();
                      row["ID"] = Index.ToString();
                      row["时间"] = time;
                      row["温度"] = temp;
                      row["湿度"] = humi;
                      DataBuffer.Rows.Add(row);
                  }
                  //刷新曲线
                  RefreshLine(DataBuffer);
              }
              else
              {
                  MessageBox.Show("无数据,请检查配置参数");
              }
          }
      }

 

测试

基于C#实现一个温湿度监测小工具

到目前为止,我们做的功能都是基于一个固定不变的小窗口驱完成。

后续,我们为了给工具增加历史数据查询,报警设置等基本的功能。需要对界面进行重新的布局和设计。

下一节,我们将主要修改布局,是窗体可以自适应分辨率。

到此这篇关于基于C#实现一个温湿度监测小工具的文章就介绍到这了,更多相关C#温湿度监测工具内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://juejin.cn/post/7107895413297905677

延伸 · 阅读

精彩推荐
  • C#C#如何将Access中以时间段条件查询的数据添加到ListView中

    C#如何将Access中以时间段条件查询的数据添加到ListView中

    这篇文章主要介绍了C# 将Access中以时间段条件查询的数据添加到ListView中,需要的朋友可以参考下...

    东腾10342022-01-17
  • C#C# 通过ServiceStack 操作Redis

    C# 通过ServiceStack 操作Redis

    这篇文章主要介绍了C# 通过ServiceStack 操作Redis的示例,帮助大家更好的理解和学习使用c#,感兴趣的朋友可以了解下...

    明志德道8702022-11-07
  • C#C# byte转为有符号整数实例

    C# byte转为有符号整数实例

    这篇文章主要介绍了C# byte转为有符号整数实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    小鹰信息技术服务部3782022-10-14
  • C#c# 反射+自定义特性保存数据至本地

    c# 反射+自定义特性保存数据至本地

    这篇文章主要介绍了c# 反射+自定义特性保存数据至本地的方法,帮助大家更好的理解和使用c#,感兴趣的朋友可以了解下...

    ndtlyych9812022-10-24
  • C#C#如何给PPT中图表添加趋势线详解

    C#如何给PPT中图表添加趋势线详解

    趋势线是一条最为符合统计规律的回归线,方便我们提前了解数据如何变化的趋势,下面这篇文章主要给大家介绍了关于C#如何给PPT中图表添加趋势线的相关资...

    E-iceblue3372022-12-05
  • C#C#-WinForm跨线程修改UI界面的示例

    C#-WinForm跨线程修改UI界面的示例

    这篇文章主要介绍了C#-WinForm跨线程修改UI界面的示例,帮助大家更好的理解和使用c#,感兴趣的朋友可以了解下...

    UP技术控11592022-10-26
  • C#C#实现分页组件的方法

    C#实现分页组件的方法

    这篇文章主要为大家详细介绍了C#实现分页组件的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    风雪幻林6492022-01-20
  • C#C#生成带二维码的专属微信公众号推广海报实例代码

    C#生成带二维码的专属微信公众号推广海报实例代码

    这篇文章主要给大家介绍了关于利用C#如何生成带二维码的专属微信公众号推广海报的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工...

    指间人生8552022-03-06