Arduino Oscilloscope





Introduction: Arduino Oscilloscope

A very basic and easy to make arduino PC oscilloscope.


  • 50K samples/second
    (actually it can go up to 110K but the signal will become noisy)
  • Auto trigger
  • Frequency counter
  • Reasonably accurate voltage readings (depending on the accuracy of the resistors used for the voltage dividers)
  • Optional: selectable voltage range: 5V, 6.6V, 10V, 20V

You'll need:

      • An Arduino Leonardo or Arduino Micro
      • 2 crocodile clamps
      • a 0.1µF capacitor (optional)
      • a 5.1V zener diode (optional)
      • a pc with Processing

      For the voltage dividers (optional, if you want to measure than 5V or want selectable range):

      • 2 two-pole dual throw switches
      • two 3K resistors
      • two 1.5K resistors
      • one 1K resistor
      • a small perfboard or breadboard

      If you only need to measure op to 5V, you can skip the voltage dividers and connect the probes directly to GND and A1. You'll have to modify the code a bit:

      In the arduino code, replace:

      ADMUX =  B00000000;         // select external reference and port 5 (A0)


      ADMUX =  B01000000;         // select internal reference (Vcc - 5V) and port 5 (A0)

      In the processing code, replace:

      // read switch position & set voltage range
       boolean switch1=((buffer[writeIndex*2]&(byte)8)==8);                                                 
       boolean switch2=((buffer[writeIndex*2]&(byte)4)==4);
       if (!switch1&&!switch2) voltageRange=20;
       if (!switch1&&switch2) voltageRange=10;
       if (switch1&&!switch2) voltageRange=6.64;
       if (switch1&&switch2) voltageRange=5;



      Step 1: Adding Voltage Dividers

      The circuit show above consists of:

      On the left: a 1:4 voltage divider between the probe and A1

      This will bring the voltage down to 1/4 of the input voltage. The analog pins can handle 5V, so this will allow for voltages up to 20V.

      Note that there are 2 input channels in the picture of the breadboard. Adding an extra channel slowed down the sampling rate dramatically (because continuous mode can't be enabled on the ADC), so I decided to leave it out in the final code.

      On the right: a switched voltage divider between 5V and the Analog Reference (AREF) pin
      You can use the switches to set the measuring range: 5V, 6.64V, 10V of 20V

      How this works:

      If configured to 'external reference', the ADC compares the voltage of the analog inputs with AREF, instead of 5V.
      Here's an example: suppose the probe is measuring 5V. The voltage on the A1 will be 5V/4 = 1.25V

      • If both switches are off, the voltage on the AREF pin is 5V.
        The ADC will read 1.25/5 = 25%
      • If switch 1 is off and switch 2 is on, the voltage on AREF is 2.5V
        The ADC will read 1.25/2.5 = 50%
      • If switch 1 is on and switch 2 is off, the voltage on AREF is 1.66V
        The ADC will read 1.25/1.66 = 75%
      • If both switches are on, the voltage on AREF is 1.25V
        The ADC will read 1.25/1.25 = 100%

      The second pole of each switch is connected to a digital input. We can read this pin to automatically adjust the voltage scale.

      A capacitor between the probe and ground
      Might not be necessary, but for some reason some pc's measure a lot of noise without it. The capacitor will solve that, but may slightly affect the signal when measuring high frequencies.

      A zener between A0 and ground
      To protect the arduino a little from overvoltage or reverse voltage (thanks, tttapa, for the tip!)

      Be careful:

      • If the analog reference is set to internal (default) while you are supplying voltage to the AREF pin, the arduino could get damaged. I did that, and it didn't damage mine, but better be safe and upload the proper code before connecting AREF.
      • the analog inputs can't handle negative voltages.
      • Don't exceed 5V on the arduino pins. It's probably a good idea to test the circuit with a voltage below 5V, so

        you don't damage the arduino in case the voltage divider on A1 was wired incorrectly.

      The arduino code was based on this excellent article:

      Good luck!

      Step 2:



      • Water Contest

        Water Contest
      • Oil Contest

        Oil Contest
      • Clocks Contest

        Clocks Contest

      71 Discussions


      8 months ago

      Is the code same for Leonardo or are there some changes? And the D3 and D4 pins are pins no. 1/TX and no. 4 (as labeled on Leonardo), correct me if I'm wrong.

      please reply thanks.


      Excellent article.It's very helpful.

      I'd like to know if this will work with Arduino Uno and if it will, are there any changes that need to be made? Also, what's the step 2? It doesn't show anything.

      Which program has been used to display the output?

      4 replies

      Hello Ahmed,
      Thanks! The UNO uses the serial port for communication over USB. This means less bandwidth than the micro, which uses native USB. It will work, but you probably won't get near 50k samples/sec.
      To display the output you can use the processing app (the download link is in the instructable).

      Best regards,

      Thanks for the reply.

      I've bought all the required + optional components that you listed out. I'm a bit confused on how to use the DPDT switches. In the required list, it says that only two of such switches are required. But in the circuit diagram, there are four switches used. What will these switches be used for though?

      Another question is how could we produce a particular wave and change the frequency, type of wave, etc? Is all of this included in the application?

      We're making the Oscilloscope as our university mini project. A quick reply will be very appreciated. Thanks, again!

      Hello Ahmed,

      SW1a and SW2b on the schematic are 2 poles of the same physical switch, switched simultaneously (one to attenuate the signal, and the other to let the arduino know that the signal is attenuated, so it can adjust the scale).

      This project will not generate wave forms. You could use low voltage AC or audio for a demonstration. If you want to control frequency, shape and amplitude, you'll need (to build) an oscillator.

      Good luck!

      I see.

      Will I be able to show wave forms using this project if I connect it to a Function generator? Or does this work on its own?

      What are the functions that this oscilloscope will be able to perform?

      Great project. Thank you for help. I am experiencing some difficulties with the graph on the processing program. the graph is not showing the accurate voltage on the screen. For example, if i put in 2V, it only shows a couple of milivolts on the display/graph shown on the processing program. PLEASE HELP!!

      2 replies

      Hi Maryclair,
      What type of arduino did you use? If you have a voltmeter, try measuring between Aref and GND pin and between A0 and GND, to check if the voltage dividers and switches are set up correctly.

      I am an Arduino Micro and I did measure the Aref and GND pin and it was correct. I even went ahead to use an oscilloscope to see and both the graph and reading I saw was fine. it was just not coming out right in the processing display.

      I am experiencing some difficulties with the graph on the processing program. the graph is not showing the accurate voltage on the screen. For example, if i put in 2V, it only shows a couple of milivolts on the display/graph shown on the processing program. PLEASE HELP!!

      hello bram! first off, very nice project, I get some really good measurements even though i use the UNO and not the arduino specified in the instructable. but i do have one slight issue, i get some strange noise. between the noise the measures are accurate but pretty much unreadable. i read somewhere in the comments that this could happen if you used the UNO but i couldn't find a solution for it. do you have any suggestions on what i can do to cancel out the noise? i use the scopeP3 code and the 5v read only setup, so nothing extra but the arduino itself.

      thanks in advance

      3 replies

      (Sorry for the late reply, It's been a while since I checked here.)
      It might have to do with power supply noise. Have you tried disconnecting your laptop and running it of the battery?

      Kind regards,

      Hello, please what do i do with the pde file (ScopeP3 and scopeP2). I cannot get the oscilloscope screen to show. I was using just the scope.ino code. please help!!!

      You should open it in Processing 2 (scopep2.pde) or Processing 3 (scopep3.pde). You can download processing for free at Good luck.

      Best regards,

      Could I use this project with Arduino Nano ?, which would have to move

      cool stuff

      exactly 44 thousandth view 44000


      I do not own a Micro or Leonardo, but I own an Uno. Will this instructable still work with the Uno?


      1 reply

      Hello Ganesh,
      It will work, but the sample rate would be limited by the serial speed.
      (You'll need about 800.000 bps for 50K samples/sec. I don't know how fast the uno's serial can go.)