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