基于Arduino Nano的DIY示波器
基于Arduino Nano的DIY示波器:打造属于你的口袋实验室
前言
在电子爱好者的世界里,示波器是不可或缺的工具之一。它能够帮助我们观察和分析各种电子信号的波形,从而更好地理解和调试电路。然而,市面上的示波器价格往往较高,对于一些初学者或预算有限的爱好者来说,可能是一个不小的负担。幸运的是,随着开源硬件和软件的发展,我们可以通过一些简单的组件和代码,自己动手制作一个功能强大的示波器。今天,我们将详细介绍如何使用Arduino Nano和SH1106 OLED显示屏,打造一个属于自己的DIY示波器。
项目简介
这个项目的目标是制作一个基于Arduino Nano的便携式示波器,它具备以下特点:
- 紧凑的设计:基于Arduino Nano的紧凑设计,便于携带和使用。
- OLED显示屏:使用SH1106 128x64 I2C OLED显示屏,实时显示波形。
- 功能丰富:支持垂直和水平缩放、频率和占空比计算、设置保存、触发极性检测以及波形冻结功能。
- 成本低廉:使用常见的电子元件,总成本远低于市售示波器。
- 开源代码:基于开源代码,易于修改和扩展。
硬件需求
制作这个DIY示波器,你需要准备以下硬件组件:
- Arduino Nano:作为核心控制器。
- SH1106 128x64 I2C OLED显示屏:用于显示波形和其他信息。
- 轻触按钮:4个,分别用于选择、向上、向下和保持功能。
- 电压分压电阻:用于调整输入信号的电压范围。
- 肖特基二极管:用于防止过电压。
- 电容:104型号,用于滤波。
- 面包板或自制PCB:用于组装电路。
- 跳线:用于连接各个组件。
- 电源: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设计包括以下部分:
- Arduino Nano插座:方便插入和更换Arduino Nano。
- OLED显示屏:预留空间和接口。
- 按钮:4个按钮的安装位置。
- 电压分压和衰减电路:集成在PCB上。
- 电源接口和去耦元件:确保电源稳定。
PCB布局
PCB的布局应尽量简洁,减少布线长度,提高信号质量。以下是PCB布局的建议:
- 将Arduino Nano插座和OLED显示屏放置在PCB的中心位置。
- 按钮分布在显示屏的周围,方便操作。
- 电源接口和去耦元件放置在靠近电源输入的位置。
软件设计
核心代码功能
示波器的核心功能由一个复杂的Arduino程序实现,以下是代码的主要功能:
- 波形采集:每屏刷新时采集200个样本。
- 频率分析:计算波形的频率和占空比。
- EEPROM存储:保存最后的设置,如电压量程、时间基准和触发极性。
- 用户界面:按钮用于循环选择设置,OLED显示屏实时显示数据。
- 触发检测:支持正负边沿触发模式。
- 电池电压模式:在启动时按下按钮,显示电池电压。
代码实现
以下是代码的关键部分:
#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) {// 实现波形绘制逻辑
}
代码上传
- 使用USB线将Arduino Nano连接到计算机。
- 在Arduino IDE中安装所需的库:
- Adafruit GFX
- Adafruit SH1106
- 打开代码文件,选择正确的开发板和COM端口。
- 点击“上传”按钮,将代码上传到Arduino Nano。
操作指南
按钮功能说明
- SELECT:循环切换控制选项(垂直量程 → 时间基准 → 触发)。
- UP/DOWN:调整当前选中的参数。
- HOLD:冻结或恢复波形显示。
- 自动保存:在最后一次按钮按下后的5秒内,设置将自动保存到EEPROM。
启动模式
在启动时,按下UP或DOWN按钮可以进入电压表模式,选择5V或50V量程。
应用场景
这个DIY示波器具有多种应用场景,包括:
- 信号可视化:观察各种电子信号的波形。
- 频率测量:测量信号的频率。
- 调试小型电子电路:帮助快速定位电路问题。
- 教育工具:用于学习波形分析和电子基础。
总结
通过这个项目,我们不仅能够制作一个功能强大的示波器,还能在这个过程中学习到硬件设计、固件开发和信号分析等多方面的知识。虽然这个DIY示波器在功能上可能无法与高端示波器相比,但它完全能够满足日常的电子实验和学习需求。更重要的是,这个项目激发了我们的创造力和动手能力,让我们在实践中不断学习和进步。
未来改进方向
虽然这个项目已经具备了基本的示波器功能,但仍有很大的改进空间。例如:
- 增加更多量程选项:目前只支持两种量程,可以增加更多量程以适应更广泛的信号范围。
- 提高采样率:通过优化代码和硬件,提高波形的采样率,从而获得更清晰的波形。
- 增加更多显示功能:如添加峰值检测、平均值计算等。
- 开发更高级的触发模式:如窗口触发、延迟触发等。
总之,这个基于Arduino Nano的DIY示波器项目是一个很好的起点,它不仅能够满足你的实际需求,还能激发你的创造力和探索精神。希望这篇文章能激发你的兴趣,让你也动手制作一个属于自己的示波器!
希望你喜欢这个项目,并在构建过程中找到乐趣!如果你有任何问题或需要帮助,欢迎在评论区交流。
作者:Svan.
注意:本博文为不得在未经本人同意进行转载或者二次创作,违者必究!!!
相关文章:

基于Arduino Nano的DIY示波器
基于Arduino Nano的DIY示波器:打造属于你的口袋实验室 前言 在电子爱好者的世界里,示波器是不可或缺的工具之一。它能够帮助我们观察和分析各种电子信号的波形,从而更好地理解和调试电路。然而,市面上的示波器价格往往较高&…...

渠道销售简历模板范文
模板信息 简历范文名称:渠道销售简历模板范文,所属行业:其他 | 职位,模板编号:KRZ3J3 专业的个人简历模板,逻辑清晰,排版简洁美观,让你的个人简历显得更专业,找到好工作…...

JAVA练习题(1) 卖飞机票
import java.util.Scanner; public class Main {public static void main(String[] args) {Scanner scnew Scanner(System.in);System.out.println("请输入飞机的票价:");int pricesc.nextInt();System.out.println("请输入月份:");…...

杆件的拉伸与压缩变形
杆件的拉伸与压缩 第一题 Q u e s t i o n \mathcal{Question} Question 图示拉杆沿斜截面 m − m m-m m−m由两部分胶合而成。设在胶合面上许用拉应力 [ σ ] 100 MPa [\sigma]100\text{MPa} [σ]100MPa,许用切应力 [ τ ] 50 MPa [\tau]50\text{MPa} [τ]50MP…...
深入解析Vue3中ref与reactive的区别及源码实现
深入解析Vue3中ref与reactive的区别及源码实现 前言 Vue3带来了全新的响应式系统,其中ref和reactive是最常用的两个API。本文将从基础使用、核心区别到源码实现,由浅入深地分析这两个API。 一、基础使用 1. ref import { ref } from vueconst count…...
Makefile中 链接库,同一个库的静态库与动态库都链接了,生效的是哪个库
Makefile中 链接库,同一个库的静态库与动态库都链接了,生效的是哪个库 在 Makefile 中同时链接同一个库的静态库(.a)和动态库(.so)时,具体哪个库生效取决于链接顺序和编译器行为。以下是详细分析…...

企业开发平台大变革:AI 代理 + 平台工程重构数字化转型路径
在企业数字化转型的浪潮中,开发平台正经历着前所未有的技术革命。从 AST(抽象语法树)到 AI 驱动的智能开发,从微服务架构到信创适配,这场变革不仅重塑了软件开发的底层逻辑,更催生了全新的生产力范式。本文…...

《汽车噪声控制》复习重点
题型 选择 填空 分析 计算 第一章 噪声定义 不需要的声音,妨碍正常工作、学习、生活,危害身体健康的声音,统称为噪声 噪声污染 与大气污染、水污染并称现代社会三大公害 声波基本概念 定义 媒质质点的机械振动由近及远传播&am…...

Linux——MySQL约束与查询
表的约束 真正约束字段的是数据类型,但是数据类型约束很单一,需要有一些额外的约束,更好的保证数据的合 法性,从业务逻辑角度保证数据的正确性。比如有一个字段是email,要求是唯一的。 表的约束是为了防止插入不合法的…...

Asp.Net Core IIS发布后PUT、DELETE请求错误405
一、方案1 1、IIS管理器,处理程序映射。 2、找到aspNetCore,双击。点击请求限制...按钮,并在谓词选项卡上,添加两者DELETE和PUT. 二、方案2 打开web.config文件,添加<remove name"WebDAVModule" />&…...

STL-to-ASCII-Generator 实用教程
参阅:STL-to-ASCII-Generator 使用教程 开源项目网址 下载 STL-to-ASCII-Generator-main.zip 解压到 D:\js\ index.html 如下 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta id"ascii&q…...
关于数据库查询速度优化
本人接手了一个关于项目没有任何文档信息的代码,代码也没有相关文档说明信息!所以在做数据库查询优化的时候不敢改动。 原因1: 老板需要我做一个首页的统计查询。明明才几十万条数据,而且我加了筛选条件为什么会这么慢ÿ…...
sql serve 多表联合查询,根据一个表字段值动态改变查询条件
在SQL Server中进行多表联合查询时,如果需要根据一个表的字段值动态改变查询条件,可以采用几种不同的方法来实现这一需求。这里介绍两种常用的方法:CASE表达式和动态SQL。 方法1: 使用 CASE 表达式 这种方法适合于查询条件可以在单个SQL语句…...

巡检机器人数据处理技术的创新与实践
摘要 随着科技的飞速发展,巡检机器人在各行业中逐渐取代人工巡检,展现出高效、精准、安全等显著优势。当前,巡检机器人已从单纯的数据采集阶段迈向对采集数据进行深度分析的新阶段。本文探讨了巡检机器人替代人工巡检的现状及优势,…...

国产linux系统(银河麒麟,统信uos)使用 PageOffice 在线打开Word文件,并用前端对话框实现填空填表
不管是政府机关、公司企业,还是金融行业、教育行业等单位,在办公过程中都经常需要填写各种文书和表格,比如通知、报告、登记表、计划表、申请表等。这些文书和表格往往是用Word文件制作的模板,比方说一个通知模板中经常会有“关于…...
Kubernetes应用发布方式完整流程指南
Kubernetes(K8s)作为容器编排领域的核心工具,其应用发布流程体现了自动化、弹性和可观测性的优势。本文将通过一个Tomcat应用的示例,详细讲解从配置编写到高级发布的完整流程,帮助开发者掌握Kubernetes应用部署的核心步…...
视频编解码学习8之视频历史
视频技术的发展历史可以追溯到19世纪,至今已跨越近200年。以下是视频技术发展的主要阶段和里程碑: 1. 早期探索阶段(19世纪-1920年代) 1832年:约瑟夫普拉托(Joseph Plateau)发明"费纳奇镜&…...

RabbitMQ-高级特性1
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言消息确认机制介绍手动确认方法代码前言代码编写消息确认机制的演示自动确认automanual 持久化介绍交换机持久化队列持久化消息持久化 持久化代码持久化代码演示…...

青藏高原东北部祁连山地区250m分辨率多年冻土空间分带指数图(2023)
时间分辨率:10年 < x < 100年空间分辨率:100m - 1km共享方式:开放获取数据大小:24.38 MB数据时间范围:近50年来元数据更新时间:2023-10-08 数据集摘要 多年冻土目前正在经历大规模的退化,…...

论文分享➲ arXiv2025 | TTRL: Test-Time Reinforcement Learning
TTRL: Test-Time Reinforcement Learning TTRL:测试时强化学习 https://github.com/PRIME-RL/TTRL 📖导读:本篇博客有🦥精读版、🐇速读版及🤔思考三部分;精读版是全文的翻译,篇幅较…...

【计算机网络-传输层】传输层协议-TCP核心机制与可靠性保障
📚 博主的专栏 🐧 Linux | 🖥️ C | 📊 数据结构 | 💡C 算法 | 🅒 C 语言 | 🌐 计算机网络 上篇文章:传输层协议-UDP 下篇文章: 网络层 我们的讲解顺序是&…...

项目管理从专家到小白
敏捷开发 Scrum 符合敏捷开发原则的一种典型且在全球使用最为广泛的框架。 三个角色 产品负责人Product Ower:专注于了解业务、客户和市场要求,然后相应地确定工程团队需要完成的工作的优先顺序。 敏捷教练Scrum Master:确保 Scrum 流程顺…...

InnoDB结构与表空间文件页的详解
目录 1.InnoDB的概览 表空间文件在哪里? 为什么要设计成内存结构和磁盘结构? 表空间与表空间文件关系? 用户数据如何在表空间文件存储? 2.页 如何设置页的大小? 页的结构及在表空间的位置? 页头包…...

世界无人机大会将至,大势智慧以“AI+实景三维”赋能低空经济
近日,“2025第九届世界无人机大会暨国际低空经济与无人系统博览会和第十届深圳国际无人机展览会”组委会召开新闻发布会,宣布本届大会主题为“步入低空经济新时代”,将于5月23-25日在深圳会展中心(福田)举行࿰…...

AI 驱动数据库交互技术路线详解:角色、提示词工程与输入输出分析
引言 在人工智能与数据库深度融合的趋势下,理解AI在数据库交互流程中的具体角色、提示词工程的运用以及各步骤的输入输出情况,对于把握这一先进技术路线至关重要。本文将对其展开详细剖析。 一、AI 在数据库交互流程中的角色 (一࿰…...
AI 助力,轻松进行双语学术论文翻译!
在科技日新月异的今天,学术交流中的语言障碍仍然是科研工作者面临的一大挑战。尤其是对于需要查阅大量外文文献的学生、科研人员和学者来说,如何高效地理解和翻译复杂的学术论文成为了一大难题。然而,由Byaidu团队推出的开源项目PDFMathTrans…...

stm32错误记录
1.使用LCD屏幕时,只用st-link时,亮度很暗,需要用usb数据线额外给屏幕供电; 2.移植freertos到f103c8t6芯片时,工程没有错误,但单片机没有反应; 需要将堆的大小改成10*1024; 3.在找已经…...
Baumer工业相机堡盟工业相机的工业视觉中为什么偏爱“黑白相机”
Baumer工业相机堡盟工业相机的工业视觉中为什么偏爱“黑白相机” Baumer工业相机为什么偏爱“黑白相机”?工业视觉中为什么倾向于多使用黑白相机黑白相机在工业视觉中的应用场景有哪些? Baumer工业相机 工业相机是常用与工业视觉领域的常用专业视觉…...
前端取经路——现代API探索:沙僧的通灵法术
大家好,我是老十三,一名前端开发工程师。在现代Web开发中,各种强大的API就像沙僧的通灵法术,让我们的应用具备了超乎想象的能力。本文将带你探索从离线应用到实时通信,从多线程处理到3D渲染的九大现代Web API,让你的应用获得"通灵"般的超能力。 在前端取经的第…...

一个电平转换电路导致MCU/FPGA通讯波形失真的原因分析
文章目录 前言一、问题描述二、原因分析三、 仿真分析四、 尝试的解决方案总结前言 一、问题描述 一个电平转换电路,800kHz的通讯速率上不去,波形失真,需要分析具体原因。输出波形如下,1码(占空比75%)低于5V,0码(占空比25%)低于4V。,严重失真。 电平转换电路很简单,M…...