WPF实现曲线数据展示【案例:震动数据分析】

news2025/1/23 10:36:46

wpf实现曲线数据展示,函数曲线展示,实例:震动数据分析为例。

如上图所示,如果你想实现上图中的效果,请详细参考我的内容,创作不易,给个赞吧。

一共有两种方式来实现,一种是使用第三方的框架来实现,另外一种是自己通过原创代码来一步步实现,本文主要介绍这两种曲线的实现方式。 

1.首先我创建一个wpf的解决方案项目。

2.在NuGet中添加 DynamicDataDisplay 项目支持

为了展示我们的UI界面,我们还添加了一个第三方的样式框架 Panuon.UI.Silver

3.我们在MainWindow.xaml文件中添加如下代码

<d3:ChartPlotter x:Name="plotter">
            <d3:Header x:Name="HeaderTitle" Visibility="Visible" Content="这是曲线的标题" FontSize="14" HorizontalAlignment="Center" />
            <d3:VerticalAxisTitle Content="Value" FontSize="14" Visibility="Collapsed"/>
            <d3:HorizontalAxisTitle Content="时间" FontSize="14" Visibility="Collapsed"/>
        </d3:ChartPlotter>

4.接下来我们就开始实现后台代码部分

  • MainWindow.xaml
    <Window x:Class="WpfApp11.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:pu="clr-namespace:Panuon.UI.Silver;assembly=Panuon.UI.Silver"
            xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
            xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
            xmlns:local="clr-namespace:WpfApp11"
            xmlns:d3="http://research.microsoft.com/DynamicDataDisplay/1.0"
            mc:Ignorable="d"
            Title="MainWindow" Height="450" Width="800">
        <Grid>
    
            <StackPanel Panel.ZIndex="1" Margin="50,40,0,0" HorizontalAlignment="Left" VerticalAlignment="Top" Orientation="Vertical">
                <CheckBox x:Name="XCheckBox" IsChecked="True"
       pu:CheckBoxHelper.CheckBoxStyle="Standard" 
       pu:CheckBoxHelper.BoxHeight="20" 
       pu:CheckBoxHelper.BoxWidth="20" 
       pu:CheckBoxHelper.CornerRadius="15"
       pu:CheckBoxHelper.CheckedBackground="{Binding ColorX}">
                    <CheckBox.Content>
                        <DockPanel>
                            <TextBlock VerticalAlignment="Center" FontSize="14" FontWeight="Bold" Text="X:" Foreground="{Binding ColorX}"/>
                            <TextBlock x:Name="txtFhr1" Text="{Binding ValueX}" FontSize="32" FontWeight="Bold" Foreground="{Binding ColorX}"/>
                        </DockPanel>
                    </CheckBox.Content>
                </CheckBox>
                <CheckBox x:Name="YCheckBox" IsChecked="True" 
                  pu:CheckBoxHelper.CheckedBackground="{Binding ColorY}" pu:CheckBoxHelper.CheckBoxStyle="Standard" pu:CheckBoxHelper.BoxHeight="20" pu:CheckBoxHelper.BoxWidth="20" pu:CheckBoxHelper.CornerRadius="15">
                    <CheckBox.Content>
                        <DockPanel>
                            <TextBlock VerticalAlignment="Center" FontSize="14" FontWeight="Bold" Text="Y:" Foreground="{Binding ColorY}"/>
                            <TextBlock x:Name="txtFhr2" Text="{Binding ValueY}" FontSize="32" FontWeight="Bold" Foreground="{Binding ColorY}" />
                        </DockPanel>
                    </CheckBox.Content>
                </CheckBox>
                <CheckBox x:Name="ZCheckBox" IsChecked="True" 
                  pu:CheckBoxHelper.CheckedBackground="{Binding ColorZ}" pu:CheckBoxHelper.CheckBoxStyle="Standard" pu:CheckBoxHelper.BoxHeight="20" pu:CheckBoxHelper.BoxWidth="20" pu:CheckBoxHelper.CornerRadius="15">
                    <CheckBox.Content>
                        <DockPanel>
                            <TextBlock VerticalAlignment="Center" FontSize="14" FontWeight="Bold" Text="Z:" Foreground="{Binding ColorZ}"/>
                            <TextBlock x:Name="txtFhr3" Text="{Binding ValueZ}" FontSize="32" FontWeight="Bold" Foreground="{Binding ColorZ}"/>
                        </DockPanel>
                    </CheckBox.Content>
                </CheckBox>
    
                <TextBlock VerticalAlignment="Center" FontSize="14" Text="单位:1g≈9.80 m/s²" Margin="0,10"/>
            </StackPanel>
    
            <d3:ChartPlotter x:Name="plotter" MouseMove="Plotter_MouseMove" Panel.ZIndex="0">
                <d3:Header x:Name="HeaderTitle" Visibility="Visible" Content="这是曲线的标题" FontSize="14" HorizontalAlignment="Center" />
                <d3:VerticalAxisTitle Content="Value" FontSize="14" Visibility="Collapsed"/>
                <d3:HorizontalAxisTitle Content="时间" FontSize="14" Visibility="Collapsed"/>
            </d3:ChartPlotter>
            
        </Grid>
    </Window>
  • MainWindow.cs
    using Microsoft.Research.DynamicDataDisplay.DataSources;
    using Microsoft.Research.DynamicDataDisplay;
    using System;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Media;
    using System.Windows.Threading;
    using Microsoft.Research.DynamicDataDisplay.Charts;
    using System.Windows.Input;
    using Panuon.UI.Silver;
    
    namespace WpfApp11
    {
        /// <summary>
        /// MainWindow.xaml 的交互逻辑
        /// </summary>
        public partial class MainWindow : Window
        {
            private readonly DispatcherTimer dispatcherTimer = new DispatcherTimer();
            private readonly LineGraph lineGraphX = new LineGraph();
            private readonly LineGraph lineGraphY = new LineGraph();
            private readonly LineGraph lineGraphZ = new LineGraph();
            private readonly ObservableDataSource<Point> xPoint = new ObservableDataSource<Point>();
            private readonly ObservableDataSource<Point> yPoint = new ObservableDataSource<Point>();
            private readonly ObservableDataSource<Point> zPoint = new ObservableDataSource<Point>();
            private readonly FontView fontView = new FontView();
            public MainWindow()
            {
                InitializeComponent();
                lineGraphX = plotter.AddLineGraph(xPoint, Colors.Red, 1.2, "X"); //#FFFF0000
                lineGraphY = plotter.AddLineGraph(yPoint, Colors.Green, 1.2, "Y"); //FF008000
                lineGraphZ = plotter.AddLineGraph(zPoint, Colors.Blue, 1.2, "Z");//FF0000FF //LineLegendItem.xaml标签
                HorizontalDateTimeAxis horizontalAxis = new HorizontalDateTimeAxis();
                horizontalAxis.ShowMinorTicks = false;
                horizontalAxis.LabelProvider = new DateTimeAxisControl().LabelProvider;
                horizontalAxis.IsDefaultAxis = true;
                horizontalAxis.ShowMayorLabels = false;
    
                horizontalAxis.LabelProvider.SetCustomView((info, uiElement) =>
                {
                    (uiElement as TextBlock).Text = info.Tick.ToString("HH:mm:ss"); //时间轴日期格式
                });
                plotter.ContextMenu = PopulateContextMenu(plotter);
                plotter.HorizontalAxis.Remove(); //去除默认
                plotter.Children.Add(horizontalAxis); //加入新的
                Loaded += MainWindow_Loaded;
                this.XCheckBox.DataContext = fontView;
                this.YCheckBox.DataContext = fontView;
                this.ZCheckBox.DataContext = fontView;
                this.XCheckBox.Checked += XCheckBox_Checked;
                this.XCheckBox.Unchecked += XCheckBox_Checked;
    
                this.YCheckBox.Checked += YCheckBox_Checked;
                this.YCheckBox.Unchecked += YCheckBox_Checked;
    
                this.ZCheckBox.Checked += ZCheckBox_Checked;
                this.ZCheckBox.Unchecked += ZCheckBox_Checked;
            }
            #region CheckedEvent
            private void XCheckBox_Checked(object sender, RoutedEventArgs e)
            {
                CheckBox checkBox = sender as CheckBox;
                if (checkBox != null)
                {
                    if ((bool)checkBox.IsChecked)
                    {
                        fontView.ColorX = fontView.IsColorX;
                    }
                    else
                    {
                        fontView.ColorX = fontView.UnColor;
                    }
                }
    
    
                if (lineGraphX.Visibility == Visibility.Hidden)
                {
                    lineGraphX.Visibility = Visibility.Visible;
                }
                else
                {
                    lineGraphX.Visibility = Visibility.Hidden;
                }
    
            }
            private void YCheckBox_Checked(object sender, RoutedEventArgs e)
            {
                CheckBox checkBox = sender as CheckBox;
                if (checkBox != null)
                {
                    if ((bool)checkBox.IsChecked)
                    {
                        fontView.ColorY = fontView.IsColorY;
                    }
                    else
                    {
                        fontView.ColorY = fontView.UnColor;
                    }
                }
    
                if (lineGraphY.Visibility == Visibility.Hidden)
                {
                    lineGraphY.Visibility = Visibility.Visible;
                }
                else
                {
                    lineGraphY.Visibility = Visibility.Hidden;
                }
            }
            private void ZCheckBox_Checked(object sender, RoutedEventArgs e)
            {
                CheckBox checkBox = sender as CheckBox;
                if (checkBox != null)
                {
                    if ((bool)checkBox.IsChecked)
                    {
                        fontView.ColorZ = fontView.IsColorZ;
                    }
                    else
                    {
                        fontView.ColorZ = fontView.UnColor;
                    }
                }
    
                if (lineGraphZ.Visibility == Visibility.Hidden)
                {
                    lineGraphZ.Visibility = Visibility.Visible;
                }
                else
                {
                    lineGraphZ.Visibility = Visibility.Hidden;
                }
            }
            #endregion
            /// <summary>
            /// 重写右键菜单
            /// </summary>
            /// <param name="plotter"></param>
            /// <returns></returns>
            /// <exception cref="NotImplementedException"></exception>
            private ContextMenu PopulateContextMenu(IInputElement target)
            {
                ContextMenu result = new ContextMenu();
                StateIcon homeIcon = new StateIcon() { Icon = (char)Convert.ToInt32("f015", 16) + string.Empty };
                StateIcon saveIcon = new StateIcon() { Icon = (char)Convert.ToInt32("f2d2", 16) + string.Empty };
                StateIcon copyIcon = new StateIcon() { Icon = (char)Convert.ToInt32("f01a", 16) + string.Empty };
                StateIcon queryIcon = new StateIcon() { Icon = (char)Convert.ToInt32("f022", 16) + string.Empty };
                StateIcon logIcon = new StateIcon() { Icon = (char)Convert.ToInt32("f07c", 16) + string.Empty };
                MenuItem fitToViewMenuItem = new MenuItem
                {
                    Header = "主图",
                    ToolTip = "初始化显示,显示主图中心位置",
                    Icon = homeIcon,
                    Command = ChartCommands.FitToView,
                    CommandTarget = target
                };
    
                MenuItem savePictureMenuItem = new MenuItem
                {
                    Header = "保存",
                    ToolTip = "保存曲线图",
                    Icon = saveIcon,
                    Command = ChartCommands.SaveScreenshot,
                    CommandTarget = target
                };
    
                MenuItem copyPictureMenuItem = new MenuItem
                {
                    Header = "拷贝",
                    ToolTip = "拷贝,复制",
                    Icon = copyIcon,
                    Command = ChartCommands.CopyScreenshot,
                    CommandTarget = target
                };
                result.Items.Add(fitToViewMenuItem);
                result.Items.Add(copyPictureMenuItem);
                result.Items.Add(savePictureMenuItem);
                return result;
            }
    
            private void MainWindow_Loaded(object sender, RoutedEventArgs e)
            {
                dispatcherTimer.Interval = TimeSpan.FromMilliseconds(100);
                dispatcherTimer.Tick += (sender1, e1) => Timer_Tick(sender1, e1);
                dispatcherTimer.IsEnabled = true;
            }
    
            /// <summary>
            /// 定时器刷新界面数据
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            private void Timer_Tick(object sender, EventArgs e)
            {
                var axis = new HorizontalDateTimeAxis();
                DateTime dateTime = DateTime.Now;
                Random random = new Random();
                double a, b, c;
                do
                {
                    a = random.NextDouble() * 10;
                    b = random.NextDouble() * 10;
                    c = random.NextDouble() * 10;
                }
                while (a == b || b == c || a == c);
    
                Point x = new Point(axis.ConvertToDouble(dateTime), a);
                xPoint.AppendAsync(this.Dispatcher, x);
    
                Point y = new Point(axis.ConvertToDouble(dateTime), b);
                yPoint.AppendAsync(this.Dispatcher, y);
    
                Point z = new Point(axis.ConvertToDouble(dateTime), c);
                zPoint.AppendAsync(this.Dispatcher, z);
            }
    
            /// <summary>
            /// 鼠标选中时,X轴和Y轴的值
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            private void Plotter_MouseMove(object sender, MouseEventArgs e)
            {
                try
                {
                    DateTime dateTime = DateTime.Now;
                    var axis = new HorizontalDateTimeAxis();
                    axis.ConvertToDouble(dateTime);
    
                    ChartPlotter chart = sender as ChartPlotter;
                    Point point = e.GetPosition(this).ScreenToData(chart.Transform);
                    TimeSpan ts = TimeSpan.FromMilliseconds(Math.Floor(point.X * 1000000));
                    DateTime formattedDate = DateTime.MinValue.Add(ts);
                    this.HeaderTitle.Content = $"速度:{point.Y.ToString("N5")} 时间:{formattedDate:HH:mm:ss,fff}";
    
                    // 目标时间
                    DateTime targetTime = formattedDate;
                    //var select = this.Data.OrderBy(v => Math.Abs((v.DateTime - targetTime).TotalMilliseconds)).First();  // 获取与目标时间最接近的 Entity
    
                    // 显示选中 Entity
                    //this.SelectedEntity.Content = select.ToString();
                }
                catch (Exception)
                {
    
                }
            }
        }
    
    }
    
  • FontView.cs
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace WpfApp11
    {
        internal class FontView : INotifyPropertyChanged
        {
            /// <summary>
            /// 曲线颜色
            /// </summary>
            public string UnColor => "#DCDCDC";
            public string IsColorX => "#FFFF0000"; //"#009C26";
            public string IsColorY => "#FF008000"; //"#8080C0";
            public string IsColorZ => "#FF0000FF"; //"#000000";
            public FontView()
            {
                _colorX = this.IsColorX;
                _colorY = this.IsColorY;
                _colorZ = this.IsColorZ;
            }
            private string _colorX = string.Empty;
            private string _colorY = string.Empty;
            private string _colorZ = string.Empty;
            public string ColorX
            {
                get { return this._colorX; }
                set
                {
                    if (this._colorX != value)
                    {
                        this._colorX = value;
                        OnPropertyChanged(nameof(ColorX));
                    }
                }
            }
    
            public string ColorY
            {
                get { return this._colorY; }
                set
                {
                    if (this._colorY != value)
                    {
                        this._colorY = value;
                        OnPropertyChanged(nameof(ColorY));
                    }
                }
            }
    
            public string ColorZ
            {
                get { return this._colorZ; }
                set
                {
                    if (this._colorZ != value)
                    {
                        this._colorZ = value;
                        OnPropertyChanged(nameof(ColorZ));
                    }
                }
            }
    
            private string x = "0.000";
            private string y = "0.000";
            private string z = "0.000";
            public string ValueX
            {
                get { return this.x; }
                set
                {
                    if (this.x != value)
                    {
                        this.x = value;
                        OnPropertyChanged(nameof(ValueX));
                    }
                }
            }
            public string ValueY
            {
                get { return this.y; }
                set
                {
                    if (this.y != value)
                    {
                        this.y = value;
                        OnPropertyChanged(nameof(ValueY));
                    }
                }
            }
            public string ValueZ
            {
                get { return this.z; }
                set
                {
                    if (this.z != value)
                    {
                        this.z = value;
                        OnPropertyChanged(nameof(ValueZ));
                    }
                }
            }
    
    
            private string node = "000000";
            private string time = "00:00:00,000";
            public string Node
            {
                get { return this.node; }
                set
                {
                    if (this.node != value)
                    {
                        this.node = value;
                        OnPropertyChanged(nameof(Node));
                    }
                }
            }
    
            public string Time
            {
                get { return this.time; }
                set
                {
                    if (this.time != value)
                    {
                        this.time = value;
                        OnPropertyChanged(nameof(Time));
                    }
                }
            }
    
    
            public event PropertyChangedEventHandler PropertyChanged;
            protected virtual void OnPropertyChanged(string propertyName)
            {
                PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
            }
        }
    }
    

以上就是全部代码了 ,创作不易,如果对你有帮助,不如点个赞吧。

附录:

DynamicDataDisplay开源项目源代码:

【CSDN文库 - DynamicDataDisplay】 

【GitHub - DynamicDataDisplay】

参考网址:

【DynamicDataDisplay 实时曲线图的使用和沿轴移动的效果 - CSDN博客】

【WPF开发随笔收录-DrawingVisual绘制高性能曲线图 - 流浪g - 博客园】

【WPF中DynamicDataDisplay的使用总结 - 低音弦 - 博客园】

【WPF实时绘制心率曲线 - 源代码实现不使用框架 - 博客园】

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2263466.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[机器学习]AdaBoost(数学原理 + 例子解释 + 代码实战)

AdaBoost AdaBoost&#xff08;Adaptive Boosting&#xff09;是一种Boosting算法&#xff0c;它通过迭代地训练弱分类器并将它们组合成一个强分类器来提高分类性能。 AdaBoost算法的特点是它能够自适应地调整样本的权重&#xff0c;使那些被错误分类的样本在后续的训练中得到…

详细解读TISAX认证的意义

详细解读TISAX认证的意义&#xff0c;犹如揭开信息安全领域的一颗璀璨明珠&#xff0c;它不仅代表了企业在信息安全管理方面的卓越成就&#xff0c;更是通往全球汽车供应链信任桥梁的关键一环。TISAX&#xff0c;即“Trusted Information Security Assessment Exchange”&#…

黑马Redis数据结构学习笔记

Redis数据结构 动态字符串 Intset Dict ZipList QuickList SkipList 类似倍增 RedisObject 五种数据类型 String List Set ZSet Hash

sqlilabs靶场二十一关二十五关攻略

第二十一关 第一步 可以发现cookie是经过64位加密的 我们试试在这里注入 选择给他编码 发现可以成功注入 爆出表名 爆出字段 爆出数据 第二十二关 跟二十一关一模一样 闭合换成" 第二十三关 第二十三关重新回到get请求&#xff0c;会发现输入单引号报错&#xff0c…

Win10将WindowsTerminal设置默认终端并添加到右键(无法使用微软商店)

由于公司内网限制&#xff0c;无法通过微软商店安装 Windows Terminal&#xff0c;本指南提供手动安装和配置新版 Windows Terminal 的步骤&#xff0c;并添加右键菜单快捷方式。 1. 下载新版终端安装包: 访问 Windows Terminal 的 GitHub 发布页面&#xff1a;https://githu…

从地铁客流讲开来:十二城日常地铁客运量特征

随着城市化进程的加速和人口的不断增长&#xff0c;公共交通系统在现代都市生活中扮演着日益重要的角色。地铁作为高效、环保的城市交通方式&#xff0c;已经成为居民日常出行不可或缺的一部分。本文聚焦于2024年10月28日至12月1日期间&#xff0c;对包括北上广深这四个超一线城…

firefox浏览器如何安装驱动?

firefox的浏览器驱动:https://github.com/mozilla/geckodriver/releases 将geckodriver.exe所在文件路径追加到系统环境变量path的后面

2.2.3 进程通信举例

文章目录 PV操作实现互斥PV操作实现同步高级通信 PV操作实现互斥 PV操作实现互斥。先明确临界资源是什么&#xff0c;然后确定信号量的初值。实现互斥时&#xff0c;一般是执行P操作&#xff0c;进入临界区&#xff0c;出临界区执行V操作。 以统计车流量为例。临界资源是记录统…

UE5 移植Editor或Developer模块到Runtime

要将源码中的非运行时模块移植到Runtime下使用,个人理解就是一个解决编译报错的过程,先将目标模块复制到项目的source目录内,然后修改模块文件夹名称,修改模块.build.cs与文件夹名称保持一致 修改build.cs内的类名 ,每个模块都要修改 // Copyright Epic Games, Inc. All …

Qt WORD/PDF(三)使用 QAxObject 对 Word 替换(QML)

关于QT Widget 其它文章请点击这里: QT Widget 国际站点 GitHub: https://github.com/chenchuhan 国内站点 Gitee : https://gitee.com/chuck_chee 姊妹篇: Qt WORD/PDF&#xff08;一&#xff09;使用 QtPdfium库实现 PDF 操作 Qt WORD/PDF&#xff08;二…

RAG基础知识及综述学习

RAG基础知识及综述学习 前言1.RAG 模块1.1 检索器&#xff08;Retriever&#xff09;1.2 检索融合&#xff08;Retrieval Fusion&#xff09;1.3 生成器&#xff08;Generator&#xff09; 2.构建检索器&#xff08;Retriever&#xff09;2.1 分块语料库2.2 编码文本块2.3 构建…

移动网络(2,3,4,5G)设备TCP通讯调试方法

背景&#xff1a; 当设备是移动网络设备连接云平台的时候&#xff0c;如果服务器没有收到网络数据&#xff0c;移动物联设备发送不知道有没有有丢失数据的时候&#xff0c;需要一个抓取设备出来的数据和服务器下发的数据的方法。 1.服务器系统是很成熟的&#xff0c;一般是linu…

深入剖析MyBatis的架构原理

架构设计 简要画出 MyBatis 的架构图 >> ​​ Mybatis 的功能架构分为哪三层&#xff1f; API 接口层 提供给外部使用的接口 API&#xff0c;开发人员通过这些本地 API 来操纵数据库。接口层一接收到调用请求就会调用数据处理层来完成具体的数据处理。MyBatis 和数据库的…

android opencv导入进行编译

1、直接新建module进行导入&#xff0c;选择opencv的sdk 导入module模式&#xff0c;选择下载好的sdk&#xff0c;修改module name为OpenCV490。 有报错直接解决报错&#xff0c;没报错直接运行成功。 2、解决错误&#xff0c;同步成功 一般报错是gradle版本问题较多。我的报…

智能座舱进阶-应用框架层-Jetpack主要组件

Jetpack的分类 1. DataBinding&#xff1a;以声明方式将可观察数据绑定到界面元素&#xff0c;通常和ViewModel配合使用。 2. Lifecycle&#xff1a;用于管理Activity和Fragment的生命周期&#xff0c;可帮助开发者生成更易于维护的轻量级代码。 3. LiveData: 在底层数据库更…

设计模式-访问者设计模式

介绍 访问者模式&#xff08;Visitor&#xff09;&#xff0c;表示一个作用于某对象结构中的各元素的操作&#xff0c;它使你可以在不改变个元素的类的前提下定义作用于这些元素的新操作。 问题&#xff1a;在一个机构里面有两种员工&#xff0c;1.Teacher 2.Engineer 员…

springmvc的拦截器,全局异常处理和文件上传

拦截器: 拦截不符合规则的&#xff0c;放行符合规则的。 等价于过滤器。 拦截器只拦截controller层API接口。 如何定义拦截器。 定义一个类并实现拦截器接口 public class MyInterceptor implements HandlerInterceptor {public boolean preHandle(HttpServletRequest reque…

宿舍管理系统(源码+数据库+报告)

356基于SpringBoot的宿舍管理系统&#xff0c;系统包含两种角色&#xff1a;管理员、用户,系统分为前台和后台两大模块 二、项目技术 编程语言&#xff1a;Java 数据库&#xff1a;MySQL 项目管理工具&#xff1a;Maven 前端技术&#xff1a;Vue 后端技术&#xff1a;SpringBo…

基于 HC_SR04的超声波测距数码管显示(智能小车超声波避障部分)

超声波测距模块HC-SR04 1、产品特色 ①典型工作用电压&#xff1a;5V ②超小静态工作电流&#xff1a;小于 5mA ③感应角度(R3 电阻越大,增益越高,探测角度越大)&#xff1a; R3 电阻为 392,不大于 15 度 R3 电阻为 472, 不大于 30 度 ④探测距离(R3 电阻可调节增益,即调节探测…

(OCPP服务器)SteVe编译搭建全过程

注意&#xff1a;建议使用3.6.0&#xff0c;我升级到3.7.1&#xff0c;并没有多什么新功能&#xff0c;反而电表的实时数据只能看到累计电能了&#xff0c;我回退了就正常&#xff0c;数据库是兼容的&#xff0c;java版本换位java11&#xff0c;其他不变就好 背景&#xff1a;…