DarrenHill

Picoscroll Clock

Apr 15th, 2021 (edited)
119
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. import math
  2. import utime
  3. import picoscroll as scroll
  4. from machine import Pin
  5.  
  6. scroll.init()
  7.  
  8. secupdated = False
  9. led = Pin(25,Pin.OUT)
  10.  
  11. # Initial time, from RTC if set via the shell, or 12:30:01 otherwise (if RTC is unset, epoch is 1/1/21 00:00:01)
  12. if utime.localtime()[0] == 2021 and utime.localtime()[1] == 1 and utime.localtime()[2] == 1:
  13.     hours = 12
  14.     minutes = 30
  15.     seconds = 1
  16.     sync = False
  17.     led.low()
  18. else:
  19.     hours = utime.localtime()[3]
  20.     minutes = utime.localtime()[4]
  21.     seconds = utime.localtime()[5]
  22.     sync = True
  23.     led.high()
  24.  
  25. # LED Brightness (0-255)
  26. brightness = 50
  27.  
  28. # Character pixel maps (3w x 5h font)
  29. zero = [0,1,1,1,0],[1,0,0,0,1],[0,1,1,1,0]
  30. one = [0,1,0,0,1],[1,1,1,1,1],[0,0,0,0,1]
  31. two = [1,0,0,1,1],[1,0,1,0,1],[0,1,0,0,1]
  32. three = [1,0,1,0,1],[1,0,1,0,1],[0,1,0,1,0]
  33. four = [0,1,1,1,0],[1,0,0,1,0],[0,0,1,1,1]
  34. five = [1,1,1,0,1],[1,0,1,0,1],[1,0,0,1,0]
  35. six = [0,1,1,1,0],[1,0,1,0,1],[0,0,0,1,0]
  36. seven = [1,0,0,1,1],[1,0,1,0,0],[1,1,0,0,0]
  37. eight = [0,1,0,1,0],[1,0,1,0,1],[0,1,0,1,0]
  38. nine = [0,1,0,0,0],[1,0,1,0,1],[0,1,1,1,0]
  39. error = [1,1,1,1,1],[1,0,1,0,1],[1,0,1,0,1]
  40. charlist = [zero,one,two,three,four,five,six,seven,eight,nine]
  41.  
  42. # Draw characters using above pixel maps, left to right, top to bottom
  43. def draw_digit(x,y,map):
  44.     global brightness
  45.  
  46.     scroll.set_pixel(x,y,map[0][0]*brightness)
  47.     scroll.set_pixel(x+1,y,map[1][0]*brightness)
  48.     scroll.set_pixel(x+2,y,map[2][0]*brightness)
  49.  
  50.     scroll.set_pixel(x,y+1,map[0][1]*brightness)
  51.     scroll.set_pixel(x+1,y+1,map[1][1]*brightness)
  52.     scroll.set_pixel(x+2,y+1,map[2][1]*brightness)
  53.  
  54.     scroll.set_pixel(x,y+2,map[0][2]*brightness)
  55.     scroll.set_pixel(x+1,y+2,map[1][2]*brightness)
  56.     scroll.set_pixel(x+2,y+2,map[2][2]*brightness)
  57.  
  58.     scroll.set_pixel(x,y+3,map[0][3]*brightness)
  59.     scroll.set_pixel(x+1,y+3,map[1][3]*brightness)
  60.     scroll.set_pixel(x+2,y+3,map[2][3]*brightness)
  61.  
  62.     scroll.set_pixel(x,y+4,map[0][4]*brightness)
  63.     scroll.set_pixel(x+1,y+4,map[1][4]*brightness)
  64.     scroll.set_pixel(x+2,y+4,map[2][4]*brightness)
  65.     return
  66.  
  67. # Process clock characters
  68. def character(x,y,char):
  69.     global charlist
  70.     if char >= 0 and char <=9:
  71.         draw_digit(x,y,charlist[char])
  72.         return
  73.     else:
  74.         draw_digit(x,y,error)
  75.         return
  76.  
  77. # Act on button presses
  78. def buttonhandler():
  79.     global hours, minutes, brightness, led
  80.    
  81.     if scroll.is_pressed(scroll.BUTTON_A):
  82.         led.low()
  83.         if scroll.is_pressed(scroll.BUTTON_X):
  84.             if brightness <= 245 and brightness >= 10:
  85.                 brightness += 10
  86.             elif brightness < 255 or brightness < 10:
  87.                 brightness += 1
  88.         else:
  89.             hours += 1
  90.         return
  91.  
  92.     if scroll.is_pressed(scroll.BUTTON_B):
  93.         led.low()
  94.         if scroll.is_pressed(scroll.BUTTON_Y):
  95.             if brightness >= 11 and brightness <= 250:
  96.                 brightness -= 10
  97.             elif brightness > 3 or brightness > 250 :
  98.                 brightness -= 1
  99.         else:
  100.             hours -= 1
  101.             if hours < 0:
  102.                 hours = 23
  103.         return
  104.  
  105.  
  106.     if scroll.is_pressed(scroll.BUTTON_X):
  107.         led.low()
  108.         minutes += 1
  109.         return
  110.  
  111.     if scroll.is_pressed(scroll.BUTTON_Y):
  112.         led.low()
  113.         minutes -= 1
  114.         if minutes < 0:
  115.             minutes = 59
  116.         return
  117.  
  118. def draw_clock(hrs,mins,secs):
  119.     global brightness
  120.     scroll.clear()
  121.  
  122.     character(0,0,hrs//10) # hour tens (0-2)
  123.     character(4,0,hrs%10) # hour units (0-9)
  124.     character(10,0,mins//10) # minute tens (0-5)
  125.     character(14,0,mins%10) # minute units (0-9)
  126.  
  127.     if(secs % 2 != 0): # draw colon between hours and minutes on odd seconds
  128.         scroll.set_pixel(8,1,brightness)
  129.         scroll.set_pixel(8,3,brightness)
  130.        
  131.     # seconds pixel bar across the bottom - borrowed from the scrollphathd clock example
  132.     seconds_progress = 15 * ((secs % 60) / 59.0)
  133.     for y in range(15):
  134.         current_pixel = min(seconds_progress, 1)
  135.         scroll.set_pixel(y + 1, 6, int(current_pixel * brightness))
  136.         seconds_progress -= 1
  137.         if seconds_progress <= 0:
  138.             break
  139.            
  140.     scroll.update()
  141.  
  142. # Main clock loop
  143. while True:
  144.     utime.sleep(0.5)
  145.     seconds = utime.localtime()[5]
  146.  
  147.     buttonhandler()
  148.    
  149.     if seconds == 0 and secupdated == False:
  150.         minutes += 1
  151.         secupdated = True
  152.        
  153.     if seconds == 1 and secupdated == True:
  154.         secupdated = False
  155.  
  156.     if minutes > 59:
  157.         hours += 1
  158.         minutes = 0
  159.  
  160.     if hours > 23:
  161.         hours = 0
  162.  
  163.     draw_clock(hours,minutes,seconds)
  164.  
  165.  
RAW Paste Data