Introduction: Binary DVM

Binary displays are very popular for clocks so it looked like there a gap waiting to be filled in the measurement area with an instrument that displayed its results in a Binary format. As result I decided that a DVM would be a suitable project to be given a Binary makeover.

The Microbit has the means via an ADC (Analogue to Digital Converter), to convert analogue inputs into digital values. These digital values can then be used to create a myriad of applications.

In this case I will describing how to make a Battery powered Digital Volt Meter (DVM), but in addition to this I will have the ability to display the voltage in Binary as well as the usual Decimal values.


If you were to apply a DC input to the ADC this being limited by the supply would mean that ~3V would be the maximum.

However, there is a way to overcome this limitation with a few additional components to measure voltages greater than the supply without causing damage to the MicroBit.

It must be noted that there is a limitation to what this simple DVM will measure and its only intended for low voltage positive DC applications in this case 0 to 20V.


MicroBit - Qty 1

Battery Pack - Qty 1

9k resistor* - Qty 1

953R resistor* - Qty 1

200R multi turn potentiometer* - Qty 1

1K resistor* - Qty 4

*All resistors 0.1W or greater.

Veroboard - Qty 1

Veropins - Qty 3

Bread:bit Edge Connector Breakout Board - Qty 1 or similar to allow the Microbit to be connected to the potential divider.

LED red low current - Qty 2

16 pin DIL socket or SIL socket strip - Qty 1


PSU, fixed or variable voltage.

PP3, 9V non rechargeable battery.

In the absence of a PSU a battery as indicated may be substituted.

4 pin single in line (SIP), pin header - Qty 2

Step 1: Potential Divider

In order to enable a voltage greater than the supply to be applied to the ADC input we will be using a potential divider network.

This network will enable the application of a scaled voltage at the ADC input, this scaling will be accomplished using resistors.

The basic network is made up of two resistors which divides the applied voltage across each resistor.

If we adopt a scaling factor of 1/10th the input, at the ADC then for an applied voltage of 20V; the maximum voltage at the ADC input would be 2V which is well within the capability of the ADC with a safety margin of 1V.

If we create a resistor potential divider using 9K & 1K with 20V across the network the voltage across the 1K resistor will be 20 * (1k/10k) = 2V.

However, components have tolerance and even with 1% resistors the voltage could be between 1.96V and 2.04V

Therefore, in order to compensate for the +/-40 mV variance we can add some variable resistance into the network to adjust for component, voltage & temperature variation.

Using a 1% 9k resistor and a 1k trimming resistor best case typical of 10% [0k9 to 1k1], its resistance would be between 0R (0V) and 1k1 max (2.198V [8K91] or 2.159V [9K09]).

Values significantly less then the value to be compensated for in this case 2V are undesirable.

Therefore, if the 1k potentiometer is replaced with a 1% 931R (0k922 to 0k94), fixed resistor in series with a 10% 200R (180R to 220R) potentiometer. This gives a compensation range of 1.84V to 2.3V (-160mV to +300mV).

Therefore, to set an accurate maximum input at the ADC we set the maximum input to be measured and adjust the potentiometer to get an accurate output. Using a DMM in both cases to set the voltages.

In the absence of a DMM to measure the input voltage use a 9V primary non-rechargeable battery as the input to the potential divider and adjust the potentiometer for 1/10th the input voltage (900mV), once the assembly is complete.

Step 2: ADC (Analog to Digital Conversion)

In order to convert the digital value that represents the input voltage into a value that can be displayed on the Microbit the following calculation is applied.

ADC 10 bit resolution = 0 to 1023 bits.

1 bit resolution = Vs/1023 = 3.226 mV, where Vs = 3.3V if powered by USB

If using a battery the voltage (Vs), will vary based on the type of battery and its state of health.


Volts = ADC value/1 bit resolution

100.006 mV= 31/3.3e-3

As the input has a 10:1 divider in the form of the resistor potential divider the resulting value is multiplied by 10.

100.006mV*10 = 1000.06mV (1.00006V) at the input of the potential divider.

This is coded in the Microbit within function Vconvert.

The ADC value is read into variable VIN.

Values >=0 are converted in to the equivalent voltage, VOUT

Vout = Vin * Vpbit * 10

But with zero volts at the input an offset error will exist which needs to be taken into account and included in the calculation.

The offset (Voff), can be found by connecting the ADC input to 0V

This value is then set to be stored in Voff.

The calculation then becomes:

Vout = Vin * Vpbit * 10 - Voff

Step 3: The Code

The Blocks code for the Binary/Decimal DVM

Step 4: Decimal Display

Having converted the digital value into a voltage, we now want to display this on the Microbit.

This is initiated by the On Button A pressed.

Vout is first converted to text.

A substring of the text containing 7 characters is created.

To this text is concatenated the letter 'V' for volts.

Show string is used to display the result.

This will scroll the result across the screen until all the has been displayed leaving a blank screen.

An example file is included with the same measurement displayed in both Decimal and Binary format.

The decimal value is 10.150V

Step 5: Binary Display

This is the part of the code that converts the Decimal value into its Binary equivalent.

An explanation into the layout of the display will clarify how the data is arranged.
4 rows x 5 columns are used to display the numeric data with one column per decimal value. The column is arranged with the LSB on row 0 and the MSB on row 3 enabling a maximum Binary count of 15, but as this is representing a Decimal digit then the maximum value will be limited to 9. Row 4 the top row is assigned to symbols, these symbols being '-' (-ve) and '.' (decimal point).

This process is initiated in the on button B pressed.

The result of Vconvert is converted to a text string of 5 characters and stored in STRVAL

A do while loop is executed for the character length of STRVAL

Each character is then split out in turn into STRMID

If STRMID is a number then this is converted into its Binary equivalent value, a non numeric value is given a default Decimal value of 16.

This process calls function DEC2BIN with two passing parameters, VALUE & INDEX3.

VALUE is the Decimal number to be converted and INDEX3 is the column number were the Binary value or Symbol will be placed.

An array LIST2 is defined with 5 elements, one element per column digit.

The process for converting the decimal value to its equivalent Binary value follows the form:

Take for example Decimal 6 to Binary.

6/2 = 3 r 0

3/2 = 1 r 1 = 011 (reverse) = 0110 (4 bits assigned per column)

The remainder from each division were the remaining integer is >1 is divided by 2 until no further integer division is possible. The remainder is stored in each element of LIST2 in the order calculated but this results in the MSB in element 0 and the LSB in element 3 which requires that the order in the values are reversed.

A do while loop is executed for the length of LIST2.

If the VALUE is >1 then it is divided by 2 and the remainder is stored in LIST2 at the index and VALUE becomes the integer, and the loop repeated else VALUE is stored in LIST2 at the index and the loop exited.

This process results in the Binary value being stored in LIST2 however, the elements are in reverse order and a Reverse LIST2 is executed to put each Binary bit in the correct order LSB at element 0.

Once the Binary value has been calculated it is displayed as a 4 bit word or nibble in the designated column. With one nibble per column up to a maximum of 5 columns. Symbols will be assigned to a 5th bit with all other bits=0 creating the following format 00001 or 00000. A one in the 5th bit indicating -ve or the decimal point and a zero indicating the absence of either of these symbols.

A designated column can only be assigned to a number or a symbol at any one time, numbers or symbols will not be mixed on the same column.

A do while loop is executed for the array length of LIST2

If the value in LIST2 at the element referenced by INDEX2 is one the LED in the reference column at the row referenced by INDEX2 is illuminated, if the value is zero the LED is un-plotted.

This will continue until each LED in the referenced column has been processed the result being either a number or a symbol.

The result will be retained on the screen between measurements.

Step 6: Assembly

The main part of the assembly is the potential divider board therefore care should be taken to ensure that the correct components are mounted in the correct location and orientation.

The orientation is particularly critical for the two LED's which act as clamping for excessive input voltage.

These will start to turn on at ~28V and if mounted in a prominent place will give a visual indication that the excessive voltage should be removed before any damage occurs.

The potential divider board is connected to the Breakout Board via a DIL socket or two SIL socket strips (cut from a single strip), allowing removal and reuse as required.

The Breakout Board is labelled with the Microbit pin names which will aid assembly.

The Binary weighted section is an experimental option for setting the supply reference without having to resort to code edition.

The 4 Binary weighted inputs to set the Voltage reference use pin headers as a simple alternative to DIP switches, open = Logic low and linked = Logic high. P13 = LSB and P16 = MSB.

Step 7: Calibration

By Calibration we mean to adjust a measuring device so that it can be used in an accurate way.

In this particular case we will be performing three operations as part of the calibration.

1: Verify the supply.

Measure the voltage between pins 0V and 3V and store this value in variable VPOS

2: Zero offset.

The value displayed with zero volts applied to the ADC input.

This should first be performed with the variable VOFF set to zero.

Connect a short wire between the ADC input (P0), and 0V with the input to the potential divider disconnected.

Initiate a measurement on the Microbit and record the value.

Repeat the measurement which should now be much closer to zero than previously, if not double check that the wire link was making a good contact between the two points before repeating the measurement.

In order to remove the need for code editing this offset is also recorded with the button A+B press..

Make sure to connect the short circuit between ADC and 0V and disconnect the measurement input prior to Pressing A+B or performing a manual Zero offset.

3: Network offset.`

The network consists of the potential divider components, the assembly and the applied voltage.

With a PSU set to 20.000V on the input to the potential divider and verify with a DMM.

With the DMM connected to the ADC input (P0), adjust the potentiometer to give 2.000V (900mV if using a 9V), +/-10mV.

Display the result on the Microbit by pressing Button A.

If a PSU is not available use a Primary non rechargeable battery (9V, PP3 for example), instead and apply this to the potential divider input.

In the absence of a DMM note the result on the Microbit display, adjust the potentiometer and repeat until 2.000V (900mV if using a 9V), +/-10mV is achieved.

This will obviously be less accurate than using an DMM as an assumption is being made with regard to the applied input voltage and a fresh battery should be used as this will be closer to the required voltage.

Calibration is completed.

An experimental option for setting the reference is included.

As an alternative to hard coding a voltage, four binary weighted inputs have been assigned to enable the reference voltage to be set without editing the code.
Pressing buttons A+B will set VPOS based on the binary pattern selected as per the Binary Weighted table.

Open circuit pin pairs = 0 and linked pin pairs = 1

Using the Binary Weighted Table (BWT), the resolution could be improved by adding further bits.

Step 8: Usage

I am sure there are many uses to which this methodology can be applied either directly, such as a Power Supply Voltage display or applied to other data displays.

But that's another chapter, in the meantime I will leave this to the reader to contemplate.

Battery Powered Contest

Participated in the
Battery Powered Contest