Показаны различия между двумя версиями страницы.
| Следующая версия | Предыдущая версия | ||
| products:laboratory_iot_c:exp51 [2024/12/13 17:27] – создано labuser30 | products:laboratory_iot_c:exp51 [2024/12/13 17:39] (текущий) – labuser30 | ||
|---|---|---|---|
| Строка 12: | Строка 12: | ||
| ==== Программный код эксперимента ==== | ==== Программный код эксперимента ==== | ||
| - | < | + | < |
| - | 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) |
| - | else: | + | } |
| - | self.state = 1 | + | }; |
| - | self.start_time = time.ticks_ms() | + | |
| - | + | class Button | |
| - | def draw_value(self, | + | private: |
| - | tft.rect(x+2, | + | |
| - | + | bool pressState; | |
| - | if value < 10: | + | |
| - | value = ' | + | |
| - | else: | + | |
| - | value = str(value) | + | |
| - | + | ||
| - | tft.text(x, y, value, font.terminalfont, | + | |
| - | + | ||
| - | + | ||
| - | class Button: | + | |
| - | | + | |
| - | self.pin = Pin(p, Pin.IN) | + | |
| - | | + | |
| - | self.oldState | + | |
| - | def onPress(self): | + | public: |
| - | state = self.pin.value() | + | Button(int _pin, bool _pressState) { |
| - | if state != self.oldState: | + | pin = _pin; |
| - | self.oldState = state | + | pinMode(pin, |
| - | if state == self.pressSate: | + | pressState = _pressState; |
| - | | + | oldState = not _pressState; |
| - | return | + | } |
| + | |||
| + | bool onPress() | ||
| + | | ||
| + | if (state != oldState){ | ||
| + | oldState = state; | ||
| + | if (state == pressState) | ||
| + | } | ||
| + | | ||
| + | } | ||
| + | }; | ||
| + | |||
| + | Stopwatch stopwatch; | ||
| + | Button btn(16, HIGH); | ||
| + | void setup() { | ||
| + | os_update_cpu_frequency(160); | ||
| + | LittleFS.begin(); | ||
| + | tft.initR(INITR_BLACKTAB); | ||
| + | tft.setRotation(2); | ||
| + | stopwatch.init(); | ||
| + | } | ||
| - | btnStartStop = Button(16, 1) | + | void loop() { |
| - | + | | |
| - | stopwatch = Stopwatch() | + | stopwatch.tick(); |
| - | + | } | |
| - | + | ||
| - | while True: | + | |
| - | if btnStartStop.onPress(): | + | |
| - | | + | |
| - | + | ||
| - | | + | |
| </ | </ | ||
| - | К коду из прошлого эксперимента мы добавили класс кнопки, | + | К коду из прошлого эксперимента мы добавили класс кнопки, |
| - | < | + | < |
| - | btnStartStop = Button(16, | + | Button |
| </ | </ | ||
| В основном цикле проверяем не нажата ли кнопка. Если нажатие зафиксировано, | В основном цикле проверяем не нажата ли кнопка. Если нажатие зафиксировано, | ||
| - | < | + | < |
| - | while True: | + | if (btn.onPress()) stopwatch.startStop(); |
| - | | + | |
| - | stopwatch.start_stop() | + | |
| - | + | ||
| - | | + | |
| </ | </ | ||
| Теперь состоянием таймера можно управлять с помощью кнопки. | Теперь состоянием таймера можно управлять с помощью кнопки. | ||