OpenVFD: 6-Digit IV-11 VFD Tube Clock




Introduction: OpenVFD: 6-Digit IV-11 VFD Tube Clock

About: Hi there, it's Frank. I'm a 20 year old electrical engineer student currently living in Berlin, Germany. In my free time, I'm in love with traveling, photography, long and calm hikes in the mountains, vegan…

Introducing OpenVFD - the colorful VFD tube clock with light effects that make the clock dance, glow or turn into a rainbow.

I'm here to share my result of creating my own dream clock with you. A computer controllable, colorfully illuminated 6-digit clock utilizing vintage Soviet IV-11 vacuum tubes.

Entirely programmed in Arduino C code, OpenVFD implements a complete Arduino Uno USB connected platform to make it compatible and easy for everyone to understand, take apart, expand and improve!

About this Instructable

The Instructable shows you what makes my VFD tube clock work and I will take you through the process of turning some tubes, parts and a bunch of code lines into a glowing tube clock. It's great and easy to follow this Instructable if you have some basic electronics knowledge already, but don't worry if not. I'll do my very best to keep everything short and simple. Here is a little TOC:

  • Introduction: The Concept
  • Introduction: A Little BOM
  • Fundamentals: Getting to Know IV-11
  • Fundamentals: Generating the Right Voltage Levels
  • Fundamentals: Gaining Control - A Discrete Approach
  • Fundamentals: Gaining Control - The Integrated Solution
  • Fundamentals: Interfacing the Microcontroller
  • Adding Functionality: The Real Time Clock - DS1307 Vs DS3231
  • Adding Functionality: Light Up the Clock
  • Adding Functionality: Everything Else & Putting It All Together
  • Building OpenVFD: The Circuit Board & Assembly
  • Building OpenVFD: Acrylic Case
  • Building OpenVFD: Make It Shine!
  • Fluorescence by The VFD Collective
  • Appendix: OpenVFD Software

Also feel free to check out the commercial version of OpenVFD: Fluorescence by The VFD Collective. If you find this Instructable useful, get your own clock by supporting the project on Kickstarter while I'm setting up the store of!

Step 1: Introduction: the Concept

So what is a VFD?

Meet an old friend! The VFD (vacuum fluorescent display), a very special vacuum tube developed in the 60s.
They glow in a crisp, futuristic teal color with remarkable, distinctive brightness and made it into calculators, stereos, car speedometers, cash registers through all the years. If you are curious, just like me, here is another Instructable by me if you would like to check out how the display works in theory.

As for the OpenVFD clock, I'm using old Russian so called "IV-11" tubes. Back then, they were chained together and made up the display of large calculators. Many of these tubes were produced, making them easy to obtain, even today.

What is the philosophy behind OpenVFD?

I wanted to recreate the VFD clock with most beautiful colors to see how colorful time can be. An IV-11 clock with tubes of uncompromising brightness, empathized by individually controllable little LED lights. Covered by a minimalistic, precisely cut acrylic glass, every color is diffused, reflected and fractioned when they reach the acrylic surface or the glass of the tubes. They create the vibrant mood, the peaceful ambient light or the perfect party moment when dancing to music!

Step 2: Introduction: a Little BOM

The parts you'll need for building the clock will heavily depend on how you want to build it. Just playing around, building a prototype clock with strip grid or maybe even a product ready for production. Here's a little BOM that gives you the feel of what you'll need if you'd like to build your clock interactively with this Instructable:

  • Arduino Uno R3
  • 6x IV-11 VFD Tube
  • 1x Buck converter (e.g. LM2596 module)
  • 1x Boost converter (e.g. XL6009 module)
  • Both modules can be replaced by one OpenVFD EcoPower Module specifically designed for driving 6x IV-11 tubes!
  • 6x 74HC595N 8-bit shift register
  • 6x UDN2981A or TD62783APG 8-channel source driver
  • DS1307 or DS3231 RTC clock module
  • 4x tactile switches
  • 4x 10 kΩ resistors
  • 6x WS2812B RGB addressable LEDs (Adafruit NeoPixel)
  • Electret microphone module (I use an amplified one with MAX9812)
  • you can never have enough buffer capacitors (100 nF)

Ready to go? Let's start with the fundamentals!

Step 3: Fundamentals: Getting to Know IV-11

It all begins with this old Russian IV-11 tube. How do we light up the tube? More specifically, what kind of voltages do we need to turn a segment off? And what about turning on a segment? What is the pin layout of the tube?

Let's answer the questions by looking at the pinout diagram above.

  • Pin 1 and 11 belong to the heater (cathode). Either pin can be tied to ground (0V) and the other one receives the cathode voltage of around 1.5 volts. The latter voltage needs to be on all the time to make segments glow
  • Pin 2 is the grid pin. Giving this pin 30V (anode voltage) enables the display
  • All the other pins (pin 3 to pin 10) are anode pins for the segments called 'a' to 'g'. 30V will turn the segment on, 0V will turn it off. It's really that simple.

A prehistoric drawing found in this datasheet illustrates the tube as its schematic symbol. If you're somehow familiar with tubes you'll surely notice that the IV-11 is just a fancy triode. In fact, that's what all VFD tubes and displays are. So isn't it insane that someone made a tube amp out of VFD displays?

Step 4: Fundamentals: Generating the Right Voltage Levels

Now that we've found out what voltage levels our VFD tube needs to work properly, it's time to make sure that we generate them from a base supply voltage, let's say 5V. (5V's just the most common voltage to work with as an electronics hobbyist).

The idea: Buck and boost converter!
Just two fancy ways to describe circuits that make a lower voltage out of a higher voltage and vice versa. We could use one of each since we have to get 1.65V from the so called buck and 30V from the boost converter. The chips we'll be using depend on one important question: How much current will our tube array draw? A glance at the datasheet gives you an idea of how much current parts of the tube will draw at maximum load. Let's do some simple math. We have six tubes. Each tube has 8 anodes, one grid, and one heater. A good guess would be:

Cathode voltage current requirement (worst case):

  • 6 * Cathode current = 6 * 110 mA = 660 mA

Anode voltage current requirement (worst case):

  • 6 * (6 * Working anode current + Grid current) = 6 * (6 * 5.0 mA + 17.0 mA) = 228 mA

This would be a total power dissipation of around 7 watts anode and about a watt for the cathode. That's some decent dissipation and the reason why we won't torture linear regulators for the step down path. For testing, take out the XL6009 step up and step down LM2596 module, and set the potentiometers so that you get the right voltage levels.

For my first PCB design, I've used LM2576-ADJ for step down and LM2577-ADJ for step up simply because they were available at my local store. You can do better and get one OpenVFD EcoPower Module specifically designed for driving 6x IV-11 tubes - but basically any IC fulfilling those requirements will work just fine.

Got the voltage levels right? You can now put the tubes on a breadboard and play with turning segments on and off. Can you tell which pin belongs to which segment and which pin the decimal dot is? Tried displaying all numbers 0 to 9, maybe even some letters?

Step 5: Fundamentals: Gaining Control - a Discrete Approach

Since you now know how your VFD displays the characters by applying the right volts to the anodes, it's time to do even more. So the controlling mind behind the VFDs won't be a person or some crackhead you hire who does un- and replugging segment voltages real fast, but a microcontroller switching in a highly precise manner. But there's one little issue that keeps us from connecting the tube segments to the microcontroller directly:

The typical microcontroller (TTL) switches between 0 and 5V, while 5V means a logical '1' or 'HIGH' and 0V a logical '0' or 'LOW'. Remember we need 30V and more than 15 mA at 30V? I mentioned the current because a microcontroller can only switch a very limited amount of current (typical: 20 mA @5V). Sometimes that's sufficient to switch a green LED but not a VFD segment. So we'll have to come up with a circuit that gives the desired 30V to our VFD segments when we use 'HIGH' to tell a segment to turn on and 0V to the segments when we go 'LOW'.

A Discrete Approach

But how exactly do we toggle the segments with just 5V? The initial circuit I came up with is, I believe, simple and intuitive. It builds upon an NPN-PNP bipolar transistor pair, where the NPN receives 0-5V in, and switches 30V over the PNP. See how it works:

  • Say we want to turn a tube segment off. So we apply 0V to the control input. The base voltage is 0V, so the NPN transistor is turned off, right? That means no current can flow through the path with R2, and the PNP transistor gets pulled up to 30V (VDD) over R3. Because of this we know that our PNP won't turn on either, and our segment is off since it doesn't get any current
  • Now let's see why 5V on 'CONTROL' will turn on the segment. With a positive voltage, Q1 will turn on. This makes R2 and R3 into a voltage divider where the base of Q2 will certainly receive a voltage (much) less than 30V. So Q2 will open up as well, switching 30V to the anode of the tube. The segment now lights up!

Together with port extending shift registers (I'll talk about them later), you can see the tube control prototype board with 48 of those NPN-PNP pairs on the picture above. I've shown this circuit to you since I believe that everyone has at least a few BC547 and BC557s lying around. So if you have some, don't hesitate to put this control circuit on breadboard using a few of them now!

Step 6: Fundamentals: Gaining Control - the Integrated Solution

If you're a bit familiar with soldering, you know that soldering more than 70 SMD transistors is no fun at all. So we have to modify our discrete circuit, moving towards higher integration. Simultaneously, I'm happy to tell you that we're getting closer to OpenVFD's final tube circuit.

The idea behind it is that we try to get a very similar NPN-PNP pair under the hood. Why? Because we still have to switch 30V to the segments. Found out that the UDN2981 8x TTL, so called high side switch is a good choice for this.

If that's on breadboard too, feel free to send TTL-level inputs to the UDN2981 you just got (TD62783 will do exactly the same thing). But be careful and don't short out any outputs. This will burn the internal transistors immediately since they have no protection at all.

Step 7: Fundamentals: Interfacing the Microcontroller

Awesome, we are almost done with fundamental stuff for the tube circuit. What you see in the picture is the completed tube circuit of OpenVFD as found in the final schematics.

And where's the magic? Right. All I did was to copy and paste the circuit in step 4 exactly six times, since we need six tubes. Now it's finally time to reveal the functionality of the 74HC595. Previously mentioned and seen, the 74HC595 is a shift register. We use it because the microcontroller only offers a very limited amount of I/O pins. Shift registers let you connect more stuff with just three pins: All of our data is shuttled through a serial pin into shift registers, controlling high side switches that we met before to turn the tube segments on and off.

Now if your tube circuit is sort of set up, get your microcontroller ready! We are going to microcontrol the six VFD tubes for the very first time. If you want to use an Arduino board, like I did, connect

  • clock pin of the 74HC595 (pin 11), SCK to pin D2 of the Arduino Uno
  • latch pin of the 74HC595 (pin 12), RCK to pin D3
  • and serial data pin of the 74HC595 (pin 14 of the first shift register), SER to pin D4 of the Uno

Have some fun with the little block of code I've written for a test drive. It's just a simple and stupid counter which starts at zero and counts up to 999,999. The top Fritzing picture shows how the first 74HC595 is supposed to be connected. All output pins will go to the UDN2981 except for pin 9 (serial out), which has to be connected to serial in of the next 74HC595.

Step 8: Adding Functionality: the Real Time Clock - DS1307 Vs DS3231

What else do we need for a VFD clock? Oh right... it's the clock. So finally we're adding a circuit that provides clock functionality. Our so called RTC (real time clock) is backed up with a battery so that the clock can tick on even if OpenVFD is turned off itself. That makes sense, right? Since we don't want to lose the time when turning on the next time. We choose between a DS1307 and a DS3231 module:

  • The DS1307 is an affordable RTC solution, simple to control but with trade-off in accuracy depending on the crystal used - which is in general pretty inaccurate due to temperature change. I had situations where the DS1307 was a minute or more off after a day. That wouldn't work in a commercial product at all
  • Luckily, the DS1307 module can easily be (almost) drop-in replaced by a DS3231 module. The DS3231 is a RTC with a TCXO (temperature compensated crystal oscillator) ensuring jaw-dropping accuracy of less than a minute error per year

After all, which one you want depends on how accurate you want it to be. Both are tested to be both pin and source code compatible to the OpenVFD schematics and firmware (software). We connect the I2C interface of the DS1307/DS3231 module to the I2C pins of Arduino (SDA -> SDA, SCL -> SCL).

Step 9: Adding Functionality: Light Up the Clock

Now let's add the most memorable characteristic of the OpenVFD clock: The LEDs that light up the tubes to create the effects and moods that we all love. It begins by finding the right RGB LED that is reliable and bright. Why RGB? Here's how beautiful colors work: We combine the three colors of RGB (red, green and blue) to get new colors. So, for instance, purple is just blue and red mixed together.

Meet the WS2812B digital LED. This LED acts like a shift register and is controlled by shuttling data through one single data pin.

What makes the WS2812B really lovely is that the exact same LED is found in NeoPixel by Adafruit. Even though the OpenVFD firmware does not rely on any Adafruit libraries (but on work done in this wonderful Instructable), Adafruit still provides brilliant documentation on this LED that help when working with them. Take a look at the connection diagram. OpenVFD chained up six WS2812Bs to light up the six tubes individually.

Just like the traditional Arduino-Hello-World uses Pin 13 for the 'blink' program, our LEDs are connected serially to Pin 13! Don't worry if they are SMD and not-so-breadboard-friendly. Something like this Adafruit breakout board will solve the problem . Or create a breakout board yourself!

Step 10: Adding Functionality: Everything Else & Putting It All Together

For the time OpenVFD is not connected to a PC, four tactile switches are used to set time, play with colors and do much more. The firmware OpenVFD makes them reacting to short and long presses.

A microphone module (MAX9812) makes your VFD clock dance to the tunes you enjoy. It measures sound as variations in air pressure and sends corresponding electric signals that are then evaluated by the microcontroller. Temperature measurement is done by a LM35 sensor that converts temperature into voltage levels. Our microcontroller translates this back to a temperature value that we all understand. While the RTC gets ridiculously accurate using DS3231, both LM35 and DS18B20 are somewhat like the German weather: moody.


And we're done with the complete VFD clock circuit design. You can download and see the complete prototyping circuit diagram below. If you got it on breadboard or prototype board by now, we're totally ready to upload the OpenVFD firmware to your microcontroller.

The latest firmware of OpenVFD is available on GitHub . When compiling, make sure the libraries RTClib, Wire and digitalWriteFast are ready. These are the only dependencies of OpenVFD. Everything about how the firmware works in detail is explained here.

Step 11: Building OpenVFD: the Circuit Board & Assembly

For the final prototype, I've designed a printed circuit board (PCB) which holds and interconnects the components. The design is as simple as it gets. It contains screw holes for a case mount, features buttons and plugs to be mounted to the back side of the clock.

Assembly begins from the circuit part with the lowest part profiles. In the last step, six of the IV-11 tubes are added to OpenVFD and we're done.

I decided not to publish PCB files as it is not suitable for home etching (hundreds of vias and thin traces). But the good news is that I will be working on a home-etching friendly PCB version that everyone can try out at home in the future. In the meantime... Why don't you design your very own PCB? I promise it's fun!

Step 12: Building OpenVFD: Acrylic Case

OpenVFD is about light and passion. To amplify this, the clock is designed to have its transparent enclosure made possible by acrylic. The aim is absolute simplicity at maximum color experience.


For your own clock, simply measure and create a case yourself using a laser cutter. I'm lucky to live next to FabLab Berlin, a place where crazy creative minds meet up. They got all the right tools. Otherwise, I'm pretty sure that there are a lot of services online that offer laser cutting.

Step 13: Building OpenVFD: Make It Shine!

When mounting the acrylic case and everything is done, it's time to light up the clock!

  • Find some exclusive place for the clock. Glass surfaces seem pretty ideal
  • Show it off to your friends. Celebrate how freakin' amazing you are!

And say thanks to me by voting for this Instructable, thank you for reading! <3

Step 14: Fluorescence by the VFD Collective

If my Instructable has inspired you to build your own VFD clock or you would like to have a complete one yourself, I'm excited to introduce Fluorescence by The VFD Collective to you. FLUORESCENCE is the commercial product based on the OpenVFD software and platform, using the second revision circuit board.

Feel free to check out and build your own VFD clock using the DIY kit!

Technically, FLUORESCENCE builds upon all the strengths of OpenVFD like a flicker free display, full brightness and improves highly on design, energy efficiency and circuit protection. You can download the block diagram as well as the schematics of FLUORESCENCE right here:

Step 15: Appendix: OpenVFD Software

The stars of the appendix: OpenVFD Controller (myOpenVFD) and the firmware. With myOpenVFD, a simple to use Windows app that sends data over USB to the clock, you'll be able to

  • Set the OpenVFD time by synchronizing with your computer's clock
  • Set individual color for an LED in OpenVFD or choose a predefined pattern
  • Send some funny random messages to the clock display
  • Check the OpenVFD firmware version, check for updates Update or write new firmware to OpenVFD

OpenVFD Firmware is the software that controls and coordinates how things work on the clock. Written in Arduino C/C++ it sends clock or any data information to the tubes, sets different LED brightness levels, retrieves sensor data (temperature, sound) and gets in sync with the real time clock. It's just a single .ino file, handy to compile yourself.

Click here to see how the OpenVFD firmware works in detail with every function taken apart. That might be helpful if you want to write your modifications to the firmware!

Both myOpenVFD and the firmware can be downloaded from The VFD Collective. Also, find The VFD Collective on GitHub!

LED Contest 2017

Runner Up in the
LED Contest 2017

Epilog Challenge 9

Participated in the
Epilog Challenge 9

Arduino Contest 2017

Participated in the
Arduino Contest 2017

4 People Made This Project!


  • Game Design: Student Design Challenge

    Game Design: Student Design Challenge
  • Big and Small Contest

    Big and Small Contest
  • For the Home Contest

    For the Home Contest



Question 1 year ago on Step 2

why do you need the microphone module?


Question 1 year ago

would this still work if i replace it with IV-6 tubes?


2 years ago

I would like to know if there is a logical sequence of connecting the pins of the 74hc595 to the VFD. Let's say we have a VFD with 6 Grids (G1-G6) and 14 Anodes; in that case, would a 74hc595 be used for the Grids and two more 74hc595 for the Anodes?
The sequence of connections from 74hc595 to VFD would be like this: Q0-Q5 (from the first 74hc595) for Grids G1-G6 and, in the sequence would be Q0-Q7 and Q0-Q5 (from the second and third 74hc595) for Anodes 1-14?
I'm confused about this! If you can help me, I thank you very much.
PS .: My VFD is not a Tube, it is Flat, as in the second image of Step 1: Introduction.

Thanks, Daniel


Question 3 years ago on Step 14

I am curious if I could use IV-12 tubes for this project. I have six that I recently acquired, and I would like to give them a new home.


Question 3 years ago

Hello Kesselwagen,
I have a little problem,(1) the segments that do not need to be displayed , but it is flicker.For example, the number 0 is displayed,but the middle segment appears flashing , as shown in Figure 1.
(2) And there is my PCB,I found the temperature of the TPS54430 chip is very high.
what could be the problem?


Answer 3 years ago

The first problem has been solved,I found out if the “delayOption “ = 0x00,that will cause the digital tube to flicker,when I change this parameter to 1000,It runs perfectly


Question 4 years ago on Step 10

Hi~ o(* ̄▽ ̄*)ブ Where can I find the “digitalwritefast.h” and “RTClib.h”


Question 4 years ago

Hello Kesselwagen,
I have a little problem with the temperature sensor.
I've read the code but i'm not able to visualize it on the tubes.
When i push the button to skip form hour, date and temperature, only skip from hour and date.
There is any modifications that i have to make on the software to abilitate it?
I would like to read it in Celisus degree.
Can you help me?
Many thanks


Answer 4 years ago

// Remove comment to enable temperature sensor reading at STEM pin (DS18B20)


Reply 4 years ago

Try this.


Reply 4 years ago

Already done but nothing is shown...


Reply 4 years ago

Hey I see you've already uncommented the comment to enable the temperature sensor. The temperature display is the one after date display (change display using the leftmost button). Did it work?
Otherwise it sounds like that the DS18B20 is not recognized correctly. Have you added the pullup resistor to STEM_PIN which is crucial for operation?


Reply 4 years ago

Yes, i’ve used the LM35 sensor, and a 1K pull-up resistor. Is it correct?


Reply 4 years ago

Hi all,

I have the same issue. If I push the button the clock switches from time mode to date mode. I push it again it does nothing; it stays in time mode. Push again it goes back to time mode. Somehow it doesn't switch to temp mode. I have the pull up resistor on DS18b20 data line. It may be a faulty sensor.


Question 4 years ago

Hi all! I have build this clock using the latest firmware 2.21 and it is working great.
Now, after I replaced my PC, I am trying to upload the firmware to another clock but I receive this error: 'intervalEvent' does not name a type.
The strange thing is that with the firmware version 2.01 I do not have this error and the syntax is the same. What could be the problem?


Answer 4 years ago

I solved the problem. I think that the latest Aduino IDE 1.8.7 is the problem. Uninstalled it and installed release 1.8.5 and it works perfectly.


Reply 4 years ago

Hey this is a weird problem since typedef struct should work on any IDE or compiler supporting C/C++, or am I wrong? I am happy to hear that you could solve the problem.


Reply 4 years ago

Hi! Thank you for your reply.
I don't know why IDE 1.8.7 gave me that error. May be it was a bad installation of IDE at that time.


4 years ago

Hi! Great project.I started building one of my own. I am using 6X MIC5891 as driver. In the last schematic posted on github I saw that the lamp grids are connected to the drivers output. For me this is not working, only 2 lamps turn on and of. If I connect the grids directly to 30V like you did in the previous versions the clock is working fine. Is the last schematic wrong or the code is not following the schematic?

Thank you for your great job.