ARDUINO не могу наладить скетч для ардуино уно.

martin

✩✩✩✩✩✩✩
7 Сен 2026
7
0
Оформи сообщение в соответствии с правилами раздела
к арудино уно подключил MAX7219. 4шт в длину. цель что бы бегала бегущая строка с названиями улиц. проблема в то что на матрицу выводится короткий, урезанный текст. я по совету ии питался и массив добавить, и скорость менять, к сожалению для меня, у меня нечего не получается.
 
Изменено:

Эдуард Анисимов

★★★★★★★
23 Сен 2019
2,522
1,003
60
Марий-Эл
@martin, Я понял, что Вы хотите, но сделайте нормальное оформление.
Покажите как выводится текст. Сколько матриц.
И никогда не обращайтесь к ИИ. Потому что его нет.
А то, что выдают за ИИ. Просто большой каталогизатор с быстрой выборкой.

А такой проект был моим самым первым 100500 лет назад. И у меня получилось с первого раза.
Оформите как следует. Попробую помочь.
 

martin

✩✩✩✩✩✩✩
7 Сен 2026
7
0
Оформи код соответствующим тэгом, см. Правила
@EugeneFrol, я в первые в форумах, как та не в каком формате вложить. сейчас постараюсь разобраться. я не знаю так можно? модератор не будет ругать?
#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Max72xxPanel.h>


int pinCS = 10; // CS присоеденить к Пин 10, DIN к ПИН 11, CLK к ПИН 13 // Uno or Duemilanove DIN 11 (MOSI) CLK 13 (SCK)
int numberOfHorizontalDisplays = 1; // количество матриц тут неясно,
int numberOfVerticalDisplays = 4; // 4 горизонтальных матрицы выглядят так как указано в скетче.

Max72xxPanel matrix = Max72xxPanel(pinCS, numberOfHorizontalDisplays, numberOfVerticalDisplays);

String tape = "";
int wait = 100; // задержка в миллисекундах (скорость движения )

int spacer = 1; // Промежуток между символами (кол-во точек)
int width = 5 + spacer; // толщина символов (в данном случае толщина фонта 5 точек)

/* Recode russian fonts from UTF-8 to Windows-1251 перекодировка*/

String utf8rus(String source)
{
int i,k;
String target;
unsigned char n;
char m[2] = { '0', '\0' };

k = source.length(); i = 0;
while (i < k) {
n = source; i++;
if (n >= 0xC0) {
switch (n) {
case 0xD0: {
n = source; i++;
if (n == 0x81) { n = 0xA8; break; }
if (n >= 0x90 && n <= 0xBF) n = n + 0x2F;
break;
}
case 0xD1: {
n = source; i++;
if (n == 0x91) { n = 0xB7; break; }
if (n >= 0x80 && n <= 0x8F) n = n + 0x6F;
break;
}
}
}
m[0] = n; target = target + String(m);
}
return target;
}

String Serial_Read() {
unsigned char c; // переменная для чтения сериал порта
String Serial_string = ""; // Формируемая из символов строка
while (Serial.available() > 0) { // Если в сериал порту есть символы
c = Serial.read(); // Читаем символ
//Serial.print(c,HEX); Serial.print(" "); Serial.print(c);
if (c == '\n') { // Если это конец строки
return Serial_string; // Возвращаем строку
}
if (c == 0xB8) c = c - 0x01; // Коррекция кодов символа под таблицу ???? так как русские символы в таблице сдвинуты относительно стандартной кодировки utf на 1 символ
if (c >= 0xBF && c <= 0xFF) c = c - 0x01;
Serial_string = Serial_string + String(char(c)); //Добавить символ в строку
}
return Serial_string;
}



void setup() {
Serial.begin(9600);
tape = utf8rus("ул.ленина.ул.мира.ул.советская.ул.пушкина.ул.кирова.ул.красная.ул.школьная.ул.строителей.ул.парковая.ул.зеленая.ул.трудовая.ул.московская.ул.первомайская.ул.лесная.ул.садовая.ул.гоголя.ул.толстого.ул.фрунзе.ул.станционная.ул.куйбышева"); // первоначальная строка для отображения
matrix.setIntensity(5); // интенсивность свечения от 0 до 15
matrix.setRotation(matrix.getRotation()+1); // направление движения. 1 - 90 2 - 180 3 - 270

}
void loop() {


if (Serial.available()){
tape=Serial_Read();
}
for ( int i = 0 ; i < width * tape.length() + matrix.width() - 1 - spacer; i++ )
{
matrix.fillScreen(LOW);

int letter = i / width; // номер символа выводимого на матрицу

int x = (matrix.width() - 1) - i % width;
int y = (matrix.height() - 8) / 2; // поиск центра текста по вертикали

while ( x + width - spacer >= 0 && letter >= 0 ) {
if ( letter < tape.length() ) {
matrix.drawChar(x, y, tape[letter], HIGH, LOW,1);
}
letter--;
x -= width;
}
matrix.write(); // отображение
delay(wait);
}
}
 

martin

✩✩✩✩✩✩✩
7 Сен 2026
7
0
#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Max72xxPanel.h>


int pinCS = 10; // CS присоеденить к Пин 10, DIN к ПИН 11, CLK к ПИН 13 // Uno or Duemilanove DIN 11 (MOSI) CLK 13 (SCK)
int numberOfHorizontalDisplays = 1; // количество матриц тут неясно,
int numberOfVerticalDisplays = 4; // 4 горизонтальных матрицы выглядят так как указано в скетче.

Max72xxPanel matrix = Max72xxPanel(pinCS, numberOfHorizontalDisplays, numberOfVerticalDisplays);

String tape = "";
int wait = 100; // задержка в миллисекундах (скорость движения )

int spacer = 1; // Промежуток между символами (кол-во точек)
int width = 5 + spacer; // толщина символов (в данном случае толщина фонта 5 точек)

/* Recode russian fonts from UTF-8 to Windows-1251 перекодировка*/

String utf8rus(String source)
{
int i,k;
String target;
unsigned char n;
char m[2] = { '0', '\0' };

k = source.length(); i = 0;
while (i < k) {
n = source; i++;
if (n >= 0xC0) {
switch (n) {
case 0xD0: {
n = source; i++;
if (n == 0x81) { n = 0xA8; break; }
if (n >= 0x90 && n <= 0xBF) n = n + 0x2F;
break;
}
case 0xD1: {
n = source; i++;
if (n == 0x91) { n = 0xB7; break; }
if (n >= 0x80 && n <= 0x8F) n = n + 0x6F;
break;
}
}
}
m[0] = n; target = target + String(m);
}
return target;
}

String Serial_Read() {
unsigned char c; // переменная для чтения сериал порта
String Serial_string = ""; // Формируемая из символов строка
while (Serial.available() > 0) { // Если в сериал порту есть символы
c = Serial.read(); // Читаем символ
//Serial.print(c,HEX); Serial.print(" "); Serial.print(c);
if (c == '\n') { // Если это конец строки
return Serial_string; // Возвращаем строку
}
if (c == 0xB8) c = c - 0x01; // Коррекция кодов символа под таблицу ???? так как русские символы в таблице сдвинуты относительно стандартной кодировки utf на 1 символ
if (c >= 0xBF && c <= 0xFF) c = c - 0x01;
Serial_string = Serial_string + String(char(c)); //Добавить символ в строку
}
return Serial_string;
}



void setup() {
Serial.begin(9600);
tape = utf8rus("ул.ленина.ул.мира.ул.советская.ул.пушкина.ул.кирова.ул.красная.ул.школьная.ул.строителей.ул.парковая.ул.зеленая.ул.трудовая.ул.московская.ул.первомайская.ул.лесная.ул.садовая.ул.гоголя.ул.толстого.ул.фрунзе.ул.станционная.ул.куйбышева"); // первоначальная строка для отображения
matrix.setIntensity(5); // интенсивность свечения от 0 до 15
matrix.setRotation(matrix.getRotation()+1); // направление движения. 1 - 90 2 - 180 3 - 270

}
void loop() {


if (Serial.available()){
tape=Serial_Read();
}
for ( int i = 0 ; i < width * tape.length() + matrix.width() - 1 - spacer; i++ )
{
matrix.fillScreen(LOW);

int letter = i / width; // номер символа выводимого на матрицу

int x = (matrix.width() - 1) - i % width;
int y = (matrix.height() - 8) / 2; // поиск центра текста по вертикали

while ( x + width - spacer >= 0 && letter >= 0 ) {
if ( letter < tape.length() ) {
matrix.drawChar(x, y, tape[letter], HIGH, LOW,1);
}
letter--;
x -= width;
}
matrix.write(); // отображение
delay(wait);
}
}
 

martin

✩✩✩✩✩✩✩
7 Сен 2026
7
0
@Эдуард Анисимов,знайте, у меня тоже получилось, правда не с первого раза. но когда добавил длинный текст, ардуино начал урезать. я поискал в инете проект, сделал как массив что ли, и все равно урезает. толи памяти не хватает, толи что. по этому и обратился к знатокам. арудин уно или нано, обе в наличии есть, матрица мах7219 8х8. вроде и кириллицой разобрался, а вот то что текст сокращается, ни где не нашел полноценного ответа, во всяком случай для себя. и еще заметил, при касании к матрицам, начинается белиберда. я где та видел видео, что конденсатор добавляют от помех
 

martin

✩✩✩✩✩✩✩
7 Сен 2026
7
0
@EugeneFrol, я ниже в постах выложил, правда боюсь что модератор забанит. а как правильно выложить, не пойму. в файл что ли сохранить? мне бы еще привыкнуть к интерфейсу форума. постонно путаюсь, порой отвечаю и не знаю кому пишу ответ
 

wizard suleiman

✩✩✩✩✩✩✩
13 Окт 2023
76
5
потом времени не будет, так что заранее подскажу что надо добавить - вот
C++:
n = source[i]; i++;
так

надеюсь он все таки позже вставит код правильно...
 

Эдуард Анисимов

★★★★★★★
23 Сен 2019
2,522
1,003
60
Марий-Эл
@wizard suleiman, Вы мечетесь туда - сюда.
Это неправильно. Нужно включать мозг, а не ИИ. Он вам не поможет.
Пока вы не поймёте, что вы хотите, я помогать не буду.
А правила оформления можно прочитать на форуме.
 

martin

✩✩✩✩✩✩✩
7 Сен 2026
7
0
вот работает, я символы сократил до 136 символов с пробелами, работает не урезая. я так понял надо создать массив что ли, что бы не урезал. роликов много а под свой скетч не могу массив организовать.19567810579100.gif
 
Изменено:

VictorArx

★★★✩✩✩✩
22 Мар 2021
734
111
@martin, правильно оформить именно не как вы написали открытым текстом код а в таких рамках с цифрами, чтобы удобно было читать и видеть под каким номером косяк. Делается с помощью такого значка </>
 

Мишутк

★✩✩✩✩✩✩
29 Мар 2025
99
43
В вашем микроконтроллере 2кб оперативной памяти. Обращение со строками у вас идет неоптимально, одновременно держится несколько копий, естественно, памяти не хватает.
Избавьтесь от типа string, выделите для текста максимально возможный массив. У вас нет никакой сложной работы со строками, чего нельзя было бы сделать просто на массиве символов. Ваш код править бесполезно. Нужно создать совершенно новый на основе массива фиксированной длины. Алгоритм скроллинга текста в матрице светодиодов не меняется.

Для начала замените tape со string на char*, разместите его в PROGMEM, замените русский текст на английский (этим вы избавитесь от необходимости конвертации utf8rus, отключите часть кода принимающего текст из serial.
Адресация tape останется прежней, функцию tape.lenght() замените на переменную хранящую длину массива с текстом. Убедитесь что ваш код работает, после этого двигайтесь дальше в сторону возврата функционала.

В любом случае, создав то что я рекомендую с длиной текста, предположим, 10 символов, вы увидите после компиляции сколько байт памяти у вас еще свободно. Вот на столько (не больше) у вас есть шанс по простому увеличить текст, если хотите его принимать по serial. Если не менять, то команда PROGMEM позволит задать его достаточно большим.