Показаны различия между двумя версиями страницы.
Предыдущая версия справа и слеваПредыдущая версияСледующая версия | Предыдущая версия | ||
products:laboratory_iot_c:exp50 [2024/12/13 16:23] – [Класс Stopwatch] labuser30 | products:laboratory_iot_c:exp50 [2024/12/13 17:12] (текущий) – [Программный код эксперимента] labuser30 | ||
---|---|---|---|
Строка 110: | Строка 110: | ||
</ | </ | ||
- | Класс содержит конструктор | + | Класс содержит |
- | * '' | + | * '' |
- | * '' | + | * '' |
- | * '' | + | * '' |
- | * '' | + | * '' |
* '' | * '' | ||
Код класса снабжен комментариями, | Код класса снабжен комментариями, | ||
- | |||
- | Функция '' | ||
Заострим внимание на вычислении количества часов: | Заострим внимание на вычислении количества часов: | ||
- | < | + | < |
- | hours = diff // (1000 * 60 * 60) | + | int hours_cur |
- | diff = diff % (1000 * 60 * 60) | + | diff = diff % (1000 * 60 * 60); |
</ | </ | ||
- | Оператор '' | + | Оператор '' |
А оператор '' | А оператор '' | ||
Сначала мы вычисляем целое количество часов, а потом мы вычисляем по сути сколько осталось после выделения целого количества часов. После этого там останется значение меньше одного часа. Его мы уже будем делить на минуты. А после вычитания минут будем определять сколько осталось секунд. | Сначала мы вычисляем целое количество часов, а потом мы вычисляем по сути сколько осталось после выделения целого количества часов. После этого там останется значение меньше одного часа. Его мы уже будем делить на минуты. А после вычитания минут будем определять сколько осталось секунд. | ||
- | Теперь сделаем программу с использованием данного класса | + | Теперь сделаем программу с использованием данного класса. |
==== Программный код эксперимента ==== | ==== Программный код эксперимента ==== | ||
- | < | + | < |
- | from machine import Pin, SPI | + | #include <SPI.h> |
- | from tft import TFT_GREEN | + | #include < |
- | import font | + | #include " |
- | import time | + | |
- | _init() | + | |
- | machine.freq(160000000) | + | |
+ | #define PIN_CS | ||
+ | #define PIN_DC | ||
+ | #define PIN_RST 5 | ||
- | dc | + | Adafruit_ST7735 tft = Adafruit_ST7735(PIN_CS, |
- | cs = Pin(2, Pin.OUT) | + | LittleFS_ImageReader reader; |
- | rst = Pin(5, Pin.OUT) | + | |
- | spi = SPI(1, baudrate=40000000, polarity=0, phase=0) | + | class Stopwatch { |
- | tft = TFT_GREEN(128, 160, spi, dc, cs, rst, rotate=0) | + | private: |
+ | unsigned int hours = 0; | ||
+ | unsigned int mins = 0; | ||
+ | unsigned int secs = 0; | ||
+ | unsigned long start_time | ||
+ | bool state = 0; | ||
+ | unsigned int backcolor = tft.color565(255, 251, 240); | ||
+ | unsigned int fontcolor = tft.color565(39, 40, 51); | ||
- | tft.initr(tft.BGR) # tft.initr(tft.RGB) #Если вместо синего цвета отображается красный, | + | public: |
- | tft.clear(tft.rgbcolor(255,251,240)) | + | void init() { |
- | tft.draw_bmp(0,0,' | + | |
+ | | ||
+ | drawInit(); | ||
+ | } | ||
+ | void drawInit() { | ||
+ | drawValue(8, | ||
+ | drawValue(55, | ||
+ | drawValue(98, | ||
- | class Stopwatch: | + | tft.setTextColor(fontcolor); |
- | def __init__(self): | + | |
- | | + | tft.setCursor(41, 125); |
- | | + | tft.setTextSize(3); |
- | self.secs = 0 | + | tft.print(":" |
- | self.start_time = 0 | + | |
- | self.state = 0 | + | |
- | self.backcolor = tft.rgbcolor(255,251,240) | + | |
- | | + | |
- | self.draw_init() | + | |
+ | tft.setCursor(88, | ||
+ | tft.setTextSize(2); | ||
+ | tft.print(":" | ||
+ | } | ||
- | | + | |
- | self.draw_value(98, 132, 2, 0) | + | tft.fillRect(x, y, 6 * size * 2, 8 * size -2, backcolor); |
- | self.draw_value(55, 125, 3, 0) | + | |
- | self.draw_value(5, | + | |
- | | + | |
- | tft.text(90, 130, ":", | + | tft.setTextColor(fontcolor); |
+ | tft.setTextSize(size); | ||
+ | if (value < 10) tft.print(0); | ||
+ | tft.print(value); | ||
+ | } | ||
- | | + | |
- | if self.state: | + | if (state) { |
- | diff = time.ticks_diff(time.ticks_ms(), self.start_time) | + | |
- | | + | int hours_cur |
- | diff = diff % (1000 * 60 * 60) | + | diff = diff % (1000 * 60 * 60); |
- | | + | int mins_cur |
- | diff = diff % (1000 * 60) | + | diff = diff % (1000 * 60); |
- | | + | int secs_cur |
- | | + | |
- | | + | |
- | | + | |
+ | } | ||
- | | + | |
- | self.mins = mins | + | mins = mins_cur; |
- | | + | |
- | + | } | |
- | if hours != self.hours: | + | |
- | self.hours = hours | + | |
- | self.draw_value(5, | + | |
| | ||
+ | if (secs_cur != secs) { | ||
+ | secs = secs_cur; | ||
+ | drawValue(98, | ||
+ | } | ||
+ | } | ||
+ | } | ||
- | | + | |
- | if self.state: | + | state = !state; |
- | self.state = 0 | + | if (state) start_time |
- | else: | + | |
- | self.state = 1 | + | }; |
- | self.start_time = time.ticks_ms() | + | |
- | + | ||
- | + | ||
- | def draw_value(self, | + | |
- | tft.rect(x+2, | + | |
- | + | ||
- | if value < 10: | + | |
- | value = ' | + | |
- | else: | + | |
- | value = str(value) | + | |
- | + | ||
- | tft.text(x, y, value, font.terminalfont, | + | |
- | + | ||
- | + | ||
- | class Button: | + | |
- | | + | |
- | 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 | + | |
- | | + | |
+ | Stopwatch stopwatch; | ||
- | stopwatch | + | void setup() { |
- | stopwatch.start_stop() | + | os_update_cpu_frequency(160); |
+ | LittleFS.begin(); | ||
+ | tft.initR(INITR_BLACKTAB); | ||
+ | tft.setRotation(2); | ||
+ | |||
+ | | ||
+ | stopwatch.startStop(); | ||
+ | } | ||
- | while True: | + | void loop() { |
- | stopwatch.tick() | + | stopwatch.tick(); |
+ | } | ||
</ | </ | ||
- | Код эксперимента должен быть понятен. Сначала как обычно подключаем библиотеки, настраиваем SPI и дисплей. Потом код класса секундомера и в конце мы создаем объект секундомера | + | Код эксперимента должен быть понятен. Сначала как обычно подключаем библиотеки и дисплей. Потом код класса секундомера и в конце мы создаем объект секундомера. |
- | < | + | < |
- | stopwatch | + | Stopwatch |
</ | </ | ||
- | Запускаем его | + | Инициализируем и запускаем его. |
- | < | + | < |
- | stopwatch.start_stop() | + | |
+ | | ||
</ | </ | ||
- | И в бесконечном цикле вызываем его метод '' | + | И в бесконечном цикле вызываем его метод '' |
- | < | + | < |
- | while True: | + | stopwatch.tick(); |
- | | + | |
</ | </ | ||
Теперь наш секундомер умеет считать время. Но еще не слушается управления. В следующем эксперименте мы добавим управление с помощью кнопки и получим полноценный секундомер. | Теперь наш секундомер умеет считать время. Но еще не слушается управления. В следующем эксперименте мы добавим управление с помощью кнопки и получим полноценный секундомер. |