Пришла пара дисплеев таких

С подключением разобрался, скетчи примеров работают, с подсветкой не ясно. При включении внешнего резистора 220 ом экран один тускло, другой никак не горит. Вывод информации сопровождается мерцанием и сбоями картинки у первого. Если включать без резистора всё светит ярко и чётко. Устойчиво, почти, работает при 27 омах. Очень хорошо при питании от аккумулятора всё работает. Почему так происходит? В цепях выводов информационных стоят резисторы по 1,5 кОм. Нахрена они надо?(все ставят зачем то)
:)
Как грамотно управлять светодиодом, или может просто выбраковку прислали?
001 | #include <Adafruit_GFX.h> // Core graphics library |
002 | #include <Adafruit_ST7735.h> // Hardware-specific library |
009 | #define TFT_RST 9 // you can also connect this to the Arduino reset |
017 | Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_RST); |
020 | #define TFT_SCLK 13 // set these to be whatever pins you like! |
021 | #define TFT_MOSI 11 // set these to be whatever pins you like! |
029 | Serial .print( "Hello! ST7735 TFT Test" ); |
032 | tft.initR(INITR_BLACKTAB); |
037 | Serial .println( "Initialized" ); |
039 | uint16_t time = millis(); |
040 | tft.fillScreen(ST7735_BLACK); |
041 | time = millis() - time; |
043 | Serial .println(time, DEC); |
047 | tft.fillScreen(ST7735_BLACK); |
048 | testdrawtext( "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Curabitur adipiscing ante sed nibh tincidunt feugiat. Maecenas enim massa, fringilla sed malesuada et, malesuada sit amet turpis. Sed porttitor neque ut ante pretium vitae malesuada nunc bibendum. Nullam aliquet ultrices massa eu hendrerit. Ut sed nisi lorem. In vestibulum purus a tortor imperdiet posuere. " , ST7735_WHITE); |
056 | tft.drawPixel(tft.width()/2, tft.height()/2, ST7735_GREEN); |
060 | testlines(ST7735_YELLOW); |
064 | testfastlines(ST7735_RED, ST7735_BLUE); |
067 | testdrawrects(ST7735_GREEN); |
070 | testfillrects(ST7735_YELLOW, ST7735_MAGENTA); |
073 | tft.fillScreen(ST7735_BLACK); |
074 | testfillcircles(10, ST7735_BLUE); |
075 | testdrawcircles(10, ST7735_WHITE); |
087 | Serial .println( "done" ); |
092 | tft.invertDisplay( true ); |
094 | tft.invertDisplay( false ); |
098 | void testlines(uint16_t color) { |
099 | tft.fillScreen(ST7735_BLACK); |
100 | for (int16_t x=0; x < tft.width(); x+=6) { |
101 | tft.drawLine(0, 0, x, tft.height()-1, color); |
103 | for (int16_t y=0; y < tft.height(); y+=6) { |
104 | tft.drawLine(0, 0, tft.width()-1, y, color); |
107 | tft.fillScreen(ST7735_BLACK); |
108 | for (int16_t x=0; x < tft.width(); x+=6) { |
109 | tft.drawLine(tft.width()-1, 0, x, tft.height()-1, color); |
111 | for (int16_t y=0; y < tft.height(); y+=6) { |
112 | tft.drawLine(tft.width()-1, 0, 0, y, color); |
115 | tft.fillScreen(ST7735_BLACK); |
116 | for (int16_t x=0; x < tft.width(); x+=6) { |
117 | tft.drawLine(0, tft.height()-1, x, 0, color); |
119 | for (int16_t y=0; y < tft.height(); y+=6) { |
120 | tft.drawLine(0, tft.height()-1, tft.width()-1, y, color); |
123 | tft.fillScreen(ST7735_BLACK); |
124 | for (int16_t x=0; x < tft.width(); x+=6) { |
125 | tft.drawLine(tft.width()-1, tft.height()-1, x, 0, color); |
127 | for (int16_t y=0; y < tft.height(); y+=6) { |
128 | tft.drawLine(tft.width()-1, tft.height()-1, 0, y, color); |
132 | void testdrawtext( char *text, uint16_t color) { |
134 | tft.setTextColor(color); |
135 | tft.setTextWrap( true ); |
139 | void testfastlines(uint16_t color1, uint16_t color2) { |
140 | tft.fillScreen(ST7735_BLACK); |
141 | for (int16_t y=0; y < tft.height(); y+=5) { |
142 | tft.drawFastHLine(0, y, tft.width(), color1); |
144 | for (int16_t x=0; x < tft.width(); x+=5) { |
145 | tft.drawFastVLine(x, 0, tft.height(), color2); |
149 | void testdrawrects(uint16_t color) { |
150 | tft.fillScreen(ST7735_BLACK); |
151 | for (int16_t x=0; x < tft.width(); x+=6) { |
152 | tft.drawRect(tft.width()/2 -x/2, tft.height()/2 -x/2 , x, x, color); |
156 | void testfillrects(uint16_t color1, uint16_t color2) { |
157 | tft.fillScreen(ST7735_BLACK); |
158 | for (int16_t x=tft.width()-1; x > 6; x-=6) { |
159 | tft.fillRect(tft.width()/2 -x/2, tft.height()/2 -x/2 , x, x, color1); |
160 | tft.drawRect(tft.width()/2 -x/2, tft.height()/2 -x/2 , x, x, color2); |
164 | void testfillcircles(uint8_t radius, uint16_t color) { |
165 | for (int16_t x=radius; x < tft.width(); x+=radius*2) { |
166 | for (int16_t y=radius; y < tft.height(); y+=radius*2) { |
167 | tft.fillCircle(x, y, radius, color); |
172 | void testdrawcircles(uint8_t radius, uint16_t color) { |
173 | for (int16_t x=0; x < tft.width()+radius; x+=radius*2) { |
174 | for (int16_t y=0; y < tft.height()+radius; y+=radius*2) { |
175 | tft.drawCircle(x, y, radius, color); |
180 | void testtriangles() { |
181 | tft.fillScreen(ST7735_BLACK); |
184 | int w = tft.width()/2; |
185 | int x = tft.height()-1; |
188 | for (t = 0 ; t <= 15; t++) { |
189 | tft.drawTriangle(w, y, y, x, z, x, color); |
197 | void testroundrects() { |
198 | tft.fillScreen(ST7735_BLACK); |
202 | for (t = 0 ; t <= 4; t+=1) { |
205 | int w = tft.width()-2; |
206 | int h = tft.height()-2; |
207 | for (i = 0 ; i <= 16; i+=1) { |
208 | tft.drawRoundRect(x, y, w, h, 5, color); |
220 | tft.setTextWrap( false ); |
221 | tft.fillScreen(ST7735_BLACK); |
222 | tft.setCursor(0, 30); |
223 | tft.setTextColor(ST7735_RED); |
225 | tft.println( "Hello World!" ); |
226 | tft.setTextColor(ST7735_YELLOW); |
228 | tft.println( "Hello World!" ); |
229 | tft.setTextColor(ST7735_GREEN); |
231 | tft.println( "Hello World!" ); |
232 | tft.setTextColor(ST7735_BLUE); |
237 | tft.fillScreen(ST7735_BLACK); |
238 | tft.setTextColor(ST7735_WHITE); |
240 | tft.println( "Hello World!" ); |
242 | tft.setTextColor(ST7735_GREEN); |
244 | tft.println( " Want pi?" ); |
246 | tft.print(8675309, HEX); |
247 | tft.println( " Print HEX!" ); |
249 | tft.setTextColor(ST7735_WHITE); |
250 | tft.println( "Sketch has been" ); |
251 | tft.println( "running for: " ); |
252 | tft.setTextColor(ST7735_MAGENTA); |
253 | tft.print(millis() / 1000); |
254 | tft.setTextColor(ST7735_WHITE); |
255 | tft.print( " seconds." ); |
260 | tft.fillScreen(ST7735_BLACK); |
261 | tft.fillRoundRect(25, 10, 78, 60, 8, ST7735_WHITE); |
262 | tft.fillTriangle(42, 20, 42, 60, 90, 40, ST7735_RED); |
265 | tft.fillRoundRect(25, 90, 78, 60, 8, ST7735_WHITE); |
266 | tft.fillRoundRect(39, 98, 20, 45, 5, ST7735_GREEN); |
267 | tft.fillRoundRect(69, 98, 20, 45, 5, ST7735_GREEN); |
270 | tft.fillTriangle(42, 20, 42, 60, 90, 40, ST7735_BLUE); |
273 | tft.fillRoundRect(39, 98, 20, 45, 5, ST7735_RED); |
274 | tft.fillRoundRect(69, 98, 20, 45, 5, ST7735_RED); |
276 | tft.fillTriangle(42, 20, 42, 60, 90, 40, ST7735_GREEN); |
18 | #include <TFT.h> // Arduino LCD library |
32 | TFT TFTscreen = TFT(cs, dc, rst); |
35 | char sensorPrintout[5]; |
43 | TFTscreen.background(0, 0, 0); |
47 | TFTscreen.stroke(255, 255, 255); |
49 | TFTscreen.setTextSize(2); |
51 | TFTscreen.text( "Sensor Value :\n " , 0, 0); |
53 | TFTscreen.setTextSize(5); |
59 | String sensorVal = String(analogRead(A0)); |
62 | sensorVal.toCharArray(sensorPrintout, 5); |
65 | TFTscreen.stroke(255, 255, 255); |
67 | TFTscreen.text(sensorPrintout, 0, 20); |
71 | TFTscreen.stroke(0, 0, 0); |
72 | TFTscreen.text(sensorPrintout, 0, 20); |
Неясно почему верхние схемы преобладают над нижними?
1. 220 Ом для подсветки, очевидно, слишком много. Разумный диапазон 10-47 Ом.
2. Я так и не смог установить соответствия между распиновкой в нулевом сообщении и схемами в первом.
3. Самое главное, непонятно, куда именно Вы включаете резистор - ни на одной схеме его нет. Судя по тому, что нарушается работа дисплея, Вы ставите его неправильно.
4. Резисторы в цепях управления, очевидно, связаны с тем, что дисплей 3.3-вольтовый.
*. Вспомнил, что 47 Ом - это я ставил на монохромный дисплей. Для цветного, очевидно, ток должен быть втрое выше, т.е. номинал вряд ли должен превышать 20 Ом.
andriano диод подсветки один, так что номинал резистора +- одинаковый для цветного и монохромного.
ТС ШИМ подайте туда и регулируйте яркость как хотите.
andriano диод подсветки один, так что номинал резистора +- одинаковый для цветного и монохромного.
ТС ШИМ подайте туда и регулируйте яркость как хотите.
Убедительно.
2. Я так и не смог установить соответствия между распиновкой в нулевом сообщении и схемами в первом.
4. Резисторы в цепях управления, очевидно, связаны с тем, что дисплей 3.3-вольтовый.
Как всегда одни вопросы. А дисплей очень такой доступный, всего 130 рублей.
01
#include <TFT.h> // Arduino LCD library
02
#include <SPI.h>
03
04
// pin definition for the Uno
05
#define cs 10
06
#define dc 8
07
#define rst 9
08
// create an instance of the library
09
TFT TFTscreen = TFT(cs, dc, rst);
10
11
// char array to print to the screen
12
char
sensorPrintout[5];
13
14
void
setup
() {
15
// Порт управления подсветкой экрана
16
pinMode(6,OUTPUT);
17
analogWrite(6,100);
18
19
// Put this line at the beginning of every sketch that uses the GLCD:
20
TFTscreen.begin();
21
22
// clear the screen with a black background
23
TFTscreen.background(0, 0, 0);
24
25
// write the static text to the screen
26
// set the font color to white
27
TFTscreen.stroke(255, 255, 255);
28
// set the font size
29
TFTscreen.setTextSize(2);
30
// write the text to the top left corner of the screen
31
TFTscreen.text(
"Sensor Value :\n "
, 0, 0);
32
// ste the font size very large for the loop
33
TFTscreen.setTextSize(5);
34
}
35
36
void
loop
() {
37
38
// Read the value of the sensor on A0
39
String sensorVal = String(analogRead(A0));
40
41
// преобразуйте чтение в массив символов
42
sensorVal.toCharArray(sensorPrintout, 5);
43
44
// установите цвет шрифта
45
TFTscreen.stroke(0, 255, 50);
46
//выведите значение датчика
47
TFTscreen.text(sensorPrintout, 0, 20);
48
//
49
delay(300);
50
// сотрите текст, который вы только что написали
51
TFTscreen.stroke(0, 0, 0);
52
TFTscreen.text(sensorPrintout, 0, 20);
53
}
Зачем тогда стабилизатор ему на плате?
Почему токаограничительный резистор только 3,3 Ома?
Зачем резисторы в схеме?
Как всегда одни вопросы.
я тут намедни протупил. без резисторов включил (использовал для ESP ранее), так что теперь - был у меня один дисплей )))
ЗЫ первые потери да 6 лет...
Если экран чик один можно так сократить резисторы. Удивительно, но такой вариант схемы работает надёжно. Замерял авометром электронным, на резисторе к SDA падает 0,8-0,9В при питании от 5 В и всего 0,06 при питании от аккума (3,8В). Как то я в смущении от их пользы, но убирать не стану :)
Ну в целом ни так и не сяк. Отрисовка медленней чем на SSD1306. Но цвета красивые. Как узоры будут смотреться неизвестно.
Офф: lilik, не в службу, скинь ссылку на свою тему, где ты шары на адресных светодиодах делал ))
https://arduino.ru/forum/proekty/zalivaem-shary-k-prazdniku
Спасибо))
Отрисовка медленней чем на SSD1306.
А скорость передачи ?
И там, и там передача последовательная. Так что даже 4 Мбит/с SPI против 400 кбит/ I2C не могут изменить соотношение на обратное.
И, кстати, 1306 вполне способен работать по I2C на 2 Мбит/с. Да и с интерфейсом SPI они бывают. Так что в принципе возможности разгона у 1306 выше.
Да, в целом не шустро, но если смотреть в прищур, то даже пламя похоже на пламя.
lilik, Сколько памяти кушают скетчи?
lilik, Сколько памяти кушают скетчи?
Секундомер 38% памяти и 6% динамической, узоры 25 и 5 соответственно.
Спасибо.
Это у 328й?
Да.
lilik, Сколько памяти кушают скетчи?
Секундомер 38% памяти и 6% динамической, узоры 25 и 5 соответственно.
а можешь код секундомера выложить?
01
// СЕКУНДОМЕР
02
#include <Adafruit_GFX.h> // Core graphics library
03
#include <Adafruit_ST7735.h> // Hardware-specific library
04
#include <SPI.h>
05
#define TFT_CS 10
06
#define TFT_RST 9
07
#define TFT_DC 8
08
Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_RST);
09
10
float
a = 0.00;
// переменная для угла поворота стрелки
11
float
aa = 0.00;
// переменная для угла поворота стрелки (предыдущее значение)
12
int
str = 55;
//длина стрелки в пикселях
13
byte
sek=16;
//
14
15
void
setup
(
void
) {
16
// Используйте этот инициализатор, если вы используете 1,8-дюймовый TFT
17
tft.initR(INITR_BLACKTAB);
// initialize a ST7735S chip, black tab
18
tft.fillScreen(ST7735_BLACK);
19
tft.setRotation(1);
//ориентация экрана
20
tft.drawCircle(80,64,63,ST7735_WHITE );
//обод секундомера
21
tft.drawCircle(80,64,62,ST7735_WHITE );
22
tft.drawCircle(80,64,61,ST7735_WHITE );
23
24
}
25
void
loop
() {
26
//
27
aa = a;
28
// tft.drawLine(80, 64, 80 + cos(aa)*str, 64 + sin(aa)*str,ST7735_BLACK ); // стирание старой стрелки-отрезка
29
tft.drawLine(80+ cos(aa+1.5)*str*0.1, 64+ sin(aa+1.5)*str*0.1, 80 + cos(aa)*str, 64 + sin(aa)*str,ST7735_BLACK );
// стирание старой стрелки
30
tft.drawLine(80+ cos(aa-1.5)*str*0.1, 64+ sin(aa-1.5)*str*0.1, 80 + cos(aa)*str, 64 + sin(aa)*str,ST7735_BLACK );
// стирание старой стрелки
31
a=a+PI/30;
32
for
(
float
i = 0.01; i < 2 * PI; i = i + PI / 30) {
33
tft.drawLine(80 + cos(i)*str * 0.9, 64 + sin(i)*str * 0.9, 80 + cos(i)*str, 64 + sin(i)*str,ST7735_GREEN );
// риски-метки шкалы через 1 сек
34
}
35
for
(
float
i = 0.01; i < 2 * PI; i = i + PI / 6) {
36
tft.drawLine(80 + cos(i)*str * 0.75, 64 + sin(i)*str * 0.75, 80 + cos(i)*str, 64 + sin(i)*str,ST7735_WHITE );
// риски-метки шкалы через 5 сек
37
}
38
// tft.drawLine(80, 64, 80 + cos(a)*str, 64 + sin(a)*str,ST7735_WHITE ); // рисование новой стрелки-отрезка
39
tft.drawLine(80+ cos(a+1.5)*str*0.1, 64+ sin(a+1.5)*str*0.1, 80 + cos(a)*str, 64 + sin(a)*str,ST7735_WHITE );
// рисование новой стрелки
40
tft.drawLine(80+ cos(a-1.5)*str*0.1, 64+ sin(a-1.5)*str*0.1, 80 + cos(a)*str, 64 + sin(a)*str,ST7735_WHITE );
// рисование новой стрелки
41
//
42
tft.drawCircle(80,64,5,ST7735_WHITE );
43
tft.drawCircle(80,64,4,ST7735_WHITE );
44
tft.setCursor(50, 45);
45
tft.setTextSize(1);
46
tft.setTextColor(ST7735_GREEN);
47
tft.println(utf8rus(
"СЕКУНДОМЕР"
));
48
tft.setCursor(70, 80);
49
tft.setTextSize(2);
50
tft.setTextColor(ST7735_GREEN);
51
if
(sek<10){tft.print(
"0"
);}tft.println(sek);
52
sek++;
if
(sek>59){sek=0;}
53
//
54
delay(835);
//подбираем опытным путём
55
tft.fillRect(70, 80, 30, 20, ST7735_BLACK);
56
}
57
////////////////////////////////////////////////////////////////////////
58
/* Функция перекодировки русских букв из UTF-8 в Win-1251 */
59
String utf8rus(String source)
60
{
61
int
i,k;
62
String target;
63
unsigned
char
n;
64
char
m[2] = {
'0'
,
'\0'
};
65
66
k = source.length(); i = 0;
67
68
while
(i < k) {
69
n = source[i]; i++;
70
71
if
(n >= 0xC0) {
72
switch
(n) {
73
case
0xD0: {
74
n = source[i]; i++;
75
if
(n == 0x81) { n = 0xA8;
break
; }
76
if
(n >= 0x90 && n <= 0xBF) n = n + 0x30;
77
break
;
78
}
79
case
0xD1: {
80
n = source[i]; i++;
81
if
(n == 0x91) { n = 0xB8;
break
; }
82
if
(n >= 0x80 && n <= 0x8F) n = n + 0x70;
83
break
;
84
}
85
}
86
}
87
m[0] = n; target = target + String(m);
88
}
89
return
target;
90
}
91
///////////////////////////////////////////////////////////////////////////
Секундомер.
С ч\б картинками разобрался, осталось научится их раскрашивать в разные цвета, имея одноцветный массив. Наверное из библиотеки функцию изымать и выдумывать зависимости цвета от счётчиков пикселей - i, j :)
секундомера стрелку (некстати) сделал накладывающейся - как настоящая.
Код секундомера для RP2040, русских шрифтов нет, увы...
001
// СЕКУНДОМЕР
002
#include <Adafruit_GFX.h> // Core graphics library
003
#include <Adafruit_ST7735.h> // Hardware-specific library for ST7735
004
#include <Adafruit_ST7789.h> // Hardware-specific library for ST7789
005
#include <SPI.h>
006
007
#define SPI01 // Дисплей на SPI1, NRF24L01 на SPI0
008
009
#if defined(SPI01) // для RP2040 SPI1
010
#define TFT_CS 13 // GP13 - CS
011
#define TFT_RST 14 // GP14 - RESET
012
#define TFT_DC 15 // GP15 - A0
013
#define TFT_MISO 12 // GP12 - MISO (MISO, RX)
014
#define TFT_MOSI 11 // GP11 - SDA (MOSI, TX)
015
#define TFT_SCLK 10 // GP10 - SCK
016
017
#else // для RP2040 SPI0
018
#define TFT_CS 5 // GP5 - CS
019
#define TFT_RST 6 // GP6 - RESET
020
#define TFT_DC 7 // GP7 - A0
021
#define TFT_MISO 4 // GP4 - MISO (MISO, RX)
022
#define TFT_MOSI 3 // GP3 - SDA (MOSI, TX)
023
#define TFT_SCLK 2 // GP2 - SCK
024
#endif
025
026
// For ST7735-based displays, we will use this call
027
Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_MOSI, TFT_SCLK, TFT_RST);
028
029
float
a = 0.00;
// переменная для угла поворота стрелки
030
float
aa = 0.00;
// переменная для угла поворота стрелки (предыдущее значение)
031
int
str = 55;
//длина стрелки в пикселях
032
byte
sek=16;
//
033
034
void
setup
(
void
) {
035
// Используйте этот инициализатор, если вы используете 1,8-дюймовый TFT
036
tft.initR(INITR_BLACKTAB);
// initialize a ST7735S chip, black tab
037
tft.fillScreen(ST7735_BLACK);
038
tft.setRotation(1);
//ориентация экрана
039
tft.setSPISpeed(50000000);
040
tft.drawCircle(80,64,63,ST7735_WHITE );
//обод секундомера
041
tft.drawCircle(80,64,62,ST7735_WHITE );
042
tft.drawCircle(80,64,61,ST7735_WHITE );
043
044
}
045
void
loop
() {
046
//
047
aa = a;
048
// tft.drawLine(80, 64, 80 + cos(aa)*str, 64 + sin(aa)*str,ST7735_BLACK ); // стирание старой стрелки-отрезка
049
tft.drawLine(80+ cos(aa+1.5)*str*0.1, 64+ sin(aa+1.5)*str*0.1, 80 + cos(aa)*str, 64 + sin(aa)*str,ST7735_BLACK );
// стирание старой стрелки
050
tft.drawLine(80+ cos(aa-1.5)*str*0.1, 64+ sin(aa-1.5)*str*0.1, 80 + cos(aa)*str, 64 + sin(aa)*str,ST7735_BLACK );
// стирание старой стрелки
051
a=a+PI/30;
052
for
(
float
i = 0.01; i < 2 * PI; i = i + PI / 30) {
053
tft.drawLine(80 + cos(i)*str * 0.9, 64 + sin(i)*str * 0.9, 80 + cos(i)*str, 64 + sin(i)*str,ST7735_GREEN );
// риски-метки шкалы через 1 сек
054
}
055
for
(
float
i = 0.01; i < 2 * PI; i = i + PI / 6) {
056
tft.drawLine(80 + cos(i)*str * 0.75, 64 + sin(i)*str * 0.75, 80 + cos(i)*str, 64 + sin(i)*str,ST7735_WHITE );
// риски-метки шкалы через 5 сек
057
}
058
// tft.drawLine(80, 64, 80 + cos(a)*str, 64 + sin(a)*str,ST7735_WHITE ); // рисование новой стрелки-отрезка
059
tft.drawLine(80+ cos(a+1.5)*str*0.1, 64+ sin(a+1.5)*str*0.1, 80 + cos(a)*str, 64 + sin(a)*str,ST7735_WHITE );
// рисование новой стрелки
060
tft.drawLine(80+ cos(a-1.5)*str*0.1, 64+ sin(a-1.5)*str*0.1, 80 + cos(a)*str, 64 + sin(a)*str,ST7735_WHITE );
// рисование новой стрелки
061
//
062
tft.drawCircle(80,64,5,ST7735_WHITE );
063
tft.drawCircle(80,64,4,ST7735_WHITE );
064
tft.setCursor(50, 45);
065
tft.setTextSize(1);
066
tft.setTextColor(ST7735_GREEN);
067
tft.println(utf8rus(
"СЕКУНДОМЕР"
));
068
tft.setCursor(70, 80);
069
tft.setTextSize(2);
070
tft.setTextColor(ST7735_GREEN);
071
if
(sek<10){tft.print(
"0"
);}tft.println(sek);
072
sek++;
if
(sek>59){sek=0;}
073
//
074
delay(835);
//подбираем опытным путём
075
tft.fillRect(70, 80, 30, 20, ST7735_BLACK);
076
}
077
////////////////////////////////////////////////////////////////////////
078
/* Функция перекодировки русских букв из UTF-8 в Win-1251 */
079
String utf8rus(String source)
080
{
081
int
i,k;
082
String target;
083
unsigned
char
n;
084
char
m[2] = {
'0'
,
'\0'
};
085
086
k = source.length(); i = 0;
087
088
while
(i < k) {
089
n = source[i]; i++;
090
091
if
(n >= 0xC0) {
092
switch
(n) {
093
case
0xD0: {
094
n = source[i]; i++;
095
if
(n == 0x81) { n = 0xA8;
break
; }
096
if
(n >= 0x90 && n <= 0xBF) n = n + 0x30;
097
break
;
098
}
099
case
0xD1: {
100
n = source[i]; i++;
101
if
(n == 0x91) { n = 0xB8;
break
; }
102
if
(n >= 0x80 && n <= 0x8F) n = n + 0x70;
103
break
;
104
}
105
}
106
}
107
m[0] = n; target = target + String(m);
108
}
109
return
target;
110
}
111
///////////////////////////////////////////////////////////////////////////
А почему такая медленная перерисовка?
А почему такая медленная перерисовка?
пока не знаю, скорость на SPI выставлена по максимуму
Код секундомера для RP2040, русских шрифтов нет, увы...
1
А картинка?
Я по ходу забыл, в файлы библиотеки "...GFX" надо добавить
001
#ifndef FONT5X7_H
002
#define FONT5X7_H
003
004
#ifdef __AVR__
005
#include <avr/io.h>
006
#include <avr/pgmspace.h>
007
#elif defined(ESP8266)
008
#include <pgmspace.h>
009
#else
010
#define PROGMEM
011
#endif
012
013
// Standard ASCII 5x7 font
014
015
static
const
unsigned
char
font[] PROGMEM = {
016
0x00, 0x00, 0x00, 0x00, 0x00,
017
0x3E, 0x55, 0x51, 0x55, 0x3E,
018
0x3E, 0x6B, 0x6F, 0x6B, 0x3E,
019
0x0C, 0x1E, 0x3C, 0x1E, 0x0C,
020
0x08, 0x1C, 0x3E, 0x1C, 0x08,
021
0x1C, 0x4A, 0x7F, 0x4A, 0x1C,
022
0x18, 0x5C, 0x7F, 0x5C, 0x18,
023
0x00, 0x1C, 0x1C, 0x1C, 0x00,
024
0x7F, 0x63, 0x63, 0x63, 0x7F,
025
0x00, 0x1C, 0x14, 0x1C, 0x00,
026
0x7F, 0x63, 0x6B, 0x63, 0x7F,
027
0x30, 0x48, 0x4D, 0x33, 0x07,
028
0x06, 0x29, 0x79, 0x29, 0x06,
029
0x20, 0x50, 0x3F, 0x02, 0x0C,
030
0x60, 0x7F, 0x05, 0x35, 0x3F,
031
0x2A, 0x1C, 0x77, 0x1C, 0x2A,
032
0x00, 0x7F, 0x3E, 0x1C, 0x08,
033
0x08, 0x1C, 0x3E, 0x7F, 0x00,
034
0x14, 0x22, 0x7F, 0x22, 0x14,
035
0x00, 0x5F, 0x00, 0x5F, 0x00,
036
0x06, 0x09, 0x7F, 0x01, 0x7F,
037
0x4A, 0x55, 0x55, 0x55, 0x29,
038
0x60, 0x60, 0x60, 0x60, 0x60,
039
0x54, 0x62, 0x7F, 0x62, 0x54,
040
0x08, 0x04, 0x7E, 0x04, 0x08,
041
0x08, 0x10, 0x3F, 0x10, 0x08,
042
0x08, 0x08, 0x2A, 0x1C, 0x08,
043
0x08, 0x1C, 0x2A, 0x08, 0x08,
044
0x1C, 0x10, 0x10, 0x10, 0x10,
045
0x1C, 0x3E, 0x08, 0x3E, 0x1C,
046
0x30, 0x3C, 0x3F, 0x3C, 0x30,
047
0x06, 0x1E, 0x7E, 0x1E, 0x06,
048
0x00, 0x00, 0x00, 0x00, 0x00,
049
0x00, 0x00, 0x5F, 0x00, 0x00,
050
0x00, 0x07, 0x00, 0x07, 0x00,
051
0x14, 0x7F, 0x14, 0x7F, 0x14,
052
0x24, 0x2A, 0x7F, 0x2A, 0x12,
053
0x23, 0x13, 0x08, 0x64, 0x62,
054
0x36, 0x49, 0x56, 0x20, 0x50,
055
0x00, 0x00, 0x07, 0x00, 0x00,
056
0x00, 0x1C, 0x22, 0x41, 0x00,
057
0x00, 0x41, 0x22, 0x1C, 0x00,
058
0x14, 0x08, 0x3E, 0x08, 0x14,
059
0x08, 0x08, 0x3E, 0x08, 0x08,
060
0x00, 0xA0, 0x60, 0x00, 0x00,
061
0x08, 0x08, 0x08, 0x08, 0x08,
062
0x00, 0x60, 0x60, 0x00, 0x00,
063
0x20, 0x10, 0x08, 0x04, 0x02,
064
0x3E, 0x51, 0x49, 0x45, 0x3E,
065
0x44, 0x42, 0x7F, 0x40, 0x40,
066
0x42, 0x61, 0x51, 0x49, 0x46,
067
0x21, 0x41, 0x45, 0x4B, 0x31,
068
0x18, 0x14, 0x12, 0x7F, 0x10,
069
0x27, 0x45, 0x45, 0x45, 0x39,
070
0x3C, 0x4A, 0x49, 0x49, 0x30,
071
0x01, 0x71, 0x09, 0x05, 0x03,
072
0x36, 0x49, 0x49, 0x49, 0x36,
073
0x06, 0x49, 0x49, 0x29, 0x1E,
074
0x00, 0x6C, 0x6C, 0x00, 0x00,
075
0x00, 0xAC, 0x6C, 0x00, 0x00,
076
0x08, 0x14, 0x22, 0x41, 0x00,
077
0x14, 0x14, 0x14, 0x14, 0x14,
078
0x00, 0x41, 0x22, 0x14, 0x08,
079
0x02, 0x01, 0x51, 0x09, 0x06,
080
0x3E, 0x41, 0x5D, 0x55, 0x5E,
081
0x7C, 0x12, 0x11, 0x12, 0x7C,
082
0x7F, 0x49, 0x49, 0x49, 0x36,
083
0x3E, 0x41, 0x41, 0x41, 0x22,
084
0x7F, 0x41, 0x41, 0x22, 0x1C,
085
0x7F, 0x49, 0x49, 0x49, 0x41,
086
0x7F, 0x09, 0x09, 0x09, 0x01,
087
0x3E, 0x41, 0x49, 0x49, 0x7A,
088
0x7F, 0x08, 0x08, 0x08, 0x7F,
089
0x00, 0x41, 0x7F, 0x41, 0x00,
090
0x20, 0x40, 0x41, 0x3F, 0x01,
091
0x7F, 0x08, 0x14, 0x22, 0x41,
092
0x7F, 0x40, 0x40, 0x40, 0x60,
093
0x7F, 0x02, 0x0C, 0x02, 0x7F,
094
0x7F, 0x04, 0x08, 0x10, 0x7F,
095
0x3E, 0x41, 0x41, 0x41, 0x3E,
096
0x7F, 0x09, 0x09, 0x09, 0x06,
097
0x3E, 0x41, 0x51, 0x21, 0x5E,
098
0x7F, 0x09, 0x19, 0x29, 0x46,
099
0x46, 0x49, 0x49, 0x49, 0x31,
100
0x03, 0x01, 0x7F, 0x01, 0x03,
101
0x3F, 0x40, 0x40, 0x40, 0x3F,
102
0x1F, 0x20, 0x40, 0x20, 0x1F,
103
0x3F, 0x40, 0x3C, 0x40, 0x3F,
104
0x63, 0x14, 0x08, 0x14, 0x63,
105
0x07, 0x08, 0x70, 0x08, 0x07,
106
0x61, 0x51, 0x49, 0x45, 0x43,
107
0x00, 0x7F, 0x41, 0x41, 0x00,
108
0x02, 0x04, 0x08, 0x10, 0x20,
109
0x00, 0x41, 0x41, 0x7F, 0x00,
110
0x04, 0x02, 0x01, 0x02, 0x04,
111
0x40, 0x40, 0x40, 0x40, 0x40,
112
0x00, 0x01, 0x02, 0x04, 0x00,
113
0x20, 0x54, 0x54, 0x54, 0x78,
114
0x7F, 0x48, 0x44, 0x44, 0x38,
115
0x38, 0x44, 0x44, 0x44, 0x48,
116
0x38, 0x44, 0x44, 0x48, 0x7F,
117
0x38, 0x54, 0x54, 0x54, 0x18,
118
0x08, 0x7E, 0x09, 0x01, 0x02,
119
0x08, 0x54, 0x54, 0x58, 0x3C,
120
0x7F, 0x08, 0x04, 0x04, 0x78,
121
0x00, 0x44, 0x7D, 0x40, 0x00,
122
0x20, 0x40, 0x44, 0x3D, 0x00,
123
0x7F, 0x10, 0x10, 0x28, 0x44,
124
0x00, 0x41, 0x7F, 0x40, 0x00,
125
0x7C, 0x04, 0x78, 0x04, 0x78,
126
0x7C, 0x08, 0x04, 0x04, 0x78,
127
0x38, 0x44, 0x44, 0x44, 0x38,
128
0x7C, 0x14, 0x14, 0x14, 0x08,
129
0x08, 0x14, 0x14, 0x0C, 0x7C,
130
0x7C, 0x08, 0x04, 0x04, 0x08,
131
0x48, 0x54, 0x54, 0x54, 0x24,
132
0x04, 0x3F, 0x44, 0x40, 0x20,
133
0x3C, 0x40, 0x40, 0x20, 0x7C,
134
0x1C, 0x20, 0x40, 0x20, 0x1C,
135
0x3C, 0x40, 0x38, 0x40, 0x3C,
136
0x44, 0x28, 0x10, 0x28, 0x44,
137
0x0C, 0x50, 0x50, 0x50, 0x3C,
138
0x44, 0x64, 0x54, 0x4C, 0x44,
139
0x00, 0x08, 0x36, 0x41, 0x00,
140
0x00, 0x00, 0x7F, 0x00, 0x00,
141
0x00, 0x41, 0x36, 0x08, 0x00,
142
0x02, 0x01, 0x02, 0x04, 0x02,
143
0x70, 0x48, 0x44, 0x48, 0x70,
144
0x00, 0x0E, 0x11, 0x0E, 0x00,
145
0x00, 0x12, 0x1F, 0x10, 0x00,
146
0x00, 0x12, 0x19, 0x16, 0x00,
147
0x00, 0x11, 0x15, 0x0B, 0x00,
148
0x00, 0x07, 0x04, 0x1F, 0x00,
149
0x00, 0x17, 0x15, 0x09, 0x00,
150
0x00, 0x0E, 0x15, 0x09, 0x00,
151
0x00, 0x01, 0x1D, 0x03, 0x00,
152
0x00, 0x0A, 0x15, 0x0A, 0x00,
153
0x00, 0x12, 0x15, 0x0E, 0x00,
154
0x00, 0x04, 0x04, 0x04, 0x00,
155
0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
156
0x3E, 0x00, 0x00, 0x00, 0x00,
157
0x3E, 0x3E, 0x00, 0x00, 0x00,
158
0x3E, 0x3E, 0x00, 0x3E, 0x00,
159
0x3E, 0x3E, 0x00, 0x3E, 0x3E,
160
0x80, 0x80, 0x80, 0x80, 0x80,
161
0xC0, 0xC0, 0xC0, 0xC0, 0xC0,
162
0xD0, 0xD0, 0xD0, 0xD0, 0xD0,
163
0xD8, 0xD8, 0xD8, 0xD8, 0xD8,
164
0xDA, 0xDA, 0xDA, 0xDA, 0xDA,
165
0xDB, 0xDB, 0xDB, 0xDB, 0xDB,
166
0x40, 0x00, 0x40, 0x00, 0x40,
167
0x60, 0x00, 0x40, 0x00, 0x40,
168
0x60, 0x00, 0x70, 0x00, 0x40,
169
0x60, 0x00, 0x70, 0x00, 0x78,
170
0x7C, 0x00, 0x40, 0x00, 0x40,
171
0x7C, 0x00, 0x7E, 0x00, 0x40,
172
0x7C, 0x00, 0x7E, 0x00, 0x7F,
173
0x1C, 0x77, 0x41, 0x41, 0x41,
174
0x41, 0x41, 0x41, 0x41, 0x41,
175
0x41, 0x41, 0x41, 0x7F, 0x00,
176
0x1C, 0x77, 0x41, 0x5D, 0x5D,
177
0x41, 0x41, 0x41, 0x5D, 0x5D,
178
0x5D, 0x5D, 0x41, 0x5D, 0x5D,
179
0x5D, 0x5D, 0x41, 0x7F, 0x00,
180
0x22, 0x1C, 0x14, 0x1C, 0x22,
181
0x00, 0x08, 0x1C, 0x08, 0x00,
182
0x00, 0x00, 0x77, 0x00, 0x00,
183
0x46, 0x5D, 0x55, 0x5D, 0x31,
184
0x7C, 0x55, 0x54, 0x55, 0x44,
185
0x08, 0x08, 0x2A, 0x08, 0x08,
186
0x00, 0x14, 0x08, 0x14, 0x00,
187
0x08, 0x14, 0x22, 0x08, 0x14,
188
0x7F, 0x41, 0x71, 0x31, 0x1F,
189
0x03, 0x05, 0x7F, 0x05, 0x03,
190
0x22, 0x14, 0x7F, 0x55, 0x22,
191
0x02, 0x55, 0x7D, 0x05, 0x02,
192
0x06, 0x09, 0x09, 0x06, 0x00,
193
0x44, 0x44, 0x5F, 0x44, 0x44,
194
0x1C, 0x14, 0x1C, 0x22, 0x7F,
195
0x20, 0x3E, 0x61, 0x3E, 0x20,
196
0x20, 0x50, 0x3F, 0x02, 0x0C,
197
0x80, 0x7C, 0x20, 0x3C, 0x40,
198
0x44, 0x3C, 0x04, 0x7C, 0x44,
199
0x00, 0x00, 0x08, 0x00, 0x00,
200
0x38, 0x55, 0x54, 0x55, 0x18,
201
0x7E, 0x08, 0x10, 0x7F, 0x01,
202
0x08, 0x10, 0x08, 0x04, 0x02,
203
0x14, 0x08, 0x22, 0x14, 0x08,
204
0x0E, 0x06, 0x0A, 0x10, 0x20,
205
0x20, 0x10, 0x0A, 0x06, 0x0E,
206
0x00, 0x00, 0x00, 0x00, 0x00,
207
0x38, 0x30, 0x28, 0x04, 0x02,
208
0x02, 0x04, 0x28, 0x30, 0x38,
209
0x7E, 0x11, 0x11, 0x11, 0x7E,
210
0x7F, 0x49, 0x49, 0x49, 0x31,
211
0x7F, 0x49, 0x49, 0x49, 0x36,
212
0x7F, 0x01, 0x01, 0x01, 0x03,
213
0xC0, 0x7F, 0x41, 0x7F, 0xC0,
214
0x7F, 0x49, 0x49, 0x49, 0x41,
215
0x77, 0x08, 0x7F, 0x08, 0x77,
216
0x41, 0x49, 0x49, 0x49, 0x36,
217
0x7F, 0x10, 0x08, 0x04, 0x7F,
218
0x7C, 0x21, 0x12, 0x09, 0x7C,
219
0x7F, 0x08, 0x14, 0x22, 0x41,
220
0x40, 0x3E, 0x01, 0x01, 0x7F,
221
0x7F, 0x02, 0x0C, 0x02, 0x7F,
222
0x7F, 0x08, 0x08, 0x08, 0x7F,
223
0x3E, 0x41, 0x41, 0x41, 0x3E,
224
0x7F, 0x01, 0x01, 0x01, 0x7F,
225
0x7F, 0x09, 0x09, 0x09, 0x06,
226
0x3E, 0x41, 0x41, 0x41, 0x22,
227
0x01, 0x01, 0x7F, 0x01, 0x01,
228
0x07, 0x48, 0x48, 0x48, 0x3F,
229
0x0E, 0x11, 0x7F, 0x11, 0x0E,
230
0x63, 0x14, 0x08, 0x14, 0x63,
231
0x7F, 0x40, 0x40, 0x7F, 0xC0,
232
0x07, 0x08, 0x08, 0x08, 0x7F,
233
0x7F, 0x40, 0x7F, 0x40, 0x7F,
234
0x7F, 0x40, 0x7F, 0x40, 0xFF,
235
0x01, 0x7F, 0x48, 0x48, 0x30,
236
0x7F, 0x48, 0x48, 0x30, 0x7F,
237
0x7F, 0x48, 0x48, 0x48, 0x30,
238
0x22, 0x41, 0x49, 0x49, 0x3E,
239
0x7F, 0x08, 0x3E, 0x41, 0x3E,
240
0x46, 0x29, 0x19, 0x09, 0x7F,
241
0x20, 0x54, 0x54, 0x54, 0x78,
242
0x3C, 0x4A, 0x4A, 0x49, 0x31,
243
0x7C, 0x54, 0x54, 0x54, 0x28,
244
0x7C, 0x04, 0x04, 0x04, 0x0C,
245
0xC0, 0x78, 0x44, 0x7C, 0xC0,
246
0x38, 0x54, 0x54, 0x54, 0x18,
247
0x6C, 0x10, 0x7C, 0x10, 0x6C,
248
0x44, 0x54, 0x54, 0x54, 0x28,
249
0x7C, 0x20, 0x10, 0x08, 0x7C,
250
0x7C, 0x40, 0x26, 0x10, 0x7C,
251
0x7C, 0x10, 0x10, 0x28, 0x44,
252
0x40, 0x38, 0x04, 0x04, 0x7C,
253
0x7C, 0x08, 0x10, 0x08, 0x7C,
254
0x7C, 0x10, 0x10, 0x10, 0x7C,
255
0x38, 0x44, 0x44, 0x44, 0x38,
256
0x7C, 0x04, 0x04, 0x04, 0x7C,
257
0x7C, 0x14, 0x14, 0x14, 0x08,
258
0x38, 0x44, 0x44, 0x44, 0x48,
259
0x04, 0x04, 0x7C, 0x04, 0x04,
260
0x0C, 0x50, 0x50, 0x50, 0x3C,
261
0x18, 0x24, 0xFC, 0x24, 0x18,
262
0x44, 0x28, 0x10, 0x28, 0x44,
263
0x7C, 0x40, 0x40, 0x7C, 0xC0,
264
0x0C, 0x10, 0x10, 0x10, 0x7C,
265
0x7C, 0x40, 0x7C, 0x40, 0x7C,
266
0x7C, 0x40, 0x7C, 0x40, 0xFC,
267
0x04, 0x7C, 0x50, 0x50, 0x20,
268
0x7C, 0x50, 0x50, 0x20, 0x7C,
269
0x7C, 0x50, 0x50, 0x50, 0x20,
270
0x28, 0x44, 0x54, 0x54, 0x38,
271
0x7C, 0x10, 0x38, 0x44, 0x38,
272
0x48, 0x34, 0x14, 0x14, 0x7C};
273
#endif // FONT5X7_H
glcdfont.c файл называется.
Новая версия, ещё более тормознутая отрисовка стрелки.
01
// СЕКУНДОМЕР
02
#include <Adafruit_GFX.h> // Core graphics library
03
#include <Adafruit_ST7735.h> // Hardware-specific library
04
#include <SPI.h>
05
#define TFT_CS 10
06
#define TFT_RST 9
07
#define TFT_DC 8
08
Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_RST);
09
10
float
a = 0.00;
// переменная для угла поворота стрелки
11
float
aa = 0.00;
// переменная для угла поворота стрелки (предыдущее значение)
12
int
str = 55;
//длина стрелки в пикселях
13
byte
sek=16;
//
14
15
void
setup
(
void
) {
16
// Используйте этот инициализатор, если вы используете 1,8-дюймовый TFT
17
tft.initR(INITR_BLACKTAB);
// initialize a ST7735S chip, black tab
18
tft.fillScreen(ST7735_BLACK);
19
tft.setRotation(1);
//ориентация экрана
20
tft.drawCircle(80,64,63,ST7735_WHITE );
//обод секундомера
21
tft.drawCircle(80,64,62,ST7735_WHITE );
22
tft.drawCircle(80,64,61,ST7735_WHITE );
23
24
}
25
void
loop
() {
26
//
27
aa = a;
28
//
29
tft.setCursor(50, 45);
30
tft.setTextSize(1);
31
tft.setTextColor(ST7735_GREEN);
32
tft.println(utf8rus(
"СЕКУНДОМЕР"
));
33
tft.setCursor(70, 80);
34
tft.setTextSize(2);
35
tft.setTextColor(ST7735_GREEN);
36
if
(sek<10){tft.print(
"0"
);}tft.println(sek);
37
//
38
tft.fillTriangle(80+ cos(aa+1.5)*str*0.1, 64+ sin(aa+1.5)*str*0.1, 80 + cos(aa)*str, 64 + sin(aa)*str,80+ cos(aa-1.5)*str*0.1, 64+ sin(aa-1.5)*str*0.1,ST7735_BLACK );
// стирание старой стрелки
39
a=a+PI/30;
40
tft.fillCircle(80,64,7,ST7735_WHITE );
41
for
(
float
i = 0.01; i < 2 * PI; i = i + PI / 30) {
42
tft.drawLine(80 + cos(i)*str * 0.90, 64 + sin(i)*str * 0.90, 80 + cos(i)*str, 64 + sin(i)*str,ST7735_GREEN );
// риски-метки шкалы через 1 сек
43
}
44
for
(
float
i = 0.01; i < 2 * PI; i = i + PI / 6) {
45
tft.drawLine(80 + cos(i)*str * 0.75, 64 + sin(i)*str * 0.75, 80 + cos(i)*str, 64 + sin(i)*str,ST7735_WHITE );
// риски-метки шкалы через 5 сек
46
}
47
tft.fillTriangle(80+ cos(a+1.5)*str*0.1, 64+ sin(a+1.5)*str*0.1, 80 + cos(a)*str, 64 + sin(a)*str,80+ cos(a-1.5)*str*0.1, 64+ sin(a-1.5)*str*0.1,ST7735_WHITE );
// рисование новой стрелки
48
tft.fillCircle(80,64,3,ST7735_BLACK );
49
50
sek++;
if
(sek>59){sek=0;}
51
//
52
delay(835);
//подбираем опытным путём
53
tft.fillRect(70, 80, 30, 20, ST7735_BLACK);
54
}
55
////////////////////////////////////////////////////////////////////////
56
/* Функция перекодировки русских букв из UTF-8 в Win-1251 */
57
String utf8rus(String source)
58
{
59
int
i,k;
60
String target;
61
unsigned
char
n;
62
char
m[2] = {
'0'
,
'\0'
};
63
64
k = source.length(); i = 0;
65
66
while
(i < k) {
67
n = source[i]; i++;
68
69
if
(n >= 0xC0) {
70
switch
(n) {
71
case
0xD0: {
72
n = source[i]; i++;
73
if
(n == 0x81) { n = 0xA8;
break
; }
74
if
(n >= 0x90 && n <= 0xBF) n = n + 0x30;
75
break
;
76
}
77
case
0xD1: {
78
n = source[i]; i++;
79
if
(n == 0x91) { n = 0xB8;
break
; }
80
if
(n >= 0x80 && n <= 0x8F) n = n + 0x70;
81
break
;
82
}
83
}
84
}
85
m[0] = n; target = target + String(m);
86
}
87
return
target;
88
}
89
///////////////////////////////////////////////////////////////////////////
А почему такая медленная перерисовка?
пока не знаю, скорость на SPI выставлена по максимуму
Давай считать: Для одного пикселя нужно записать 16 бит, что при 4МГц будет 4 мкс, что соответствует 64 тактам при 16 МГц. Ну еще преобразование 1 бита 16 - это 8-10 инструкций, пусть будет еще 16 тактов. Итого 80 тактов или 5 мкс.
На экране 160*128=20к пикселей, по 5 мкс на каждый - 100 мс. Т.е. должно быть порядка 10 fps. Мы видим явно меньше, вопрос - почему?
andriano он же через библиотеку выводит ... - дели скорость на 100 :-)
Не 10 кадров в секунду, а 10 секунда на кадр ...
andriano он же через библиотеку выводит ... - дели скорость на 100 :-)
Не 10 кадров в секунду, а 10 секунда на кадр ...
Вот поэтому я никогда и не пользуюсь стандартными библиотеками для экрана, а предпочитаю писать сам.
lilik, покажи тот фрагмент, который выводит на экран первый рисунок из сообщения №25.
lilik На какой частоте работает плата ? Если на 16, то fosc/2 - это 8, а не 4 ...
Жаль что нет буфера как на UART - ожидание окончания вывода даёт паузы между байтами ...
Спасибо! Вторая половина кодовой таблицы с выбором языка оказывается только ручками )))
Что-то я на этом тормознулся, хотя с DOS был жеж более чем в теме... Осень...
Да, я добавил в ваш код установку скорости SPI, отрабатывает ли должным образом
надо разбираться, но если ставить скорость 60000000 то дисплей не АЛЛЁ )))
1
tft.setSPISpeed(50000000);
lilik, покажи тот фрагмент, который выводит на экран первый рисунок из сообщения №25.
01
// РИСУНОК
02
#include <Adafruit_GFX.h> // Core graphics library
03
#include <Adafruit_ST7735.h> // Hardware-specific library
04
#include <SPI.h>
05
#define TFT_CS 10
06
#define TFT_RST 9
07
#define TFT_DC 8
08
Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_RST);
09
extern
const
unsigned
char
ris_1[];
10
extern
const
unsigned
char
ris_2[];
11
12
void
setup
(
void
) {
13
// Используйте этот инициализатор, если вы используете 1,8-дюймовый TFT
14
tft.initR(INITR_BLACKTAB);
// initialize a ST7735S chip, black tab
15
tft.fillScreen(ST7735_BLACK);
16
tft.setRotation(0);
//ориентация экрана
17
}
18
void
loop
() {
19
tft.drawBitmap(0,0,ris_1, 128,160,tft.Color565(255,255,255),0);
20
tft.drawBitmap(0,0,ris_2, 128,160,tft.Color565(255,255,255),0);
21
}
Да, я добавил в ваш код установку скорости SPI, отрабатывает ли должным образом...
1
tft.setSPISpeed(50000000);
Скетч не компилируется.
lilik На какой частоте работает плата ? Если на 16, то fosc/2 - это 8, а не 4 ...
Жаль что нет буфера как на UART - ожидание окончания вывода даёт паузы между байтами ...
Плата UNO китайская с CH340.
50 МГц ??? У вас Uno, а не RP2040 !!!
50 МГц ??? У вас Uno, а не RP2040 !!!
Да!, но не компилируется не из-за чисел :)
Вот так компилируется и работает, но число 16000000 (и любые другие) ни на что не влияют.
01
// РИСУНОК
02
#include <Adafruit_GFX.h> // Core graphics library
03
#include <Adafruit_ST7735.h> // Hardware-specific library
04
#include <SPI.h>
05
#define TFT_CS 10
06
#define TFT_RST 9
07
#define TFT_DC 8
08
Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_RST);
09
extern
const
unsigned
char
ris_1[];
10
extern
const
unsigned
char
ris_2[];
11
12
void
setup
(
void
) {
13
// Используйте этот инициализатор, если вы используете 1,8-дюймовый TFT
14
tft.initR(INITR_BLACKTAB);
// initialize a ST7735S chip, black tab
15
tft.fillScreen(ST7735_BLACK);
16
tft.setRotation(0);
//ориентация экрана
17
SPI.begin();
18
SPI.beginTransaction(SPISettings(16000000, MSBFIRST, SPI_MODE0));
19
}
20
void
loop
() {
21
tft.drawBitmap(0,0,ris_1, 128,160,tft.Color565(255,255,255),0);
22
tft.drawBitmap(0,0,ris_2, 128,160,tft.Color565(255,255,255),0);
23
}
lilik, покажи тот фрагмент, который выводит на экран первый рисунок из сообщения №25.
1
tft.drawBitmap(0,0,ris_1, 128,160,tft.Color565(255,255,255),0);
2
tft.drawBitmap(0,0,ris_2, 128,160,tft.Color565(255,255,255),0);
3
}
Ну а раз так - сообщения №32-33.
На UNO 16 МНц частота SPI не может быть выше 8 МНц
SPI.setClockDivider(SPI_CLOCK_DIV2);
Ну и кроме того, по моим наблюдениям, 8МГц на AVR практически не отличается от 4МГц.
Да и вообще, с реализацией SPI на Arduino нужно как следует разбираться: если для AVR я установил лишь факт, описанный выше (т.е. относительное значение), то для stm32 получил абсолютное: на практике скорость передачи 1/7 от теоретического значения.
Ну и кроме того, по моим наблюдениям, 8МГц на AVR практически не отличается от 4МГц.
Да и вообще, с реализацией SPI на Arduino нужно как следует разбираться: если для AVR я установил лишь факт, описанный выше (т.е. относительное значение), то для stm32 получил абсолютное: на практике скорость передачи 1/7 от теоретического значения.
а как померить реальную скорость?
Есть такая функция - millis().
Ну и, кроме того, у "железячников" должен быть осциллограф (или логический анализатор).
На UNO 16 МНц частота SPI не может быть выше 8 МНц
SPI.setClockDivider(SPI_CLOCK_DIV2);
Подставил в скетч, так же медленно как и было. Мне вот что интересно - все функции рисования картинок приводят к функции рисования одной точки. Сегодня мне интересно из одноцветной картинки делать разноцветную. Вот пример трансформации библиотечной функции в самописную.
01
// РИСУНОК
02
#include <Adafruit_GFX.h> // Core graphics library
03
#include <Adafruit_ST7735.h> // Hardware-specific library
04
#include <SPI.h>
05
#define TFT_CS 10
06
#define TFT_RST 9
07
#define TFT_DC 8
08
Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_RST);
09
extern
const
unsigned
char
ris_1[];
10
extern
const
unsigned
char
ris_2[];
11
12
void
setup
(
void
) {
13
// Используйте этот инициализатор, если вы используете 1,8-дюймовый TFT
14
tft.initR(INITR_BLACKTAB);
// initialize a ST7735S chip, black tab
15
tft.fillScreen(ST7735_BLACK);
16
tft.setRotation(0);
//ориентация экрана
17
}
18
void
loop
() {
19
20
drawBitmap_(0,0,ris_1, 128,160);
21
delay(200);
//
22
}
23
////////////////////////////////////////////////////////
24
void
drawBitmap_(int16_t x, int16_t y,
25
const
uint8_t *bitmap, int16_t w, int16_t h) {
26
int16_t i, j, byteWidth = (w + 7) / 8;
27
uint8_t
byte
;
28
29
for
(j=0; j<h; j++) {
30
for
(i=0; i<w; i++) {
31
if
(i & 7)
byte
<<= 1;
32
else
byte
= pgm_read_byte(bitmap + j * byteWidth + i / 8);
33
if
(
byte
& 0x80)
34
{
35
//tft.drawPixel(x+i, y+j,tft.Color565(255,255,255) );
36
if
(j>h/2-5&&i<=w/2-5){tft.drawPixel(x+i, y+j,tft.Color565(0,255,0) );}
37
if
(j<=h/2-5&&i>w/2-5){tft.drawPixel(x+i, y+j,tft.Color565(255,0,255) );}
38
if
(j>h/2-5&&i>w/2-5){tft.drawPixel(x+i, y+j,tft.Color565(0,150,255) );}
39
if
(i*i+j*j<10010&&j<=w){tft.drawPixel(x+i, y+j,tft.Color565(255,0,0) );}
40
}
41
}
42
}
43
}
44
//////////////////////////////////////////////////////////
Она переделывает одну картинку в другую.
Может дело в попиксельном выводе данных?
пока вы не переделаете вывод пикселей картинки напрямую дисплею в память, скорости нормальной не получите.
Да, выводить попиксельно - это неправильно.
В контроллерах цветных дисплеев (во всех, с которыми мне приходилось работать) специально для увеличения скорости вывода пикселей используется функция, задающая прямоугольник, в который осуществляется вывод. Например, для вывода символа в знакоместо 10*16 задается прямоугольная область такого размера, а потом просто поочередно передаются цвета точек, которые последовательно заполняют эту область.
Т.е. на вывод 160 точек в примере выше мы сначала задаем команду 6-16 байт, а потом цвета всех 160 точек, т.е. еще 320 байт. Т.е. из примерно 330 байт 320 передают информацию о цвете точек.
При попиксельном выводе все то же самое, только на 3-16 байт служебной информации (задающей координаты точки) приходится только 2 байта на цвет (единственной точки).
В случае картинки и невозможности уместить ее в памяти целиком, целесообразно выводить построчно: т.е. задали строку 128*1 пискель, посчитали в буфер (256 байт) и вывели на экран. Потом - следующую.
пока вы не переделаете вывод пикселей картинки напрямую дисплею в память, скорости нормальной не получите.
В примерах, что я опытничаю, внутри библиотек две функции рисования точки. Какая работает мне не ясно.
01
void
Adafruit_ST7735::drawPixel(int16_t x, int16_t y, uint16_t color)
02
{
03
04
if
((x < 0) ||(x >= _width) || (y < 0) || (y >= _height))
return
;
05
06
setAddrWindow(x,y,x+1,y+1);
07
08
#if defined (SPI_HAS_TRANSACTION)
09
if
(hwSPI) SPI.beginTransaction(mySPISettings);
10
#endif
11
12
DC_HIGH();
13
CS_LOW();
14
spiwrite(color >> 8);
15
spiwrite(color);
16
CS_HIGH();
17
18
#if defined (SPI_HAS_TRANSACTION)
19
if
(hwSPI) SPI.endTransaction();
20
#endif
21
}
01
void
GFXcanvas1::drawPixel(int16_t x, int16_t y, uint16_t color) {
02
// Bitmask tables of 0x80>>X and ~(0x80>>X), because X>>Y is slow on AVR
03
static
const
uint8_t PROGMEM
04
GFXsetBit[] = { 0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01 },
05
GFXclrBit[] = { 0x7F, 0xBF, 0xDF, 0xEF, 0xF7, 0xFB, 0xFD, 0xFE };
06
07
if
(buffer) {
08
if
((x < 0) || (y < 0) || (x >= _width) || (y >= _height))
return
;
09
10
int16_t t;
11
switch
(rotation) {
12
case
1:
13
t = x;
14
x = WIDTH - 1 - y;
15
y = t;
16
break
;
17
case
2:
18
x = WIDTH - 1 - x;
19
y = HEIGHT - 1 - y;
20
break
;
21
case
3:
22
t = x;
23
x = y;
24
y = HEIGHT - 1 - t;
25
break
;
26
}
Кстати такой блок нашёл, он на скорость влиет?
01
inline
void
Adafruit_ST7735::CS_HIGH(
void
)
02
{
03
#if defined(USE_FAST_IO)
04
*csport |= cspinmask;
05
#else
06
digitalWrite(_cs, HIGH);
07
#endif
08
}
09
10
inline
void
Adafruit_ST7735::CS_LOW(
void
)
11
{
12
#if defined(USE_FAST_IO)
13
*csport &= ~cspinmask;
14
#else
15
digitalWrite(_cs, LOW);
16
#endif
17
}
18
19
inline
void
Adafruit_ST7735::DC_HIGH(
void
)
20
{
21
#if defined(USE_FAST_IO)
22
*dcport |= dcpinmask;
23
#else
24
digitalWrite(_dc, HIGH);
25
#endif
26
}
27
28
inline
void
Adafruit_ST7735::DC_LOW(
void
)
29
{
30
#if defined(USE_FAST_IO)
31
*dcport &= ~dcpinmask;
32
#else
33
digitalWrite(_dc, LOW);
34
#endif
35
}
пока вы не переделаете вывод пикселей картинки напрямую дисплею в память, скорости нормальной не получите.
В примерах, что я опытничаю, внутри библиотек две функции рисования точки. Какая работает мне не ясно.
01
void
Adafruit_ST7735::drawPixel(int16_t x, int16_t y, uint16_t color)
02
{
03
04
if
((x < 0) ||(x >= _width) || (y < 0) || (y >= _height))
return
;
05
06
setAddrWindow(x,y,x+1,y+1);
07
08
#if defined (SPI_HAS_TRANSACTION)
09
if
(hwSPI) SPI.beginTransaction(mySPISettings);
10
#endif
11
12
DC_HIGH();
13
CS_LOW();
14
spiwrite(color >> 8);
15
spiwrite(color);
16
CS_HIGH();
17
18
#if defined (SPI_HAS_TRANSACTION)
19
if
(hwSPI) SPI.endTransaction();
20
#endif
21
}
ну вот же она, задается координаты вывода, как выше писали. Формируете буфер данных для вывода, и по SPI шлете все это дисплею.
вот из проекта для ili9341, суть та же. (только это для STM + DMA)
01
void
f3spitft::tftSetAddrWindow(unsigned
short
x0, unsigned
short
y0, unsigned
short
x1, unsigned
short
y1) {
02
static
unsigned
char
pos_data[4];
03
// column address set
04
tftSendCommand(0x2A);
// CASET
05
while
(
this
->spiBUSY());
06
pos_data[0] = (x0 >> 8) & 0xFF;
07
pos_data[1] = x0 & 0xFF;
08
pos_data[2] = (x1 >> 8) & 0xFF;
09
pos_data[3] = x1 & 0xFF;
10
tftWriteData((unsigned
char
*)&pos_data, 4);
11
while
(
this
->spiBUSY());
12
// row address set
13
tftSendCommand(0x2B);
// RASET
14
while
(
this
->spiBUSY());
15
pos_data[0] = (y0 >> 8) & 0xFF;
16
pos_data[1] = y0 & 0xFF;
17
pos_data[2] = (y1 >> 8) & 0xFF;
18
pos_data[3] = y1 & 0xFF;
19
tftWriteData((unsigned
char
*)&pos_data, 4);
20
while
(
this
->spiBUSY());
21
// write to RAM
22
tftSendCommand(0x2C);
// RAMWR
23
while
(
this
->spiBUSY());
24
}
25
26
void
f3spitft::tftPrintBuffer(unsigned
short
x1, unsigned
short
y1, unsigned
short
x2, unsigned
short
y2, unsigned
char
* inData) {
27
if
((x1 >= tftWIDTH) || (y1 >= tftHEIGHT) || (x2 >= tftWIDTH) || (y2 >= tftHEIGHT))
return
;
28
if
((x1 >= tftWIDTH) || (y1 >= tftHEIGHT) || (x2 >= tftWIDTH) || (y2 >= tftHEIGHT))
return
;
29
if
(x1>x2) swap(x1,x2);
30
if
(y1>y2) swap(y1,y2);
31
unsigned
short
sizeData = (x2-x1+1)*(y2-y1+1);
32
tftSetAddrWindow(x1, y1, x2, y2);
33
tftSetPinDC(1);
34
tftSetPinCS(0);
// говорим slave устройству что начинаем работать
35
inWork = 1;
// флаг начала работы
36
DMA1_Channel3->CCR &= ~DMA_CCR_EN;
// отключаем любое действие канала если идет передача
37
DMA1_Channel3->CPAR = (unsigned
long
)(&SPI1->DR);
//заносим адрес регистра DR в CPAR
38
DMA1_Channel3->CMAR = (unsigned
long
)(unsigned
char
*)inData;
//заносим адрес данных в регистр CMAR
39
DMA1_Channel3->CNDTR = sizeData;
//количество передаваемых данных // 16 битных слов, т е пикселей
40
DMA1_Channel3->CCR &= ~DMA_CCR_MEM2MEM;
//режим MEM2MEM отключен
41
DMA1_Channel3->CCR &= ~DMA_CCR_PL;
//приоритет низкий
42
DMA1_Channel3->CCR &= ~DMA_CCR_MSIZE;
//разрядность данных в памяти 16 бит // 01: 16-bits
43
DMA1_Channel3->CCR |= DMA_CCR_MSIZE_0;
//разрядность данных в памяти 16 бит // 01: 16-bits
44
DMA1_Channel3->CCR &= ~DMA_CCR_PSIZE;
//разрядность регистра данных 16 бит в шину SPI
45
DMA1_Channel3->CCR |= DMA_CCR_PSIZE_0;
//разрядность регистра данных 16 бит в шину SPI
46
DMA1_Channel3->CCR |= DMA_CCR_MINC;
// включить инкремент адреса памяти
47
DMA1_Channel3->CCR &= ~DMA_CCR_PINC;
//Инкремент адреса периферии отключен
48
DMA1_Channel3->CCR &= ~DMA_CCR_CIRC;
//кольцевой режим отключен
49
DMA1_Channel3->CCR |= DMA_CCR_DIR;
//1 - из памяти в периферию
50
SPI1->CR2 |= SPI_CR2_TXDMAEN;
// разрешить отправку через DMA
51
DMA1_Channel3->CCR |= DMA_CCR_EN;
// включаем передачу данных
52
}
53
54
void
f3spitft::tftShowBackground(unsigned
char
* inPic) {
// выводим фоновую карптинку двумя частями в половину экрана
55
tftPrintBuffer(0, 0, tftWIDTH-1, tftHEIGHT/2-1, inPic);
56
while
(
this
->spiBUSY());
57
tftPrintBuffer(0, tftHEIGHT/2, tftWIDTH-1, tftHEIGHT-1, inPic+tftWIDTH*tftHEIGHT);
58
while
(
this
->spiBUSY());
59
}