В прошлом эксперименте мы получили секундомер, который умеет отсчитывать время, но еще не поддается управлению. В этом эксперименте мы добавим ему кнопку для запуска и остановки.
Рисунок 1. Монтажная схема эксперимента для дисплея с 8 выводами
Рисунок 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()
К коду из прошлого эксперимента мы добавили класс кнопки, который уже использовали ранее здесь. Создаем объект кнопки на выводе 16 с логической 1 в нажатом состоянии:
btnStartStop = Button(16, 1)
В основном цикле проверяем не нажата ли кнопка. Если нажатие зафиксировано, то изменяем состояние секундомера (запускаем, если не запущен. Останавливаем, если запущен):
while True: if btnStartStop.onPress(): stopwatch.start_stop() stopwatch.tick()
Теперь состоянием таймера можно управлять с помощью кнопки.