Being slightly annoyed that NXP obsoleted the SAA1064 chips used
in clock version 3, I decided to design fourth, and maybe final
version. I wanted to to retain all good features of version 3 and
add some new. I also targeted to lower the cost of parts, as the
Maxim DS3231 is very expensive and the SAA display drivers were
not too cheap either. So the LED drivers are replaced with
TLC5925, and RTC is changed to PCF2129. On circuit design the swap
of these parts was quick, but on FW side a little slower, as I had
to write the drivers.
Meanwhile the cost of factory made PCB from China has dropped
also for bigger boards, so there wasn't need for singled side
design anymore, as used in my previous version clocks.
The version 4 uses same 58 mm (2.3") displays as version 3. There are compatible displays available from several manufacturers. The displays must be common anode type. Suitable displays are e.g. Sharlight CM1-2302 series, Kingbright SA23-11 series and also most of the 2.3" displays from eBay.
The best matching flat top LED for the cheap eBay displays that
I've found is Kingbright WP483SRSGW (or older code Kingbright
L-483SRSGW). This is actually bi-color LED but when mounted as in
assembly drawing, it lights red. I've also used shrink tube around
the LEDs to prevent light leakage from side.
Previous clock used the internal temperature sensor of the DS3231
RTC to show temperature. This wasn't however giving accurate
readings since the power dissipated by displays and drivers was
heating the RTC. Version 4 has connectors to fit two external NTC
thermistors to measure inside and outside temperatures. Suitable
thermistors are available from eBay. They have 10 kohm
resistance beta value of 3950. The thermistors have an XH
connector at one end, which is a Chinese copy of JST
XH series connector. You can use either the genuine JST or
the Chinese replica on the PCB. According to my measurements these
thermistors follow very closely to this
chart on Adafruit website. I measured one thermistor in ice
water 31.87 kohm and in boiling water 652 ohm. The firmware has an
array based on the Adafruit table and in practice the displayed
temperature value seems to follow very closely to a commercial
The remote control support is improved. The firmware supports
Nec, Nec42, Samsung, SIRC, JVC and RC-5 protocols. It also has a
learn function which can be used to teach it to work with any
remote which uses one of the supported protocols. You can use e.g.
an old TV or DVD remote control to control the clock. The IR
receiver should be chosen based on the carrier frequency used by
the protocol. SIRC uses 40 kHz, RC-5 uses 36 kHz and the rest use
38 kHz. However, the 38 kHz works quite well also for SIRC and
RC-5. An example of suitable 38 kHz receiver is Vishay TSOP53438.
It is cheap, sensitive and has good noise rejection.
Time base of the clock is derived from PCF2129AT. It also
provides battery back-up. The power consumption of the RTC is 2.15
µA when in backup mode. A CR2032 battery has a typical capacity of
190 mA so it should last for over 10 years. Of course when clock
is getting power, the battery is not drained. The PCF2129AT is
temperature stabilized and the accuracy is very similar to DS3231
for only fraction of price.
A piezoelectric buzzer can be used to give audible alerts.
Currently there is possibility to configure it to hourly beep but
it could of course be used for other alarms. The buzzer needs a
higher voltage to give loud enough sound. The direct drive from
PIC pin shown on 3.0 schematics is not enough, it needs to be
driven from the input supply voltage. I will update the design at
some phase. There is also an IR emitter LED which could be used to
control e.g. a TV on at a certain time of day, or it could be used
to sync several clocks to same time base. Currently the IRED
doesn't have support in FW.
There is also a footprint for U-blox (former Fastrax) UC530M GPS
/ Glonass module. The firmware has automatic recognition for GPS
module and PCF2129 RTC. It works with eiher one, or both. The
firmware only uses the time and date from GPS, derived from GPRMC
The schematics are pretty straight forward. The PIC16F1788
firmware makes most job.
Input voltage is fed to connector X1. It should be high enough to
be able to drive the chain of 4 LEDs in each segment. For red
displays this is typically around 7.5 V. Then the output stage of
TLC5925 needs an additional 1.0 V to maintain regulation. A 12 V
power supply is OK for most display types. To save some power, 9 V
supply is usually also OK. Voltages up to 17 V can be used (or up
to 16 V if using MCP1703-3302E/DB as regulator IC6), but this
causes just more power wasted and heat generated in the display
drivers. Diode D1 protects from incorrect supply polarity, but for
over voltage there is no protection.
The displays are driven by three TLC5925 constant current LED
drivers. They are controlled via SPI bus from PIC. The LED current
is set with a resistor in R-EXT pin on the TLC5925. Current at
each output is 18 times the R-EXT pin current. Now a little trick
is used to allow global brightness control of all segments. The
integrated DAC and integrated op-amp of PIC is used to control the
low sides of R-EXT resistors. This allows easy brightness control
without using PWM and without all the disadvantages associated
GPS / Glonass module UC530M is configured to use it's internal
antenna, so the only external component it needs is a bypass
capacitor. It is connected to the PIC via UART. Main purpose of
the module on this clock is to provide automatic and accurate time
26.3.2017 Circuit diagram v4.0.
The PCB for the clock is again designed using Cadsoft Eagle
version 5.12. The design is double sided, and design rules are
quite relaxed. Most of the components are SMD and on bottom side
of board. Only the parts which need to be visible or are too high
for bottom side are on top. This minimizes board area since the
displays fill up the top side of board almost completely. Segment
order for display drivers is same as in previous version. It
allows simple routing of all segment signals in one layer. This
causes some more work in display driver source code, since the
segment order is different for the two displays controlled by one
I have produced the boards at seeed studio. They have
the best price for this size of board. The quality of boards was
flawless. Also a very nice addition was that they sent a photo of
the ready boards to email when they were shipped. The boards have
black solder mask which makes the clock look very sleek if you use
smoke tinted plexiglass over it. You can order these boards from
Seeed from here.
A Digi-Key shared cart which has all the parts except GPS module and joystick switch, click here. The Alps SKQUCAA010 joystick switch is available from RS (P/N 516-316) and Farnell (P/N 1435775). A directly compatible substitute is available from eBay.
The Eagle design files, Gerbers and assembly drawing can be
kello_hw_v40.zip 26.3.2017 Schematic and board file, designed with Eagle 5.12.
kello_v40_assy_dwg.pdf 29.12.2017 Assembly drawing including bill of materials
kello_v40_gerber.zip 26.3.2017 Gerber and drill file package. Generated with Seeed_Gerber_Generater_2-layer.cam
The firmware for the clock is written with CCS PIC-C Compiler. The
source files package including compiled .HEX file are available
for download below.
The IR receiver code was originally based on San
Bergmans's NEC reveiver code and RC-5
receiver code. I have thus simplified them a bit and
converted to C. Also the RC-5 code is improved such that it syncs
the receiver on each received bit. This makes it much more
tolerable to different remotes which may have slightly different
timings. The JVC, Samsung and SIRC receiver codes are written by
me but basically they work with same operating principle (timer
interrupt driven state machine). I have also added auto
recognition, so the IR decoder state machine identifies the code
it receives and processes accordingly.
The GPS receiver code is based on code
from CCS customer forums code library posted by PICoHolic.
The code for Bosch BME280 temperature, atmospheric pressure and
relative humidity module comes with the CCS compiler. For PIC16
series of chips, the compiled code can be too big to fit in memory
segments if all code is inline. This can be solved by adding a
#separate directive before int32 _bme280_compensate_H_int32
function. This forces the compiler to realize this function as
separate, not inline, and allows the code to fit in the memory
All the rest of the code, including drivers for TLC5925 and
PCF2129 chips is developed by me. You can freely use and modify
them for your own use, but use of them for commercial purposes is
prohibited without written permission from me. You can find
contact info at beginning of the source files or at bottom of this
page created 25.12.2017
last updated 3.2.2018 firstname.lastname@example.org