Skip to content

Instantly share code, notes, and snippets.

@chrismeyersfsu
Last active January 7, 2024 14:15
Show Gist options
  • Save chrismeyersfsu/3270419 to your computer and use it in GitHub Desktop.
Save chrismeyersfsu/3270419 to your computer and use it in GitHub Desktop.
Arduino Poor man's oscilloscope processing code
/*
* Oscilloscope
* Gives a visual rendering of analog pin 0 in realtime.
*
* This project is part of Accrochages
* See http://accrochages.drone.ws
*
* (c) 2008 Sofian Audry (info@sofianaudry.com)
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
import processing.serial.*;
Serial port; // Create object from Serial class
int val; // Data received from the serial port
int[] values;
float zoom;
void setup()
{
size(1280, 480);
// Open the port that the board is connected to and use the same speed (9600 bps)
port = new Serial(this, Serial.list()[0], 9600);
values = new int[width];
zoom = 1.0f;
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;
}
}
void draw()
{
background(0);
drawGrid();
val = getValue();
if (val != -1) {
pushValue(val);
}
drawLines();
}
@zsolt-szilagyi
Copy link

Hi. I don't know how I can suggest changes or make pull requests towards a gist.
Here is a version which:
Adds a pause button (p),
Switches to a speed of 2.000.000 (because why not)
Goes to the second serial port, as the first is used by BT on mac.
https://gist.github.com/zsolt-szilagyi/2e4088f6ba0d30c04aa6bc589fb41739

@carlstenAuto
Copy link

What could I modify to add a second analog reading? I have been using this code to diagnose engine signals, but having the ability to compare two waveforms at once would be really cool! I have some light arduino/processing experience, but I can't see where to begin to add, say, reading and displaying A0 and A1

Thank you!

@hadoopmarc
Copy link

hadoopmarc commented Jan 7, 2024

Inspirational and practical! See my personal gist with increased time resolution to 8000 samples per second, building on the Pause feature of zsolt-szilagyi. The images below show a 16 Hz blockwave in the original and the new version. Now it is no longer a poor man's oscilloscope but a usable scope for speech signals (3.1 kHz).
block-16hz-zsolt-szilagyi
block-16hz-hadoopmarc

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment