Digital Clock/Thermometer using a Side-Lit LED Display

(C) 2022, G. Forrest Cook W0RIO

Displaying Temperature
Side-Lit LED display showing the temperature

Arduino interface circuitry
Side-Lit LED display interface circuitry

Displaying a Random Number
Side-Lit LED display showing a random number

Side-Lit LED interface Schematic
Schematic of the Side-Lit LED Arduino interface

Introduction

This project uses an Arduino processor to control a 1958-vintage milled plexiglass digital display for the purpose of displaying time and temperature. The circuitry is powered by either 5VDC from a USB connector, 9VDC from an Arduino power supply or 12VDC using a buck regulator circuit board. This project has been running continuously from a 12V solar-charged battery since 2022 when it was built. The DS3231 real-time clock is very stable and only needs to have its time adjusted whenever daylight savings changes.

The display was apparently part of an early digital voltmeter, based on the +/- and AC symbols on the left digit. It was purchased from a surplus electronics dealer and came with no electronics. The construction consists of an aluminum frame with milled channels that hold stacks of plexiglass pieces. Numbers, decimal points and other symbols were milled into the plexiglass pieces. When light is shined through holes in the aluminum frame onto the sides of the plexiglass pieces, individual numbers light up. The display has an appearance that is similar to a large neon NIXIE tube. Originally, the display would have been illuminated by small incandescent or neon bulbs. The numbers are 1" tall and the display front is approximately 8"x3".

The display is made from 100% unobtanium and is a one-of-a-kind device. There is a small company known as Lixie Labs which has manufactured similar displays in the past. Unfortunately, the company appears to no longer stock the digits. An ambitious person with a numerically controlled mill could produce the required digit plates and make their own display.

Theory

A total of 24 bits of information is serially shifted from the Arduino microcontroller to the interface board which controls the LED display. The interface board uses three 74HC595 shift register/latch ICs which control four 74LS145 decoder/driver ICs for driving the 40 indivicual digits. A 6 bit 75492 driver IC controls the four decimal points and the +/- signs. a more common ULN2003 IC could be used here with appropriate pinout changes. An 8 bit ULN2803 could be also be used if the builder wants to use all 8 outputs from the third shift register. The AC sign from the original voltmeter application is not used.

The display's LEDs are ultra-bright 505nM Aqua-colored parts. They were chosen because of their high brightness and pleasing color. Different colors of LEDs could also be used, but they should be ultra-bright types. The LEDs are driven through 100 ohm and 120 ohm current limiting resistors which set the operating current around 15mA. These resistors should be increased in value if you want to drive lower-voltage LED colors such as red or orange. The decimal points and +/- signs are driven at a lower current level since the symbols are at the front of the display and require a bit less brightness.

5V DC power for the interface board is sourced from the Arduino's 5V bus, a few bypass capacitors are used for de-glitching the shift register circuitry. A 1N4001 diode is wired across the interface board's 5V bus and ground lines, it prevents reverse polarity from being applied to the interface chips in the event that the power pins are incorrectly connected to the Arduino. An optional red LED and current limit resistor are installed on the interface board as a power indicator.

A Dallas DS3231 I2C real-time clock chip is connected to the Arduino's I2C bus via the SCL and SDA pins. The clock chip also requires connection to the Arduino's +5V and ground pins. Adafruit sells a nice DS3231 breakout board that includes a small lithium battery holder.

Here is the Arduino Source Code for the project. Several additional libraries need to be downloaded into the Arduino development system to support the temperature sensor. These include: SPI, OneWire and DallasTemperature. The Adafruit RTClib and BusIO libraries are required for the DS3231 clock chip.

Construction

The interface board was built on a perforated prototype board using IC sockets and point-to-point soldered wiring. Wire-wrap wire was used for most of the connections and 22 gauge tinned bus wire was used for the +5V and ground buses. The connections between the interface board and the LED array was done with rainbow ribbon cable. Connections between the interface board and the Arduino were done with stranded wire and pin headers. It is important to test the interface board before wiring up all of the LEDs, this minimizes cable flexing which can break off the LED pins.

The individual LEDs were mounted in the holes on the display assembly and secured with hot melt glue. The five common LED cathode buses were wired together and brought back to the interface board with another ribbon cable. Be sure to use a heat sink when soldering to the LED pins, LEDs are extremely sensitive to overheating.

The Arduino and interface boards were attached to pieces of blank PC board using threaded standoffs and 4-40 machine screws. The blank PC boards were attached to the back of the display assembly using hot melt glue.

A wooden case to hold the display is in the planning stages. Three pieces of wood will be cut for the bottom and sides. A clear piece of plexiglass will be cut for the top so that the back side of the LEDs will be visible. A thin piece of wood or circuit board material will be added to the back to protect the electronics.

Use

Operation of the clock and thermometer is fully automatic, just power it up and watch it run. On power-up, the software runs a short animation sequence through the decimal points and minus sign, then it displays the number of temperature sensors. After that, it goes into the main display loop. The main loop alternates between displaying time and temperature, it can also optionally display a sequence of random numbers. The software automatically finds out how many temperature sensors are connected, then displays each of them before looping back to show the time. The random numbers are just eye candy to show off the capabilities of the display, the digits randomly jump around for a few seconds to make a nice 3D light show.

The real-time clock should keep accurate time for a number of years once it has been set. If the software detects that the real time clock chip has lost battery power, it will set the clock to the time of the most recent compile.

There are three time-set pushbuttons connected the Arduino's digital input pins 5, 6 and 7. The input pins all have 4.7K pull-up resistors connected to +5V, the pushbuttons ground each of the input pins when pressed. To set the hour, press the button on pin 5 and wait for a 2 digit display to start incrementing, release the button when the hour is correct. The button on pin 6 sets the minutes in the same manner as the hours setting. The button on pin 7 holds the seconds at zero, counting resumes when the button is released. To set the time accurately, adjust the minutes one minute forward, then press and hold the seconds zero button until the reference time reaches 0 seconds.

Project Extensions

Multiple temperature sensors can be added to the device with no changes to the software. Additional DS18B20 temperature ICs can just be wired in parallel with the first sensor. Each DS18B20 has a unique serial number and will show up in the software with a different index number, starting at 0.

Remote temperature sensors should be wired using shielded wire to keep nearby lightning strikes and other noise from corrupting the data or even destroying the Arduino. The shield wire should be grounded at the controller side and left floating at the sensor side.

There are two unused bits on the third 74HC595 shift register, these could be used to directly drive two LEDs to indicate Celsius or Farenheit or Inside/Outside temperature. The two extra bits could also drive a 2-to-4 line demultiplexer IC such as half of a 74HC139 or 74HC155 to light up one of four LEDs or one of three LEDs and LEDs off for the fourth state. Three LEDs could be used to indicate inside/outside temp and PM (time).

The sensor software can be easily be modified to display the temperature in either the Farenheit or Celsius scales by setting the units variable to 0 or 1 in the setup function. It would be an easy code change to select either scale by reading the state of a switch or jumper on one of the Arduino's digital I/O pins.

It would be relatively easy to modify this circuit for use with neon NIXIE tubes. The driver chips would need to be changed to high-voltage chips that can handle the 90+ volts that are required for NIXIEs. The software should be able to control NIXIEs without any changes.

An LM2596-based DC to DC converter board can be purchased on eBay for a few dollars, this can be used to run the clock on 12VDC (nominal) power. When run directly from 5VDC, the clock draws around 120mA peak. Running the clock on 12V from the LM2596 board consumed around 80 mA peak.

Back to FC's Arduino Circuits page.