Klockor är något som jag alltid varit fascinerad av. Det finns många sätt att visa tidens gång och här är ett av dem.

En digital klocka som uppdaterar sin tid via en NTP-server på internet.

Eftersom jag använder en Wemos D1 Mini så tycker jag det faller sig naturligt att skriva klockan i micropython. Den inbyggda realtidsklockan är tyvärr inte så exakt så den uppdateras en gång i timmen via nätet.

Komponenterna är, som sagt, en Wemos D1 Mini bestyckad med en ESP8266. Tiden visas på en 4-siffrig 7-segment display driven av en TM1637 via I2C. Det här är varianten med ett kolon istället för punkter.

Wemos D1 Mini
TM1637 modul

Inkopplingen kan knappast bli enklare med bara fyra sladdar mellan modulerna. Se nedan hur de ska kopplas ihop.

Programmet är också enkelt.

Biblioteket som krävs för att driva displayen kan hämtas på Github.

C:\Users\gorgu\Desktop\1637_clock.py
 1 # Enklast möjliga klocka i micropython för
 2 # en Wemos D1 Mini med en TM1637-display.
 3 #
 4 # Tiden hämtas från nätet.
 5 #
 6 # Biblioteket för att driva displayen
 7 # kan laddas ned från Github:
 8 #
 9 # https://github.com/mcauser/micropython-tm1637
10 #
11 # Wemos  TM1637
12 #  D1     CLK
13 #  D2     DIO
14 # 3V3/5V  VCC
15 #  G      GND
16 
17 # Här importerar vi lite funktioner som krävs
18 import tm1637
19 import network, usocket, utime, ntptime
20 from machine import Pin
21 
22 # Namn och lösenord till trådlösa nätet
23 ssid = "SSID"
24 password = "PASSWORD"
25 
26 # flagga som håller reda på om kolon ska vara tänd eller släckt
27 flg=False
28 # Tidszon
29 TZ=1
30 # Sommartid/vintertid, 1=sommartid, 0=vintertid
31 DST=1
32 # Räknare för att hålla reda på när klockan ska uppdateras
33 cnt = 0
34 
35 
36 # Funktionen för att ansluta och hämta tiden från nätet
37 def GetNTP():
38     wifi = network.WLAN(network.STA_IF)
39     wifi.active(True)
40     wifi.connect(ssid,password)
41     while not wifi.isconnected():
42         pass
43     try:
44         ntptime.settime()
45         retVal = True
46     except:
47         retVal = False
48         
49     wifi.disconnect()
50     wifi.active(False)
51     return(retVal)
52 
53 
54 
55 tm=tm1637.TM1637(clk=Pin(4), dio=Pin(5))
56 tm.brightness(7)
57 
58 # Huvudloopen som körs två gånger per sekund
59 while True:
60     if cnt <= 0:
61         tm.show('net ',False)
62         tmp = GetNTP()
63         if tmp == True:    
64             cnt=3600
65         else:
66             tm.show('Fail',False)
67             utime.sleep(3)
68     
69     localtmp=utime.time() + TZ * 3600 + DST * 3600
70     localtime = utime.localtime(localtmp)
71 
72     h=localtime[3]
73     m=localtime[4]
74     tm.numbers(h,m,flg)
75     if flg==True:
76         flg=False
77         cnt=cnt-1
78     else:
79         flg=True
80 
81     utime.sleep(0.5)

Så fort klockan slås på så försöker den ansluta till internet för att hämta aktuell tid. Detta visas på displayen enligt bilden till vänster nedan. Om inget händer på några minuter eller om ett felmeddelande som det på bilden nedan till höger  visas så har det uppstått något problem.

Kontrollera att inloggningsuppgifterna stämmer och att routern är påslagen. Andra problem kan vara att klockan befinner sig utanför räckvidden för nätverket.

När allt är påslaget och uppkopplat så kommer tiden att uppdateras en gång i timmen.