使用单片机在图形点阵LCD上绘制波形图
使用单片机在图形点阵LCD上绘制波形图
需求:
假如有一组浮点数据,是通过AD转换得到的,保存在数组MyArray[]中,采集点数为len,采集周期为T,现在想用单片机在LCD上绘制出这组数据对应的波形图,该如何实现呢?
在图形点阵LCD上制波形图,主要是为了提高采集数据的可视化效果,其次是为了提升产品的竞争力。我的理解就是为了好看。
一、绘图原理
1、定义波形图的显示区域
在绘图之前,我们需要先规划好显示区域。在12864的点阵屏中,X轴坐标为0~127,Y轴坐标为0~63,因此,我们定义波形图的显示参数如下:
#define Picture_Xmin 10 //波形图在LCD中的最小x坐标
#define Picture_Ymin 25 //波形图在LCD中的最小y坐标
#define Picture_Xpp 108 //波形图在LCD中的最大长度
#define Picture_Ypp 35 //波形图在LCD中的最大高度
#define Picture_Xmax (Picture_Xmin+Picture_Xpp) //波形图在LCD中的最大x坐标
#define Picture_Ymax (Picture_Ymin+Picture_Ypp) //波形图在LCD中的最大y坐标
注意:Picture_Xmax<128, Picture_Ymax<64
2、求数组MyArray[]中的最大值,最小值和峰峰值
采集数据的最大峰峰值数据,在绘图时,落在波形图的最大高度处,纵坐标反而是最小的。因此,我们采用最大值和采集点数据减法计算,得到其纵坐标。这样,就可以绘制曲线图了。
float MaxValue; //用来保存MyArray[]中的最大值
float MinValue; //用来保存MyArray[]中的最小值
float APPValue; //用来保存MyArray[]中的最大峰峰值
//函数功能:计算“最大值,最小值和峰峰值”
void Calculate_MaxValue_MinValue_ And_APPValue (float *s,u16 len)
{
u16 i;
float f;
MaxValue = s[0]; //默认最大值为第1点
MinValue = s[0]; //默认最小值为第1点
for(i=0;i<len;i++)
{
f=s[i];
if( MaxValue < f ) MaxValue= f;//保存最大值
if( MinValue > f ) MinValue= f;//保存最小值
}
APPValue = MaxValue - MinValue;//求最大峰峰值
}
3、画图
void DrawPicture (float *s,u16 len)
{
u16 i;
s16 x0;
s16 y0;
s16 x1;
s16 y1;
float f;
for(i=1;i<len;i++)//绘制曲线图
{
f=i-1; f=f*Picture_Xpp; f=f/len; x0=f;
f=MaxValue-s[i-1]; f=f*Picture_Ypp; f=f/APPValue; y0=f;
f=i; f=f*Picture_Xpp; f=f/len; x1=f;
f=MaxValue-s[i]; f=f*Picture_Ypp; f=f/APPValue; y1=f;
x0=x0+Picture_Xmin;
x1=x1+Picture_Xmin;
y0=y0+Picture_Ymin;
y1=y1+Picture_Ymin;
if(x1<Picture_Xmin) x1=Picture_Xmin;
if(x1>Picture_Xmax) x1=Picture_Xmax;
if(y1<Picture_Ymin) y1=Picture_Ymin;
if(y1>Picture_Ymax) y1=Picture_Ymax;
LCD12864_Draw_Line(x0,y0,x1,y1);//连接两点
delay_ms(10);
IWDG_ReloadCounter(); //喂狗
}
}
4、测试数据
float zgg[500]={\
0.015,0.017,0.015,0.013,0.015,0.017,0.012,0.010,0.016,0.005,\
0.010,0.008,0.011,0.007,0.010,0.010,0.012,0.009,0.014,0.010,\
0.010,0.011,0.004,0.018,0.010,0.011,0.012,0.017,0.007,0.011,\
0.011,0.011,0.019,0.013,0.015,0.010,0.006,0.015,0.012,0.008,\
0.009,0.014,0.008,0.011,0.011,0.012,0.012,0.011,0.009,0.009,\
0.008,0.011,0.009,0.016,0.013,0.009,0.017,0.011,0.009,0.016,\
0.016,0.018,0.350,1.455,1.846,1.301,0.915,3.114,2.057,2.492,\
2.492,1.810,2.786,2.759,4.029,3.502,4.158,5.301,4.977,4.885,\
5.187,5.089,7.498,6.864,5.561,5.556,5.785,5.099,5.084,6.788,\
6.813,5.818,7.310,6.542,6.588,7.890,8.497,9.550,7.780,8.992,\
7.991,6.775,7.861,6.070,7.436,7.526,7.428,7.831,8.010,9.033,\
7.712,8.285,10.741,7.642,8.600,8.875,7.750,8.004,8.427,8.585,\
7.681,8.896,9.189,9.090,10.693,10.375,9.289,12.039,10.143,9.360,\
9.090,9.897,9.763,8.382,10.486,10.310,8.447,8.390,10.005,8.476,\
7.379,7.649,6.994,5.216,7.270,6.369,5.622,6.346,5.542,6.544,\
6.661,6.028,6.296,6.355,5.758,4.138,4.123,4.447,2.778,3.776,\
4.231,2.986,3.303,2.086,3.364,3.159,2.510,2.722,2.905,3.149,\
2.334,2.342,4.827,2.402,2.498,3.293,2.702,2.400,0.975,2.333,\
2.484,2.320,1.738,1.826,2.401,1.606,1.907,4.055,2.452,2.557,\
3.185,4.060,3.783,2.288,3.517,3.073,3.835,3.548,3.397,3.621,\
3.277,4.059,6.163,4.788,5.490,5.926,4.776,5.832,5.375,5.931,\
5.641,6.116,6.494,5.810,6.589,6.170,5.996,7.143,6.010,7.020,\
6.084,7.609,7.766,6.424,8.962,7.657,7.651,8.441,8.822,8.056,\
8.056,9.544,10.316,8.953,11.235,9.466,9.439,11.076,9.861,10.979,\
11.175,11.397,11.229,11.782,12.640,11.227,11.199,15.345,12.014,13.559,\
12.358,13.194,13.410,13.420,15.032,14.768,15.588,16.330,15.671,16.423,\
16.384,15.650,17.480,19.635,17.554,17.906,18.879,20.133,18.643,19.774,\
19.774,20.218,20.108,21.673,20.306,19.601,17.923,18.702,19.537,17.518,\
17.518,17.309,15.661,17.110,16.761,16.466,18.900,18.883,19.926,19.239,\
19.339,18.480,20.742,17.802,18.132,18.887,17.559,15.768,16.246,17.168,\
16.190,15.683,15.908,16.724,15.345,15.535,17.338,16.310,15.740,19.018,\
19.018,15.470,16.562,16.356,15.073,16.106,15.629,13.992,14.893,13.934,\
13.934,13.543,13.498,15.776,13.819,13.940,13.533,14.011,14.911,12.808,\
14.547,13.968,13.734,12.015,12.165,12.483,10.434,9.705,11.537,9.156,\
10.918,10.678,9.082,9.774,9.481,10.021,8.808,8.753,9.036,9.195,\
7.963,6.926,7.067,8.801,5.732,6.574,6.389,5.748,5.210,4.475,\
3.889,4.680,3.835,3.285,3.593,3.524,1.565,1.988,4.024,0.016,\
0.015,2.159,0.017,0.016,0.123,0.020,0.014,0.016,0.013,0.015,\
0.015,0.013,0.012,0.013,0.006,0.008,0.010,0.011,0.015,0.009,\
0.012,0.009,0.010,0.009,0.012,0.014,0.010,0.013,0.010,0.011,\
0.012,0.008,0.015,0.012,0.009,0.013,0.018,0.007,0.008,0.012,\
0.009,0.005,0.016,0.014,0.015,0.011,0.009,0.016,0.013,0.011,\
0.006,0.011,0.016,0.003,0.008,0.009,0.016,0.001,0.012,0.014,\
0.007,0.018,0.010,0.013,0.005,0.017,0.016,0.014,0.012,0.906,\
1.162,1.221,2.657,1.665,1.798,1.308,1.938,1.553,2.034,2.732,\
3.292,2.987,3.215,5.045,4.450,4.327,5.036,5.694,6.738,5.664,\
5.955,5.343,5.202,5.067,5.883,5.216,5.913,5.819,6.587,6.393,\
6.486,7.045,8.264,7.951,7.846,7.259,7.427,6.607,7.599,6.556,\
6.556,7.572,7.113,5.954,7.276,9.913,7.580,8.802,11.101,8.764,\
8.764,8.794,7.993,7.160,8.247,8.147,7.197,7.849,9.611,8.391\
};
void Test_DrawPicture(void)
{
Calculate_MaxValue_MinValue_ And_APPValue(zgg,500);
DrawPicture(zgg,500);
}
5、测试结果:
若修改Picture_Ymin和Picture_Ypp,则可以放大曲线图。
对于128*64图形点阵LCD,需要注意:Picture_Xmax<128, Picture_Ymax<64

相关文章:
使用单片机在图形点阵LCD上绘制波形图
使用单片机在图形点阵LCD上绘制波形图 需求: 假如有一组浮点数据,是通过AD转换得到的,保存在数组MyArray[]中,采集点数为len,采集周期为T,现在想用单片机在LCD上绘制出这组数据对应的波形图,该…...
生信人写程序1. Perl语言模板及配置
生物信息领域常用语言 个人认为:是否能熟悉使用Shell(项目流程搭建)R(数据统计与可视化)Perl/Python/Java…(胶水语言,数据格式转换,软件间衔接)三门语言是一位合格生物信息工程师的标准。 生物信息常用语言非常广泛,我常用的有…...
【Android】Kotlin学习之数据容器 -- 集合
一. 定义 List : 是一个有序列表, 可通过下标访问元素. 元素可以在list中出现多次, 元素可重复 Set : 是元素唯一的集合, 一般来说Set中元素的顺序并不重要, 无序集合. Map : 是一组键值对, 键是唯一的, 每个键刚好映射到一个值, 值可以重复 二. 集合创建 三. 示例 mutabl…...
超详细 springboot 整合 Mock 进行单元测试!本文带你搞清楚!
文章目录 一、什么是Mock1、Mock定义2、为什么使用3、常用的Mock技术4、Mokito中文文档5、集成测试和单元测试区别 二、API1、Mockito的API2、ArgumentMatchers参数匹配3、OngoingStubbing返回操作 三、Mockito的使用1、添加Maven依赖2、InjectMocks、Mock使用3、SpringbootTes…...
国产操作系统下Chrome的命令行使用 _ 统信 _ 麒麟
原文链接:国产操作系统下Chrome的命令行使用 | 统信 | 麒麟 Hello,大家好啊!今天我们来聊聊如何在国产操作系统上使用命令行操作Google Chrome。无论是进行自动化测试、网页截图还是网页数据抓取,使用命令行操作Google Chrome都能…...
linux性能监控之slabtop
slabtop命令是以实时的方式显示内核slab缓冲区的细节信息,是linux自带的命令 [rootk8s-master ~]# slabtop --helpUsage:slabtop [options]Options:-d, --delay <secs> delay updates-o, --once only display once, then exit-s, --sort <char&…...
Allure 在 Python 中的安装与使用
Allure 是一个灵活轻量级的测试报告工具,它能够生成详细且富有洞察力的测试报告。在 Python 中,Allure 通常与 Pytest 结合使用,以提供更加丰富的测试结果展示。下面我将介绍关于如何在 Python 中使用 Allure 的详细操作。 一、环境准备 在…...
python实现动态时钟功能
欢迎关注我👆,收藏下次不迷路┗|`O′|┛ 嗷~~ 一.前言 时钟,也被称为钟表,是一种用于测量、记录时间的仪器。时钟通常由时针、分针、秒针等计时仪器组成,是现代社会不可或缺的一种计时工具。它的发明和使用极大地改变了人类的生活方式和时间观念。 时钟的类型有很多,…...
QueryPerformanceCounter实现高精度uS(微妙)延时
参考连接 C# 利用Kernel32的QueryPerformanceCounter封装的 高精度定时器Timer_kernel32.dll queryperformancecounter-CSDN博客https://blog.csdn.net/wuyuander/article/details/111831973 特此记录 anlog 2024年5月11日...
Logstash详解
Logstash详解:构建强大日志收集与处理管道的利器 一、引言 在大数据和云计算的时代,日志数据作为企业运营和故障排查的重要依据,其收集、处理和分析能力显得尤为重要。Logstash,作为一款强大的日志收集、处理和转发工具…...
QT设计模式:适配器模式
基本概念 适配器模式(Adapter Pattern)是一种结构型设计模式,允许将一个类的接口转换成客户端所期望的另一个接口,可以让原本由于接口不兼容而不能一起工作的类能够一起工作。 适配器模式需要实现的部分为: Target类…...
开发规范相关
1.对IDEA集成的代码检查 或 AliBaBa的代码检查 定义的规则进行取消或新增 代码自动扫描检查对于代码规范来说至关重要,但有时,我们希望忽略掉某些不必要的检查,比如忽略掉这个检查 可以如下操作 此时即可不再提示告警...
C++ 容器(五)——Set操作
一、Set容器定义 set 是一个有序关联容器,其中的元素按照升序排列,且不允许重复元素。 set 中的元素是唯一的,即任意两个元素不能相等。 1、set 可以用来对元素进行排序,因为它会自动对元素进行有序排列。 2、set 可以用来去重,当我们需要对一个容器中的元素进行去重操…...
【数字IC设计】芯片设计中的RDC
RDC问题定义 在芯片设计中,RDC是reset domain crossing 的缩写,类似于CDC(clock domain crossing),由于现在SOC芯片是有很多ECUs组成,为了使整个系统能够快速从复位中恢复, 用户希望SOC里面每个ECU模块都可以有自己独立的异步复位信号,这样可以在出问题的时候只复位有错…...
spark history server异常
现象:spark 日志文件突然新增了很多.hprof文件, 查找日志spark配置参数spark_log_dir进入日志目录: 查看historyServer日志: Spark Command: /usr/lib/jvm/java-1.8.0/bin/java -cp /opt/apps/JINDOSDK/jindosdk-current/lib/*:/…...
一个优秀 Maven 项目,各 Model 间最佳继承设计方案
1.单一职责原则 (Single Responsibility Principle): 每个模块应该专注于执行一个清晰且明确定义的功能,遵循单一职责原则,以降低模块的复杂性。 2.高内聚性 (High Cohesion): 模块内的组件和类应该紧密相关,共同实现模块的目标。高内聚性…...
MATLAB概述
文章目录 目录结构搜索路径高频命令clearclf/closeclc/homewho/whosformatsave/loadcd/pwdhelp/docsprintf/fprintf/disp tips MATLAB [1] 是美国 MathWorks公司出品的商业 数学软件,用于算法开发、数据可视化、数据分析以及 数值计算的高级技术计算语言和交互式…...
Redis5.0的Stream数据结构
Redis 5.0中引入的Stream数据结构是一种新的、持久化的、可查询的、可扩展的消息队列服务。它可以被视为一个日志或消息队列,由一个有序的、不断增长的日志序列来存储事件流数据。以下是关于Redis 5.0 Stream数据结构的详细解释: 一、Stream数据结构概述…...
避坑指南!RK3588香橙派yolov5生成RKNN模型!
地址1,转换模型 地址2,转换模型 地址3,解决ppa 下载k2 本文目录 一、将.pt模型转为onnx模型文件。(Windows)二、将.onnx模型转为.rknn模型文件。(Linux)三、将.rknn模型部署到开发板RK3588中…...
算法学习笔记(Nim游戏)
N i m Nim Nim游戏 n n n堆物品,每堆有 a i a_i ai个,每个玩家轮流取走任意一堆的任意个物品,但不能不取,取走最后一个物品的人获胜。 N i m Nim Nim游戏是一种经典的公平组合游戏。现在对它进行分析。 首先定义两个博弈中的状…...
使用VSCode开发Django指南
使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架,专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用,其中包含三个使用通用基本模板的页面。在此…...
Leetcode 3576. Transform Array to All Equal Elements
Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接:3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到…...
ServerTrust 并非唯一
NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...
在QWebEngineView上实现鼠标、触摸等事件捕获的解决方案
这个问题我看其他博主也写了,要么要会员、要么写的乱七八糟。这里我整理一下,把问题说清楚并且给出代码,拿去用就行,照着葫芦画瓢。 问题 在继承QWebEngineView后,重写mousePressEvent或event函数无法捕获鼠标按下事…...
IP如何挑?2025年海外专线IP如何购买?
你花了时间和预算买了IP,结果IP质量不佳,项目效率低下不说,还可能带来莫名的网络问题,是不是太闹心了?尤其是在面对海外专线IP时,到底怎么才能买到适合自己的呢?所以,挑IP绝对是个技…...
nnUNet V2修改网络——暴力替换网络为UNet++
更换前,要用nnUNet V2跑通所用数据集,证明nnUNet V2、数据集、运行环境等没有问题 阅读nnU-Net V2 的 U-Net结构,初步了解要修改的网络,知己知彼,修改起来才能游刃有余。 U-Net存在两个局限,一是网络的最佳深度因应用场景而异,这取决于任务的难度和可用于训练的标注数…...
C++_哈希表
本篇文章是对C学习的哈希表部分的学习分享 相信一定会对你有所帮助~ 那咱们废话不多说,直接开始吧! 一、基础概念 1. 哈希核心思想: 哈希函数的作用:通过此函数建立一个Key与存储位置之间的映射关系。理想目标:实现…...
C# winform教程(二)----checkbox
一、作用 提供一个用户选择或者不选的状态,这是一个可以多选的控件。 二、属性 其实功能大差不差,除了特殊的几个外,与button基本相同,所有说几个独有的 checkbox属性 名称内容含义appearance控件外观可以变成按钮形状checkali…...
【若依】框架项目部署笔记
参考【SpringBoot】【Vue】项目部署_no main manifest attribute, in springboot-0.0.1-sn-CSDN博客 多一个redis安装 准备工作: 压缩包下载:http://download.redis.io/releases 1. 上传压缩包,并进入压缩包所在目录,解压到目标…...
【PX4飞控】mavros gps相关话题分析,经纬度海拔获取方法,卫星数锁定状态获取方法
使用 ROS1-Noetic 和 mavros v1.20.1, 携带经纬度海拔的话题主要有三个: /mavros/global_position/raw/fix/mavros/gpsstatus/gps1/raw/mavros/global_position/global 查看 mavros 源码,来分析他们的发布过程。发现前两个话题都对应了同一…...
