Бегущая строка с выводом через блютуз

Тема в разделе "Arduino & Shields", создана пользователем bibo, 6 июл 2018.

  1. bibo

    bibo Нерд

    В общем, заморочился себе сделать для некоторых нужд мобильную бегущую строку. Выводить текст удобно через блютуз телефона.
    Накарябал некий код. Вроде работает, но выводит строку чуть более шестидесяти символов. А мне нужно больше. Возможно ли?
    Код (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;
    }


     
     
  2. b707

    b707 Гуру

    А что за ардуина? Скорее всего памяти не хватает.
    Попробуйте переписать код без использования String
     
    bibo нравится это.
  3. bibo

    bibo Нерд

    использовал ля этих целей самую дешевую китайскую pro mini c atmega168p на борту)
    о нехватке памяти как-то не проскочила мысль...
     
    Последнее редактирование: 6 июл 2018
  4. ZAZ-965

    ZAZ-965 Гик

    @bibo, у вас SoftwareSerial заведен на пины аппаратного Serial. Неужели так работало?
     
  5. bibo

    bibo Нерд

    Работает. Ежели перекинуть SoftwareSerial на какие-либо другие пины, то не работает.
    И начал я заморачиваться с
    SoftwareSerial потому как не работало с аппаратным.
    Тут надо отметить факт, что примененная платка немного "поджарена", на пин raw подал 12 в и преобразователь испустил волшебный дым. Хотя разве может гибель преобразователя повлиять на поведение платки?