IV-18 Vacuum Fluorescent Display NTP Clock

IV-18 Vacuum Fluorescent Display NTP Clock

This clock uses an interesting old Russian Vacuum Fluorescent Display (VFD) tube, the IV-18 which was also used by Adafruit in one of their designs, the "Ice Tube" clock. It is a quite attractive 8 digit, 7 segment display with 2 additional symbols, used here for status information. Some eBay retailers still have a few in stock.

The MCU is an ESP8266 based Wemos D1 mini. This runs the Network Time Protocol (NTP) software and feeds an HV5812 20bit shift register which drives the display tube. Since the ESP8266 is a 3.3 volt device, a level shifter SN74HCT14N is used to provide the three 5 volt signals needed for the shift register. Because the SN74HCT14N's buffers are inverting, 2 are cascaded together for each signal.

The IV-18 is a standard VFD seven segment construction. Each digit is made up of 7 segments plus a decimal point. The same segment in each of the 8 digits are connected together in parallel as in any typical multiplexed 7 segment display. These are driven at +35 volts in this application. For each digit, there a dedicated grid and this is used to determine which digit is currently displayed. The grid of the selected digit is again driven at +35 volts. There is also a heater, a pair of fine wires spanning the entire display. This driven at 5 volts and also forms the display cathode. Display dimming in low ambient light is managed by running blank cycles within the multiplexing schedule.

Special in this design is the use of a dedicated VFD filament driver chip, the LM9022. This chip is obsolete but available from some eBay retailers. The LM4871, which is more readily available, is reported to be a valid substitute. These use a bridge to alternate the polarity of the 5 volt heater supply at, with the components selected in this design, a frequency of 25kHz. The idea is to reduce the impact of a luminosity gradient across the display, which may be caused by the cathode being 0v at one end and +5V at the other end. I also did an experiment driving the heater with 5 volts DC and noticed only a very slight dimming at one end of the display, so this additional complexity may not actually be necessary. However, there are also reports of a noticeable luminosity gradient with some samples of the IV-18. There is also a potential software solution which would be to vary the multiplexing 'on' time to increase the perceived brightness of the affected digit positions.

The boost converter and filament supply are switched on by a load switch (TPS27081ADDCR) which has a selectable slew rate. Without this, the high inrush current to the boost converter could cause a problem for a PC USB port (usually limited to 500mA). Standard 5 volt smart phone chargers however had no such difficulty. It is recommended that if you decide, however, to dispense with this load switch, that you have a jumper to isolate the boost converter so you can still, without difficulty, connect the clock to a PC USB port for programming or troubleshooting etc.

An optional real time clock (RTC) chip has been specified, the DS3231 together with a backup battery, and is used if a time cannot be obtained via the WLAN. This is really only of benefit where the power supply and WLAN are unreliable. These can simply be omitted without any software or configuration changes. It would then also be possible to omit the 2 pullup resistors on the I2C lines, however, that would then require a software change to prevent I2C transactions hanging. If you decide to use a ready made DS3231 type module, and you use a standard (non-rechargeable) CR2032 cell, you should disable this module's charging circuit by removing a resistor (see the description in the speaking clock link below). The clock automatically compensates for DST changes. There is a configuration option to enable the date to be displayed periodically, scrolling across the screen.

An optional buzzer is also specified for future development. No supporting software routine to drive it is supplied here.

The design uses 2 printed circuit boards (PCB), one for the IV-18 tube with the HV8512 driver chip. The other for all the remaining components. The benefit of having the driver chip on the tube board is that only 8 interconnections are then needed between the two PCBs. The layout was done using Kicad and the PCBs produced by A..L..L..P_C_B . com

The software is very similar to that of other NTP clocks I have published. The differences are mainly in the display driver routines. In the case of this clock, an image of the grid and segments for the currently displayed digit is pushed out to the shift register display driver, with a period of 1 mS, to reduce visible flicker. For a fuller description of the software and a user manual including how to configure it with the WLAN credentials, time zone etc., see a similar example which has complete documentation:

micro clock Arduino ESP8266 based micro NTP Clock - Exhibition / Gallery - Arduino Forum
speaking clock Arduino ESP8266 Speaking Clock - Exhibition / Gallery - Arduino Forum
nixie clock Six Digit Nixie Clock - Exhibition / Gallery - Arduino Forum

The software and schematic diagram appear as attachments below.

VFD_IV-18_V0_01_Schematic.pdf (76 KB)

clock_esp_IV_18_v0_02P.zip (30.3 KB)

3 Likes

Hello,

I made my first nixie clock, it is a bit like "my first nixie, by Playschool" :baby:

The Hardware is quite simple, a IV-18, a Wemos D1 mini and a small SOP-4 adapter for the 20 bit VFD driver MAX6921awi. the 30V is from a DC-DC converter.
No PCB, simpler, you die.
(got it here: IV18 WIFI VFD nixie clock (PCB less) by aeropic - Thingiverse )
image

it works from scratch, just the brightness at 0, but the big dot on the left was on before being connected to the wifi.

unfortunately, the firmware is quite awful. : you must enter http://192.168.4.1/?B=80 to set the brightness to 80% :cold_face:
I thought I could make something better. but no... I am not good programmer enough.

I saw your project,
Your firmware is so much better !!! exactly what I would liked to do it.

I tried to adapt it to my clock, modified the GPIO as follow:

Data D4 -> D5
Clock D0 -> D7
Strobe D7 -> D6
Blanking D8 -> D8 (but I had to ground it to light the digits.)

I could compile it with Arduino IDE, it works, except that the segments are completely scrambled.
good point, the hardware is compatible, I will just have to remap the segments and the grids.

so easy to say, but I didn't succeed in anything…
I made the pin connectivity of the two clocks, to see the differences.

Here they are:

IV-18		MAX6921		HV5812
pins		my board	your clock

Segment-a	out00		hv13
Segment-b	out02		hv15
Segment-c	out05		hv18
Segment-d	out06		hv19
Segment-e	out04		hv17
Segment-f	out01		hv14
Segment-g	out03		hv16
Segment-pt	out07		hv20
Grid-1		out18		hv08
Grid-2		out11		hv01
Grid-3		out17		hv07
Grid-4		out12		hv02
Grid-5		out16		hv06
Grid-6		out13		hv03
Grid-7		out14		hv04
Grid-8		out15		hv05
Grid-9		out19		hv09 

(only 2 segment on this grid-9)


here is my clock with your firmware.
I also don't understand what is the purpose of the display.cpp regarding the display.h ?

Help !!!

Best regards from Paris,
Benoit.

That is a very nice looking clock. The mapping of the digits (grids) and segments (anodes) is complicated in my design because I optimised the PCB layout between the IV-18 tube and the HV5812 driver/shift register. Since the IV-18 seems to have a random ordering of the grids and anodes to base pins, I followed that and tidied it up in software.
The 2 tables in display.cpp (SEG1 and SEG2) and the following switch statement have to be changed to respect your pin mapping.It is already a good sign that you can get something, albeit garbled, on that display.

Here is my attempt to convert the mapping to match your wiring, based on the table you suppliied. Simply replace the old display.cpp with this :
Display.cpp (15.7 KB)

The Display.h file is the class interface and the .cpp file contains the implementation. It is quite a standard way of constructing libraries and both are required.

Hello,
Thanks for your help.

When I start the Clock with the original FW,
I had a first phase with just the first character on the left side of the tube lit at 100% brightness.
then the second phase with the Network initialisation and the hour is displayed with some software dimming. of course if the dimming is too strong, you don't see anything.

with your FW, at the first phase, all segments are lit. 8 x (7 +1) + the two mostleft '°' and '-'
It is Christmas :slight_smile:
at the second phase, nothing is displayed. the tube is definitively blanc.

of course, the clock is running, here are the serial output:

custTzStdHour: (0) 
custTzStdOffset: (0) 
custTzDstWeek: (0) 
custTzDstDow: (1) 
custTzDstMonth: (1) 
custTzDstHour: (0) 
custTzDstOffset: (0) 
dacInputLevel: (32) 
playTime: (0) 
scrollDisplay: (0) 

Validating Eeprom.

WLAN Setup...   
Stopping WiFi
Connecting to WLAN
Starting/Restarting WiFi
.....
192.168.92.179
in setup_timeSync()
tzName: CET/CEST
RTC not found. No RTC sync will be performed
Triggering NTP update:
 INITIALISE 
time not set
 PENDING_UDP 
NTP hundredths of a seconds = (90).  Loopcounter (csCount)= (2) 
NTP time now:
17-06-2023 (Sat)  11:51:15
sync time when csCount has the value: (12) 
ntpSyncAgeMs() = (4294967295) 
delayed time sync. csCount = 12 
Arduino time now:
17-06-2023 (Sat)  11:51:16

Let's notice that I don't have any LDR installed.
I just add the switch on Rx
second thing, I don't have any logic converter between the D1 mini and the Max6921, but it works fine, maybe the MAX driver is more tolerant.

I tried with the Blanking signal grounded, the displays remain all segments illuminated, but no date or even some flickering segment.

in both case, the button works :slight_smile: but the tube remains in its state...

17-06-2023 (Sat)  14:26:43           ntpSync:1   WLAN:1
button press detected
17-06-2023 (Sat)  14:26:44           ntpSync:1   WLAN:1
button release detected
msgScroll::send(): 192.168.92.179

Did you make any changes to the code I supplied in post #5 ?
For example, these may not match your wiring:

const uint8_t clockPin = 16 ;     		// GPIO16 = D0
const uint8_t strobePin = 13 ;    		// GPIO13 = D7
const uint8_t dataPin = 2 ;     		// GPIO2  = D4

If everything is lit, it seems the mapping is not correct or the mulltiplexing isn't working. If you have made those changes and it is still not working I'll supply you with a barebones sketch which just writes some test data to the display. Once that is working, it should be a simple matter to get the rest of my code working.

There is no modification on the display.cpp

I had
const uint8_t hvEnablePin = 15 ; // GPIO15 = D8
in the ino file,
but if I comment it, it fails with hvEnablePin bot declared.

Just so I understand. Have you changed your hardware to match my software ?
That is, this table now matches how your current project is wired

const uint8_t clockPin = 16 ;     		// GPIO16 = D0
const uint8_t strobePin (LOAD)  = 13 ;  // GPIO13 = D7
const uint8_t dataPin = 2 ;     		// GPIO2  = D4

your config was not aligned with mine, so I modified the configuration files as follow :

Data D4 -> D5
Clock D0 -> D7
Strobe D7 -> D6
Blanking D8 -> D8
in the appropriates places in display.cpp and clock_esp_IV_18_v0_02P.ino

so you are right, i compiled the bad gpio values...
I just recompile it with:

with const uint8_t clockPin = 13 ; // GPIO13 = D7
const uint8_t strobePin = 12 ; // GPIO12 = D6
const uint8_t dataPin = 14 ; // GPI14 = D5

at the boot I have 1 2 3 9 5(without the g segment) 6 7 8 after the net init , it is blank.

with the gpio15 grounded, I have 
°- 18<space>59.<Space>54 (with the a segment added) 
the time is correct !!! just a few segments misplaced...

ah, the most left ° disepears, I just have the "-". 
it is back again, °-18.<space>11<space>08

quite perfect, just to see how ajust the brightness !!!!

:sparkler: :fireworks: :tada: :confetti_ball:

I don't fully understand what the current situation is but it appears that you are closer to seeing something recognisable. Show some pictures of the display with comments and I'll see what I can do to correct any mapping errors. I see one error already in that the digit 9 always has the decimal point lit.

The 5 have the following sements:
a, c, d, f. It just need to have the g

The 4 shouldn't have the segment a.

that's all I can say, I don't know what should be lit or not, for instance the dot or comma..

the scroll date works fine, It is the first time I can see 2023 with four digits :wink:

the ip address is Ok, the dots are not displayed, bus I don't know if they should...
we are not far from the perfection !!!

Download - UploadNow.io here is a video of the clock.


22h 23min 35sec


22h 23min 14sec

Regards,
Benoit.

I'm still struggling with the video but I have seen this:
Table const byte SEG1[12] in Display.cpp has some errors affecting the 4, 5 and 9.

0b11110100, // 4   should be 0b01110100, // 4 

0b11000110, // 5   should  be 0b11010110, // 5 

0b11110111, // 9  should be  0b11110110, // 9 

Hello,

I tried your modifications and added some more.

    const byte SEG1[13] = {
		// A F B G E C D dp
		0b11101110, // 0
		0b00100100, // 1
		0b10111010, // 2
		0b10110110, // 3
		0b01110100, // 4
		0b11010110, // 5
		0b11011110, // 6
		0b10100100, // 7
		0b11111110, // 8
		0b11110110, // 9
		0b00000000, // 10 - blank
		0b00010000,  // 11 - dash 
	    0b00000001  // 12 - decimal point 
	};

So I could add dash in the time HH-MM-SS and an underscore in the day DD_MM_YYYY

Everything works great.
Thanks a million time for your help !!!

Best regards,
Benoit.

I'm pleased it works now and that you have even been able to enhance it. If you make any significant modifications which might be useful for others then publish these with code and a schematic. On thing I am not happy about is the display dimming which works by inserting blanks in the multiplexing cycle. It works but can cause some visible flickering at very low ambient light levels where the maximum dimming is used. For more recent clocks (ATmega328p based) , I've started a (hardware) timer at the beginning of the multiplexing cycle and this, when it expires, depending on the light level, suppresses the display.

Hi,
I built this nice clock, but I have a problem. I have an active large dot and a segment below it. I wanted to modify it so that it goes off and instead there are dashes between the hours and minutes. Does anyone have such a modification? Thank you for your help.
Sorry have English, it's just a translator.

Did you build that clock based on the design in post #1? Did you make any modifications to it and are you using the IV-18 tube ?
The digits have a strange internal order. You can see in the routine Display.cpp that the indicator, which I think is what you mean by the dot and segment below it, is digit '8' in the code and the the remaining 8 digits are then numbered 0 to 7.
Do you simply want to stop displaying this dot and the segment below it ?

Yes, I'm using IV-18 and would really like to disable the display of position 8.

Hello,
my clock is working fine. But I would like to see the time for a longer time, maybe 5 minutes. when should I make the change?
Thank you for your help.

You haven't explained very well. Do you want to suppress the display in the red marked section shown below ?

What do you mean about seeing the time for a longer time ? Do you see it scrolling the date or what ?

Maybe also answer my questions in post #17