Introduction: Vacuum Fluorescent Display Watch
That whole project started a while back with an hackaday article from 2014 in which [Johngineer] build the 'ChronodeVFD', a wristwatch made from an old soviet vacuum fluorescent display. It kind of triggered the 'shut up and take my money' reflex in me, but as it wasn't for sale and didn't have any design details available I quickly had to scrap that.
Fast forward a bit, during a late night eBay shopping spree (as one usually does...), I stumbled upon a listing from an Ukrainian guy who sold an IVL2-7/5 VFD - the exact same model used for the ChronodeVFD. After a bit of back and forth with the seller I ended up with a box of these babies neatly wrapped in what seems like Russian newspaper - nice!
However, I now realised that I had no clue how to drive these things or even how they worked, so some googling was in order.
Step 1: What the Hell Is an VFD and How Does It Work?
Vacuum fluorescent displays work kind of like a CRTs where accelerated electrons are bombarded on a layer of phosphor which then emits this typical blue-greenish light. VFDs are driven with much lower voltages compared to CRTs which is why they are often found in small consumer equipment predating the LCD-era.
In order to create free electrons a filament is heated within the VFD, the cathode (at negative, or in our case ground potential). This creates an electron cloud around the filament, which will be accelerated towards any positively charged surface, here the plates of the anode. This on its own works already, but would require a separate pin for each segment on the display to drive it. To reduce the number of inputs, most VFDs are multiplexed with a matrix above each substructure like a 7-segment. Only when the plate and its matrix are at a positive voltage electrons will hit the phosphor surface.
The IVL2-7/5 is controlled with an anode voltage of around 24V for the matrix and plates. The filament is heated with 2.4V AC. The AC is needed to even out the voltage difference between the filament and the anode. If DC is used, the side closer to ground will be at a higher voltage difference (0-24V vs 2.4-24V) and may be brighter than the other side. In practice the difference is hardly noticeable.
Step 2: Testing
Initially I didn't have a datasheet for the display, so I had to resort to trial-and-error testing. The filament pins can easily be found by measuring the resistance between them as it should be in the order of tens of Ohms. All the other pins are either a short or open circuit.
In the end I found the original datasheet, so this wasn't really necessary...
Step 3: Circuit Design & PCB Layout
The watch was designed with the following specifications in mind:
- Run (briefly) from a AA alkaline battery
- Compact size
- Wifi & Bluetooth
- Easily programmable
The brain of the watch is an ESP32 (Wroom-32 module) as it can be programmed via Arduino and has build in Wifi/Bluetooth and a very low power sleep mode. To interface with the ESP32 a FTDI USB-Serial converter was used.
The most challenging part of this project was to get the different power supply correctly designed. The VFD needs 24V for its anode and ideally 2.4V AC for the filament. The ESP32 also need its share of 3.3V at more than 240mA when heavily using wireless communications. All that has to be squeezed out of a 1.5V AA alkaline cell.
Early on the 2.4V AC was replaced by just using 3.3V on the filament and modulating the output with an H-bridge to not burn up the filament. It actually can survive 3.3V for a bit, but quickly turns into a light bulb...
The 3.3V is generated using a MP3120 boost converter, that is specifically designed to work with single cell alkaline batteries. It can theoretically go down to 0.8V, but in practice only at very low currents. But it has a built in linear regulator, that allows the use of batteries with higher than 3.3V voltage like 14500 lithium cells.
24V for the VFD comes also from a boost converter MCP1663. This one is less efficient due to the high step-up from 3.3V to 24V. The display also works at lower voltages down to 16V, but loses much of its brightness.
To switch the 24V on the display anodes 2 high-side switching ICs TBD63783A with a 16 bit I2C expander (MCP23017) are used. This can also be done with discrete PNP & NPN transistors, but due to limited board area I opted for the more integrated solution.
The whole design and layout was done with KiCad5.
Step 4: Assembly and Some Troubleshooting
The PCB were ordered from JLCPCB with black solder mask and gold plating (because why not...). The assembly was done by hand.
Initially the USB-Serial converter didn't work, but after some troubleshooting this was due to mixed up data lines on the USB connector, that were fixed with some bodge wires as seen in the picture above.
Step 5: Code
The software was written with Arduino using PlatformIO.
The full source code and design files can be found on GitHub:

Participated in the
Arduino Contest 2019
69 Comments
Question 2 months ago
Hello, this is a super cool project that I'm attempting to replicate. However, I'm new to the electronics game and have some questions. How does one program the ESP32 module, does it need to be programmed before being soldered onto the PCB or can I program it after everything is already put together. Thank you so much!
Answer 2 months ago
Thank you!
The ESP32 is programmed via the USB port on the PCB, so no need to pre-flash the chip.
Reply 2 months ago
Right on! That makes things easier, however another bump has hit the road. Whenever I try to open the pcb or schematic in Kicad it says that it has an error loading it along with a bunch of jargon and "line 1, offset 1." Is there any way I can fix this? I did some research but google wasn't very helpful. Thanks!
Reply 2 months ago
What version of KiCAD are you using?
Question 2 months ago
Is there a downloadable BOM for this project?
Thanks!
3 months ago
Hi, great project, this same cicuit could drive the bigger IVL1-7/5?
Reply 3 months ago
I don't have a datasheet of that display, but I'd say it should work too as long as the voltages are in a similar range.
1 year ago
Thank you soo much for your share! I've been searching so much to find some information about this tube on the internet and found your project. Now i got it to first run on the breadboard. More is coming, i first wanted to thank you especially for explaining how this tube works(everyting is Russian about this).
Question 2 years ago
First of all...a big thank you for sharing this wonderful project! I`m almost done with the pcb, just only waiting for the micro-usb socket to be able for programming in system. While waiting i trie to understand the code you`ve written. Have put it up to an evaluation board and enabled the serial to get the messages of the time (in main.cpp). There i get only shown the inital time the board gets through NTP. No counting up like i expected. I apologize for not being the crack in coding, so there`s the question if this is the wrong point (activating the serial output in main.cpp) to have a look wether the code is functional. Maybe you can give me a hint...
Cheers
Answer 2 years ago
Hey,
Great, that you're enjoying the project!
The program simply joins the configured WiFi and updates the time via NTP. After that the ESP keeps track of the time internally and therefore the WiFi is turned off again.
If you uncomment the Serial print line in the updateTime function it should print out the local time every 2 seconds. Otherwise it just sends the update to the display. On a dev board without the display it won't do much.
Let me know if that helped.
Best wishes.
Reply 2 years ago
Thank you for your instant reply. When uncommenting the Serial print line in the updateTime function i only get the time from the moment, when the esp32 connects the timeserver via NTP. Every two seconds it shows the same time like 20:15:12 ... 20:15:12 ... 20:15:12 ... 20:15:12 ... 20:15:12 and so on. There is no update in the time visible in the terminal. I expected to see the ongoing local_time like 20:15:12 ... 20:15:14 ... 20:15:16 ... 20:15:18 ... 20:15:20 ... from the esp32 in the terminal to be shure that the code is running well. For being shure that the code is doing well i checked it out on the dev board. But there`s my limitation in coding. I`m not able to find out, if the code gives really the ongoing time via the Serial to the terminal. That`s why i asked which time the terminal will show. In fact, there is no update in the time visible...
Best regards
Reply 2 years ago
Changing from "Serial.println(&local, "Date: %d.%m.%y Time: %H:%M:%S"); // print formated time" to - "Serial.println(time, "Date: %d.%m.%y Time: %H:%M:%S"); // print formated time" did the trick. The expression "&local" didn`t contain the internal time from the esp32. Using the expression "time", the same that is used for updating the vfd, was solving the problem. Now the terminal is showing the continuing time :-)
Reply 2 years ago
Glad you could figure it out!
I changed the time variable at some point and didn't update the comment.
I hope your board works once the connector arrives ;-)
Reply 2 years ago
So finally the watch is build ... in the first shot ... without a fault. Thank you again for your efforts in coding and constructing!!!
Next stage is to customise the brightness. Although it looks great in the picture (because i made the pic in a darker enviroment ), the brightness is in reality not enough. I spent a few hours in looking in the code in order to increase the PWM with the value "dutyCycle", but unfortunately i didn`t find the place where the value could be set higher. Maybe you can give me a hint for this.
Next thing i would like to change, and this can`t be done by me because of missing ability in coding, is disactivating the display for four seconds and activating for one second and so on. It would be a great benefit for the battery life if you have the time and the interest in a further developement by coding the deactivation for four seconds and activating for one second.
Cheers
Question 2 years ago on Introduction
Hi, I'd like to attempt this project and wanted to ask, if you have a complete list of components and gerber files for the pcb? It would be very much appreciated!
Answer 2 years ago
Hey, did you have a look at the GitHub page? There should be everything you need.
Let me know if something is unclear.
3 years ago
Hi, I am Alexander and I am from Ukraine!
I repeated your project, please explain to me how can I program the U6 ESP32-WROOM module?
How can I check if the "Battery voltage regulation" and the "VFD driver" are working correctly, at what control point should be 24V? How can I measure it?
Thank you waiting for an answer from you ...
Reply 3 years ago
Здравствуйте, Александр, хочу задать вам вопрос - как вы нашли перечень компонентов с нужными обозначения и?
Reply 3 years ago
1;"R19,R18,R5,R6,R9,R12,R13,R14,R15,R16,R17";"R_0805_2012Metric";11;"10k";;;
2;"C19";"C_1206_3216Metric";1;"10uF";;;
3;"U10";"ILV2-5_7";1;"IVL2-7_5";;;
4;"REF**,REF**,REF**,REF**";"Strap_Holes";4;"Strap_Holes";;;
5;"U6";"ESP32-WROOM";1;"ESP32-WROOM";;;
6;"U8,U9";"SOP-18_7.0x12.5mm_P1.27mm";2;"TBD62783A";;;
7;"U4";"SSOP-20_3.9x8.7mm_P0.635mm";1;"FT231XS";;;
8;"J2";"PinHeader_1x04_P1.27mm_Vertical";1;"I2C_Con";;;
9;"U7";"SSOP-28_5.3x10.2mm_P0.65mm";1;"MCP23017_SS";;;
10;"REF**,REF**,REF**,REF**";"Wire_Holes";4;"Wire_Holes";;;
11;"U1";"SOT-23-5";1;"MIC5219-3.3YM5";;;
12;"L2,L1";"L_Taiyo-Yuden_MD-5050";2;"10uH";;;
13;"BT1";"BK-92";1;"AA BK-92";;;
14;"C1,C2,C5,C6,C8,C11,C12,C14,C15,C16,C17";"C_0805_2012Metric";11;"4.7uF";;;
15;"C3,C4";"C_0805_2012Metric";2;"47pF";;;
16;"C9,C10,C18";"C_0805_2012Metric";3;"100nF";;;
17;"C13";"C_0805_2012Metric";1;"1uF";;;
18;"D1";"D_SOD-323";1;"D_Schottky 40V 1A";;;
19;"J1";"USB_Micro-B_Molex_47346-0001";1;"USB_B_Micro";;;
20;"Q1";"SOT-363_SC-70-6";1;"MBT3904DW1";;;
21;"R1,R2";"R_1206_3216Metric";2;"0R";;;
22;"R3,R4";"R_0805_2012Metric";2;"27";;;
23;"R7";"R_0805_2012Metric";1;"1M";;;
24;"R8";"R_0805_2012Metric";1;"640k";;;
25;"R10";"R_0805_2012Metric";1;"1.05M";;;
26;"R11";"R_0805_2012Metric";1;"56k";;;
27;"SW1";"SW_SPST_EVQP7A";1;"B1";;;
28;"SW2";"SW_SPST_EVQP7A";1;"B2";;;
29;"SW3";"SW_SPST_EVQP7A";1;"B_RES";;;
30;"SW4";"SW_SPST_EVQP7A";1;"B_0";;;
31;"U2";"WSON-8-1EP_2x2mm_P0.5mm_EP0.9x1.6mm";1;"DRV8837C";;;
32;"U3";"TSOT-23-6";1;"MP3120";;;
33;"U5";"TSOT-23-5";1;"MCP1663";;;
34;"C7";"C_0805_2012Metric";1;"470pF";;;
Reply 2 years ago
MCP1663 - где можно найти?