Screens cleanup

This commit is contained in:
Nils Schulte 2020-03-21 21:25:23 +01:00
parent 08610f2c70
commit ed30bf42d9
6 changed files with 175 additions and 134 deletions

View File

@ -2,22 +2,20 @@ import machine
import time import time
class Button(): class Button():
def __init__(self,pin,onPushDown = None, onPushUp = None,onClick = None,onHold = None,clickTime=300,debounceTimeMs = 50,inputMode = machine.Pin.IN,inverted = False): def __init__(self,pin,onPushDown = None, onPushUp = None,clickTime=300,debounceTimeMs = 50,inputMode = machine.Pin.IN,inverted = False):
self.pin = machine.Pin(pin,inputMode) self.pin = machine.Pin(pin,inputMode)
self.debounceTimestamp = -debounceTimeMs self.debounceTimestamp = -debounceTimeMs
self.debounceTimeMs = int(debounceTimeMs) self.debounceTimeMs = int(debounceTimeMs)
self.clickTime = clickTime self.clickTime = clickTime
self.pushDownTimeStamp = -clickTime self.pushDownTimeStamp = -clickTime
self.setCallbacks(onPushDown,onPushUp,onClick,onHold) self.setCallbacks(onPushDown,onPushUp)
self.pin.irq(trigger=machine.Pin.IRQ_RISING|machine.Pin.IRQ_FALLING , handler=self._IRQ) self.pin.irq(trigger=machine.Pin.IRQ_RISING|machine.Pin.IRQ_FALLING , handler=self._IRQ)
self.value = self.pin.value() self.value = self.pin.value()
self.inverted = inverted self.inverted = inverted
def setCallbacks(self,onPushDown = None, onPushUp = None,onClick = None,onHold = None): def setCallbacks(self,onPushDown = None, onPushUp = None):
self.onPushDown = onPushDown self.onPushDown = onPushDown
self.onPushUp = onPushUp self.onPushUp = onPushUp
self.onClick = onClick
self.onHold = onHold
def _IRQ(self,p): def _IRQ(self,p):
new_value = self.pin.value() new_value = self.pin.value()
@ -28,9 +26,7 @@ class Button():
self.debounceTimestamp = time_ms self.debounceTimestamp = time_ms
if (new_value ^ self.inverted): if (new_value ^ self.inverted):
if (self.onPushUp != None): if (self.onPushUp != None):
self.onPushUp() self.onPushUp(time_ms-self.pushDownTimeStamp)
if (self.onClick != None and (self.pushDownTimeStamp + self.clickTime > time_ms)):
self.onClick()
else: else:
if (self.onPushDown != None): if (self.onPushDown != None):
self.onPushDown() self.onPushDown()

View File

@ -11,20 +11,23 @@ a = 440 #Hz
b = 493 #Hz b = 493 #Hz
C = 523 #Hz C = 523 #Hz
# Sounds
# (Duration,Freq) # (Duration,Freq)
# If Last Duration is None play endlessly # If Last Duration is None play last Freq times (negative = infinite)
# 0: Silent
# 1: BeepBeep BEEP = ((100,1100),)
# 2: Alle Meine Entchen BEEPBEEP = ((700,1000),(100,None),(600,1000))
SOUNDS = [((0,None),),\
((700,1000),(100,None),(600,1000)),\ # 0: BEEEEP BEEEEP BEEEEEP
# 1: Alle Meine Entchen
ALARMTONES = (((300,1200),(100,None),(200,1200),(300,None),(None,10)),
((400,c),(100,None),(400,d),(100,None),(400,e),(100,None),(400,f),(100,None),\ ((400,c),(100,None),(400,d),(100,None),(400,e),(100,None),(400,f),(100,None),\
(900,g),(100,None),(900,g),(100,None),(400,a),(100,None),(400,a),(100,None),\ (900,g),(100,None),(900,g),(100,None),(400,a),(100,None),(400,a),(100,None),\
(400,a),(100,None),(400,a),(100,None),(1900,g),(100,None),(400,a),(100,None),\ (400,a),(100,None),(400,a),(100,None),(1900,g),(100,None),(400,a),(100,None),\
(400,a),(100,None),(400,a),(100,None),(400,a),(100,None),(1900,g),(100,None),\ (400,a),(100,None),(400,a),(100,None),(400,a),(100,None),(1900,g),(100,None),\
(400,f),(100,None),(400,f),(100,None),(400,f),(100,None),(400,f),(100,None),\ (400,f),(100,None),(400,f),(100,None),(400,f),(100,None),(400,f),(100,None),\
(900,e),(100,None),(900,e),(100,None),(400,d),(100,None),(400,d),(100,None),\ (900,e),(100,None),(900,e),(100,None),(400,d),(100,None),(400,d),(100,None),\
(400,d),(100,None),(400,d),(100,None),(2000,c))]#,(None,None) (400,d),(100,None),(400,d),(100,None),(2000,c)),)
class Buzzer(): class Buzzer():
def __init__(self,pin,duty = 100): def __init__(self,pin,duty = 100):
@ -42,13 +45,20 @@ class Buzzer():
self._pwm.duty(0) self._pwm.duty(0)
else: else:
self.newSound = False self.newSound = False
timesPlayed = 0
print("Play sound!")
for i in range(len(self.sound)): for i in range(len(self.sound)):
s = self.sound[i] s = self.sound[i]
if s[0] == None: if s[0] == None:
if s[1]-timesPlayed == 0:
break
else:
i = 0 i = 0
timesPlayed += 1
if (s[1] != None): if (s[1] != None):
self._pwm.freq(s[1]) #self._pwm.freq(s[1])
self._pwm.duty(self.duty) #self._pwm.duty(self.duty)
pass
else: else:
self._pwm.duty(0) self._pwm.duty(0)
await asyncio.sleep_ms(s[0]) await asyncio.sleep_ms(s[0])

View File

@ -4,127 +4,155 @@ import Buzzer
import Settings import Settings
import Hardware as HW import Hardware as HW
class InitHandsScreen():
def __await__(self):
self.running = True
self.mode=0 # 0: Minutes, 1: Hours
HW.housingLEDs.fill((0,0,0))
HW.stepperminu.rotateTo(0)
HW.stepperhour.rotateTo(0)
HW.leds[1].flash(0.7)
for number,button in enumerate(HW.buttons):
button.setCallbacks(\
onPushDown=lambda i=number:self.onButtonPressed(i),\
onPushUp=lambda pushDownTime,button=number:self.onButtonReleased(button,pushDownTime))
# Wait for the Hands to move up
while not HW.stepperhour.isAtTarget() or not HW.stepperminu.isAtTarget():
await asyncio.sleep_ms(200)
HW.housingLEDs.upper((50,50,50))
while self.running:
await asyncio.sleep_ms(200)
HW.housingLEDs.fill((0,0,0))
self.cleanup()
__iter__ = __await__ # https://github.com/micropython/micropython/issues/2678
def finish(self):
self.running = False
for b in HW.buttons:
b.setCallbacks()#Clear Callbacks
for l in HW.leds:
l.off()
def __init__(self):
self.running = False
def onButtonPressed(self,button):
if button == 1:
HW.leds[button].on(overwriteFlashing=False)
else:
HW.leds[button].on()
if self.mode == 0:
HW.stepperminu.rotateTo(direction=(1 if button == 0 else -1))
elif self.mode == 1:
HW.stepperhour.rotateTo(direction=(1 if button == 0 else -1))
def onButtonReleased(self,button,time):
HW.leds[button].off(overwriteFlashing=(button!=1))
if button == 1:
self.mode+=1
if self.mode == 2:
self.finish()
else:
if self.mode == 0:
HW.stepperminu.stop()
else:
HW.stepperhour.stop()
def cleanup(self):
HW.stepperhour.reset() # Set the new Zero
HW.stepperminu.reset()
class ClockScreen(): class ClockScreen():
def __await__(self):
self.running = True
self.init()
while self.running:
await asyncio.sleep_ms(200)
HW.housingLEDs.fill((0,0,0))
self.cleanup()
__iter__ = __await__ # https://github.com/micropython/micropython/issues/2678
def finish(self):
self.running = False
for b in HW.buttons:
b.setCallbacks()#Clear Callbacks
def __init__(self):
self.running = False
self.light = False
self.clock = StepperClock.StepperClock()
COLORS = ((255,0,0),(255,0,127),(127,0,255),(0,0,255),(0,127,255),(0,255,127),(0,255,0),(127,255,0),(255,127,0)) COLORS = ((255,0,0),(255,0,127),(127,0,255),(0,0,255),(0,127,255),(0,255,127),(0,255,0),(127,255,0),(255,127,0))
BRIGHTNESS = (5,10,50,100,160,255) BRIGHTNESS = (5,10,50,100,160,255)
def __init__(self): def onButtonPressed(self,button):
self.clock = StepperClock.StepperClock()
self.running = False
self.light = False
def stopIfAllPressed(self,button):
HW.leds[button].on() HW.leds[button].on()
for b in HW.buttons:
if not b.isPushed():
break
else:
self.running = False
def onClicked(self,button): def onButtonReleased(self,button,pushDownTime):
print("Clock press",pushDownTime)
HW.leds[button].off()
if button == 0: if button == 0:
Settings.selectedBrightness=(Settings.selectedBrightness+1)%len(ClockScreen.BRIGHTNESS) Settings.selectedBrightness=(Settings.selectedBrightness+1)%len(ClockScreen.BRIGHTNESS)
elif button == 1: elif button == 1:
if pushDownTime > 1100:
self.finish()
return
self.light = not self.light self.light = not self.light
elif button == 2: elif button == 2:
Settings.selectedColor=(Settings.selectedColor+1)%len(ClockScreen.COLORS) Settings.selectedColor=(Settings.selectedColor+1)%len(ClockScreen.COLORS)
HW.housingLEDs.fill([int(c/255*ClockScreen.BRIGHTNESS[Settings.selectedBrightness]) for c in ClockScreen.COLORS[Settings.selectedColor]] if self.light else (0,0,0)) HW.housingLEDs.fill([int(c/255*ClockScreen.BRIGHTNESS[Settings.selectedBrightness]) for c in ClockScreen.COLORS[Settings.selectedColor]] if self.light else (0,0,0))
def __await__(self):
def init(self):
HW.housingLEDs.fill([int(c/255*ClockScreen.BRIGHTNESS[Settings.selectedBrightness]) for c in ClockScreen.COLORS[Settings.selectedColor]] if self.light else (0,0,0)) HW.housingLEDs.fill([int(c/255*ClockScreen.BRIGHTNESS[Settings.selectedBrightness]) for c in ClockScreen.COLORS[Settings.selectedColor]] if self.light else (0,0,0))
for i,b in enumerate(HW.buttons): for i,b in enumerate(HW.buttons):
b.setCallbacks(onPushDown=lambda i=i:self.stopIfAllPressed(i),onPushUp=lambda i=i:HW.leds[i].off(),onClick=lambda i=i:self.onClicked(i)) b.setCallbacks(onPushDown=lambda i=i:self.onButtonPressed(i),onPushUp=lambda pushDownTime,button=i:self.onButtonReleased(button,pushDownTime))
self.running = True
self.clock.start() self.clock.start()
while self.running:
await asyncio.sleep_ms(200) def cleanup(self):
self.clock.stop() self.clock.stop()
__iter__ = __await__ # https://github.com/micropython/micropython/issues/2678
class SettingsScreen():
def __init__(self):
self.running = False
def onButtonPressed(self,button):
HW.leds[button].on(overwriteFlashing=False)
for b in HW.buttons:
if not b.isPushed():
break
else:
self.running = False
return
if not HW.buttons[1].isPushed():
if button == 0 :
if self.mode == 0:
HW.stepperminu.rotateTo(direction=1)
if self.mode == 1:
HW.stepperhour.rotateTo(direction=1)
elif button == 2:
if self.mode == 0:
HW.stepperminu.rotateTo(direction=-1)
if self.mode == 1:
HW.stepperhour.rotateTo(direction=-1)
def onButtonReleased(self,button):
if not self.running:
return
HW.leds[button].off(overwriteFlashing=False)
if button == 0:#left
if self.mode == 0 or self.mode == 1:
HW.stepperminu.stop()
HW.stepperhour.stop()
if self.mode == 3:
Settings.selectedSound =(Settings.selectedSound -1) % len(Buzzer.SOUNDS)
HW.buzzer.playSound(Buzzer.SOUNDS[Settings.selectedSound ])
elif button == 2:#right
if self.mode == 0 or self.mode == 1:
HW.stepperminu.stop()
HW.stepperhour.stop()
if self.mode == 3:
Settings.selectedSound =(Settings.selectedSound +1) % len(Buzzer.SOUNDS)
HW.buzzer.playSound(Buzzer.SOUNDS[Settings.selectedSound ])
elif button == 1: #middle
self.mode=(self.mode+1)%4
if self.mode == 3:
HW.buzzer.playSound(Buzzer.SOUNDS[Settings.selectedSound ])
else:
HW.buzzer.stop()
if self.mode == 2:
HW.leds[0].flash(0.7)
HW.leds[1].flash(0.7)
HW.leds[2].flash(0.7)
else:
HW.leds[0].off()
HW.leds[1].off()
HW.leds[2].off()
if self.mode == 0 or self.mode == 1:
HW.housingLEDs.upper((50,50,50))
else:
HW.housingLEDs.clear()
class RingtoneSettingsScreen():
def __await__(self): def __await__(self):
self.mode = 0 self.running = True
HW.stepperminu.rotateTo(0) for i,b in enumerate(HW.buttons):
b.setCallbacks(onPushDown=lambda i=i:self.onButtonPressed(i),onPushUp=lambda pushDownTime,button=i:self.onButtonReleased(button,pushDownTime))
# Turn LEDs Red and play the selected Sound and turn the minute-hand to the selected sound
HW.housingLEDs.fill((200,0,0))
HW.buzzer.playSound(HW.Buzzer.ALARMTONES[Settings.selectedSound])
HW.stepperminu.rotateTo(-Settings.selectedSound/12)
HW.stepperhour.rotateTo(0) HW.stepperhour.rotateTo(0)
HW.housingLEDs.clear()
while not HW.stepperhour.isAtTarget() or not HW.stepperminu.isAtTarget(): while not HW.stepperhour.isAtTarget() or not HW.stepperminu.isAtTarget():
await asyncio.sleep_ms(200) await asyncio.sleep_ms(200)
HW.housingLEDs.upper((50,50,50))
for led in HW.leds:
led.off()
for i,b in enumerate(HW.buttons):
b.setCallbacks(onPushDown=lambda i=i:self.onButtonPressed(i),onPushUp=lambda i=i:self.onButtonReleased(i))
self.running = True
while self.running: while self.running:
await asyncio.sleep_ms(200) await asyncio.sleep_ms(200)
for led in HW.leds: HW.housingLEDs.fill((0,0,0))
led.off() self.cleanup()
HW.housingLEDs.clear()
HW.stepperhour.reset()
HW.stepperminu.reset()
HW.buzzer.stop()
Settings.save()
__iter__ = __await__ # https://github.com/micropython/micropython/issues/2678 __iter__ = __await__ # https://github.com/micropython/micropython/issues/2678
def __init__(self):
self.running = False
def finish(self):
self.running = False
for b in HW.buttons:
b.setCallbacks()#Clear Callbacks
def onButtonPressed(self,button):
HW.leds[button].on()
def onButtonReleased(self,button,pushDownTime):
print("Ring Select push down",pushDownTime)
HW.leds[button].off()
if button == 1:
if pushDownTime > 1100:
Settings.save()
self.finish()
return
else:
if pushDownTime < 500:
Settings.selectedSound=(Settings.selectedSound+ (1 if button == 2 else -1))%len(Buzzer.ALARMTONES)
HW.stepperminu.rotateTo(-Settings.selectedSound/12)
HW.buzzer.playSound(HW.Buzzer.ALARMTONES[Settings.selectedSound])
def cleanup(self):
HW.housingLEDs.fill((0,0,0))
HW.buzzer.stop()

View File

@ -60,6 +60,7 @@ class Stepper:
self._rotTarget = self.stepnum self._rotTarget = self.stepnum
async def _update_async(self): async def _update_async(self):
print("update")
while(True): while(True):
await asyncio.sleep_ms(self.stepDurationMs) await asyncio.sleep_ms(self.stepDurationMs)
if not self.isAtTarget(): if not self.isAtTarget():

13
boot.py
View File

@ -5,11 +5,12 @@ webrepl.start()
sta_if = network.WLAN(network.STA_IF) sta_if = network.WLAN(network.STA_IF)
sta_if.active(True) sta_if.active(True)
availableNetworkSSIDs = [s[0].decode() for s in sta_if.scan()] if sta_if.status() != network.STAT_GOT_IP:
print(availableNetworkSSIDs) availableNetworkSSIDs = [s[0].decode() for s in sta_if.scan()]
#load wifi credentials from file print(availableNetworkSSIDs)
with open("wifi-credentials","r") as f: #load wifi credentials from file
while True: with open("wifi-credentials","r") as f:
while sta_if.status() != network.STAT_GOT_IP:
ssid = f.readline() ssid = f.readline()
password = f.readline()# password = f.readline()#
if not ssid or not password: if not ssid or not password:
@ -17,4 +18,6 @@ with open("wifi-credentials","r") as f:
ssid = ssid.replace("\n","") ssid = ssid.replace("\n","")
password = password.replace("\n","") password = password.replace("\n","")
if ssid in availableNetworkSSIDs: if ssid in availableNetworkSSIDs:
print("Connecting to",ssid)
sta_if.connect(ssid,password) sta_if.connect(ssid,password)
break

15
main.py
View File

@ -6,15 +6,18 @@ import Screens
#Async #Async
loop = asyncio.get_event_loop() loop = asyncio.get_event_loop()
modus = 0
screens = (Screens.ClockScreen(),\
Screens.SettingsScreen())
async def run_screens(): async def run_screens():
global modus,screens InitScreen = Screens.InitHandsScreen()
await InitScreen
modus = 0
screens = (Screens.ClockScreen(),\
Screens.RingtoneSettingsScreen())
while True: while True:
await screens[modus%len(screens)] HW.buzzer.playSound(HW.Buzzer.BEEP)
await screens[modus]
for b in HW.buttons: for b in HW.buttons:
b.setCallbacks()#Clear Callbacks b.setCallbacks()#Clear Callbacks
modus += 1 modus = (modus+1)%len(screens)
loop.run_until_complete(run_screens()) loop.run_until_complete(run_screens())