===== Эксперимент 49. Графический интерфейс секундомера ===== Попробуем создать первое полезное устройство с использованием TFT дисплея. Пусть это будет простой секундомер. На дисплее будут отображаться часы, минуты и секунды, которые будет отсчитывать секундомер. Также снабдим его кнопкой по нажатию на которую, секундомер будет запускаться и останавливаться. Для красоты дополнительно выведем на дисплей картинку. Картинка с изображением секундомера {{ :products:esp-iot:time.zip |}} Ее нужно загрузить во внутреннюю память микроконтроллера ==== Схема эксперимента ==== {{ :products:esp-iot:exp24.1_mont.png?direct&600 |}} //Рисунок 1. Монтажная схема эксперимента для дисплея с 8 выводами// {{ :products:esp-iot:exp24.1_mont_11pin.png?direct&600 |}} //Рисунок 2. Монтажная схема эксперимента для дисплея с 11 выводами// ==== Программный код эксперимента ==== #include #include #include "LittleFS_ImageReader.h" #define PIN_CS 2 #define PIN_DC 4 #define PIN_RST 5 Adafruit_ST7735 tft = Adafruit_ST7735(PIN_CS, PIN_DC, PIN_RST); LittleFS_ImageReader reader; void setup() { os_update_cpu_frequency(160); LittleFS.begin(); tft.initR(INITR_BLACKTAB); tft.setRotation(2); tft.fillScreen(tft.color565(255, 251, 240)); reader.drawBMP("/time.bmp", tft, 0, 0); tft.setTextColor(tft.color565(39, 40, 51)); tft.setTextSize(3); tft.setCursor(8, 125); tft.print("00"); tft.setCursor(41, 125); tft.print(":"); tft.setCursor(55, 125); tft.print("00"); tft.setTextSize(2); tft.setCursor(88, 132); tft.print(":"); tft.setCursor(98, 132); tft.print("00"); } void loop() { } Этот код выводит интерфейс секундомера. Задаем псевдонимы выводов микроконтроллера, к которым подключается дисплей #define PIN_CS 2 #define PIN_DC 4 #define PIN_RST 5 Cоздаем объекты дисплея дисплея и считывателя изображений Adafruit_ST7735 tft = Adafruit_ST7735(PIN_CS, PIN_DC, PIN_RST); LittleFS_ImageReader reader; Этой строкой мы переключаем частоту микроконтроллера на максимальные для него 160 мегагерц. Это нужно для увеличения скорости его работы, что ускоряет работу с дисплеем. os_update_cpu_frequency(160); Инициализируем файловую систему и дисплей, устанавливаем поворот изображения на 180°. заливаем его фоновым цветом и отображаем картинку с секундомером. LittleFS.begin(); tft.initR(INITR_BLACKTAB); tft.setRotation(2); Закрашиваем дисплей RBG цветом, получая нужное значение с помощью метода ''color565'', выводим картинку секундомера. tft.fillScreen(tft.color565(255, 251, 240)); tft.draw_bmp(0,0,'time.bmp') Задаем цвет шрифта и его размер tft.setTextColor(tft.color565(39, 40, 51)); tft.setTextSize(3); Отображаем часы, разделитель — двоеточие, и минуты. tft.setCursor(8, 125); tft.print("00"); tft.setCursor(41, 125); tft.print(":"); tft.setCursor(55, 125); tft.print("00"); Уменьшаем размер шрифта, отображаем разделитель и секунды tft.setTextSize(2); tft.setCursor(88, 132); tft.print(":"); tft.setCursor(98, 132); tft.print("00"); } Координаты для вывода данных подбирались экспериментально, для получения приемлемого дизайна. Мы намерено разбили данные на части: часы, минуты, секунды и разделители. Ведь в будущем нам нужно будет изменять эти данные независимо друг от друга, именно поэтому мы и разделили их. Мы получили интерфейс нашего устройства — секундомера. В следующем эксперименте займемся реализацией логики его работы.