Facebook
From Sweltering Lemur, 3 Years ago, written in Python.
This paste is a reply to Timer App Sample from wingtiger - go back
Embed
Viewing differences between Timer App Sample and Re: Timer App Sample
from m5stack import *
from m5stack_ui import *
from uiflow import *
import ntptime
import time
from m5stack import touch
import wifiCfg

screen = M5Screen()
screen.clean_screen()
screen.set_screen_bg_color(0x000000)


timerMinutes = None
batteryLevel = None
hour = None
isSleep = None
timerMin = None
isTimeupSoundPlaying = None
isTimerPaused = None
lastActiveTick = None
touchY = None
timerIsRunning = None
minute = None
timerIsTimeup = None
timerSec = None
tickToNextLoop = None
i = None
clockDelimiter = None
isClockMode = None
timerStartTick = None
idleTime = None
timerTargetTick = None
timeToDisplay = None
timerTimeSpent = None
pausedTick = None
clockToDisplay = None
ntp = None

wifiCfg.autoConnect(lcdShow=True)
TimerBG = M5Img("res/TimerBG2.png", x=0, y=0, parent=None)
charging = M5Img("res/chargning2.png", x=255, y=12, parent=None)

from numbers import Number
import math


# この関数の説明…
def initialize():
  global timerMinutes, batteryLevel, hour, isSleep, timerMin, isTimeupSoundPlaying, isTimerPaused, lastActiveTick, touchY, timerIsRunning, minute, timerIsTimeup, timerSec, tickToNextLoop, i, clockDelimiter, isClockMode, timerStartTick, idleTime, timerTargetTick, timeToDisplay, timerTimeSpent, pausedTick, clockToDisplay, ntp
  screen.set_screen_brightness(35)
  lcd.font(lcd.FONT_DejaVu24, transparent=False)  # This is to avoid M5Stack 1.60 bug in LCD.
  tickToNextLoop = 0
  isClockMode = False
  initTimer()
  showBatteryMeter()
  showTimerMinutes()
  if not (wifiCfg.wlan_sta.isconnected()):
    pass
  ntp = 0
  ntp = ntptime.client(host='jp.pool.ntp.org', timezone=9)

# Describe this function...
def checkTouchForPause():
  global timerMinutes, batteryLevel, hour, isSleep, timerMin, isTimeupSoundPlaying, isTimerPaused, lastActiveTick, touchY, timerIsRunning, minute, timerIsTimeup, timerSec, tickToNextLoop, i, clockDelimiter, isClockMode, timerStartTick, idleTime, timerTargetTick, timeToDisplay, timerTimeSpent, pausedTick, clockToDisplay, ntp
  if timerIsRunning and (touch.status()):
    touchY = touch.read()[1]
    if touchY > 50 and 190 > touchY:
      # U need to upload a wav using image uploader (AddImage >> any filetype)
      speaker.playWAV('/sd/pause1.wav')
      if isTimerPaused:
        isTimerPaused = False
        timerTargetTick = (timerTargetTick if isinstance(timerTargetTick, Number) else 0) + ((time.ticks_ms()) - pausedTick)
        timerStartTick = (timerStartTick if isinstance(timerStartTick, Number) else 0) + ((time.ticks_ms()) - pausedTick)
      else:
        isTimerPaused = True
        pausedTick = time.ticks_ms()
        lcd.font(lcd.FONT_DejaVu56)
        lcd.print('         ', 80, 115, 0x000000)
    while touch.status():
      wait_ms(50)
  else:
    pass

# この関数の説明…
def timerApp():
  global timerMinutes, batteryLevel, hour, isSleep, timerMin, isTimeupSoundPlaying, isTimerPaused, lastActiveTick, touchY, timerIsRunning, minute, timerIsTimeup, timerSec, tickToNextLoop, i, clockDelimiter, isClockMode, timerStartTick, idleTime, timerTargetTick, timeToDisplay, timerTimeSpent, pausedTick, clockToDisplay, ntp
  showClock()
  if isTimeupSoundPlaying:
    playTimeupSound()
  if timerIsRunning:
    for count2 in range(9):
      checkTouchForPause()
      wait_ms(100)
  else:
    idleTime = (time.ticks_ms()) - lastActiveTick
    if idleTime > 240000:
      sleep()
    wait_ms(950)

# この関数の説明…
def initTimer():
  global timerMinutes, batteryLevel, hour, isSleep, timerMin, isTimeupSoundPlaying, isTimerPaused, lastActiveTick, touchY, timerIsRunning, minute, timerIsTimeup, timerSec, tickToNextLoop, i, clockDelimiter, isClockMode, timerStartTick, idleTime, timerTargetTick, timeToDisplay, timerTimeSpent, pausedTick, clockToDisplay, ntp
  timerMinutes = 10
  timerIsRunning = False
  timerIsTimeup = False
  isTimeupSoundPlaying = False
  lastActiveTick = time.ticks_ms()

# この関数の説明…
def showBatteryMeter():
  global timerMinutes, batteryLevel, hour, isSleep, timerMin, isTimeupSoundPlaying, isTimerPaused, lastActiveTick, touchY, timerIsRunning, minute, timerIsTimeup, timerSec, tickToNextLoop, i, clockDelimiter, isClockMode, timerStartTick, idleTime, timerTargetTick, timeToDisplay, timerTimeSpent, pausedTick, clockToDisplay, ntp
  batteryLevel = ((power.getBatVoltage()) - 3.2) * 100
  if power.getChargeState():
    charging.set_hidden(False)
  else:
    charging.set_hidden(True)
  for i in range(4):
    if batteryLevel >= (i * 25 + 15):
      lcd.fillRect(275+i*9, 12,7,13, lcd.GREEN)
    else:
      lcd.fillRect(275+i*9, 12,7,13, lcd.BLACK)

# Describe this function...
def sleep():
  global timerMinutes, batteryLevel, hour, isSleep, timerMin, isTimeupSoundPlaying, isTimerPaused, lastActiveTick, touchY, timerIsRunning, minute, timerIsTimeup, timerSec, tickToNextLoop, i, clockDelimiter, isClockMode, timerStartTick, idleTime, timerTargetTick, timeToDisplay, timerTimeSpent, pausedTick, clockToDisplay, ntp
  power.setPowerLED(False)
  power.setLCDBacklightVoltage(0)
  power.setBusPowerMode(1)
  screen.set_screen_brightness(5)
  isSleep = True
  while isSleep:
    if touch.status():
      updateActive()
    wait_ms(1000)

# Describe this function...
def showClock():
  global timerMinutes, batteryLevel, hour, isSleep, timerMin, isTimeupSoundPlaying, isTimerPaused, lastActiveTick, touchY, timerIsRunning, minute, timerIsTimeup, timerSec, tickToNextLoop, i, clockDelimiter, isClockMode, timerStartTick, idleTime, timerTargetTick, timeToDisplay, timerTimeSpent, pausedTick, clockToDisplay, ntp
  hour = ntp.hour()
  minute = ntp.minute()
  clockDelimiter = ':'
  clockToDisplay='{:02d}'.format(hour) + clockDelimiter + '{:02d}'.format(minute)
  lcd.setColor(0x111111, 0x99cccc);
  lcd.font(lcd.FONT_DejaVu24)
  lcd.print(clockToDisplay, 6, 8, 0x330000)
  lcd.setColor(0xffffff, 0x000000);

# Describe this function...
def updateActive():
  global timerMinutes, batteryLevel, hour, isSleep, timerMin, isTimeupSoundPlaying, isTimerPaused, lastActiveTick, touchY, timerIsRunning, minute, timerIsTimeup, timerSec, tickToNextLoop, i, clockDelimiter, isClockMode, timerStartTick, idleTime, timerTargetTick, timeToDisplay, timerTimeSpent, pausedTick, clockToDisplay, ntp
  isSleep = False
  lastActiveTick = time.ticks_ms()
  isClockMode = False
  screen.set_screen_brightness(35)
  power.setPowerLED(True)
  power.setLCDBacklightVoltage(2.8)

# この関数の説明…
def stopTimer():
  global timerMinutes, batteryLevel, hour, isSleep, timerMin, isTimeupSoundPlaying, isTimerPaused, lastActiveTick, touchY, timerIsRunning, minute, timerIsTimeup, timerSec, tickToNextLoop, i, clockDelimiter, isClockMode, timerStartTick, idleTime, timerTargetTick, timeToDisplay, timerTimeSpent, pausedTick, clockToDisplay, ntp
  timerSch.stop('timer1')
  if timerIsTimeup == False:
    speaker.playWAV('/sd/clear1.wav')
  else:
    speaker.playWAV('/sd/over1.wav')
  timerIsRunning = False
  lcd.font(lcd.FONT_DejaVu24)
  lcd.print(timerTimeSpent, 125, 69, 0xffff33)
  lcd.font(lcd.FONT_DejaVu56)
  lcd.print(timeToDisplay, 80, 115, 0xffffff)
  lastActiveTick = time.ticks_ms()

# この関数の説明…
def runTimer():
  global timerMinutes, batteryLevel, hour, isSleep, timerMin, isTimeupSoundPlaying, isTimerPaused, lastActiveTick, touchY, timerIsRunning, minute, timerIsTimeup, timerSec, tickToNextLoop, i, clockDelimiter, isClockMode, timerStartTick, idleTime, timerTargetTick, timeToDisplay, timerTimeSpent, pausedTick, clockToDisplay, ntp
  speaker.playWAV('/sd/coin1.wav')
  isTimerPaused = False
  timerStartTick = time.ticks_ms()
  timerTargetTick = timerStartTick + timerMinutes * 60000
  timerIsTimeup = False
  timerIsRunning = True
  pausedTick = time.ticks_ms()
  timerSch.run('timer1', 500, 0x00)

# この関数の説明…
def timerTimeUp():
  global timerMinutes, batteryLevel, hour, isSleep, timerMin, isTimeupSoundPlaying, isTimerPaused, lastActiveTick, touchY, timerIsRunning, minute, timerIsTimeup, timerSec, tickToNextLoop, i, clockDelimiter, isClockMode, timerStartTick, idleTime, timerTargetTick, timeToDisplay, timerTimeSpent, pausedTick, clockToDisplay, ntp
  if timerIsTimeup == False:
    timerIsTimeup = True
    lcd.font(lcd.FONT_DejaVu56)
    lcd.print('00:00', 80, 115, 0xffff33)
    isTimeupSoundPlaying = True

# Describe this function...
def showTimeToTarget():
  global timerMinutes, batteryLevel, hour, isSleep, timerMin, isTimeupSoundPlaying, isTimerPaused, lastActiveTick, touchY, timerIsRunning, minute, timerIsTimeup, timerSec, tickToNextLoop, i, clockDelimiter, isClockMode, timerStartTick, idleTime, timerTargetTick, timeToDisplay, timerTimeSpent, pausedTick, clockToDisplay, ntp
  timerMin = math.floor((timerTargetTick - (time.ticks_ms())) / 60000)
  timerSec = math.ceil(((timerTargetTick - (time.ticks_ms())) % 60000) / 1000)
  if timerSec >= 60:
    timerSec = 59
  if timerMin < 0:
    timerSec = 0
    timerMin = 0
  timeToDisplay='{:02d}'.format(timerMin) + ":" + '{:02d}'.format(timerSec)
  lcd.font(lcd.FONT_DejaVu56)
  lcd.print(timeToDisplay, 80, 115, 0xffffff)
  if timerTargetTick <= (time.ticks_ms()):
    timerTimeUp()

# この関数の説明…
def playTimeupSound():
  global timerMinutes, batteryLevel, hour, isSleep, timerMin, isTimeupSoundPlaying, isTimerPaused, lastActiveTick, touchY, timerIsRunning, minute, timerIsTimeup, timerSec, tickToNextLoop, i, clockDelimiter, isClockMode, timerStartTick, idleTime, timerTargetTick, timeToDisplay, timerTimeSpent, pausedTick, clockToDisplay, ntp
  isTimeupSoundPlaying = False
  speaker.playWAV('/sd/hurry2.wav')

# この関数の説明…
def showTimerMinutes():
  global timerMinutes, batteryLevel, hour, isSleep, timerMin, isTimeupSoundPlaying, isTimerPaused, lastActiveTick, touchY, timerIsRunning, minute, timerIsTimeup, timerSec, tickToNextLoop, i, clockDelimiter, isClockMode, timerStartTick, idleTime, timerTargetTick, timeToDisplay, timerTimeSpent, pausedTick, clockToDisplay, ntp
  timeToDisplay='{:02d}'.format(timerMinutes) + ":00"
  lcd.font(lcd.FONT_DejaVu56)
  lcd.print(timeToDisplay, 80, 115, 0xffffff)

# Describe this function...
def showTimeSpent():
  global timerMinutes, batteryLevel, hour, isSleep, timerMin, isTimeupSoundPlaying, isTimerPaused, lastActiveTick, touchY, timerIsRunning, minute, timerIsTimeup, timerSec, tickToNextLoop, i, clockDelimiter, isClockMode, timerStartTick, idleTime, timerTargetTick, timeToDisplay, timerTimeSpent, pausedTick, clockToDisplay, ntp
  timerMin = math.floor(((time.ticks_ms()) - timerStartTick) / 60000)
  timerSec = math.floor((((time.ticks_ms()) - timerStartTick) % 60000) / 1000)
  timerTimeSpent='{:02d}'.format(timerMin) + ":" + '{:02d}'.format(timerSec) + ' '
  lcd.font(lcd.FONT_DejaVu24)
  lcd.print(timerTimeSpent, 125, 69, 0xffff66)


def buttonB_wasPressed():
  global timerMinutes, batteryLevel, hour, isSleep, timerMin, isTimeupSoundPlaying, isTimerPaused, lastActiveTick, touchY, timerIsRunning, minute, timerIsTimeup, timerSec, tickToNextLoop, clockDelimiter, isClockMode, timerStartTick, idleTime, timerTargetTick, timeToDisplay, timerTimeSpent, pausedTick, i, clockToDisplay, ntp
  updateActive()
  if timerIsRunning == False:
    # U need to upload a wav using image uploader (AddImage >> any filetype)
    speaker.playWAV('/sd/big1.wav')
    while touch.status():
      timerMinutes = (timerMinutes if isinstance(timerMinutes, Number) else 0) + 1
      if timerMinutes > 60:
        timerMinutes = 1
      showTimerMinutes()
      wait(0.3)
  pass
btnB.wasPressed(buttonB_wasPressed)

def buttonC_wasPressed():
  global timerMinutes, batteryLevel, hour, isSleep, timerMin, isTimeupSoundPlaying, isTimerPaused, lastActiveTick, touchY, timerIsRunning, minute, timerIsTimeup, timerSec, tickToNextLoop, clockDelimiter, isClockMode, timerStartTick, idleTime, timerTargetTick, timeToDisplay, timerTimeSpent, pausedTick, i, clockToDisplay, ntp
  updateActive()
  if timerIsRunning == False:
    runTimer()
  else:
    stopTimer()
  pass
btnC.wasPressed(buttonC_wasPressed)

def buttonA_wasPressed():
  global timerMinutes, batteryLevel, hour, isSleep, timerMin, isTimeupSoundPlaying, isTimerPaused, lastActiveTick, touchY, timerIsRunning, minute, timerIsTimeup, timerSec, tickToNextLoop, clockDelimiter, isClockMode, timerStartTick, idleTime, timerTargetTick, timeToDisplay, timerTimeSpent, pausedTick, i, clockToDisplay, ntp
  updateActive()
  if timerIsRunning == False:
    speaker.playWAV('/sd/small1.wav')
    while touch.status():
      timerMinutes = (timerMinutes if isinstance(timerMinutes, Number) else 0) + -1
      if timerMinutes < 1:
        timerMinutes = 60
      showTimerMinutes()
      wait(0.3)
  pass
btnA.wasPressed(buttonA_wasPressed)

@timerSch.event('timer1')
def ttimer1():
  global timerMinutes, batteryLevel, hour, isSleep, timerMin, isTimeupSoundPlaying, isTimerPaused, lastActiveTick, touchY, timerIsRunning, minute, timerIsTimeup, timerSec, tickToNextLoop, clockDelimiter, isClockMode, timerStartTick, idleTime, timerTargetTick, timeToDisplay, timerTimeSpent, pausedTick, i, clockToDisplay, ntp
  if isTimerPaused:
    lcd.font(lcd.FONT_DejaVu40)
    lcd.print('PAUSE', 95, 120, 0xffff00)
  else:
    if timerIsTimeup == False:
      showTimeToTarget()
    showTimeSpent()
  lastActiveTick = time.ticks_ms()
  pass


power.setPowerLED(False)
power.setBusPowerMode(1)
initialize()
while True:
  showBatteryMeter()
  for count in range(10):
    timerApp()
  wait_ms(2)