用 Arduino Nano 和 Nokia 5110 LCD 自制 20kHz 示波器:简易 DIY 指南
组件与物料
| Arduino Nano R3 | ×1 |
| Nokia 5110 LCD 显示屏 (PCD8544) | ×1 |
| 10kΩ 电阻 | ×4 |
| 4.75kΩ 电阻 | ×1 |
| 330Ω 电阻 | ×1 |
| 轻触开关 (四个) | ×4 |
所需工具
- 电烙铁
- 无铅焊锡丝
应用与在线服务
- Arduino IDE
项目简介
本项目教你制作一个简单的 Arduino 示波器,最大显示频率 20 kHz,最大输入电压 5V (不加分压器时)。
示波器通过四个按键控制:
- HOLD 键:冻结当前波形
- 同步键:设置触发电平
- “+” 和 “-” 键:控制扫描速度、同步电平,并在 HOLD 模式下移动波形
Nokia 5110 屏幕上:垂直每格 1V,水平每格对应扫描分辨率,可选值:0.1、0.2、0.5、1.0、2.0、5.0、10.0、20.0、50.0 ms。扫描值在左上角显示。触发电平在屏幕左侧显示为小条,触发电压值在右上角显示。项目详情见 arduino.ru 页面。
器件极其简单,仅包含:
- Arduino Nano 单片机
- Nokia N5110 LCD 显示屏
- 四个按键
- 四个下拉电阻
- 输入插孔
- 电源开关和指示灯
已用正弦波和方波发生器测试。虽非专业仪器,但可用于教学或实验室测试低频信号,优点是制作简单、成本极低。
最终装入 PVC 盒子,表面贴自粘壁纸。
代码
Arduino 代码 (C/C++)
#include <Adafruit_GFX.h>
#include <Adafruit_PCD8544.h>
#include <SPI.h>
Adafruit_PCD8544 display = Adafruit_PCD8544(7, 6, 5, 4, 3); // CLK, DIN, DC, CE, RST
// VCC +3.3V, BL 通过 200Ω 接 3.3V
int izm, x, y, u, i2, zz, hold, h0, h1, h2, raz = 0, menu, sss = 512, u_dig;
unsigned int data[168];
unsigned long time, times;
float per;
byte i;
void setup() {
Serial.begin(9600);
display.begin();
display.clearDisplay();
display.display();
display.setContrast(40);
display.setTextSize(1);
display.setTextColor(BLACK);
pinMode(10, INPUT); // +
pinMode(11, INPUT); // -
pinMode(12, INPUT); // hold
pinMode(13, INPUT); // 同步
ADMUX = 0b01000000; // 10位 A0
ADCSRA = 0b11110010; // CLK/4
analogWrite(9, 127); // PWM 输出
}
void loop() {
// 按键控制
if (menu == 0) {
if (digitalRead(10) == HIGH) {
if (hold == 0) raz++;
if (hold == 1) i2++;
delay(100);
}
if (digitalRead(11) == HIGH) {
if (hold == 0) raz--;
if (hold == 1 && hold > 0) i2--;
delay(100);
}
}
if (digitalRead(12) == HIGH) { hold++; i2 = 0; delay(100); }
if (digitalRead(13) == HIGH) { menu++; delay(100); }
if (hold > 1) hold = 0;
if (menu > 1 || menu < 0) menu = 0;
if (raz <= 0) raz = 0;
if (raz > 8) raz = 8;
if (menu == 1) {
hold = 0;
if (digitalRead(10) == HIGH) { sss += 24; delay(100); }
if (digitalRead(11) == HIGH) { sss -= 24; delay(100); }
if (sss > 1023) sss = 1023;
if (sss < 0) sss = 0;
}
display.setCursor(0, 0);
// 扫描时间校准 (由信号发生器标定)
if (raz == 0) { zz = 1; h2 = 2; per = 0.1; }
if (raz == 1) { zz = 1; h2 = 1; per = 0.2; }
if (raz == 2) { zz = 12; h2 = 1; per = 0.5; }
if (raz == 3) { zz = 32; h2 = 1; per = 1; }
if (raz == 4) { zz = 75; h2 = 1; per = 2; }
if (raz == 5) { zz = 200; h2 = 1; per = 5; }
if (raz == 6) { zz = 380; h2 = 1; per = 10; }
if (raz == 7) { zz = 750; h2 = 1; per = 20; }
if (raz == 8) { zz = 1900; h2 = 1; per = 50; }
// 采样与显示
if (hold == 0 && millis() - time > 0) {
ads();
while (izm < sss) { ads(); h0++; if (h0 > 5000) break; }
h0 = 0;
times = micros();
while (i < 167) {
i++;
delayMicroseconds(zz);
ads();
data[i] = izm;
}
i = 0;
times = micros() - times;
Serial.println(times);
}
// 显示输出
if (millis() - time > 100) {
display.clearDisplay();
if (sss < 204 && sss > 100) { u_dig = 10; display.setCursor(0, 40); display.print("0.4V"); }
else if (sss < 100) { u_dig = 5; display.setCursor(0, 40); display.print("0.2V"); }
else { u_dig = 25; }
display.setCursor(0, 0);
while (i < 167) {
i++;
setka();
display.drawLine(i * h2 - i2, 47 - data[i] / u_dig, i * h2 - i2 + h2 - 1, 47 - data[i + 1] / u_dig, BLACK);
}
i = 0;
display.print(per, 1); display.print(" mS ");
if (menu == 0) {
if (hold == 1) display.print("HOLD ");
else display.print("AUTO ");
}
if (menu == 1) {
display.print(sss / 200.0, 1); display.print(" V ");
display.drawLine(0, 48 - sss / u_dig, 4, 48 - sss / u_dig, BLACK);
}
time = millis();
}
display.display();
}
void ads() {
// 10位 ADC 读取
do { ADCSRA |= (1 << ADSC); } while ((ADCSRA & (1 << ADIF)) == 0);
izm = (ADCL | ADCH << 8);
}
void setka() {
for (y = 8; y < 47; y += 8) {
for (x = 0; x < 83; x += 4) display.drawPixel(x, y, BLACK);
}
for (x = 0; x < 83; x += 26) {
for (y = 10; y < 47; y += 4) display.drawPixel(x, y, BLACK);
}
}
原理图
制造工艺
- 智能窗帘:基于Arduino与太阳能的自动光控系统
- 自制简易红外避障传感器:IR LED + 光电二极管 + Arduino
- Arduino DIY 电压表:Nokia 5110 屏幕显示,手把手教学
- DIY Arduino Nano 示波器:10 Hz–50 kHz / 128×64 LCD
- 自制高精度测距轮:Arduino Nano + 旋转编码器 + 1602 LCD
- 轻松打造 Arduino 秒表:按钮触发计时器
- DIY 自动量程电容表 (10 pF – 10 μF) – Arduino Nano 简易制作
- 自制 AI LCD 陪伴机器人:你的互动小伙伴
- 非接触手势门锁:APDS-9960 + Arduino 实现安全门禁
- Arduino Nano 多功能伴侣套件 —— 电阻/电容测量、二极管测试、RTC时钟一体化
- 为Arduino构建隔离模拟输入电路
- 用 DS1302 RTC 和 Arduino UNO 制作可靠闹钟