===== Эксперимент 51. Секундомер =====
В прошлом эксперименте мы получили секундомер, который умеет отсчитывать время, но еще не поддается управлению. В этом эксперименте мы добавим ему кнопку для запуска и остановки.
==== Схема эксперимента ====
{{ :products:esp-iot:exp24.3_mont.png?direct&600 |}}
//Рисунок 1. Монтажная схема эксперимента для дисплея с 8 выводами//
{{ :products:esp-iot:exp24.3_mont_11pin.png?direct&600 |}}
//Рисунок 2. Монтажная схема эксперимента для дисплея с 11 выводами//
==== Программный код эксперимента ====
from machine import Pin, SPI
from tft import TFT_GREEN
import font
import time
_init()
machine.freq(160000000)
dc = Pin(4, Pin.OUT)
cs = Pin(2, Pin.OUT)
rst = Pin(5, Pin.OUT)
spi = SPI(1, baudrate=40000000, polarity=0, phase=0)
tft = TFT_GREEN(128, 160, spi, dc, cs, rst, rotate=0)
tft.initr(tft.BGR) # tft.initr(tft.RGB) #Если вместо синего цвета отображается красный, а вместо красного синий
tft.clear(tft.rgbcolor(255,251,240))
tft.draw_bmp(0,0,'time.bmp')
class Stopwatch:
def __init__(self):
self.hours = 0
self.mins = 0
self.secs = 0
self.start_time = 0
self.state = 0
self.backcolor = tft.rgbcolor(255,251,240)
self.fontcolor = tft.rgbcolor(39,40,51)
self.draw_init()
def draw_init(self):
self.draw_value(98, 132, 2, 0)
self.draw_value(55, 125, 3, 0)
self.draw_value(5, 125, 3, 0)
tft.text(41, 125, ":", font.terminalfont, self.fontcolor, 3)
tft.text(90, 130, ":", font.terminalfont, self.fontcolor, 2)
def tick(self):
if self.state:
diff = time.ticks_diff(time.ticks_ms(), self.start_time)
hours = diff // (1000 * 60 * 60)
diff = diff % (1000 * 60 * 60)
mins = diff // (1000 * 60)
diff = diff % (1000 * 60)
secs = diff // (1000)
if secs != self.secs:
self.secs = secs
self.draw_value(98, 132, 2, secs)
if mins != self.mins:
self.mins = mins
self.draw_value(55, 125, 3, mins)
if hours != self.hours:
self.hours = hours
self.draw_value(5, 125, 3, hours)
def start_stop(self):
if self.state:
self.state = 0
else:
self.state = 1
self.start_time = time.ticks_ms()
def draw_value(self, x, y, size, value):
tft.rect(x+2, y, 6 * size * 2, 8 * size -2, self.backcolor)
if value < 10:
value = '0' + str(value)
else:
value = str(value)
tft.text(x, y, value, font.terminalfont, self.fontcolor, size)
class Button:
def __init__(self, p, pressSate):
self.pin = Pin(p, Pin.IN)
self.pressSate = pressSate
self.oldState = not pressSate
def onPress(self):
state = self.pin.value()
if state != self.oldState:
self.oldState = state
if state == self.pressSate:
return True
return False
btnStartStop = Button(16, 1)
stopwatch = Stopwatch()
while True:
if btnStartStop.onPress():
stopwatch.start_stop()
stopwatch.tick()
К коду из прошлого эксперимента мы добавили класс кнопки, который уже [[products:laboratory_iot:exp45|использовали ранее здесь]]. Создаем объект кнопки на выводе 16 с логической 1 в нажатом состоянии:
btnStartStop = Button(16, 1)
В основном цикле проверяем не нажата ли кнопка. Если нажатие зафиксировано, то изменяем состояние секундомера (запускаем, если не запущен. Останавливаем, если запущен):
while True:
if btnStartStop.onPress():
stopwatch.start_stop()
stopwatch.tick()
Теперь состоянием таймера можно управлять с помощью кнопки.