Adding slider code
Adding slider code and bitmaps First try!
BIN
CircuitPython_Slider/10min_bmp.bmp
Normal file
|
After Width: | Height: | Size: 6.4 KiB |
BIN
CircuitPython_Slider/20min_bmp.bmp
Normal file
|
After Width: | Height: | Size: 6.4 KiB |
BIN
CircuitPython_Slider/5min_bmp.bmp
Normal file
|
After Width: | Height: | Size: 6.4 KiB |
BIN
CircuitPython_Slider/60min_bmp.bmp
Normal file
|
After Width: | Height: | Size: 6.4 KiB |
BIN
CircuitPython_Slider/backingupBMP.bmp
Normal file
|
After Width: | Height: | Size: 6.4 KiB |
BIN
CircuitPython_Slider/camSlide_bmp.bmp
Normal file
|
After Width: | Height: | Size: 6.4 KiB |
347
CircuitPython_Slider/code.py.py
Normal file
|
|
@ -0,0 +1,347 @@
|
||||||
|
import time
|
||||||
|
import displayio
|
||||||
|
import terminalio
|
||||||
|
import board
|
||||||
|
import adafruit_imageload
|
||||||
|
from adafruit_display_text.label import Label
|
||||||
|
from adafruit_seesaw.seesaw import Seesaw
|
||||||
|
from adafruit_st7735r import ST7735R
|
||||||
|
from adafruit_featherwing import minitft_featherwing
|
||||||
|
from adafruit_motorkit import MotorKit
|
||||||
|
from adafruit_motor import stepper
|
||||||
|
|
||||||
|
#setup stepper motor
|
||||||
|
kit = MotorKit()
|
||||||
|
|
||||||
|
#setup minitft featherwing
|
||||||
|
minitft = minitft_featherwing.MiniTFTFeatherWing()
|
||||||
|
|
||||||
|
#setup bitmap file locations
|
||||||
|
five_minBMP = "/5min_bmp.bmp"
|
||||||
|
ten_minBMP = "/10min_bmp.bmp"
|
||||||
|
twenty_minBMP = "/20min_bmp.bmp"
|
||||||
|
hourBMP = "/60min_bmp.bmp"
|
||||||
|
runningBMP = "/camSlide_bmp.bmp"
|
||||||
|
reverseqBMP = "/reverseQ_bmp.bmp"
|
||||||
|
backingUpBMP = "/backingup_bmp.bmp"
|
||||||
|
stopBMP = "/stopping_bmp.bmp"
|
||||||
|
|
||||||
|
# Release any resources currently in use for the displays
|
||||||
|
displayio.release_displays()
|
||||||
|
|
||||||
|
#variables for state machines in loop
|
||||||
|
mode = 0
|
||||||
|
onOff = 0
|
||||||
|
pause = 0
|
||||||
|
stop = 0
|
||||||
|
z = 0
|
||||||
|
|
||||||
|
#seesaw setup for minitft featherwing
|
||||||
|
reset_pin = 8
|
||||||
|
i2c = board.I2C()
|
||||||
|
ss = Seesaw(i2c, 0x5E)
|
||||||
|
ss.pin_mode(reset_pin, ss.OUTPUT)
|
||||||
|
|
||||||
|
#tft setup for minitft featherwing
|
||||||
|
spi = board.SPI()
|
||||||
|
tft_cs = board.D5
|
||||||
|
tft_dc = board.D6
|
||||||
|
display_bus = displayio.FourWire(spi, command=tft_dc, chip_select=tft_cs)
|
||||||
|
ss.digital_write(reset_pin, True)
|
||||||
|
|
||||||
|
#display for displayio and minitft
|
||||||
|
display = ST7735R(display_bus, width=160, height=80, colstart=24, rotation=270, bgr=True)
|
||||||
|
|
||||||
|
#image groups
|
||||||
|
five_minGroup = displayio.Group(max_size=20)
|
||||||
|
ten_minGroup = displayio.Group(max_size=20)
|
||||||
|
twenty_minGroup = displayio.Group(max_size=20)
|
||||||
|
hourGroup = displayio.Group(max_size=20)
|
||||||
|
reverseqGroup = displayio.Group(max_size=20)
|
||||||
|
backingUpGroup = displayio.Group(max_size=20)
|
||||||
|
stopGroup = displayio.Group(max_size=20)
|
||||||
|
progBarGroup = displayio.Group(max_size=20)
|
||||||
|
|
||||||
|
#bitmap setup for all of the menu screens
|
||||||
|
five_minBG, five_minPal = adafruit_imageload.load(five_minBMP,
|
||||||
|
bitmap=displayio.Bitmap,
|
||||||
|
palette=displayio.Palette)
|
||||||
|
five_minDis = displayio.TileGrid(five_minBG, pixel_shader=five_minPal)
|
||||||
|
ten_minBG, ten_minPal = adafruit_imageload.load(ten_minBMP,
|
||||||
|
bitmap=displayio.Bitmap,
|
||||||
|
palette=displayio.Palette)
|
||||||
|
ten_minDis = displayio.TileGrid(ten_minBG, pixel_shader=ten_minPal)
|
||||||
|
twenty_minBG, twenty_minPal = adafruit_imageload.load(twenty_minBMP,
|
||||||
|
bitmap=displayio.Bitmap,
|
||||||
|
palette=displayio.Palette)
|
||||||
|
twenty_minDis = displayio.TileGrid(twenty_minBG, pixel_shader=twenty_minPal)
|
||||||
|
hourBG, hourPal = adafruit_imageload.load(hourBMP,
|
||||||
|
bitmap=displayio.Bitmap,
|
||||||
|
palette=displayio.Palette)
|
||||||
|
hourDis = displayio.TileGrid(hourBG, pixel_shader=hourPal)
|
||||||
|
runningBG, runningPal = adafruit_imageload.load(runningBMP,
|
||||||
|
bitmap=displayio.Bitmap,
|
||||||
|
palette=displayio.Palette)
|
||||||
|
runningDis = displayio.TileGrid(runningBG, pixel_shader=runningPal)
|
||||||
|
reverseqBG, reverseqPal = adafruit_imageload.load(reverseqBMP,
|
||||||
|
bitmap=displayio.Bitmap,
|
||||||
|
palette=displayio.Palette)
|
||||||
|
reverseqDis = displayio.TileGrid(reverseqBG, pixel_shader=reverseqPal)
|
||||||
|
backingUpBG, backingUpPal = adafruit_imageload.load(backingUpBMP,
|
||||||
|
bitmap=displayio.Bitmap,
|
||||||
|
palette=displayio.Palette)
|
||||||
|
backingUpDis = displayio.TileGrid(backingUpBG, pixel_shader=backingUpPal)
|
||||||
|
stopBG, stopPal = adafruit_imageload.load(stopBMP,
|
||||||
|
bitmap=displayio.Bitmap,
|
||||||
|
palette=displayio.Palette)
|
||||||
|
stopDis = displayio.TileGrid(stopBG, pixel_shader=stopPal)
|
||||||
|
|
||||||
|
#setup for timer display when camera is sliding
|
||||||
|
text_area = Label(terminalio.FONT, text=' ')
|
||||||
|
text_area.x = 55
|
||||||
|
text_area.y = 65
|
||||||
|
|
||||||
|
#adding the bitmaps to the image groups so they can be displayed
|
||||||
|
five_minGroup.append(five_minDis)
|
||||||
|
ten_minGroup.append(ten_minDis)
|
||||||
|
twenty_minGroup.append(twenty_minDis)
|
||||||
|
hourGroup.append(hourDis)
|
||||||
|
progBarGroup.append(runningDis)
|
||||||
|
progBarGroup.append(text_area)
|
||||||
|
reverseqGroup.append(reverseqDis)
|
||||||
|
backingUpGroup.append(backingUpDis)
|
||||||
|
stopGroup.append(stopDis)
|
||||||
|
|
||||||
|
#setting button states on minitft featherwing to None
|
||||||
|
down_state = None
|
||||||
|
up_state = None
|
||||||
|
a_state = None
|
||||||
|
b_state = None
|
||||||
|
select_state = None
|
||||||
|
|
||||||
|
#arrays to match up with the different slide speeds
|
||||||
|
#graphics menu array
|
||||||
|
graphics = [five_minGroup, ten_minGroup, twenty_minGroup, hourGroup]
|
||||||
|
#delay for the stepper motor
|
||||||
|
speed = [0.0154, 0.034, 0.0688, 0.2062]
|
||||||
|
#time duration for the camera slide
|
||||||
|
slide_duration = [300, 600, 1200, 3600]
|
||||||
|
#beginning timer display
|
||||||
|
slide_begin = ["5:00", "10:00", "20:00", "60:00"]
|
||||||
|
#stepper motor steps that corresponds with the timer display
|
||||||
|
slide_checkin = [860, 1720, 2580, 3440, 4300, 5160,
|
||||||
|
6020, 6880, 7740, 8600, 9460, 10320,
|
||||||
|
11180, 12040, 12900, 13760, 14620, 15480,
|
||||||
|
16340, 17195]
|
||||||
|
#variable that counts up through the slide_checkin array
|
||||||
|
check = 0
|
||||||
|
|
||||||
|
#start time
|
||||||
|
begin = time.monotonic()
|
||||||
|
print(begin)
|
||||||
|
#when feather is powered up it shows the initial graphic splash
|
||||||
|
display.show(graphics[mode])
|
||||||
|
|
||||||
|
while True:
|
||||||
|
try:
|
||||||
|
#setup minitft featherwing buttons
|
||||||
|
buttons = minitft.buttons
|
||||||
|
#define the buttons' state changes
|
||||||
|
if not buttons.down and down_state is None:
|
||||||
|
down_state = "pressed"
|
||||||
|
if not buttons.up and up_state is None:
|
||||||
|
up_state = "pressed"
|
||||||
|
if not buttons.select and select_state is None:
|
||||||
|
select_state = "pressed"
|
||||||
|
if not buttons.a and a_state is None:
|
||||||
|
a_state = "pressed"
|
||||||
|
if not buttons.b and b_state is None:
|
||||||
|
b_state = "pressed"
|
||||||
|
#scroll down to change slide duration and graphic
|
||||||
|
if buttons.down and down_state == "pressed":
|
||||||
|
#blocks the button if the slider is sliding or
|
||||||
|
#in an inbetween state
|
||||||
|
if pause == 1 or onOff == 1:
|
||||||
|
mode = mode
|
||||||
|
down_state = None
|
||||||
|
else:
|
||||||
|
mode += 1
|
||||||
|
down_state = None
|
||||||
|
if mode > 3:
|
||||||
|
mode = 0
|
||||||
|
print("Mode:,", mode)
|
||||||
|
display.show(graphics[mode])
|
||||||
|
#scroll up to change slide duration and graphic
|
||||||
|
if buttons.up and up_state == "pressed":
|
||||||
|
#blocks the button if the slider is sliding or
|
||||||
|
#in an inbetween state
|
||||||
|
if pause == 1 or onOff == 1:
|
||||||
|
mode = mode
|
||||||
|
up_state = None
|
||||||
|
else:
|
||||||
|
mode -= 1
|
||||||
|
up_state = None
|
||||||
|
if mode < 0:
|
||||||
|
mode = 3
|
||||||
|
print("Mode: ", mode)
|
||||||
|
display.show(graphics[mode])
|
||||||
|
#workaround so that the menu graphics show after a slide is finished
|
||||||
|
if mode == mode and pause == 0 and onOff == 0:
|
||||||
|
display.show(graphics[mode])
|
||||||
|
#starts slide
|
||||||
|
if buttons.select and select_state == "pressed" or z == 2:
|
||||||
|
#blocks the button if the slider is sliding or
|
||||||
|
#in an inbetween state
|
||||||
|
if pause == 1 or onOff == 1:
|
||||||
|
#print("null")
|
||||||
|
select_state = None
|
||||||
|
else:
|
||||||
|
#shows the slider is sliding graphic
|
||||||
|
display.show(progBarGroup)
|
||||||
|
#gets time of button press
|
||||||
|
press = time.monotonic()
|
||||||
|
print(press)
|
||||||
|
#displays initial timer
|
||||||
|
text_area.text = slide_begin[mode]
|
||||||
|
#resets button
|
||||||
|
select_state = None
|
||||||
|
#changes onOff state
|
||||||
|
onOff += 1
|
||||||
|
#changes z state
|
||||||
|
z = 0
|
||||||
|
if onOff > 1:
|
||||||
|
onOff = 0
|
||||||
|
#number of steps for the length of the aluminum extrusions
|
||||||
|
for i in range(17200):
|
||||||
|
#for loop start time
|
||||||
|
start = time.monotonic()
|
||||||
|
#gets actual duration time
|
||||||
|
real_time = start - press
|
||||||
|
#creates a countdown from the slide's length
|
||||||
|
end = slide_duration[mode] - real_time
|
||||||
|
# /60 since time is in seconds
|
||||||
|
mins_remaining = end / 60
|
||||||
|
if mins_remaining < 0:
|
||||||
|
mins_remaining += 60
|
||||||
|
#gets second(s) count
|
||||||
|
total_sec_remaining = mins_remaining * 60
|
||||||
|
#formats to clock time
|
||||||
|
mins_remaining, total_sec_remaining = divmod(end, 60)
|
||||||
|
#microstep for the stepper
|
||||||
|
kit.stepper1.onestep(style=stepper.MICROSTEP)
|
||||||
|
#delay determines speed of the slide
|
||||||
|
time.sleep(speed[mode])
|
||||||
|
if i == slide_checkin[check]:
|
||||||
|
#check-in for time remaining based on motor steps
|
||||||
|
print("0%d:%d" %
|
||||||
|
(mins_remaining, total_sec_remaining))
|
||||||
|
print(check)
|
||||||
|
if total_sec_remaining < 10:
|
||||||
|
text_area.text = "%d:0%d" % (mins_remaining, total_sec_remaining)
|
||||||
|
else:
|
||||||
|
text_area.text = "%d:%d" % (mins_remaining, total_sec_remaining)
|
||||||
|
check = check + 1
|
||||||
|
if check > 19:
|
||||||
|
check = 0
|
||||||
|
if end < 10:
|
||||||
|
#displays the stopping graphic for the last 10 secs.
|
||||||
|
display.show(stopGroup)
|
||||||
|
#changes states after slide has completed
|
||||||
|
kit.stepper1.release()
|
||||||
|
pause = 1
|
||||||
|
onOff = 0
|
||||||
|
stop = 1
|
||||||
|
check = 0
|
||||||
|
#delay for safety
|
||||||
|
time.sleep(2)
|
||||||
|
#shows choice menu
|
||||||
|
display.show(reverseqGroup)
|
||||||
|
#b is defined to stop the slider
|
||||||
|
#only active if the slider is in the 'stopped' state
|
||||||
|
if buttons.b and b_state == "pressed" and stop == 1:
|
||||||
|
#z defines location of the camera on the slider
|
||||||
|
#0 means that it is opposite the motor
|
||||||
|
if z == 0:
|
||||||
|
b_state = None
|
||||||
|
time.sleep(1)
|
||||||
|
display.show(backingUpGroup)
|
||||||
|
#delay for safety
|
||||||
|
time.sleep(2)
|
||||||
|
#brings camera back to 'home' at double speed
|
||||||
|
for i in range(1145):
|
||||||
|
kit.stepper1.onestep(direction=stepper.BACKWARD, style=stepper.DOUBLE)
|
||||||
|
time.sleep(1)
|
||||||
|
kit.stepper1.release()
|
||||||
|
#changes states
|
||||||
|
pause = 0
|
||||||
|
stop = 0
|
||||||
|
#1 means that the camera is next to the motor
|
||||||
|
if z == 1:
|
||||||
|
b_state = None
|
||||||
|
time.sleep(2)
|
||||||
|
#changes states
|
||||||
|
pause = 0
|
||||||
|
stop = 0
|
||||||
|
z = 0
|
||||||
|
#a is defined to slide in reverse of the prev. slide
|
||||||
|
#only active if the slider is in the 'stopped' state
|
||||||
|
if buttons.a and a_state == "pressed" and stop == 1:
|
||||||
|
#z defines location of the camera on the slider
|
||||||
|
#1 means that the camera is next to the motor
|
||||||
|
if z == 1:
|
||||||
|
a_state = None
|
||||||
|
time.sleep(2)
|
||||||
|
stop = 0
|
||||||
|
pause = 0
|
||||||
|
#2 allows the 'regular' slide loop to run
|
||||||
|
#as if the 'select' button has been pressed
|
||||||
|
z = 2
|
||||||
|
#0 means that the camera is opposite the motor
|
||||||
|
if z == 0:
|
||||||
|
a_state = None
|
||||||
|
#same script as the 'regular' slide loop
|
||||||
|
time.sleep(2)
|
||||||
|
display.show(progBarGroup)
|
||||||
|
press = time.monotonic()
|
||||||
|
print(press)
|
||||||
|
text_area.text = slide_begin[mode]
|
||||||
|
onOff += 1
|
||||||
|
pause = 0
|
||||||
|
stop = 0
|
||||||
|
if onOff > 1:
|
||||||
|
onOff = 0
|
||||||
|
for i in range(17200):
|
||||||
|
start = time.monotonic()
|
||||||
|
real_time = start - press
|
||||||
|
end = slide_duration[mode] - real_time
|
||||||
|
mins_remaining = end / 60
|
||||||
|
if mins_remaining < 0:
|
||||||
|
mins_remaining += 60
|
||||||
|
total_sec_remaining = mins_remaining * 60
|
||||||
|
mins_remaining, total_sec_remaining = divmod(end, 60)
|
||||||
|
#only difference is that the motor is stepping backwards
|
||||||
|
kit.stepper1.onestep(direction=stepper.BACKWARD, style=stepper.MICROSTEP)
|
||||||
|
time.sleep(speed[mode])
|
||||||
|
if i == slide_checkin[check]:
|
||||||
|
print("0%d:%d" %
|
||||||
|
(mins_remaining, total_sec_remaining))
|
||||||
|
if total_sec_remaining < 10:
|
||||||
|
text_area.text = "%d:0%d" % (mins_remaining, total_sec_remaining)
|
||||||
|
else:
|
||||||
|
text_area.text = "%d:%d" % (mins_remaining, total_sec_remaining)
|
||||||
|
check = check + 1
|
||||||
|
if check > 19:
|
||||||
|
check = 0
|
||||||
|
if end < 10:
|
||||||
|
display.show(stopGroup)
|
||||||
|
#state changes
|
||||||
|
kit.stepper1.release()
|
||||||
|
pause = 1
|
||||||
|
onOff = 0
|
||||||
|
stop = 1
|
||||||
|
z = 1
|
||||||
|
check = 0
|
||||||
|
time.sleep(2)
|
||||||
|
display.show(reverseqGroup)
|
||||||
|
except MemoryError:
|
||||||
|
pass
|
||||||
BIN
CircuitPython_Slider/reverseQBMP.bmp
Normal file
|
After Width: | Height: | Size: 6.4 KiB |
BIN
CircuitPython_Slider/stopping_bmp.bmp
Normal file
|
After Width: | Height: | Size: 6.4 KiB |