基于Arduino Nano的DIY示波器

基于Arduino Nano的DIY示波器:打造属于你的口袋实验室

前言

在电子爱好者的世界里,示波器是不可或缺的工具之一。它能够帮助我们观察和分析各种电子信号的波形,从而更好地理解和调试电路。然而,市面上的示波器价格往往较高,对于一些初学者或预算有限的爱好者来说,可能是一个不小的负担。幸运的是,随着开源硬件和软件的发展,我们可以通过一些简单的组件和代码,自己动手制作一个功能强大的示波器。今天,我们将详细介绍如何使用Arduino Nano和SH1106 OLED显示屏,打造一个属于自己的DIY示波器。
在这里插入图片描述

项目简介

这个项目的目标是制作一个基于Arduino Nano的便携式示波器,它具备以下特点:

  • 紧凑的设计:基于Arduino Nano的紧凑设计,便于携带和使用。
  • OLED显示屏:使用SH1106 128x64 I2C OLED显示屏,实时显示波形。
  • 功能丰富:支持垂直和水平缩放、频率和占空比计算、设置保存、触发极性检测以及波形冻结功能。
  • 成本低廉:使用常见的电子元件,总成本远低于市售示波器。
  • 开源代码:基于开源代码,易于修改和扩展。

硬件需求

制作这个DIY示波器,你需要准备以下硬件组件:

  1. Arduino Nano:作为核心控制器。
  2. SH1106 128x64 I2C OLED显示屏:用于显示波形和其他信息。
  3. 轻触按钮:4个,分别用于选择、向上、向下和保持功能。
  4. 电压分压电阻:用于调整输入信号的电压范围。
  5. 肖特基二极管:用于防止过电压。
  6. 电容:104型号,用于滤波。
  7. 面包板或自制PCB:用于组装电路。
  8. 跳线:用于连接各个组件。
  9. 电源:5V稳压电源。

电路设计

电路图概述

在这里插入图片描述

整个电路的设计相对简单,主要分为以下几个部分:

  • 信号输入:通过电压分压电路和可选的衰减器,将信号输入到Arduino Nano的模拟输入引脚A0。
  • OLED显示屏连接:使用I2C接口,连接到Arduino Nano的A4(SDA)和A5(SCL)引脚。
  • 按钮连接:使用肖特基二极管将按钮信号合并,并连接到数字引脚D2,用于中断操作。
  • 保护电路:肖特基二极管用于防止过电压,电阻用于正确缩放输入电压。

详细电路图

以下是电路的详细连接方式:

  • 信号输入
    • 输入信号通过一个电压分压电路连接到A0引脚。
    • 为了保护Arduino Nano,使用一个肖特基二极管防止输入电压过高。
  • OLED显示屏
    • SDA引脚连接到A4。
    • SCL引脚连接到A5。
    • VCC和GND分别连接到电源和地。
  • 按钮
    • 4个按钮分别连接到D2引脚,每个按钮之间通过肖特基二极管隔离。
    • 按钮的另一端连接到地。
  • 电源
    • 使用5V稳压电源为整个电路供电。

PCB设计

在这里插入图片描述

为了使项目更加紧凑和美观,可以设计一个定制的PCB。PCB设计包括以下部分:

  1. Arduino Nano插座:方便插入和更换Arduino Nano。
  2. OLED显示屏:预留空间和接口。
  3. 按钮:4个按钮的安装位置。
  4. 电压分压和衰减电路:集成在PCB上。
  5. 电源接口和去耦元件:确保电源稳定。

PCB布局

PCB的布局应尽量简洁,减少布线长度,提高信号质量。以下是PCB布局的建议:

  • 将Arduino Nano插座和OLED显示屏放置在PCB的中心位置。
  • 按钮分布在显示屏的周围,方便操作。
  • 电源接口和去耦元件放置在靠近电源输入的位置。

软件设计

在这里插入图片描述

核心代码功能

示波器的核心功能由一个复杂的Arduino程序实现,以下是代码的主要功能:

  1. 波形采集:每屏刷新时采集200个样本。
  2. 频率分析:计算波形的频率和占空比。
  3. EEPROM存储:保存最后的设置,如电压量程、时间基准和触发极性。
  4. 用户界面:按钮用于循环选择设置,OLED显示屏实时显示数据。
  5. 触发检测:支持正负边沿触发模式。
  6. 电池电压模式:在启动时按下按钮,显示电池电压。

代码实现

以下是代码的关键部分:

#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SH1106.h>#define SCREEN_WIDTH 128 // OLED显示屏幕宽度,以像素为单位
#define SCREEN_HEIGHT 64 // OLED显示屏幕高度,以像素为单位// 定义OLED显示屏的复位引脚
#define OLED_RESET     -1
Adafruit_SH1106 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);// 定义按钮引脚
#define BUTTON_SELECT 2
#define BUTTON_UP 3
#define BUTTON_DOWN 4
#define BUTTON_HOLD 5// 其他变量定义
int sampleRate = 200; // 每屏采集样本数
float voltageScale = 1.0; // 电压量程
float timeBase = 1.0; // 时间基准
bool triggerPositive = true; // 触发极性void setup() {// 初始化OLED显示屏display.begin(SH1106_SWITCHCAPVCC, 0x3C);display.display();delay(2000); // 等待显示屏初始化display.clearDisplay();// 初始化按钮引脚pinMode(BUTTON_SELECT, INPUT_PULLUP);pinMode(BUTTON_UP, INPUT_PULLUP);pinMode(BUTTON_DOWN, INPUT_PULLUP);pinMode(BUTTON_HOLD, INPUT_PULLUP);// 从EEPROM读取最后的设置voltageScale = EEPROM.read(0);timeBase = EEPROM.read(1);triggerPositive = EEPROM.read(2);
}void loop() {// 检测按钮操作if (digitalRead(BUTTON_SELECT) == LOW) {// 切换设置选项}if (digitalRead(BUTTON_UP) == LOW) {// 调整当前选中的参数}if (digitalRead(BUTTON_DOWN) == LOW) {// 调整当前选中的参数}if (digitalRead(BUTTON_HOLD) == LOW) {// 冻结或恢复波形显示}// 采集波形数据int samples[sampleRate];for (int i = 0; i < sampleRate; i++) {samples[i] = analogRead(A0);}// 分析波形数据float frequency = calculateFrequency(samples);float dutyCycle = calculateDutyCycle(samples);// 显示波形和数据display.clearDisplay();drawWaveform(samples);display.setTextSize(1);display.setTextColor(SSD1306_WHITE);display.setCursor(0, 10);display.println("Frequency: " + String(frequency) + " Hz");display.println("Duty Cycle: " + String(dutyCycle) + " %");display.display();
}// 计算频率的函数
float calculateFrequency(int *samples) {// 实现频率计算逻辑
}// 计算占空比的函数
float calculateDutyCycle(int *samples) {// 实现占空比计算逻辑
}// 绘制波形的函数
void drawWaveform(int *samples) {// 实现波形绘制逻辑
}

代码上传

  1. 使用USB线将Arduino Nano连接到计算机。
  2. 在Arduino IDE中安装所需的库:
    • Adafruit GFX
    • Adafruit SH1106
  3. 打开代码文件,选择正确的开发板和COM端口。
  4. 点击“上传”按钮,将代码上传到Arduino Nano。

操作指南

按钮功能说明

在这里插入图片描述

  • SELECT:循环切换控制选项(垂直量程 → 时间基准 → 触发)。
  • UP/DOWN:调整当前选中的参数。
  • HOLD:冻结或恢复波形显示。
  • 自动保存:在最后一次按钮按下后的5秒内,设置将自动保存到EEPROM。

启动模式

在启动时,按下UP或DOWN按钮可以进入电压表模式,选择5V或50V量程。

应用场景

在这里插入图片描述

这个DIY示波器具有多种应用场景,包括:

  1. 信号可视化:观察各种电子信号的波形。
  2. 频率测量:测量信号的频率。
  3. 调试小型电子电路:帮助快速定位电路问题。
  4. 教育工具:用于学习波形分析和电子基础。

总结

通过这个项目,我们不仅能够制作一个功能强大的示波器,还能在这个过程中学习到硬件设计、固件开发和信号分析等多方面的知识。虽然这个DIY示波器在功能上可能无法与高端示波器相比,但它完全能够满足日常的电子实验和学习需求。更重要的是,这个项目激发了我们的创造力和动手能力,让我们在实践中不断学习和进步。

未来改进方向

虽然这个项目已经具备了基本的示波器功能,但仍有很大的改进空间。例如:

  • 增加更多量程选项:目前只支持两种量程,可以增加更多量程以适应更广泛的信号范围。
  • 提高采样率:通过优化代码和硬件,提高波形的采样率,从而获得更清晰的波形。
  • 增加更多显示功能:如添加峰值检测、平均值计算等。
  • 开发更高级的触发模式:如窗口触发、延迟触发等。

总之,这个基于Arduino Nano的DIY示波器项目是一个很好的起点,它不仅能够满足你的实际需求,还能激发你的创造力和探索精神。希望这篇文章能激发你的兴趣,让你也动手制作一个属于自己的示波器!


希望你喜欢这个项目,并在构建过程中找到乐趣!如果你有任何问题或需要帮助,欢迎在评论区交流。

作者:Svan.


注意:本博文为不得在未经本人同意进行转载或者二次创作,违者必究!!!

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

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

相关文章

LeetCode 解题思路 47(最长回文子串、最长公共子序列)

解题思路&#xff1a; dp 数组的含义&#xff1a; dp[i][j] 是否为回文子串。递推公式&#xff1a; dp[i][j] s.charAt(i) s.charAt(j) && dp[i 1][j - 1]。dp 数组初始化&#xff1a; 单字符 dp[i][i] true&#xff0c;双字符 dp[i][i 1] s.charAt(i) s.charA…

通过管道实现C++ Linux独立进程之间的通信和字符串传递

在Linux环境下&#xff0c;独立进程之间的通信&#xff08;IPC&#xff09;可以通过多种方式实现&#xff0c;包括管道、消息队列、共享内存和套接字。本文将详细介绍如何使用管道&#xff08;pipe&#xff09;在C中实现独立进程之间的通信&#xff0c;并传递字符串。 一、管道…

神经网络极简入门技术分享

1. 引言 神经网络是深度学习的基础&#xff0c;其设计灵感来源于人脑神经元的结构和工作方式。尽管现代神经网络已经变得异常复杂&#xff0c;但其核心原理却相对简单易懂。本报告旨在通过剖析神经网络的最基本单元——神经元&#xff0c;帮助初学者理解神经网络的工作原理。 …

五、Hadoop集群部署:从零搭建三节点Hadoop环境(保姆级教程)

作者&#xff1a;IvanCodes 日期&#xff1a;2025年5月7日 专栏&#xff1a;Hadoop教程 前言&#xff1a; 想玩转大数据&#xff0c;Hadoop集群是绕不开的一道坎。很多小伙伴一看到集群部署就头大&#xff0c;各种配置、各种坑。别慌&#xff01;这篇教程就是你的“救生圈”。 …

科研项目管理:4款高效工具推荐与效率提升实践

一般来说&#xff0c;科研项目往往涉及复杂的任务、跨部门协作以及严格的时间和预算限制。传统的管理方式&#xff0c;如电子表格或邮件沟通&#xff0c;难以应对多任务并行、资源分配复杂的需求。借助现代项目管理工具&#xff0c;研究人员能够优化工作流程、提升团队协作效率…

如何统一修改word中所有英文字母的字体格式

1.需求分析 我想让整篇论文中的所有英文字母格式都修改为Time New Roman格式。 2.直观操作流程 点击左上角开始 --> 点击替换 --> 点击更多 --> 点击特殊格式 --> 选择查找内容为任意字母(Y) --> 将光标点到替换内容 --> 点击格式 --> 点击字体 --> …

【疑难杂症2025-003】Java-mvn项目在gitlab-ci构建镜像时遇到的问题和解决方案

本文由Markdown语法编辑器编辑完成&#xff0e; 1.背景: 之前从同事手里接手了一个java的项目&#xff0c;是用maven构建项目的&#xff0e;由于我们的服务都是基于docker来部署的&#xff0c;因此这个java项目也是要编译成docker image然后发布&#xff0e;但是之前一直都是…

【RT-Thread Studio】nor flash配置Fal分区

前置条件&#xff1a;【RT-Thread Studio】W25Q128配置 添加 FAL软件包 配置SFUD驱动程序&#xff0c;使用FAL的设备为W25Q128 将fal_cfg.h和fal_flash_sfud_port.c提取出来&#xff0c;放到自己创建的fal_porting目录。 修改 fal_flash_sfud_port.c struct fal_flash_dev n…

Spring MVC 视图解析器 (ViewResolver) 如何配置? Spring Boot 是如何自动配置常见视图解析器的?

我们来详细分析一下视图解析器 (ViewResolver) 的配置以及 Spring Boot 是如何自动配置它们的。 视图解析器 (ViewResolver) 是什么&#xff1f; 在 Spring MVC 中&#xff0c;当控制器 (Controller) 方法处理完请求并返回一个逻辑视图名 (String) 时&#xff0c;DispatcherS…

理解网站导航文件:robots.txt、sitemap.xml与LLMs.txt的全面解析

在当今数字化时代&#xff0c;网站不仅需要为人类用户提供良好的浏览体验&#xff0c;还需要考虑搜索引擎和人工智能系统的可访问性。本文将深入探讨三种关键的网站导航文件&#xff1a;传统的robots.txt和sitemap.xml&#xff0c;以及新兴的LLMs.txt&#xff0c;分析它们的功能…

leetcode 349. Intersection of Two Arrays

题目描述 题目限制0 < nums1[i], nums2[i] < 1000&#xff0c;所以可以开辟一个1001个元素的数组来做哈希表。 class Solution { public:vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {vector<int> table(1001,0…

【软件工程】软件多缺陷定位方法总结

软件多缺陷定位(Multi-Fault Localization)是软件工程中的一个重要研究方向,旨在同时定位代码中存在的多个缺陷(Bug)。由于多个缺陷可能相互干扰(如掩盖错误行为),导致传统单缺陷定位方法效果下降,因此需要针对多缺陷场景的特殊性设计方法。以下是常见的多缺陷定位方法…

【数据结构入门训练DAY-30】数的划分

文章目录 前言一、题目二、解题思路结语 前言 本次训练内容 训练DFS。训练解题思维。 一、题目 将整数n分成k份&#xff0c;且每份不能为空&#xff0c;任意两份不能相同(不考虑顺序)。 例如&#xff1a;n7&#xff0c;k3&#xff0c;下面三种分法被认为是相同的。 {1&a…

OpenCV进阶操作:图像直方图、直方图均衡化

文章目录 一、图像直方图二、图像直方图的作用三、使用matplotlib方法绘制直方图2.使用opencv的方法绘制直方图&#xff08;划分16个小的子亮度区间&#xff09;3、绘制彩色图像的直方图 四、直方图均衡化1、绘制原图的直方图2、绘制经过直方图均衡化后的图片的直方图3、自适应…

Open CASCADE学习|Geom2d_BezierCurve 类

概述 Open CASCADE 提供了几何建模的强大工具集,其中 Geom2d_BezierCurve 类用于表示二维贝塞尔曲线。贝塞尔曲线在计算机图形学和计算机辅助设计(CAD)中具有广泛应用,本文将详细介绍 Geom2d_BezierCurve 类及其使用方法。 贝塞尔曲线简介 贝塞尔曲线是一种参数曲线,广泛…

muduo源码解析

1.对类进行禁止拷贝 class noncopyable {public:noncopyable(const noncopyable&) delete;void operator(const noncopyable&) delete;protected:noncopyable() default;~noncopyable() default; }; 2.日志 使用枚举定义日志等级 enum LogLevel{TRACE,DEBUG,IN…

互联网大厂Java面试实录:Spring Boot与微服务架构在电商场景中的应用解析

&#x1f4aa;&#x1f3fb; 1. Python基础专栏&#xff0c;基础知识一网打尽&#xff0c;9.9元买不了吃亏&#xff0c;买不了上当。 Python从入门到精通 &#x1f601; 2. 毕业设计专栏&#xff0c;毕业季咱们不慌忙&#xff0c;几百款毕业设计等你选。 ❤️ 3. Python爬虫专栏…

关于汇编语言与程序设计——单总线温度采集与显示的应用

一、实验要求 (1)握码管的使用方式 (2)掌握DS18B20温度传感器的工作原理 (3)掌握单总线通信方式实现 MCU与DS18B20数据传输 二、设计思路 1.整体思路 通过编写数码管显示程序和单总线温度采集程序&#xff0c;结合温度传感报警&#xff0c;利用手指触碰传感器&#xff0c;当…

用html+js+css实现的战略小游戏

效果图: 兄弟们&#xff0c;话不多说&#xff0c;直接上代码 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0">…

Navicat BI 数据分析功能上线 | 数据洞察新方法

Navicat 17.2 版本一经发布&#xff0c;便以 AI 助手赋能智能交互、Snowflake 支持拓展数据连接版图、拓展对关系型、维度以及数据仓库 2.0 建模方法的支持等新特性与功能抓住了用户的目光&#xff0c;但其中一项低调且实用的更新 - 在 BI 数据预览中深度集成数据分析工具&…