Различия

Показаны различия между двумя версиями страницы.

Ссылка на это сравнение

Предыдущая версия справа и слеваПредыдущая версия
Следующая версия
Предыдущая версия
products:laboratory_iot:exp50 [2020/06/01 19:12] – [Класс Stopwatch] labuser29products:laboratory_iot:exp50 [2021/07/21 16:47] (текущий) – [Программный код эксперимента] labuser29
Строка 14: Строка 14:
  
 {{ :products:esp-iot:exp24.1_mont.png?direct&600 |}} {{ :products:esp-iot:exp24.1_mont.png?direct&600 |}}
-//Рисунок 1. Монтажная схема эксперимента//+//Рисунок 1. Монтажная схема эксперимента для дисплея с 8 выводами//
  
 +{{ :products:esp-iot:exp24.1_mont_11pin.png?direct&600 |}}
 +//Рисунок 2. Монтажная схема эксперимента для дисплея с 11 выводами//
 ==== Класс Stopwatch==== ==== Класс Stopwatch====
  
-<code python Exp49.py[enable_line_numbers="2", start_line_numbers_at="1"]>+<code python [enable_line_numbers="2", start_line_numbers_at="1"]>
 class Stopwatch: class Stopwatch:
     def __init__(self):     def __init__(self):
Строка 110: Строка 112:
 </code> </code>
  
-Оператор ''%//%'' — это оператор деления без остатка. Например 5 // 2 = 2. А остаток 0.5 был отброшен.+Оператор ''%%//%%'' — это оператор деления без остатка. Например 5 %%//%% 2 = 2. А остаток 0.5 был отброшен.
 А оператор ''%'' — напротив возвращает только остаток от деления. 5 % 2 = 0.5 А оператор ''%'' — напротив возвращает только остаток от деления. 5 % 2 = 0.5
  
 Сначала мы вычисляем целое количество часов, а потом мы вычисляем по сути сколько осталось после выделения целого количества часов. После этого там останется значение меньше одного часа. Его мы уже будем делить на минуты. А после вычитания минут будем определять сколько осталось секунд. Сначала мы вычисляем целое количество часов, а потом мы вычисляем по сути сколько осталось после выделения целого количества часов. После этого там останется значение меньше одного часа. Его мы уже будем делить на минуты. А после вычитания минут будем определять сколько осталось секунд.
 +
 +Теперь сделаем программу с использованием данного класса
 +
 +==== Программный код эксперимента ====
 +
 +<file python Exp50.py[enable_line_numbers="2", start_line_numbers_at="1"]>
 +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
 +
 +
 +stopwatch = Stopwatch()
 +stopwatch.start_stop()
 +
 +while True:
 +    stopwatch.tick()
 +</file>
 +
 +Код эксперимента должен быть понятен. Сначала как обычно подключаем библиотеки, настраиваем SPI и дисплей. Потом код класса секундомера и в конце мы создаем объект секундомера
 +<code python[enable_line_numbers="2", start_line_numbers_at="98"]>
 +stopwatch = Stopwatch()
 +</code>
 +
 +Запускаем его
 +<code python[enable_line_numbers="2", start_line_numbers_at="99"]>
 +stopwatch.start_stop()
 +</code>
 +
 +И в бесконечном цикле вызываем его метод ''tick()''. В нем он занимается отслеживаем времени и отображением изменений на дисплее
 +<code python[enable_line_numbers="2", start_line_numbers_at="101"]>
 +while True:
 +    stopwatch.tick()
 +</code>
 +
 +Теперь наш секундомер умеет считать время. Но еще не слушается управления. В следующем эксперименте мы добавим управление с помощью кнопки и получим полноценный секундомер.