The Network Time Protocol (NTP) has revolutionized the world. Suddenly one could have anywhere in the world accurate time and date. NTP is a simple UDP based protocol and can be implemented in a Microcontroller.
Using the tuxgraphics ethernet board and a LCD display we build a nice clock which gets time and date via NTP. Just attach it to you DSL router!
A NTP client
The NTP protocol is described in RFC958. Essentially it is just a 64 bit time-stamp. 32 bits of this time-stamp are the seconds in UTC (=GMT Greenwich mean time) since since Jan. 1st 1900. The other 32 bits are fractions of a second. In other words NTP can be very very accurate. For our purposes it is however enough if we just evaluate the seconds.
The AVR NTP clock synchronizes at startup with a NTP server and uses then a timer interrupt to maintain time locally. Every hour it tries then to synchronize again. If your DSL router is however off during the night then it's not a problem. The clock just continues. We use the on board crystal to maintain the clock locally. This will minimize the drift even if no Internet connection was possible for a couple of days.
For this we just generate a timer interrupt every second. The 16bit timer/counter of the atmega168 supports this already on hardware level.
The basic clock is therefore just this:
The hardware interrupt is generated every second and we step the counter "time". Very easy.
If you had already a look at the code you might have noticed that the included README file says that one needs an atmega168 for this and a atmega88 not sufficient. Why should such a simple counter not fit into an atmega88 chip??.
The problem is the math to convert seconds since day-X into a human readable format. This requires quite heavy math for a microcontroller. AVR is a 8-bit processor therefore 32-bit math is expensive. Add the NTP client, the web-server and the LCD driver and you are above the 8Kb available in the atmega88. An atmega168 has however more than sufficient space. It fills not more than 2/3 of the atmega168. You can therefore easily add additional functions to this wall clock if you want.
Все, что вам нужно это LCD дисплей, web сервер на AVR и SMD плата.
LCD дисплей 16х2 с голубой подсветкой и SMD плата AVR web сервера смонтированы на кусочке листа акрилового стекла. Для питания часов я использовал зарядное устройство от старого мобильного телефона Ericsson (не видно на рисунке). Зарядное устройство вырабатывает 5 вольт постоянного напряжения и при этом очень легкое так как в нем используется ключевой блок питания. Оно включается непосредственно в розетку, а выходное напряжение поступает в часы по кабелю диной 1,5 м. Я купил это зарядное устройство за 2 евро на ebay.
NTP часы, вид с переди.
The 16x2 LCD display with blue backlight and the AVR webserver SMD board are mounted on an acrylic glass sheet. For the power supply I used an old Ericsson Mobile phone charger (not visible on the picture). It produces 5V DC and is very light as it is a switched power supply. It plugs directly into the wall socket and the 5V DC output is then connected via a 1.5m cable to the clock. I got the charger at ebay for 2 Euro.
Using the clock
The X in the right corner is a status indicator:
'/': ETH link down
'|': ETH link up but NTP sever could not be reached yet. The clock tries to sync every hour. Thus if you cut your Internet connection during the night then you will see this character. Note that the clock will continue to run form the internal crystal.
The fields on that configuration page (URL http://ClockIP/config) are as follows:
It is also possible to use this clock if the NTP server to query is not in the internet but on the local LAN. In this case you just specify the NTP server address as both "NTP server IP" and "Default GW".
The web server has also a second page (URL http://ClockIP) where you can just see the current time and date as shown on the LCD display.
The NTP clock hardware
You can power the 3.3 V regulator of the ethernet board and the LCD display and the back light from a 5 V DC power supply. I used an old Ericsson mobile phone charger for that purpose.
Between atmega168 pin PB1 and VCC (3.3V) you can optionally connect a 270 Ohm resistor and a LED. The LED will then go on and off every second (blink).
Q: When I access the clock via the web browser then everything is fine. The LCD display shows however no time. I see just a row of squares.