DIY 迷你示波器:基于 Arduino Nano 与 OLED 显示屏的逐步教程
项目简介
本教程展示如何利用 Arduino Nano、0.96" SSD1306 OLED 屏幕和少量离散元件,自制一款袖珍数字示波器。虽然带宽和采样率有限,但足以观测音频信号、PWM 波形、传感器输出等低频信号,是极佳的电子入门实践项目。
核心组件清单
- Arduino Nano R3 × 1
- 0.96" SSD1306 OLED (128×64, I2C) × 1
- 1N4148 快速二极管 × 4(输入保护/钳位)
- 轻触开关 × 9(功能键:范围、时间基准、触发、暂停等)
- 电阻:100Ω、12kΩ、120kΩ、510kΩ(分压探头)
- 电容:104 (0.1µF) 陶瓷电容
- 面包板/万用板、跳线、USB 数据线
原理图与接线
参考项目附件原理图(schematics 文件夹)。关键点:
- 信号输入经分压网络(12k/120k/510k 组合)和二极管钳位至 A0,量程可切换 ±0.2V~±50V。
- OLED 接 I2C(A4=SDA, A5=SCL),复位脚悬空(-1)。
- 9 个按键分别接 D2~D10(D2 为外部中断 INT0,用于触发同步)。
- D13 控制板载 LED 指示采样状态。
固件功能特性
- 10 档垂直量程:Auto 5V / Auto 50V / 50V / 20V / 10V / 5V / 2V / 1V / 0.5V / 0.2V
- 8 档水平时基:50ms~200µs/div(实时采样 200 点)
- 触发模式:上升/下降沿触发,自动/正常/单次(简易实现)
- 波形冻结:HOLD 键暂停刷新
- 参数保存:关机自动保存设置至 EEPROM
- 屏幕显示:网格、刻度、电压/时间标尺、平均电压、触发同步状态
代码架构解析
关键数据结构
#define REC_LENGTH 200 // 单次采样点数
int waveBuff[REC_LENGTH]; // 波形缓冲区
volatile int vRange, hRange, trigD, scopeP; // 量程/时基/触发/光标模式
volatile boolean hold, paraChanged;
主循环流程
setConditions():按当前量程计算 ADC 阈值、分压系数。readWave():根据时基设置 ADC 预分频(ADCSRA)并精确delayMicroseconds()采样 200 点。dataAnalize():计算最值、平均值、自动量程边界、触发点搜索。writeCommonImage()/plotData()/dispInf():绘制网格、波形、标尺信息。display.display():刷新 OLED(约 37ms)。saveEEPROM():参数变更后延时写入。
采样率与时基对应表
| 时基档位 | 采样间隔 | ADCSRA 预分频 | 整帧耗时 |
|---|---|---|---|
| 50 ms/div | 1888 µs | 128 | ~400 ms |
| 20 ms/div | 688 µs | 128 | ~160 ms |
| 10 ms/div | 288 µs | 128 | ~80 ms |
| 5 ms/div | 88 µs | 128 | ~40 ms |
| 2 ms/div | 24 µs | 64 | ~16 ms |
| 1 ms/div | 12 µs | 16 | ~8 ms |
| 500 µs/div | 4 µs + nop×13 | 16 | ~4 ms |
| 200 µs/div | nop×31 | 4 | ~2 ms |
高速档位通过降低 ADC 预分频并插入 asm("nop") 实现亚微秒级定时,但会牺牲 ADC 精度(有效位数下降)。
按键映射与操作
| 引脚 | 功能 | 说明 |
|---|---|---|
| D2 (INT0) | 触发同步 | 下降沿中断,配合按键状态切换模式 |
| D8 | SELECT | 切换光标模式:垂直量程 ↔ 水平时基 ↔ 触发极性 |
| D9 | UP | 增加当前参数 |
| D10 | DOWN | 减少当前参数 |
| D11 | HOLD | 冻结/恢复波形刷新 |
| D12 | 10×/1× | 探头衰减切换(控制分压网络) |
性能指标与局限
- 最大实时采样率:约 500 kSa/s(200 µs/div 档),带宽 < 50 kHz。
- 垂直分辨率:10-bit ADC(内部 1.1V 基准),配合分压网络实现多量程。
- 输入阻抗:约 600kΩ(1×),6MΩ(10×)。
- 无隔离,**严禁直接测量市电或高压信号**,需配合隔离探头。
- 单通道,无存储深度扩展,波形更新率受限于 OLED 刷新(~20 fps)。
固件下载与烧录
- 安装库:
Adafruit_GFX、Adafruit_SSD1306(库管理器搜索安装)。 - 下载
_20190212_OLEDoscilloscope.ino,用 Arduino IDE 打开。 - 选择 Arduino Nano、正确端口,上传。
- 上电后显示启动画面,进入主界面即可使用。
参考资料与致谢
- 原版固件来源:RadioPench Blog
- 示波器原理:Wikipedia - Oscilloscope
制造工艺
- 自制家用作业书写机:Arduino + GRBL 控制的笔绘仪
- DIY Photoshop 硬件控制台:Arduino Nano RP2040 实现快捷键外设
- 用 Arduino 打造绚丽显示器 Ambilight 系统
- 自制可拳击的可编程键盘按钮:基于 Arduino 与压电元件的分步指南
- 用 Arduino 测量地球质量:DIY 分步指南
- 构建基于 PHP 的 Web 界面控制 Arduino Uno
- Arduino 合成乐音:从零实现 88 键钢琴全音域
- 基于 Arduino 和超声波传感器的自动门控制系统
- 手把手打造Arduino Nano喂食机器人
- 基于 Arduino Mega 与物联网传感器的高级家庭监控系统
- Arduino 实时数字罗盘:HMC5883L + Processing 可视化教程
- DIY 碳纤维制造:在家制作碳纤维零件的分步指南