Эксперимент 51. Секундомер

В прошлом эксперименте мы получили секундомер, который умеет отсчитывать время, но еще не поддается управлению. В этом эксперименте мы добавим ему кнопку для запуска и остановки.

Схема эксперимента

Рисунок 1. Монтажная схема эксперимента для дисплея с 8 выводами

Рисунок 2. Монтажная схема эксперимента для дисплея с 11 выводами

Программный код эксперимента

Exp51.py
  1. from machine import Pin, SPI
  2. from tft import TFT_GREEN
  3. import font
  4. import time
  5. _init()
  6. machine.freq(160000000)
  7.  
  8.  
  9. dc = Pin(4, Pin.OUT)
  10. cs = Pin(2, Pin.OUT)
  11. rst = Pin(5, Pin.OUT)
  12.  
  13. spi = SPI(1, baudrate=40000000, polarity=0, phase=0)
  14. tft = TFT_GREEN(128, 160, spi, dc, cs, rst, rotate=0)
  15.  
  16. tft.initr(tft.BGR) # tft.initr(tft.RGB) #Если вместо синего цвета отображается красный, а вместо красного синий
  17. tft.clear(tft.rgbcolor(255,251,240))
  18. tft.draw_bmp(0,0,'time.bmp')
  19.  
  20.  
  21. class Stopwatch:
  22. def __init__(self):
  23. self.hours = 0
  24. self.mins = 0
  25. self.secs = 0
  26. self.start_time = 0
  27. self.state = 0
  28. self.backcolor = tft.rgbcolor(255,251,240)
  29. self.fontcolor = tft.rgbcolor(39,40,51)
  30. self.draw_init()
  31.  
  32.  
  33. def draw_init(self):
  34. self.draw_value(98, 132, 2, 0)
  35. self.draw_value(55, 125, 3, 0)
  36. self.draw_value(5, 125, 3, 0)
  37.  
  38. tft.text(41, 125, ":", font.terminalfont, self.fontcolor, 3)
  39. tft.text(90, 130, ":", font.terminalfont, self.fontcolor, 2)
  40.  
  41.  
  42. def tick(self):
  43. if self.state:
  44. diff = time.ticks_diff(time.ticks_ms(), self.start_time)
  45. hours = diff // (1000 * 60 * 60)
  46. diff = diff % (1000 * 60 * 60)
  47. mins = diff // (1000 * 60)
  48. diff = diff % (1000 * 60)
  49. secs = diff // (1000)
  50.  
  51. if secs != self.secs:
  52. self.secs = secs
  53. self.draw_value(98, 132, 2, secs)
  54.  
  55. if mins != self.mins:
  56. self.mins = mins
  57. self.draw_value(55, 125, 3, mins)
  58.  
  59. if hours != self.hours:
  60. self.hours = hours
  61. self.draw_value(5, 125, 3, hours)
  62.  
  63.  
  64. def start_stop(self):
  65. if self.state:
  66. self.state = 0
  67. else:
  68. self.state = 1
  69. self.start_time = time.ticks_ms()
  70.  
  71.  
  72. def draw_value(self, x, y, size, value):
  73. tft.rect(x+2, y, 6 * size * 2, 8 * size -2, self.backcolor)
  74.  
  75. if value < 10:
  76. value = '0' + str(value)
  77. else:
  78. value = str(value)
  79.  
  80. tft.text(x, y, value, font.terminalfont, self.fontcolor, size)
  81.  
  82.  
  83. class Button:
  84. def __init__(self, p, pressSate):
  85. self.pin = Pin(p, Pin.IN)
  86. self.pressSate = pressSate
  87. self.oldState = not pressSate
  88.  
  89. def onPress(self):
  90. state = self.pin.value()
  91. if state != self.oldState:
  92. self.oldState = state
  93. if state == self.pressSate:
  94. return True
  95. return False
  96.  
  97.  
  98. btnStartStop = Button(16, 1)
  99.  
  100. stopwatch = Stopwatch()
  101.  
  102.  
  103. while True:
  104. if btnStartStop.onPress():
  105. stopwatch.start_stop()
  106.  
  107. stopwatch.tick()

К коду из прошлого эксперимента мы добавили класс кнопки, который уже использовали ранее здесь. Создаем объект кнопки на выводе 16 с логической 1 в нажатом состоянии:

  1. btnStartStop = Button(16, 1)

В основном цикле проверяем не нажата ли кнопка. Если нажатие зафиксировано, то изменяем состояние секундомера (запускаем, если не запущен. Останавливаем, если запущен):

  1. while True:
  2. if btnStartStop.onPress():
  3. stopwatch.start_stop()
  4.  
  5. stopwatch.tick()

Теперь состоянием таймера можно управлять с помощью кнопки.