Эксперимент 49. Графический интерфейс секундомера

Попробуем создать первое полезное устройство с использованием TFT дисплея. Пусть это будет простой секундомер. На дисплее будут отображаться часы, минуты и секунды, которые будет отсчитывать секундомер. Также снабдим его кнопкой по нажатию на которую, секундомер будет запускаться и останавливаться. Для красоты дополнительно выведем на дисплей картинку.

Картинка с изображением секундомера

Ее нужно загрузить во внутреннюю память микроконтроллера

Схема эксперимента

Рисунок 1. Монтажная схема эксперимента для дисплея с 8 выводами

Рисунок 2. Монтажная схема эксперимента для дисплея с 11 выводами

Программный код эксперимента

Exp49.ino
  1. #include <SPI.h>
  2. #include <Adafruit_ST7735.h>
  3. #include "LittleFS_ImageReader.h"
  4.  
  5. #define PIN_CS 2
  6. #define PIN_DC 4
  7. #define PIN_RST 5
  8.  
  9. Adafruit_ST7735 tft = Adafruit_ST7735(PIN_CS, PIN_DC, PIN_RST);
  10. LittleFS_ImageReader reader;
  11.  
  12. void setup() {
  13. os_update_cpu_frequency(160);
  14. LittleFS.begin();
  15. tft.initR(INITR_BLACKTAB);
  16. tft.setRotation(2);
  17.  
  18. tft.fillScreen(tft.color565(255, 251, 240));
  19. reader.drawBMP("/time.bmp", tft, 0, 0);
  20.  
  21. tft.setTextColor(tft.color565(39, 40, 51));
  22. tft.setTextSize(3);
  23. tft.setCursor(8, 125);
  24. tft.print("00");
  25. tft.setCursor(41, 125);
  26. tft.print(":");
  27. tft.setCursor(55, 125);
  28. tft.print("00");
  29. tft.setTextSize(2);
  30. tft.setCursor(88, 132);
  31. tft.print(":");
  32. tft.setCursor(98, 132);
  33. tft.print("00");
  34. }
  35.  
  36. void loop() {
  37. }

Этот код выводит интерфейс секундомера.

Задаем псевдонимы выводов микроконтроллера, к которым подключается дисплей

  1. #define PIN_CS 2
  2. #define PIN_DC 4
  3. #define PIN_RST 5

Cоздаем объекты дисплея дисплея и считывателя изображений

  1. Adafruit_ST7735 tft = Adafruit_ST7735(PIN_CS, PIN_DC, PIN_RST);
  2. LittleFS_ImageReader reader;

Этой строкой мы переключаем частоту микроконтроллера на максимальные для него 160 мегагерц. Это нужно для увеличения скорости его работы, что ускоряет работу с дисплеем.

  1. os_update_cpu_frequency(160);

Инициализируем файловую систему и дисплей, устанавливаем поворот изображения на 180°. заливаем его фоновым цветом и отображаем картинку с секундомером.

  1. LittleFS.begin();
  2. tft.initR(INITR_BLACKTAB);
  3. tft.setRotation(2);

Закрашиваем дисплей RBG цветом, получая нужное значение с помощью метода color565, выводим картинку секундомера.

  1. tft.fillScreen(tft.color565(255, 251, 240));
  2. tft.draw_bmp(0,0,'time.bmp')

Задаем цвет шрифта и его размер

  1. tft.setTextColor(tft.color565(39, 40, 51));
  2. tft.setTextSize(3);

Отображаем часы, разделитель — двоеточие, и минуты.

  1. tft.setCursor(8, 125);
  2. tft.print("00");
  3. tft.setCursor(41, 125);
  4. tft.print(":");
  5. tft.setCursor(55, 125);
  6. tft.print("00");

Уменьшаем размер шрифта, отображаем разделитель и секунды

  1. tft.setTextSize(2);
  2. tft.setCursor(88, 132);
  3. tft.print(":");
  4. tft.setCursor(98, 132);
  5. tft.print("00");
  6. }

Координаты для вывода данных подбирались экспериментально, для получения приемлемого дизайна. Мы намерено разбили данные на части: часы, минуты, секунды и разделители. Ведь в будущем нам нужно будет изменять эти данные независимо друг от друга, именно поэтому мы и разделили их.

Мы получили интерфейс нашего устройства — секундомера. В следующем эксперименте займемся реализацией логики его работы.