create new tag
view all tags

Virtual Instruments


Measurement instruments like multi-meters, pulse generators or oscilloscopes can be rather costly and the requirements for the IoT course are rather modest with respect to signal height (we have either digital signals of 0 or 3.3V or analogue signals in the same range) or with respect to frequency (a few kHz max).

The ESP32 has a Digital to Analogue Converter (DAC), which can be uses to generate signals of any shape, and it has an ADC which can be used to sample analogue signals.

Three types of instruments have been implemented:

  • a signal generator
  • a voltmeter
  • an oscilloscope
Of course all of these instruments are extremely basic, but they fulfil the requirements of this course.

Each of the instruments consists of a TCP server running of the ESP. This server generates the analogue signal for the pulse generator using the 8-bit DAC provided by the ESP32 or samples the analogue signal to be measured using its ADC in case of the voltmeter and the oscilloscope.

An application with a Graphical User Interface (GUI), created with the Qt5 library implements a TCP client that connects to the server, gets the measured data from it and displays them in a user-friendly manner. Measurement parameters, like the pulse shape and frequency in case of the pulse generator can also be set using GUI elements.

A Virtual Voltmeter

The simplest of the virtual instruments is certainly the Voltmeter. The analogue signal level must be connected to GPIO 36 (first ADC channel). Then the voltmeterServer.py must be started on the ESP32:


As you can see, the server has IP: (this will very probably be different on your machine) and it waits for connections requests on port 5000.

Once the server is running you can start the GUI application on the PC and connect to the server (in the example above the PC has IP Once the connection is established the signal level is shown in analogue form (the gauge) as well as in digital form. The values are in volts.


The pulse generator

The pulse generator provides 4 different pulse shapes:

  • rectangular
  • triangular
  • sawtooth
  • sine wave
It works on the same principles as the voltmeter: The pulseGenServer.py is a TCP server which allows connection from a GUI application pulseGenGUI.py serving as TCP client. This application controls the settings of the pulse generator sending commands to the pulseGenServer:
  • select pulse shape
  • select frequency
  • select pulse height
  • start pulse generation
It has a display that shows how the signal will look like if measured on an oscilloscope.
pulseGenRectsmall.png pulseGenTriagsmall.png
pulseGenSawsmall.png pulseGenSinsmall.png
As we can see, there is an additional knob to control the pulse height and there are 2 menus, the first of which controls the sample frequency of the generator, while the other one controls the simulated sampling frequency of an oscilloscope. In the above examples the generator works at 5 kHz while the simulated oscilloscope takes samples at 2 KHz which means that 2.5 complete signal pulses are seen.

A pulse consists of 500 samples and is constantly repeated. The generator sample frequency is the frequency at which samples are emitted. These frequencies are pretty low, but they are adapted to the analogue bandwidth of the ESP32 ADC channels which will be used for the virtual oscilloscope application. The maximum sample frequency is 5 kHz, which corresponds to 200 us between samples, and a pulse length of 500 * 0.2 ms = 100 ms and therefore a pulse frequency of 10 Hz.

The generator pulse frequency is entirely controlled by software delays, which have been calibrated with a physical oscilloscope:


The image shows the oscilloscope trace for a square pulse at 5 kHz. A pulse length of 100 ms is expected, and we can see that the time between the markers, corresponding to 2 pulses, reads 201 ms.

-- Uli Raich - 2021-05-15


Topic attachments
I Attachment History Action Size Date Who Comment
PNGpng pulseGenRectsmall.png r1 manage 30.7 K 2021-05-16 - 11:54 UliRaich  
PNGpng pulseGenSawsmall.png r1 manage 34.0 K 2021-05-16 - 11:54 UliRaich  
PNGpng pulseGenSinsmall.png r1 manage 35.6 K 2021-05-16 - 11:54 UliRaich  
PNGpng pulseGenTriagsmall.png r1 manage 35.7 K 2021-05-16 - 11:54 UliRaich  
PNGpng rect.png r1 manage 80.0 K 2021-05-16 - 12:08 UliRaich  
PNGpng voltmeter.png r1 manage 25.9 K 2021-05-16 - 08:30 UliRaich  
PNGpng voltmeter_server.png r1 manage 26.5 K 2021-05-16 - 08:31 UliRaich  
Edit | Attach | Watch | Print version | History: r3 < r2 < r1 | Backlinks | Raw View | Raw edit | More topic actions
Topic revision: r3 - 2021-05-16 - UliRaich
This site is powered by the TWiki collaboration platform Powered by PerlCopyright © 2008-2022 by the contributing authors. All material on this collaboration platform is the property of the contributing authors.
Ideas, requests, problems regarding TWiki? Send feedback