亿迅智能制造网
工业4.0先进制造技术信息网站!
首页 | 制造技术 | 制造设备 | 工业物联网 | 工业材料 | 设备保养维修 | 工业编程 |
home  MfgRobots >> 亿迅智能制造网 >  >> Manufacturing Technology >> 制造工艺

DIY Arduino Nano 示波器:10 Hz–50 kHz / 128×64 LCD

组件与材料

Arduino Nano R3×1
电解电容 100 µF×1
ST7920 128×64 LCD×1
旋转电位器×2
轻触按键×3

所需工具

软件

项目简介

本项目利用 Arduino Nano 内部 ADC 实现10 Hz – 50 kHz 带宽的简易示波器,波形显示在 128×64 像素 ST7920 屏幕上(波形区 96×64,参数区 32×64)。无需外部 DAC,结构极简、成本极低,适合教学与低频信号调试。

主要功能

DIY Arduino Nano 示波器:10 Hz–50 kHz / 128×64 LCD

硬件连接要点

完整代码

#include <U8glib.h>
U8GLIB_ST7920_128X64_4X u8g(6, 5, 4); // SCK, SID, CS

int Input = A0;
int Key_add = 8, Key_sub = 9, Key_hold = 10;
int x, y, i, i1, i2, V_min, V_max, V_mid, t, t0, t1, sta, Key = 1, hold = 0;
long Freq; float Vpp;
int Y[96], Buffer[192];

// 启动画面位图数据省略...

void setup() {
  pinMode(Key_add, INPUT_PULLUP);
  pinMode(Key_sub, INPUT_PULLUP);
  pinMode(Key_hold, INPUT_PULLUP);
  ADMUX = 0x60;  // AVCC 参考、A0 输入
  ADCSRA = 0xe2; // ADEN, ADSC, ADATE, ADPS=128
  u8g.setFont(u8g_font_5x7);
  u8g.firstPage();
  do { u8g.drawBitmapP(0, 0, 16, 64, L); } while (u8g.nextPage());
  delay(2000);
}

void loop() {
  sample(); Measure(); Transform(); Key_scan();
  if (!hold) {
    u8g.firstPage();
    do { draw(); } while (u8g.nextPage());
  }
}

void sample() {
  for (i = 0; i < 192; i++) {
    Buffer[i] = ADCH;
    switch (Key) {
      case 1: break;
      case 2: delayMicroseconds(4); break;
      case 3: delayMicroseconds(10); break;
      case 4: delayMicroseconds(23); break;
      case 5: delayMicroseconds(60); break;
      case 6: delayMicroseconds(123); break;
      case 7: delayMicroseconds(248); break;
      case 8: delayMicroseconds(623); break;
      case 9: delayMicroseconds(1247); break;
    }
  }
}

void Measure() {
  V_max = V_min = Buffer[0];
  for (i = 0; i < 192; i++) {
    if (Buffer[i] > V_max) V_max = Buffer[i];
    if (Buffer[i] < V_min) V_min = Buffer[i];
  }
  V_mid = (V_max + V_min) / 2;
  Vpp = (V_max - V_min) * 5.0 / 255;
  for (i = 0; i < 97; i++) if (Buffer[i] < V_mid && Buffer[i+1] >= V_mid) { i1 = i; break; }
  for (i = i1+1; i < 98+i1; i++) if (Buffer[i] < V_mid && Buffer[i+1] >= V_mid) { i2 = i; break; }
  t = i2 - i1;
  Freq = t > 0 ? 8000L / t : 0;
}

void Transform() {
  for (sta = 0; sta < 96; sta++) if (Buffer[sta] < 128 && Buffer[sta+2] > 128) break;
  for (i = 0; i < 96; i++) Y[i] = 63 - (Buffer[i+sta] >> 2);
}

void draw() {
  for (x = 0; x < 95; x++) u8g.drawLine(x, Y[x], x, Y[x+1]);
  u8g.drawFrame(0, 0, 97, 64);
  u8g.drawLine(48, 0, 48, 63); u8g.drawLine(0, 32, 96, 32);
  for (x = 0; x < 96; x += 8) u8g.drawLine(x, 31, x, 33);
  for (y = 0; y < 64; y += 8) u8g.drawLine(47, y, 49, y);
  for (x = 8; x < 96; x += 8) for (y = 8; y < 64; y += 8) u8g.drawPixel(x, y);

  u8g.drawStr(98, 7, "MS/div"); u8g.drawStr(98, 23, "V/div"); u8g.drawStr(98, 30, "0.324");
  u8g.drawStr(98, 40, "Vpp"); u8g.setPrintPos(98, 47); u8g.print(Vpp); u8g.drawStr(118, 47, "V");
  u8g.drawStr(98, 55, "F(HZ)");

  switch (Key) {
    case 1: u8g.drawStr(98, 14, "0.02"); u8g.setPrintPos(98, 62); u8g.print(Freq*50); break;
    case 2: u8g.drawStr(98, 14, "0.05"); u8g.setPrintPos(98, 62); u8g.print(Freq*20); break;
    case 3: u8g.drawStr(98, 14, "0.1");  u8g.setPrintPos(98, 62); u8g.print(Freq*10); break;
    case 4: u8g.drawStr(98, 14, "0.2");  u8g.setPrintPos(98, 62); u8g.print(Freq*5); break;
    case 5: u8g.drawStr(98, 14, "0.5");  u8g.setPrintPos(98, 62); u8g.print(Freq*2); break;
    case 6: u8g.drawStr(98, 14, "1");    u8g.setPrintPos(98, 62); u8g.print(Freq); break;
    case 7: u8g.drawStr(98, 14, "2");    u8g.setPrintPos(98, 62); u8g.print(Freq/2); break;
    case 8: u8g.drawStr(98, 14, "5");    u8g.setPrintPos(98, 62); u8g.print(Freq/5); break;
    case 9: u8g.drawStr(98, 14, "10");   u8g.setPrintPos(98, 62); u8g.print(Freq/10); break;
  }
}

void Key_scan() {
  if (!digitalRead(Key_add)) { while(!digitalRead(Key_add)); Key = (Key==9)?9:Key+1; delay(10); }
  if (!digitalRead(Key_sub)) { while(!digitalRead(Key_sub)); Key = (Key==1)?1:Key-1; delay(10); }
  if (!digitalRead(Key_hold)) { while(!digitalRead(Key_hold)); hold = ~hold; delay(10); }
}

原理图

DIY Arduino Nano 示波器:10 Hz–50 kHz / 128×64 LCD

制造工艺

  1. 自制LUMAZOID:基于Arduino的音乐可视化灯光控制器
  2. 用 Arduino Nano 和 Nokia 5110 LCD 自制 20kHz 示波器:简易 DIY 指南
  3. DIY 钢铁侠人偶:Arduino 控制超声波触发音效与灯光
  4. Find Me:基于 Arduino 与蓝牙的智能寻物器制作指南
  5. 互动 LED 矩阵门显:PIR 触发节日问候 + 待机特效
  6. DIY Arduino 加湿器控制器:继电器安全控制高压电路
  7. Arduino DIY 电压表:Nokia 5110 屏幕显示,手把手教学
  8. Arduino 声纳实时测距与 Processing 可视化
  9. MobBob:3D 打印智能机器人,Android 手机无缝控制,语音视觉一体
  10. DIY Arduino Nano 示波器:10 Hz–50 kHz / 128×64 LCD
  11. DIY Arduino 手柄方向盘 - 游戏竞速模拟器自制指南
  12. Arduino 101 计步器:集成 DHT11 温湿度 + LCD 显示步数/距离/卡路里