208 lines
4.8 KiB
Python
208 lines
4.8 KiB
Python
from adafruit_display_text.label import Label
|
|
import time
|
|
import gc
|
|
import board
|
|
import displayio
|
|
import random
|
|
import math
|
|
from adafruit_bitmap_font import bitmap_font
|
|
from adafruit_matrixportal.network import Network
|
|
from adafruit_matrixportal.matrix import Matrix
|
|
import adafruit_requests as requests
|
|
|
|
# statics
|
|
SPEED = 24 # should be even
|
|
|
|
COLORS = [
|
|
0x50FA7B,
|
|
0xFFB86C,
|
|
0xF1FA8C,
|
|
0xFF5555,
|
|
0xFF79C6,
|
|
0x8BE9FD,
|
|
]
|
|
FONT = bitmap_font.load_font("/Bm437_Paradise132_7x9-12.bdf")
|
|
TEXTWIDTH = 7
|
|
|
|
tick = 0
|
|
|
|
|
|
def random_color():
|
|
return random.choice(COLORS)
|
|
|
|
|
|
# Get wifi details and more from a secrets.py file
|
|
try:
|
|
from secrets import secrets
|
|
except ImportError:
|
|
print("WiFi secrets are kept in secrets.py, please add them there!")
|
|
raise
|
|
|
|
network = Network(
|
|
debug=False,
|
|
status_neopixel=board.NEOPIXEL,
|
|
)
|
|
matrix = Matrix()
|
|
display = matrix.display
|
|
upper_text_content = " =^_^="
|
|
upper_text = Label(
|
|
FONT,
|
|
text=upper_text_content,
|
|
color=random_color(),
|
|
)
|
|
upper_text.y = 2
|
|
|
|
decoration = Label(FONT, text="»»»»»»»»»»»»", color=random_color())
|
|
decoration.y = 10
|
|
|
|
middle_text_content = "jacking"
|
|
middle_text = Label(
|
|
FONT,
|
|
text=middle_text_content,
|
|
color=random_color(),
|
|
)
|
|
middle_text.y = 16
|
|
|
|
lower_text_content = " in..."
|
|
lower_text = Label(
|
|
FONT,
|
|
text=lower_text_content,
|
|
color=random_color(),
|
|
)
|
|
lower_text.y = 25
|
|
|
|
maingroup = displayio.Group()
|
|
g = displayio.Group()
|
|
g.append(upper_text)
|
|
maingroup.append(decoration)
|
|
g.append(middle_text)
|
|
g.append(lower_text)
|
|
maingroup.append(g)
|
|
|
|
display.brightness = 0.01
|
|
display.auto_refresh = False
|
|
display.show(maingroup)
|
|
|
|
daynames = {
|
|
0: "monday",
|
|
1: "tuesday",
|
|
2: "wednesday",
|
|
3: "thursday",
|
|
4: "friday",
|
|
5: "saturday",
|
|
6: "sunday",
|
|
}
|
|
|
|
|
|
def sliceForTextField(s, i, max_chars=10) -> str:
|
|
i = math.trunc(i)
|
|
if len(s) < max_chars:
|
|
return s
|
|
return str(s[i % len(s) :] + s[: i % len(s)])[:max_chars]
|
|
|
|
|
|
def update_content():
|
|
global middle_text_content, upper_text_content, tick
|
|
tick = 0
|
|
try:
|
|
# set time from network
|
|
network.get_local_time()
|
|
except RuntimeError as e:
|
|
print("failed loading time")
|
|
try:
|
|
# get unread rss feeds
|
|
print("loading rss feeds")
|
|
headers = {"X-Auth-Token": secrets["miniflux_token"]}
|
|
rssresponse = requests.get(
|
|
secrets["miniflux_url"] + "/entries?status=unread&direction=desc",
|
|
headers=headers,
|
|
)
|
|
entries = rssresponse.json()["entries"]
|
|
rssresponse.close()
|
|
upper_text_content = str(len(entries)) + " unread entries "
|
|
for e in entries:
|
|
gc.collect()
|
|
upper_text_content += "|" + e["feed"]["title"]
|
|
upper_text_content += "-" + e["title"] + "| "
|
|
gc.collect()
|
|
except RuntimeError as e:
|
|
print("failed loading unread")
|
|
gc.collect()
|
|
try:
|
|
weatherresponse = requests.get(
|
|
"https://wttr.in/?format='%l:+%C+precipitation+%p+%t+%w+humidity+%h+dawn:+%D+dusk:+%d+uv:+%u'"
|
|
)
|
|
middle_text_content = (
|
|
weatherresponse.text.replace("\n", " ").replace("'", "") + " "
|
|
)
|
|
weatherresponse.close()
|
|
except RuntimeError as e:
|
|
print("failed getting weather")
|
|
|
|
|
|
def update_time():
|
|
global lower_text_content
|
|
now = time.localtime()
|
|
lower_text_content = (
|
|
"{dayname} {day}.{month:02d}.{year} {hours:02d}:{minutes:02d}:{seconds:02d}".format(
|
|
hours= now[3],
|
|
minutes=now[4],
|
|
seconds=now[5],
|
|
dayname=daynames[now[6]],
|
|
day=now[2],
|
|
month=now[1],
|
|
year=now[0],
|
|
)
|
|
+ " "
|
|
)
|
|
|
|
def update(tick):
|
|
global display
|
|
|
|
if tick % (10 * SPEED) == 0:
|
|
upper_text.color = random_color()
|
|
middle_text.color = random_color()
|
|
lower_text.color = random_color()
|
|
decoration.color = random_color()
|
|
# do this once about every half hour
|
|
if tick % (1800 * SPEED) == 0:
|
|
update_content()
|
|
|
|
# do this every new letter
|
|
offset = 0 - tick % TEXTWIDTH
|
|
if offset == 0:
|
|
texttick = tick / TEXTWIDTH
|
|
update_time()
|
|
lower_text.text = sliceForTextField(
|
|
lower_text_content,
|
|
texttick,
|
|
)
|
|
|
|
middle_text.text = sliceForTextField(
|
|
middle_text_content,
|
|
texttick,
|
|
)
|
|
|
|
upper_text.text = sliceForTextField(
|
|
upper_text_content,
|
|
texttick,
|
|
)
|
|
|
|
g.x = offset
|
|
decoration.x = -1 * offset - TEXTWIDTH * 2
|
|
display.refresh(
|
|
minimum_frames_per_second=0,
|
|
target_frames_per_second=SPEED,
|
|
)
|
|
|
|
|
|
|
|
display.refresh(
|
|
minimum_frames_per_second=0,
|
|
target_frames_per_second=SPEED,
|
|
)
|
|
network.connect()
|
|
|
|
while True:
|
|
update(tick)
|
|
tick += 1 |