Created
July 19, 2024 13:50
-
-
Save jplattel/414ea352eb1125b33bfcbedb7b5d1ff9 to your computer and use it in GitHub Desktop.
Simplified code for a smaller Pingo clock
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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