The Year 2038 problem is a problem in which time values are stored as
a signed 32-bit integer, and this number is interpreted as the number
of seconds since 00:00:00 UTC on 1 January 1970. In such
implementation, after 2038-01-19 03:14:07(UTC), the variable will
overflow and may cause system failure.
For more, see wikipedia.
This device counts down the time to the moment that the year 2038
occurs. It continuously calibrates the internal RTC by accessing an
ntp server.
In this device, the year 2038 problem do take place.
if (dispmode == MODE_UNIXTIME) {
dispDigits(now.unixtime()-SECONDS_UTC_TO_JST);
} else if (dispmode == MODE_COUNTDOWN) {
dispDigits((0x7FFFFFFF - (now.unixtime()-SECONDS_UTC_TO_JST))); // y 2038!
} else if (dispmode == MODE_CLOCK) {
dispClock(now);
} else if (dispmode == MODE_DATE) {
dispDate(now);
}
Just casting values in dispDigits()
by (int32_t)
makes things fine.
Materials
- Micro controller: ESP-WROOM-02
- LED driver IC: HT16K33
- 7 segment LED x 4: OSL40562-IB x 2 (anode common)
- 7 segment LED x 1: OSL10561-IB x 2 (anode common)
- RTC: DS1307
- 32kHz Crystal
- push switch (vertical)
- CR2032 battery holder
- PCA9306 I2C level converter
- Original PCB
Hardware
To say simply, this is a 10-digits 7-segment LED display with WiFi
connection.
Software
I used Adafruit HT16K33 Arduino library (Adafruit_LEDBackpack
) for
driving 7 segment LEDs. However, this driver is written for
cathode-common LEDs. So I inherit the Adafruit_LEDBackPack
class and
modified display method for anode common LEDs (Anodecommon_7seg
).
The clock is always calibrated by ntp service and RTC with battery
stores time even if the power is not supplied.
API
This device provides HTTP service and REST API.
API | parameter | value | effect |
---|---|---|---|
mode | value | int | change mode |
status | — | — | show status |
config | timezone | string | change local timezone |
countdown | date | string | set user-specified countdown timer |
time | string | ||
timezone | string |
$ curl http://esp_7seg.local/status
{"unixtime":1517957705,"countdown":629525942,"mode":0}
$ curl "http://esp_7seg.local/mode?value=2"
{"mode":2}
Web Interface
By accessing assigned URL (default: http://cc2038.local/ ), you can use user-specified countdown feature easily.
GitHub