给出一个基于arduino的oled简易示波器的代码,将上述界面修改为两个部分(右侧,左侧),右侧分两部分显示波形图和fft转换图,左侧显示幅值、中值、频率、和采样率,要求可以在串口监视器上修改数值,要求使用的函数都是arduino中的库函数,根据上述的fft转换方法给出代码

时间: 2024-04-21 07:22:31 浏览: 16
下面是一个基于 Arduino 的 OLED 简易示波器的代码,其中将界面分为两个部分(右侧和左侧),右侧显示波形图和 FFT 转换图,左侧显示幅值、中值、频率和采样率。你可以通过串口监视器来修改参数值。 ```c++ #include <Wire.h> #include <Adafruit_GFX.h> #include <Adafruit_SSD1306.h> #include "arduinoFFT.h" #define SCREEN_WIDTH 128 #define SCREEN_HEIGHT 64 #define OLED_RESET 4 Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET); arduinoFFT FFT = arduinoFFT(); const uint16_t samples = 64; const double signalFrequency = 1000; const double samplingFrequency = 5000; const uint8_t amplitude = 100; double vReal[samples]; double vImag[samples]; double fftMagnitudes[samples / 2]; void setup() { Serial.begin(115200); while (!Serial) ; display.begin(SSD1306_SWITCHCAPVCC, 0x3C); display.clearDisplay(); display.setTextColor(WHITE); display.setTextSize(1); } void loop() { if (Serial.available() > 0) { amplitude = Serial.parseInt(); Serial.print("Amplitude: "); Serial.println(amplitude); } double cycles = (((samples - 1) * signalFrequency) / samplingFrequency); for (uint16_t i = 0; i < samples; i++) { vReal[i] = int8_t((amplitude * (sin((i * (twoPi * cycles)) / samples))) / 2.0); vImag[i] = 0.0; } display.clearDisplay(); display.setCursor(0, 0); display.print("Amplitude: "); display.println(amplitude); display.print("Mean: "); display.println(mean(vReal, samples), 4); display.print("Frequency: "); display.println(signalFrequency); display.print("Sampling Rate: "); display.println(samplingFrequency); display.drawLine(64, 0, 64, SCREEN_HEIGHT, WHITE); // 分隔线 drawWaveform(); drawFFT(); display.display(); } void drawWaveform() { int offsetX = 66; int offsetY = 0; int waveWidth = SCREEN_WIDTH - offsetX; int waveHeight = SCREEN_HEIGHT / 2; double xScale = waveWidth / (samples - 1); double yScale = waveHeight / (amplitude * 2); for (int i = 0; i < samples - 1; i++) { int x1 = offsetX + i * xScale; int y1 = offsetY + waveHeight - (vReal[i] * yScale); int x2 = offsetX + (i + 1) * xScale; int y2 = offsetY + waveHeight - (vReal[i + 1] * yScale); display.drawLine(x1, y1, x2, y2, WHITE); } } void drawFFT() { int offsetX = 66; int offsetY = SCREEN_HEIGHT / 2; int fftWidth = SCREEN_WIDTH - offsetX; int fftHeight = SCREEN_HEIGHT / 2; FFT.Windowing(vReal, samples, FFT_WIN_TYP_HAMMING, FFT_FORWARD); FFT.Compute(vReal, vImag, samples, FFT_FORWARD); FFT.ComplexToMagnitude(vReal, vImag, samples); double xScale = fftWidth / (samples / 2); double yScale = fftHeight / (samples / 2); for (int i = 0; i < samples / 2 - 1; i++) { int x1 = offsetX + i * xScale; int y1 = offsetY + fftHeight - (fftMagnitudes[i] * yScale); int x2 = offsetX + (i + 1) * xScale; int y2 = offsetY + fftHeight - (fftMagnitudes[i + 1] * yScale); display.drawLine(x1, y1, x2, y2, WHITE); } } double mean(double *vData, uint16_t bufferSize) { double sum = 0.0; for (uint16_t i = 0; i < bufferSize; i++) { sum += vData[i]; } return sum / bufferSize; } ``` 在这个代码中,我们使用了 `Adafruit_SSD1306` 库来控制 OLED 显示屏,并使用了 `arduinoFFT` 库来进行 FFT 转换。 在 `setup()` 函数中,我们初始化 OLED 显示屏和串口。 在 `loop()` 函数中,我们首先检查是否有可用的串口输入。如果有输入,我们将其解析为振幅值,并将其打印到串口监视器中。 然后,我们生成波形数据并显示在左侧部分。波形数据通过 `drawWaveform()` 函数绘制在屏幕上。 接下来,我们进行 FFT 转换,并将转换结果绘制在右侧部分。FFT 转换结果通过 `drawFFT()` 函数绘制在屏幕上。 最后,我们在屏幕上显示幅值、中值、频率和采样率。 希望这个代码满足你的需求!如果你有其他问题,请随时提问。

相关推荐

最新推荐

recommend-type

基于Arduino的无人机飞行摇杆控制器设计

飞行摇杆控制无人机更具有真实感,有传统遥控器无法比拟的优点,且拥有较多的通道数。本文使用Arduino开发板设计了一套无人机飞行摇杆控制器,该控制器不需要电脑,成本低廉,携带方便,是理想的无人机控制平台。
recommend-type

一种基于Arduino的智能窗户模型.docx

一种智能窗户,包括窗户、窗帘、pm2.5感应传感器、风雨感应传感器、柔性太阳能薄膜、锂电池、控制模块,所述柔性太阳能薄膜附着在窗帘表面,接收阳光并转化为太阳能。所述窗户可以使用两套电源系统控制,日常为家用...
recommend-type

基于arduino红外线传感器循迹xiaoche

本次设计采用arduino公司的2560作为控制芯片,传感器模块采用八路红外线传感器实现,能够轻松识别黑白两色路面,同时具有抗环境干扰能力,电机模块由L298N芯片和两个直流电机构成,组成了智能车的动力系统,电源采用...
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

实现实时数据湖架构:Kafka与Hive集成

![实现实时数据湖架构:Kafka与Hive集成](https://img-blog.csdnimg.cn/img_convert/10eb2e6972b3b6086286fc64c0b3ee41.jpeg) # 1. 实时数据湖架构概述** 实时数据湖是一种现代数据管理架构,它允许企业以低延迟的方式收集、存储和处理大量数据。与传统数据仓库不同,实时数据湖不依赖于预先定义的模式,而是采用灵活的架构,可以处理各种数据类型和格式。这种架构为企业提供了以下优势: - **实时洞察:**实时数据湖允许企业访问最新的数据,从而做出更明智的决策。 - **数据民主化:**实时数据湖使各种利益相关者都可
recommend-type

SPDK_NVMF_DISCOVERY_NQN是什么 有什么作用

SPDK_NVMF_DISCOVERY_NQN 是 SPDK (Storage Performance Development Kit) 中用于查询 NVMf (Non-Volatile Memory express over Fabrics) 存储设备名称的协议。NVMf 是一种基于网络的存储协议,可用于连接远程非易失性内存存储器。 SPDK_NVMF_DISCOVERY_NQN 的作用是让存储应用程序能够通过 SPDK 查询 NVMf 存储设备的名称,以便能够访问这些存储设备。通过查询 NVMf 存储设备名称,存储应用程序可以获取必要的信息,例如存储设备的IP地址、端口号、名称等,以便能
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。
recommend-type

"互动学习:行动中的多样性与论文攻读经历"

多样性她- 事实上SCI NCES你的时间表ECOLEDO C Tora SC和NCESPOUR l’Ingén学习互动,互动学习以行动为中心的强化学习学会互动,互动学习,以行动为中心的强化学习计算机科学博士论文于2021年9月28日在Villeneuve d'Asq公开支持马修·瑟林评审团主席法布里斯·勒菲弗尔阿维尼翁大学教授论文指导奥利维尔·皮耶昆谷歌研究教授:智囊团论文联合主任菲利普·普雷教授,大学。里尔/CRISTAL/因里亚报告员奥利维耶·西格德索邦大学报告员卢多维奇·德诺耶教授,Facebook /索邦大学审查员越南圣迈IMT Atlantic高级讲师邀请弗洛里安·斯特鲁布博士,Deepmind对于那些及时看到自己错误的人...3谢谢你首先,我要感谢我的两位博士生导师Olivier和Philippe。奥利维尔,"站在巨人的肩膀上"这句话对你来说完全有意义了。从科学上讲,你知道在这篇论文的(许多)错误中,你是我可以依
recommend-type

实现实时监控告警系统:Kafka与Grafana整合

![实现实时监控告警系统:Kafka与Grafana整合](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9tbWJpei5xcGljLmNuL21tYml6X2pwZy9BVldpY3ladXVDbEZpY1pLWmw2bUVaWXFUcEdLT1VDdkxRSmQxZXB5R1lxaWNlUjA2c0hFek5Qc3FyRktudFF1VDMxQVl3QTRXV2lhSWFRMEFRc0I1cW1ZOGcvNjQw?x-oss-process=image/format,png) # 1.1 Kafka集群架构 Kafka集群由多个称为代理的服务器组成,这