Arduino示波器(一)

Arduino示波器(一)

一、背景

自ADS1115被Arduino/ESP32/phyphox蓝牙实验开发组发掘,小伙伴们突然有了一个企图:开发一个极为便宜的示波器——真正的金钱上的投入少,因为phyphox实验主打可移动性和低成本——于是查阅了一些中外文献(当然是业余的挤出来的时间),发现大致思路有这么两种:一种是主张精确和准确,纷纷提出STM32、ADC采样等。我是不主张的,追求精确和准确干嘛不用专业的示波器?如果不是玩物丧志的沉溺于diy真的没有必要;另一种则是使用12864等显示波形,但是我们是在研究Arduino&phyphox示波器,最直接的显示途径,便是phyphox了。这样算下来,大致的可取路径有以下几个方向:

  1. 使用Arduino/ESP32采集数据,然后使用phyphox来充当显示屏。这个方案实在太过简单,略过了,不研究。

  2. 使用Arduino/ESP32采集数据,使用Arduino IDE自带的串口绘图器充当显示屏。这个方案当然极为方便,但是要在串口绘图器上调整div或者hold,以及显示数字,好象不太可能。可以粗略使用,仍然略过,不研究。

  3. 使用Arduino/ESP32采集数据,用其他应用程序来显示波形。这个方案,最优搭配绝对是processing莫属!于是到processing官网去查找示波器代码,果然有!简单改改,放在这里用了,是为(一).

  4. 这最后的方案,便是12864。自接触单片机以来,只研究过1206和OLED,还没有用过12864,这一个尝试,便只记录Arduino+Processing。

二、Arduino代码

什么新意也没有,从A0读电压,然后送给串口。注意只测了正电压。

#define ANALOG_IN 0

void setup() {
  Serial.begin(9600); 
  //Serial.begin(115200); 
}

void loop() {
  int val = analogRead(ANALOG_IN);                                              
  Serial.write( 0xff );                                                         
  Serial.write( (val >> 8) & 0xff );                                            
  Serial.write( val & 0xff );
}

三、processing代码

以下代码,在processing 3.54下调试通过。代码不是我写的。这个代码似乎很不processing,但人家是现成的代码。不必改了。

按键盘上的+号,图象实现Y增益,-号Y增益减小,按p键,图象保持,即hold。

import processing.serial.*;

Serial port;  // Create object from Serial class
int val;      // Data received from the serial port
int[] values;
float zoom;
boolean paused;

void setup() 
{
  size(1280, 600);
  // Open the port that the board is connected to and use the same speed (9600 bps)
  port = new Serial(this, "COM9", 9600);//这里直接改串口号,运行速度极快
  values = new int[width];
  zoom = 1.0f;
  paused = false;
  smooth();
}

int getY(int val) {
  return (int)(height - val / 1023.0f * (height - 1));
}

int getValue() {
  int value = -1;
  while (port.available() >= 3) {
    if (port.read() == 0xff) {
      value = (port.read() << 8) | (port.read());
    }
  }
  return value;
}

void pushValue(int value) {
  for (int i=0; i<width-1; i++)
    values[i] = values[i+1];
  values[width-1] = value;
}

void drawLines() {
  stroke(255);
  
  int displayWidth = (int) (width / zoom);
  
  int k = values.length - displayWidth;
  
  int x0 = 0;
  int y0 = getY(values[k]);
  for (int i=1; i<displayWidth; i++) {
    k++;
    int x1 = (int) (i * (width-1) / (displayWidth-1));
    int y1 = getY(values[k]);
    line(x0, y0, x1, y1);
    x0 = x1;
    y0 = y1;
  }
}

void drawGrid() {
  stroke(255, 0, 0);
  line(0, height/2, width, height/2);
}

void keyReleased() {
  switch (key) {
    case '+':
      zoom *= 2.0f;
      println(zoom);
      if ( (int) (width / zoom) <= 1 )
        zoom /= 2.0f;
      break;
    case '-':
      zoom /= 2.0f;
      if (zoom < 1.0f)
        zoom *= 2.0f;
      break;
    case 'p':
      paused = !paused;
      break;
    }
}

void draw()
{
  if(paused) {return;}
  
  background(0);
  drawGrid();
  val = getValue();
  if (val != -1) {
    pushValue(val);
  }
  drawLines();
}

(0)

相关推荐

  • 十大滤波算法

    5.中位值平均滤波法(又称防脉冲干扰平均滤波法) [pre lang="arduino" line="1"]/* A.名称:中位值平均滤波法(又称防脉冲干扰平均 ...

  • Arduino+12864示波器准备工作(一)

    Arduino+12864示波器准备工作(一) 使用单片机制作示波器,除了一些商用产品的方案,网上已经有很多基于STM32.51和Arduino的,收集和整理了一些51.Arduino的.10分钟.8 ...

  • Arduino+12864示波器准备工作(二)

    在Arduino里面显示单色bmp,把bmp转化为十六进制字符数组之后,只需include到ino文件里就行了.这部分简单,做个笔记.一.使用python转化单色bmp要显示的1212.bmp文件,本 ...

  • 修摩托车高手都用示波器,我来带你入门

    示波器在摩托中国网的大力推广下,已成为行业内摩托车维修的一大利器,由于探测不同部位的工作波形,需要的探头各有差异,本文主要谈谈通用示波器探头在使用中容易被忽视的几点注意事项. 一.带宽 这个通常会在探 ...

  • 美女车,起步总易熄火,看我用示波器抓出故障根源

    自从上次我用示波器解决了一台汽车的疑难故障后,在附近圈内名声大噪,引发了不少圈内人对示波器的好奇.这不,今天又有好友介绍来一台北京现代1.6升自动档车. 车是美女开的,保养的非常不错! 据美女说,车有 ...

  • 摩托车维修中使用示波器只能查电路?谁说的!

    作者:摩托中国 摩托医生 前几日有一五羊本田100小踏板,出现冷车不好启动的故障.车主曾骑到售后去修,售后说要把车放到店内等车冷后才能判断故障,车主因工作太忙没有答应. 之后车主骑到本店来修,经试车发 ...

  • 运用示波器排查哈雷DaVidson摩托车无法启动故障

    示波器的维修案例又来了,想吐槽的朋友们准备好了吗?哈哈 首先回顾历史: 1903年,威廉哈雷(William Harley)和戴维森(Davidson)三兄弟在密尔沃基创建了著名的Harley-Dav ...

  • 踏板摩托车启动时好时坏,看我用示波器妙手排查!

    作者:龙行天下 一台国二GY6-125发动机的踏板,客户骑行过来送修,据车主反映有时不好着车.接车后启动试车,发现此车偶尔一枪就着,有时有点想着又着不了的感觉. 拆卸座包,取下高压包做跳火试验,火花强 ...

  • 和爷爷一起学Arduino:做创客也需要数学1(原码与反码)

    https://m.toutiao.com/is/eD2KoBx/ "和爷爷一起学Arduino:直流电机的控制(介绍H桥电路的工作原理) (toutiao.com)"一文里,我们 ...

  • 利用示波器维修化油器摩托车,进气压力波形的采集及判读注意事项

    作者:松生空谷 常见示波器外观 运用示波器维修摩托车,是一种相对而言的新方法,可能有些修理工不屑一顾,但对于一些感兴趣的人来说,却不失为一种好工具.大家都知道,化油器车上是没有进气压力传感器的,必须自 ...