В общем, заморочился себе сделать для некоторых нужд мобильную бегущую строку. Выводить текст удобно через блютуз телефона. Накарябал некий код. Вроде работает, но выводит строку чуть более шестидесяти символов. А мне нужно больше. Возможно ли? Код (C++): #include <Adafruit_GFX.h> #include <Max72xxPanel.h> #include <SoftwareSerial.h> #include <Time.h> int gRxPin = 1; int gTxPin = 0; int speed_line = A5; int brightness = A4; int wait ;// скорость бегущей строки int spacer = 2; int width = 4 + spacer; // Регулируем расстояние между символами int refresh=0; int pinCS = 10; // Подключение пина CS, clk 13, din 11, int numberOfHorizontalDisplays = 8; // Количество светодиодных матриц по Горизонтали int numberOfVerticalDisplays = 1; // Количество светодиодных матриц по Вертикали Max72xxPanel matrix = Max72xxPanel(pinCS, numberOfHorizontalDisplays, numberOfVerticalDisplays); SoftwareSerial BTSerial(gRxPin, gTxPin); int rotate1, rotate2, bright; String tape; void setup() { Serial.begin(9600); BTSerial.begin(9600); pinMode(speed_line, INPUT); pinMode(brightness, INPUT); matrix.setRotation(matrix.getRotation()+2); //1 - 90 2 - 180 3 - 270 угол поворота // начальные координаты матриц 8*8 matrix.setRotation(0, 1); // 1 матрица matrix.setRotation(1, 1); // 2 матрица matrix.setRotation(2, 1); // 3 матрица matrix.setRotation(3, 1); // 4 матрица matrix.setRotation(4, 1); // 1 матрица matrix.setRotation(5, 1); // 2 матрица matrix.setRotation(6, 1); // 3 матрица matrix.setRotation(7, 1); // 4 матрица delay(500); } void loop() { rotate1 = analogRead(speed_line); rotate2 = analogRead(brightness); bright = rotate2/68; wait = rotate1/60; matrix.setIntensity(bright); // Яркость матрицы от 0 до 15 if (BTSerial.available()) { Serial.write(BTSerial.read()); } if (Serial.available()) { BTSerial.write(Serial.read()); } if (Serial.available()){ tape=Serial_Read(); delay(1000); } 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); } } /* Перекодировка русского шрифта из UTF-8 в 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]; i++; if (n >= 0xC0) { switch (n) { case 0xD0: { n = source[i]; i++; if (n == 0x81) { n = 0xA8; break; } if (n >= 0x90 && n <= 0xBF) n = n + 0x2F; break; } case 0xD1: { n = source[i]; 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; } /* Код для работы с com-портом */ String Serial_Read() { unsigned char c; // переменная для чтения сериал порта String Serial_string = ""; // Формируемая из символов строка while (Serial.available() > 0) { // Если в сериал порту есть символы c = Serial.read(); // Читаем символ 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; }
использовал ля этих целей самую дешевую китайскую pro mini c atmega168p на борту) о нехватке памяти как-то не проскочила мысль...
Работает. Ежели перекинуть SoftwareSerial на какие-либо другие пины, то не работает. И начал я заморачиваться с SoftwareSerial потому как не работало с аппаратным. Тут надо отметить факт, что примененная платка немного "поджарена", на пин raw подал 12 в и преобразователь испустил волшебный дым. Хотя разве может гибель преобразователя повлиять на поведение платки?