Skip to content

Instantly share code, notes, and snippets.

@jplattel
Created July 19, 2024 13:50
Show Gist options
  • Save jplattel/414ea352eb1125b33bfcbedb7b5d1ff9 to your computer and use it in GitHub Desktop.
Save jplattel/414ea352eb1125b33bfcbedb7b5d1ff9 to your computer and use it in GitHub Desktop.
Simplified code for a smaller Pingo clock
print("Starting Pingo mini!")
import board
import neopixel
import time
import wifi
import socketpool
import adafruit_ntp
import digitalio
import adafruit_connection_manager
WIFI_SSID = "your_wifi_ssid"
WIFI_PASS = "your_wifi_pass"
RING_SIZE = [1, 8, 12, 16, 24, 32]
RING_INDEX = [0,0,0,0,0,0]
# Initialize Wifi / NTP
wifi.radio.connect(WIFI_SSID, WIFI_PASS)
time.sleep(2) # Give it some time to startup...
pool = adafruit_connection_manager.get_radio_socketpool(wifi.radio)
ntp = adafruit_ntp.NTP(pool, tz_offset=2)
# Initialize LED rings
for i in range(1, len(RING_SIZE)):
RING_INDEX[i] = RING_INDEX[i - 1] + RING_SIZE[i - 1]
class Pingo():
def __init__(self):
self.leds = neopixel.NeoPixel(board.GP0, sum(RING_SIZE), brightness=0.3, auto_write=True)
self.leds.show()
self.ring_index_hour = 2
self.ring_index_minutes = 4
self.ring_index_seconds = 5
def tick(self):
self.update()
time.sleep(1)
def get_time(self):
return {
"seconds": ntp.datetime.tm_sec,
"minutes": ntp.datetime.tm_min,
"hour": ntp.datetime.tm_hour,
}
def _set_led_range(self, start, end, color):
for i in range(start, end):
self.leds[i] = color
def _clear_ring(self, ring):
for i in range(RING_INDEX[ring], RING_INDEX[ring] + RING_SIZE[ring]):
self.leds[i] = (0,0,0)
def _set_hour(self, hour):
if (hour == 12 or hour == 24):
self._clear_ring(self.ring_index_hour)
elif (hour >= 12):
hour = hour - 12
start = RING_INDEX[self.ring_index_hour]
end = int(start + (hour * (RING_SIZE[self.ring_index_hour] / 12)))
self._set_led_range(start, end, (10,100,10))
def _set_minutes(self, minutes):
if (minutes == 0):
self._clear_ring(self.ring_index_minutes)
start = RING_INDEX[self.ring_index_minutes]
end = int(start + (minutes * (RING_SIZE[self.ring_index_minutes] / 60)))
self._set_led_range(start, end, (20,0,100))
def _set_seconds(self, seconds):
if (seconds == 0):
self._clear_ring(self.ring_index_seconds)
start = RING_INDEX[self.ring_index_seconds]
end = int(start + (seconds * (RING_SIZE[self.ring_index_seconds] / 60)))
self._set_led_range(start, end, (100,30,0))
def update(self):
timestamp = self.get_time()
print(f"{timestamp['hour']}:{timestamp['minutes']}:{timestamp['seconds']}")
# print(timestamp['minutes'], timestamp['seconds'])
self._set_seconds(timestamp['seconds'])
self._set_minutes(timestamp['minutes'])
self._set_hour(timestamp['hour'])
self.leds.show()
pingo = Pingo()
while True:
pingo.tick()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment