-
-
Save aallan/581ecf4dc92cd53e3a415b7c33a1147c to your computer and use it in GitHub Desktop.
import network | |
import socket | |
import time | |
import struct | |
from machine import Pin | |
NTP_DELTA = 2208988800 | |
host = "pool.ntp.org" | |
led = Pin("LED", Pin.OUT) | |
ssid = 'A NETWORK' | |
password = 'A PASSWORD' | |
def set_time(): | |
NTP_QUERY = bytearray(48) | |
NTP_QUERY[0] = 0x1B | |
addr = socket.getaddrinfo(host, 123)[0][-1] | |
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) | |
try: | |
s.settimeout(1) | |
res = s.sendto(NTP_QUERY, addr) | |
msg = s.recv(48) | |
finally: | |
s.close() | |
val = struct.unpack("!I", msg[40:44])[0] | |
t = val - NTP_DELTA | |
tm = time.gmtime(t) | |
machine.RTC().datetime((tm[0], tm[1], tm[2], tm[6] + 1, tm[3], tm[4], tm[5], 0)) | |
wlan = network.WLAN(network.STA_IF) | |
wlan.active(True) | |
wlan.connect(ssid, password) | |
max_wait = 10 | |
while max_wait > 0: | |
if wlan.status() < 0 or wlan.status() >= 3: | |
break | |
max_wait -= 1 | |
print('waiting for connection...') | |
time.sleep(1) | |
if wlan.status() != 3: | |
raise RuntimeError('network connection failed') | |
else: | |
print('connected') | |
status = wlan.ifconfig() | |
print( 'ip = ' + status[0] ) | |
led.on() | |
set_time() | |
print(time.localtime()) | |
led.off() |
Thank you for sharing this code.
I've been hitting a error if I I rerun the script. I cannot see why.
I've added a little at the end but do not see why that should cause the upset. I've updated to the current latest uf2s and run on several different boards.
Extra code:
`
print(" ")
year,mon,day,h,m,s,weekday,x = time.localtime()
now = str(h)+":"+str(m)+":"+str(s)
date = str(year)+" "+months[mon]+" "+str(year)
print(now)
print(date)
print(wd[weekday])
`
ERRORs below
`
MPY: soft reboot
connected
ip = 192.168.0.79
(2025, 3, 8, 13, 40, 38, 5, 67)
13:40:38
2025 Apr 2025
Sat
%Run -c $EDITOR_CONTENT
MPY: soft reboot
connected
ip = 192.168.0.79
Traceback (most recent call last):
File "", line 53, in
File "", line 25, in set_time
OSError: [Errno 110] ETIMEDOUT
`
I tried this change: s.settimeout(5) but it did not help.
@tonygo . Did you add this try: ___ except: block into your code?
(From my post/reaction: Jul 18, 2022)
@tonygo . Did you add this try: ___ except: block into your code?
(From my post/reaction: Jul 18, 2022)
When I try this, I get an error on the line val=struct.unpack(...)
local variable referenced before assignment.
Presumably, msg is not set if the exception happens.
You guys have any idea on how to use this on an SSD1306 OLED screen? Nevermind figured it out!!