Различия

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

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

Следующая версия
Предыдущая версия
products:laboratory_iot_c:exp51 [2024/12/13 17:27] – создано labuser30products:laboratory_iot_c:exp51 [2024/12/13 17:39] (текущий) labuser30
Строка 12: Строка 12:
 ==== Программный код эксперимента ==== ==== Программный код эксперимента ====
  
-<file python Exp51.py[enable_line_numbers="2", start_line_numbers_at="1"]> +<file arduino Exp51.ino[enable_line_numbers="2", start_line_numbers_at="1"]> 
-from machine import Pin, SPI +#include <SPI.h> 
-from tft import TFT_GREEN +#include <Adafruit_ST7735.h> 
-import font +#include "LittleFS_ImageReader.h" 
-import time +
-_init() +
-machine.freq(160000000)+
  
 +#define PIN_CS  2
 +#define PIN_DC  4
 +#define PIN_RST 5
  
-dc  Pin(4Pin.OUT)  +Adafruit_ST7735 tft Adafruit_ST7735(PIN_CS,  PIN_DCPIN_RST); 
-cs  = Pin(2Pin.OUT+LittleFS_ImageReader reader;
-rst = Pin(5, Pin.OUT)+
  
-spi SPI(1, baudrate=40000000, polarity=0, phase=0) +class Stopwatch { 
-tft TFT_GREEN(128160spidccs, rst, rotate=0)+  private: 
 +    unsigned int hours 0;  
 +    unsigned int mins 0;  
 +    unsigned int secs = 0;   
 +    unsigned long start_time = 0; 
 +    bool state 0;  
 +    unsigned int backcolor = tft.color565(255251240);  
 +    unsigned int fontcolor = tft.color565(394051);   
  
-tft.initr(tft.BGRtft.initr(tft.RGB#Если вместо синего цвета отображается красный, а вместо красного синий +  public: 
-tft.clear(tft.rgbcolor(255,251,240))  +    void init() {   
-tft.draw_bmp(0,0,'time.bmp')+      tft.fillScreen(backcolor) 
 +      reader.drawBMP("/time.bmp"tft, 0, 0)
 +      drawInit();  
 +    } 
  
 +    void drawInit() {
 +      drawValue(8, 125, 3, 0);  
 +      drawValue(55, 125, 3, 0); 
 +      drawValue(98, 132, 2, 0);
  
-class Stopwatch: +      tft.setTextColor(fontcolor) 
-    def __init__(self): +       
-        self.hours = 0 +      tft.setCursor(41125) 
-        self.mins = 0 +      tft.setTextSize(3); 
-        self.secs = 0 +      tft.print(":");
-        self.start_time = 0 +
-        self.state = 0 +
-        self.backcolor = tft.rgbcolor(255,251,240+
-        self.fontcolor = tft.rgbcolor(39,40,51+
-        self.draw_init()+
  
 +      tft.setCursor(88, 132);  
 +      tft.setTextSize(2); 
 +      tft.print(":");
 +    }
  
-    def draw_init(self): +    void drawValue(int xint yint sizeint value{ 
-        self.draw_value(9813220+      tft.fillRect(xy6 * size * 28 * size -2backcolor);
-        self.draw_value(5512530) +
-        self.draw_value(5, 125, 30)+
  
-        tft.text(41125, ":", font.terminalfont, self.fontcolor, 3+      tft.setCursor(xy);   
-        tft.text(90, 130, ":", font.terminalfont, self.fontcolor, 2)+      tft.setTextColor(fontcolor); 
 +      tft.setTextSize(size);
  
 +      if (value < 10) tft.print(0);
 +      tft.print(value); 
 +    }
  
-    def tick(self): +    void tick() { 
-        if self.state: +      if (state) {  
-            diff = time.ticks_diff(time.ticks_ms(), self.start_time) +        unsigned long diff = millis() start_time; 
-            hours = diff // (1000 * 60 * 60) +        int hours_cur = diff / (1000 * 60 * 60) 
-            diff = diff % (1000 * 60 * 60) +        diff = diff % (1000 * 60 * 60) 
-            mins = diff // (1000 * 60) +        int mins_cur = diff / (1000 * 60) 
-            diff = diff % (1000 * 60) +        diff = diff % (1000 * 60) 
-            secs = diff // (1000)+        int secs_cur = diff / (1000)
  
-            if secs != self.secs: +        if (hours_cur != hours) { 
-                self.secs secs +            hours hours_cur;  
-                self.draw_value(981322secs)+            drawValue(81253hours)
 +        }
  
-            if mins != self.mins: +        if (mins_cur != mins) { 
-                self.mins = mins +          mins = mins_cur; 
-                self.draw_value(55, 125, 3, mins) +          drawValue(55, 125, 3, mins); 
- +        }
-            if hours != self.hours: +
-                self.hours = hours +
-                self.draw_value(5, 125, 3, hours)+
                  
 +        if (secs_cur != secs) {
 +          secs = secs_cur;
 +          drawValue(98, 132, 2, secs);
 +        }
 +      }
 +    }
  
-    def start_stop(self): +    void startStop() { 
-        if self.state: +      state = !state 
-            self.state = +      if (state) start_time = millis();  
-        else: +    } 
-            self.state = 1 +};
-            self.start_time = time.ticks_ms()+
  
- +class Button 
-    def draw_value(self, x, y, size, value): +  private
-        tft.rect(x+2, y, 6 * size * 2, 8 * size -2, self.backcolor) +    int pin; 
- +    bool pressState; 
-        if value < 10: +    bool oldState;
-            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): +  public:  
-        state = self.pin.value() +    Button(int _pin, bool _pressState) { 
-        if state != self.oldState: +      pin = _pin; 
-            self.oldState = state +      pinMode(pin, INPUT); 
-            if state == self.pressSate: +      pressState = _pressState; 
-                return True +      oldState = not _pressState; 
-        return False+    } 
 +  
 +    bool onPress() { 
 +      bool state = digitalRead(pin); 
 +      if (state != oldState){ 
 +        oldState = state; 
 +        if (state == pressState) return true; 
 +      } 
 +      return false; 
 +    } 
 +};  
 +  
 +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() { 
- +  if (btn.onPress()stopwatch.startStop(); 
-stopwatch = Stopwatch(+  stopwatch.tick()
- +}
- +
-while True: +
-    if btnStartStop.onPress()+
-        stopwatch.start_stop() +
- +
-    stopwatch.tick()+
 </file> </file>
  
-К коду из прошлого эксперимента мы добавили класс кнопки, который уже [[products:laboratory_iot:exp45|использовали ранее здесь]]. Создаем объект кнопки на выводе 16 с логической 1 в нажатом состоянии: +К коду из прошлого эксперимента мы добавили класс кнопки, который уже [[products:laboratory_iot_c:exp45|использовали ранее здесь]]. Создаем объект кнопки на выводе 16 с логической 1 в нажатом состоянии: 
-<code python[enable_line_numbers="2", start_line_numbers_at="98"]> +<code arduino[enable_line_numbers="2", start_line_numbers_at="113"]> 
-btnStartStop = Button(16, 1)+Button btn(16, HIGH);
 </code> </code>
  
 В основном цикле проверяем не нажата ли кнопка. Если нажатие зафиксировано, то изменяем состояние секундомера (запускаем, если не запущен. Останавливаем, если запущен): В основном цикле проверяем не нажата ли кнопка. Если нажатие зафиксировано, то изменяем состояние секундомера (запускаем, если не запущен. Останавливаем, если запущен):
-<code python[enable_line_numbers="2", start_line_numbers_at="103"]> +<code arduino[enable_line_numbers="2", start_line_numbers_at="124"]> 
-while True: +  if (btn.onPress()) stopwatch.startStop();
-    if btnStartStop.onPress()+
-        stopwatch.start_stop() +
- +
-    stopwatch.tick()+
 </code> </code>
  
 Теперь состоянием таймера можно управлять с помощью кнопки. Теперь состоянием таймера можно управлять с помощью кнопки.