Відповісти

Введіть повідомлення і натисніть Надіслати
Параметри

Назад

Огляд теми (нові повідомленні вгорі)

vladxxx
2025-04-06 12:03:33

https://youtube.com/watch?v=yF5b6bKn7dk&si=1sq55sumtW7IE65A

vladxxx
2025-04-06 11:50:18

Хлопци !!! У кого завалился лишний системные и монитор? Help. Если что помогу с проектами на stm .Я бомж с Луганска. Работаю в mikroc, kubeide.

renoshnik
2025-04-02 19:18:24
jokeer пише:

В мене до графіка зауважень і не було wink тут таке.. якщо чужий код працює якось не так, то або копати даташіти, або спробувати іншу реалізацію.

то я ще не відвик від служби..  smile

маю на увазі, що графік з цією лібою малюється одним кольором без змін ...
стара ліба пішла в смітник ...

jokeer
2025-04-02 18:13:59

В мене до графіка зауважень і не було wink тут таке.. якщо чужий код працює якось не так, то або копати даташіти, або спробувати іншу реалізацію.

renoshnik
2025-04-02 17:52:44
jokeR пише:

https://github.com/adafruit/Adafruit-ST7735-Library/ не хочете розглянути?

Дякую, графік тепер без зауважень ...  smile  smile  smile

jokeR
2025-04-02 14:54:50

https://github.com/adafruit/Adafruit-ST7735-Library/ не хочете розглянути?

jokeer
2025-04-02 14:52:22

https://github.com/adafruit/Adafruit-ST7735-Library/tree/1.0.8 не хочете розглянути?

renoshnik
2025-04-02 13:24:05

В прикладах бібліотеки взяв скетч аналогового годинника

/*
  An example analogue clock using a TFT LCD screen to show the time
 use of some of the drawing commands with the ST7735 library.
 For a more accurate clock, it would be better to use the RTClib library.
 But this is just a demo. 
 
 This examples uses the hardware SPI only. Non-hardware SPI
 is just too slow (~8 times slower!)
 
 Gilchrist 6/2/2014 1.0
 Updated by Bodmer
 */

#include <TFT_ST7735.h> // Graphics and font library for ST7735 driver chip
#include <SPI.h>

TFT_ST7735 tft = TFT_ST7735();  // Invoke library, pins defined in User_Setup.h

#define ST7735_GREY 0xBDF7

float sx = 0, sy = 1, mx = 1, my = 0, hx = -1, hy = 0;    // Saved H, M, S x & y multipliers
float sdeg=0, mdeg=0, hdeg=0;
uint16_t osx=64, osy=64, omx=64, omy=64, ohx=64, ohy=64;  // Saved H, M, S x & y coords
uint16_t x0=0, x1=0, y0=0, y1=0;
uint32_t targetTime = 0;                    // for next 1 second timeout

static uint8_t conv2d(const char* p) {
  uint8_t v = 0;
  if ('0' <= *p && *p <= '9')
    v = *p - '0';
  return 10 * v + *++p - '0';
}

uint8_t hh=conv2d(__TIME__), mm=conv2d(__TIME__+3), ss=conv2d(__TIME__+6);  // Get H, M, S from compile time

boolean initial = 1;

void setup(void) {
  tft.init();
  tft.setRotation(0);
  tft.fillScreen(ST7735_GREY);
  tft.setTextColor(ST7735_GREEN, ST7735_GREY);  // Adding a black background colour erases previous text automatically
  
  // Draw clock face
  tft.fillCircle(64, 64, 61, ST7735_BLUE);
  tft.fillCircle(64, 64, 57, ST7735_BLACK);

  // Draw 12 lines
  for(int i = 0; i<360; i+= 30) {
    sx = cos((i-90)*0.0174532925);
    sy = sin((i-90)*0.0174532925);
    x0 = sx*57+64;
    y0 = sy*57+64;
    x1 = sx*50+64;
    y1 = sy*50+64;

    tft.drawLine(x0, y0, x1, y1, ST7735_BLUE);
  }

  // Draw 60 dots
  for(int i = 0; i<360; i+= 6) {
    sx = cos((i-90)*0.0174532925);
    sy = sin((i-90)*0.0174532925);
    x0 = sx*53+64;
    y0 = sy*53+64;
    
    tft.drawPixel(x0, y0, ST7735_BLUE);
    if(i==0 || i==180) tft.fillCircle(x0, y0, 1, ST7735_CYAN);
    if(i==0 || i==180) tft.fillCircle(x0+1, y0, 1, ST7735_CYAN);
    if(i==90 || i==270) tft.fillCircle(x0, y0, 1, ST7735_CYAN);
    if(i==90 || i==270) tft.fillCircle(x0+1, y0, 1, ST7735_CYAN);
  }

  tft.fillCircle(65, 65, 3, ST7735_RED);

  // Draw text at position 64,125 using fonts 4
  // Only font numbers 2,4,6,7 are valid. Font 6 only contains characters [space] 0 1 2 3 4 5 6 7 8 9 : . a p m
  // Font 7 is a 7 segment font and only contains characters [space] 0 1 2 3 4 5 6 7 8 9 : .
  tft.drawCentreString("Time flies",64,130,4);

  targetTime = millis() + 1000; 
}

void loop() {
  if (targetTime < millis()) {
    targetTime = millis()+1000;
    ss++;              // Advance second
    if (ss==60) {
      ss=0;
      mm++;            // Advance minute
      if(mm>59) {
        mm=0;
        hh++;          // Advance hour
        if (hh>23) {
          hh=0;
        }
      }
    }

    // Pre-compute hand degrees, x & y coords for a fast screen update
    sdeg = ss*6;                  // 0-59 -> 0-354
    mdeg = mm*6+sdeg*0.01666667;  // 0-59 -> 0-360 - includes seconds
    hdeg = hh*30+mdeg*0.0833333;  // 0-11 -> 0-360 - includes minutes and seconds
    hx = cos((hdeg-90)*0.0174532925);    
    hy = sin((hdeg-90)*0.0174532925);
    mx = cos((mdeg-90)*0.0174532925);    
    my = sin((mdeg-90)*0.0174532925);
    sx = cos((sdeg-90)*0.0174532925);    
    sy = sin((sdeg-90)*0.0174532925);

    if (ss==0 || initial) {
      initial = 0;
      // Erase hour and minute hand positions every minute
      tft.drawLine(ohx, ohy, 65, 65, ST7735_BLACK);
      ohx = hx*33+65;    
      ohy = hy*33+65;
      tft.drawLine(omx, omy, 65, 65, ST7735_BLACK);
      omx = mx*44+65;    
      omy = my*44+65;
    }

      // Redraw new hand positions, hour and minute hands not erased here to avoid flicker
      tft.drawLine(osx, osy, 65, 65, ST7735_BLACK);
      tft.drawLine(ohx, ohy, 65, 65, ST7735_WHITE);
      tft.drawLine(omx, omy, 65, 65, ST7735_WHITE);
      osx = sx*47+65;    
      osy = sy*47+65;
      tft.drawLine(osx, osy, 65, 65, ST7735_RED);

    tft.fillCircle(65, 65, 3, ST7735_RED);
  }
}

секундна стрілка рандомно залишає артифакти жовтого кольору ....

можливо дійсно то якість самого екрану така ...

renoshnik
2025-04-02 13:11:49

Для тесту запустив таку програмку

#include <TFT_ST7735.h> // Библиотека для работы с экраном
#include <SPI.h>
// Параметры подключения (замените на ваши пины)
#define CS_PIN 10
#define DC_PIN 9
#define RST_PIN 8
TFT_ST7735 tft = TFT_ST7735(); // Инициализация экрана

void setup(void) {
  tft.init();             // Инициализация экрана
  tft.setRotation(3);     // Установка ориентации экрана
  tft.fillScreen(TFT_NAVY);     // Установка начального цвета фона
  drawAxes();             // Построение осей координат
}

void loop() {
 delay(50);
 tft.drawLine(75, 0, 75, 75, TFT_GREEN); // цвет изменяется 
 delay(50);
 tft.drawLine(55, 120, 55, 20, TFT_GREEN); // цвет изменяется 
 delay(50);
 tft.drawFastVLine(25, 0, 90, TFT_GREEN); // стабильный цвет
 delay(50);
 drawAxes();               // Построение осей координат
}
//  ФУНКЦИЯ ОТРИСОВКИ БАЗОВОГО ЭКРАНА
void drawAxes() {
  // Начало координат в нижнем левом углу
  int originX = 1;      // Начало координат по X (левый край экрана)
  int endX = 158;       // Окончание координат по X (правый край экрана)
  int originY = 125;    // Начало координат по Y (нижний край экрана)
  int endY = 0;       // Окончание координат по Y (верхний край экрана)  
  // Рисуем оси X и Y
  tft.drawFastHLine(0, originY, tft.width(), TFT_WHITE); // Горизонтальная линия вправо
  tft.drawFastVLine(originX, 0, tft.height(), TFT_WHITE); // Вертикальная линия вверх
  // Добавляем стрелки на концах осей
  tft.drawLine(endX, originY, endX - 3, originY - 3, TFT_WHITE);  // Стрелка вправо
  tft.drawLine(originX, endY, originX + 3, endY + 3, TFT_WHITE);    // Стрелка вверх
  // Подписи осей
  tft.setTextColor(TFT_CYAN);
  tft.setTextSize(1);
  tft.setCursor(139, 115);  // Подпись оси X
  unsigned long _x = tft.width();
  tft.print(_x);
unsigned long _y = tft.height();  
  tft.setCursor(5, 1);    // Подпись оси Y
  tft.print(_y);
}

tft.drawLine(75, 0, 75, 75, TFT_GREEN); // цвет изменяется
tft.drawLine(55, 120, 55, 20, TFT_GREEN); // цвет изменяется
tft.drawFastVLine(25, 0, 90, TFT_GREEN); // стабильный цвет

якщо за коментувати рядок    tft.setRotation(3);     // Установка ориентации экрана

результат не змінюється  hmm  hmm  hmm

jokeer
2025-04-02 12:54:17

Дебажити чужу лібу це цікаве зайняття. Я б запропонував або дуже уважно подивитися на приклади до неї, якщо вони є, і працюють коректно - шукати різницю. Або пошукати, може є інші рішення.

dimich
2025-04-02 10:31:43
renoshnik пише:

FAST використовується тільки для горизонтальних і вертикальних ліній у графіку мені не вдалося використати FAST hmm

Там же в коді все написано. Якщо макрос FAST_LINE визначений, то звичайна drawLine() використовує оптимізований алгорим, який вертикальні та горизонтальні сегменти більше двох пікселів малює за допомогою Fast Line, тому працює швидше. Але код функції на 116 байтів більший. Якщо FAST_LINE не визначений, то drawLine() використовує класичну реалізацію алгоритму Брезенхема, яка повільніша, але менша за розміром.

renoshnik пише:

***  може проблеми з кольором через орієнтацію екрану hmm

Все може бути. Якщо ця конфігурація впливає на обчислення адреси (хоч програмно, хоч апаратно в самому контроллері), то теж може. Потрібно повиводити тестові зображення. Спочатку просто пікселі різних кольорів. З парними та непарними координатами. Якщо все ок, тоді лінії, теж різних кольорів, з парними і непарними координатами початку та кінця. Потім, по результатам, дивитись в реалізацію бібліотеки та документацію на контроллер.

renoshnik
2025-04-02 09:58:25
dimich пише:
renoshnik пише:

Так FAST_LINE застосовується для прямих ліній, дійсно так правильніше було малювати осі координат...

Я маю на увазі, що в залежності від значення макроса FAST_LINE під час компіляції використовується або одна, або інша реалізація TFT_ST7735::drawLine().

renoshnik пише:

Що до розміру екрану, то кінцеві точки я визначив візуально підбором, бо параметрів екрану я не знав.

Там розмір екрана задається параметрами конструктора:

  TFT_ST7735(int16_t _W = ST7735_TFTWIDTH, int16_t _H = ST7735_TFTHEIGHT);

і за замовчуванням це 128x160.

Враховуючи всю ту "магію" з MADCTL та іншими параметрами, а також зоопарком варіантів модулів з клонами ST7735, при некоректній ініціалізації можуть невірно розраховуватись адреси пікселів, які попадають в середину пікселя, що виглядає як спотворення кольорів.
Я би для початку повиводив прості тестові зображення, щоб побачити закономірність.

З розміром екрану розібрався.

  tft.drawFastHLine(0, originY, tft.width(), TFT_WHITE); // Горизонтальная линия вправо
  tft.drawFastVLine(originX, 0, tft.height(), TFT_WHITE);	// Вертикальная линия вверх
//  tft.drawLine(endX, originY, endX - 3, originY - 3, TFT_WHITE);	// Стрелка по X
//  tft.drawLine(originX, endY, originX + 3, endY + 3, TFT_WHITE); 	// Стрелка по Y

FAST використовується тільки для горизонтальних і вертикальних ліній у графіку мені не вдалося використати FAST hmm

***  може проблеми з кольором через орієнтацію екрану hmm

  tft.setRotation(3);       // Установка ориентации экрана
dimich
2025-04-02 00:35:38
renoshnik пише:

Так FAST_LINE застосовується для прямих ліній, дійсно так правильніше було малювати осі координат...

Я маю на увазі, що в залежності від значення макроса FAST_LINE під час компіляції використовується або одна, або інша реалізація TFT_ST7735::drawLine().

renoshnik пише:

Що до розміру екрану, то кінцеві точки я визначив візуально підбором, бо параметрів екрану я не знав.

Там розмір екрана задається параметрами конструктора:

  TFT_ST7735(int16_t _W = ST7735_TFTWIDTH, int16_t _H = ST7735_TFTHEIGHT);

і за замовчуванням це 128x160.

Враховуючи всю ту "магію" з MADCTL та іншими параметрами, а також зоопарком варіантів модулів з клонами ST7735, при некоректній ініціалізації можуть невірно розраховуватись адреси пікселів, які попадають в середину пікселя, що виглядає як спотворення кольорів.
Я би для початку повиводив прості тестові зображення, щоб побачити закономірність.

renoshnik
2025-04-01 23:29:54
dimich пише:
renoshnik пише:

В лібі поки нічого підозрілого не знайшов...

Ця ліба? Там два варіанта реалізації drawLine(), з FAST_LINE і без.

Якщо у вас 158x125, то

   int endX = 158;       			// Окончание координат по X (правый край экрана)
   int originY = 125;    			// Начало координат по Y (нижний край экрана)

мало би бути

   int endX = 157;
   int originY = 124;

хіба ні?


Так FAST_LINE застосовується для прямих ліній, дійсно так правильніше було малювати осі координат...

    tft.drawFastHLine(0, y, w, color1);
    tft.drawFastVLine(x, 0, h, color2);

Що до розміру екрану, то кінцеві точки я визначив візуально підбором, бо параметрів екрану я не знав.

dimich
2025-04-01 22:58:08
renoshnik пише:

В лібі поки нічого підозрілого не знайшов...

Ця ліба? Там два варіанта реалізації drawLine(), з FAST_LINE і без.

Якщо у вас 158x125, то

   int endX = 158;       			// Окончание координат по X (правый край экрана)
   int originY = 125;    			// Начало координат по Y (нижний край экрана)

мало би бути

   int endX = 157;
   int originY = 124;

хіба ні?

Підвал форуму