Показаны различия между двумя версиями страницы.
| Предыдущая версия справа и слеваПредыдущая версияСледующая версия | Предыдущая версия | ||
| 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(); |
| - | | + | |
| </ | </ | ||
| Теперь наш секундомер умеет считать время. Но еще не слушается управления. В следующем эксперименте мы добавим управление с помощью кнопки и получим полноценный секундомер. | Теперь наш секундомер умеет считать время. Но еще не слушается управления. В следующем эксперименте мы добавим управление с помощью кнопки и получим полноценный секундомер. | ||