Бегущая строка на матрице

Уважаемые форумчане!

Помогите пожалуйста. Есть светодиодная матрица 48х16 (3 шт. 16х16). Вывожу на нее бегущую строку. Строка выводиться один раз. Не могу понять почему текст с правого края матрицы выводиться посимвольно, а не попиксельно как когда бегущая строка уезжает за левую границу матрицы. Функцию вывода бегущей строки прилагаю

// Бегущая строка

void runstring()

{ int j = 0;

startrun = 48;

// Организуем смену цветов в бегущей строке

pass++;

if (pass == 9) pass = 0;

matrix.setTextColor(colors[pass]); // Применяем следующий цвет из массива

// Цикл прокрутки строки

while (j != runcaunt)

    {   

     j++;

     matrix.fillScreen(0);                                           // Очистка экрана

     matrix.setCursor(startrun, 10);                                 // Определяем позицию начала текста (x, y)

     matrix.setFont(&TimesNRCyr7pt8b);                               // Используем наш шрифт TimesNRCyr9

     matrix.print(runtext);                                          // Выводим текст на экран

     startrun--;

     matrix.show();                                                  // Показываем обновленное изображение на матрице

     delay(30);                                                      // Задерживаем выполнение на 100 миллисекунд

   }

Код поправьте. Или в новом сообщении вставьте

// Бегущая строка
void runstring()
{ int j = 0;
startrun = 48;
// Организуем смену цветов в бегущей строке
pass++;
if (pass == 9) pass = 0;
matrix.setTextColor(colors[pass]);                                // Применяем следующий цвет из массива
// Цикл прокрутки строки
while (j != runcaunt)
{
j++;
matrix.fillScreen(0);                                                           // Очистка экрана
matrix.setCursor(startrun, 10);                                         // Определяем позицию начала текста (x, y)
matrix.setFont(&TimesNRCyr7pt8b);                               // Используем наш шрифт TimesNRCyr9
matrix.print(runtext);                                                           // Выводим текст на экран
startrun–;
matrix.show();                                                                       // Показываем обновленное изображение на матрице
delay(30);                                                                               // Задерживаем выполнение на 30 миллисекунд
}
}

Три обратных апострофа. С новой строки

как правильно вставить код?

вставил код

Что такое runcaunt ?

Покажите код полностью. Какая библиотека матрицы?
В том кусочке, что вы опубликовали, я не вижу ничего, что может пролить свет на ваш вопрос.
У меня есть только догадки.
Вообще, логичным было бы обратное поведение - справа буквы выезжают попиксельно, слева пропадают целые буквы.

#include <Adafruit_GFX.h>                               
#include <Adafruit_NeoMatrix.h>                            
#include <Adafruit_NeoPixel.h>                               


Adafruit_NeoMatrix matrix = Adafruit_NeoMatrix(16, 16, 3, 1, PIN,                           
  NEO_TILE_TOP   + NEO_TILE_LEFT   + NEO_MATRIX_COLUMNS   + NEO_TILE_PROGRESSIVE +
  NEO_MATRIX_TOP + NEO_MATRIX_LEFT + NEO_MATRIX_ROWS + NEO_MATRIX_ZIGZAG,
  NEO_GRB + NEO_KHZ800);
  DHT dht(DHTPIN, DHT11);                                                                

runcaunt = 150;

из этой функции вызывается

// Функция вывода времени восхода и захода данные забиты или бегущая строка о празднике 
void matrvoshod ()
{    if(mon==5 && den==9 && mode == 1)
    {
      runcaunt = 150;
      runtext = "День победы";
      runstring();
      runstr = 1; }
   if(mon==5 && den==1 && mode == 1)
    { 
      runcaunt = 150;
      runtext = "День труда";
      runstring();
      runstr = 1;}
   if(mon==7 && den==23  && mode == 1)
    {  
      runcaunt = 240;
      runtext = "С днем рождения Леночка";
      runstring();
      runstr = 1;}
    if(mon==7 && den==25  && mode == 1)
    {  
      runcaunt = 200;
      runtext = "С днем рождения Сергей";
      runstring();
      runstr = 1;}
    if(mon==1 && den==1  && mode == 1)
    {  
      runcaunt = 150;
      runtext = "С новым годом";
      runstring();
      runstr = 1;}
   if(mon==12 && den==31  && mode == 1)
    {  
      runcaunt = 150;
      runtext = "С новым годом";
      runstring();
      runstr = 1;}
   if(mon==1  && den==7  && mode == 1)
    {  
      runcaunt = 150;
      runtext = "С Рождеством";
      runstring();
      runstr = 1;}
   if(mon==3 && den==8  && mode == 1)
    {  
      runcaunt = 200;
      runtext = "С праздником 8 марта";
      runstring();
      runstr = 1;}
   if(mon==2 && den==23  && mode == 1)
    {  
      runcaunt = 200;
      runtext = "С днем защитника отечества";
      runstring();
      runstr = 1;}
  if(mon==8 && den==12  && mode == 1)
    { 
      runcaunt = 200;
      runtext = "Неплохой день";
      runstring();
      runstr = 1;}
    if (runstr == 0 )
    {
    matrix.fillScreen(0) ;
    matrix.setTextColor(colors[4]);
    matrix.setCursor(10, 1);
    matrix.print(zahod);
    matrix.setCursor(12, 9);
    matrix.setTextColor(colors[2]);
    matrix.print(voshod);
    matrix.show();
    return;}

еще раз: Покажите код

Или у вас там что-то секретное?

А если сюда передать (16, 16, 4, 1, … ?

код полностью

#include <Adafruit_GFX.h>                                   //Библиотеки для работы с матрицами
#include <Adafruit_NeoMatrix.h>                             //Библиотеки для работы с матрицами
#include <Adafruit_NeoPixel.h>                              //Библиотеки для работы с матрицами
#include <Wire.h>                                           // Если используется аппаратная шина I2C, то подключаем библиотеку Wire, до подключения библиотеки iarduino_RTC (для модуля часов).
#include <iarduino_RTC.h>                                   // Подключаем библиотеку iarduino_RTC для работы с модулями реального времени.
#include <Fonts/FreeSansBold9pt7b.h>                        // Подключение шрифта высотой 13 пикселей
#include <NecDecoder.h>                                     // Библиотека Гувера для ИК приемника
#include "DHT.h"                                            // Библиотека датчика температуры и влажности
#include <TimeLord.h>                                       // Библиотека расчета времени захода и восхода солнца и фаз луны
#include "FontsRus/TimesNRCyr10.h"
#include "FontsRus/TimesNRCyr9.h"
#include "FontsRus/FreeSansOblique6.h"
#include "Fonts/FreeSerifBoldItalic9pt7b.h"
#include "FontsRus/TimesNRCyr7.h"
#include "FontsRus/TimesNRCyr6.h"                           // Русский шрифт. Изменены символ A - латинская на прямоугольник большой и @ на прямоугольник маленикий
#include "FontsRus/TimesNRCyr8.h"

// Мои функции приведенные в конце кода (после loop())
void fromsun();                                             // Функция подбора времени захода и восхода  
void gimn();                                                // Функция проигрывания гимна РФ на пищалке
void lordt();                                               // Функция для определения восхода и захода солнца и фазы луны
void modechoice();                                          // Функция выбора режима или настройки часов с пульта ДУ

// Назначение пинов для устройств
#define tonePin 5                                           // Пин для пищалки
#define DHTPIN 7                                            // Пин на датчик температуры и влажности
#define PIN 12                                              // Пин для светодидной матрицы
#define ESP_RST_PIN 7                                       // Пин для сброса ESP8266
#define ESP_EN_PIN 8   


//Определение переменных
//Переменные редактируемые для настройки устройства на отключение матрицы
 int offmin =  15;                                          // Минуты отключения матрицы
 int offhour = 0;                                           // Часы отключения матрицы
 int onmin =   30;                                          // Минуты включения матрицы
 int onhour =  5;                                           // Часы включения матрицы

// Переменные времени
 int min = 0;                      // Переменная для minutes 
 int sekunda = 0;                  // Переакнная для секунды (в программе не используется)
 int hou = 0;                      // Переменная для Hours
 int den = 0;                      // Переменная для day
 int mon = 0;                      // Переменная для month
 int year = 0;                     // Переменная для year
 int week = 0;                     // Переменная для weekday
 
//Переменные функции бегущей строки
 int pass = 0;                                               // Индекс массива цветов 
 int startrun = 48;                                          // Начало координат начала бегущей строки
 String runtext;                                             // Текст для бегущей строки
 int runstr = 0;                                             // Определяет выводится ли бегущаяя строка или данные о восходе и заходе в режиме 1.

// Переменные функций подключения к интернету
 int st1 = 0;                                                // счетчик подключения к интернету
 int st2 = 0;                                                // счетчик ожидания вода данных сети
 int st3 = 0;                                                // счетчик отсутвия данных точного времени (так для информации)
 int status = 6;                                               // Переменная статуса полученных данных из последовательного порта
 int errordata;                                              // 0 - Данные времени из интернета получены и применяются, 1 - Ошибка. Данные на получены и применяется врямя из модуля часов
 int stcount = 0;                                            // счетчи к максимального количества шагов при подключении к интернету
 String inputString = "";                                    // Переменная для получения времени (временная) 
 int countitime = 0;                                         // Счетчик для массива int datatime [6]  в который заносятся данные времени полученные с ESP8266
 int datatime [7];                                           // массив данных времени
 const char* espdata;                                        // временные переменные
 char*  ee;                                                  // временные переменные
 char c ;                                                    // временные переменные
 
 // Переменные для астрономических данных                                   
 float const LONGITUDE = 30.2017;                           // значения долготы (западные значения отрицательные)  30°12′05″ в.д. (для Сертолово)
 float const LATITUDE =  60.1444;                           // значения широты (южные значения отрицательные)      60°08′39″ с.ш. (для Сертолово)       
 String voshod;                                             // Значения времени восхода
 String zahod;                                              // Значения времени захода
 float phase;                                               // Фаза луны в числах библиотеки TimeLord
 int moon;                                                  // Фаза луны в определении

 uint8_t step = 1;                                          // для организации таймера
 int moder = 4;                                             // Режим 3. Поочередный вывод режима 1 и режима 2
 int mode = 1;                                              // Переменная указывающая режим
 auto korrect = 1;                                          // Переменная применяется при чтении кнопок нажатия пульта.  
 NecDecoder ir;                                             // объект для работы с ик приемник
 int show = 1;                                              // если 0 то матрица не работает (наверное можно без нее)
 int runcaunt;      
 uint32_t last_millis = 0;                                   // Переменная для организации таймера
 String weekday1;                                            // Переменная будних дней недели
 String weekday2;                                            // Переменная выходных дней недели

// Создание объектов 
iarduino_RTC time(RTC_DS3231);                                                              // для модуля DS3231 с i2C
Adafruit_NeoMatrix matrix = Adafruit_NeoMatrix(16, 16, 3, 1, PIN,                           // Декларирование матрицы. См. описание 1 (внизу)
  NEO_TILE_TOP   + NEO_TILE_LEFT   + NEO_MATRIX_COLUMNS   + NEO_TILE_PROGRESSIVE +
  NEO_MATRIX_TOP + NEO_MATRIX_LEFT + NEO_MATRIX_ROWS + NEO_MATRIX_ZIGZAG,
  NEO_GRB + NEO_KHZ800);
  DHT dht(DHTPIN, DHT11);                                                                     //Датчика DHT11 (синий корпус)
 

// Массив цветов для светодиодной матрицы
  const uint16_t colors[] = {
  matrix.Color(150, 0, 115),            // 0
  matrix.Color(11, 224, 217),          // 1
  matrix.Color(255, 0, 0),             // 2  Красный
  matrix.Color(0, 255, 0),             // 3  Зеленый
  matrix.Color(0, 0, 255),             // 4  Синий
  matrix.Color(176, 40, 176),          // 5  Фиолетовый
  matrix.Color(255, 12, 200),          // 6  
  matrix.Color(255, 255, 255),         // 7  белый
  matrix.Color(254, 180, 52)           // 8  лунный
                            };   


void setup()
 {
// Настройка пинов управления ESP8266
  pinMode(ESP_RST_PIN, OUTPUT);
  pinMode(ESP_EN_PIN, OUTPUT);

// Включение ESP8266
  digitalWrite(ESP_EN_PIN, HIGH);
  digitalWrite(ESP_RST_PIN, HIGH);

// Инициализация последовательных портов
  Serial.begin(9600);                                                 // Для отладки и вывода на монитор
  Serial3.begin(115200);                                              // Для связи с ESP8266
  time.begin();                                                       // Инициируем модуль часов.
  dht.begin();                                                        // Инициируем модуль температуры и влажности
  matrix.begin();                                                     // Инициируем светодиодную матриу
  itime();                                                            // Получение времени с интернета

  // Считываем данные часов в переменные
    min =  time.minutes;
    hou =  time.Hours;    
    den =  time.day;    
    mon =  time.month;    
    year =  time.year;    
    week = time.weekday;  
  }
//***************************************************************************************************************************************



// Функция вывода на матрицы информацию о подключении к WiFi
void wificonn ()
{   matrix.setBrightness(50);
    matrix.setTextColor(colors[1]);
    matrix.setFont(); 
    matrix.fillScreen(0);
    matrix.setCursor(3, 4);
    matrix.print("WAITING");
    matrix.show();
    return;
}
//******************************************************************************************************************************************


// Бегущая строка
void runstring()
{ int j = 0;
  startrun = 48;
// Организуем смену цветов в бегущей строке
  pass++; 
  if (pass == 9) pass = 0;     
  matrix.setTextColor(colors[pass]);                            // Применяем следующий цвет из массива
  
// Цикл прокрутки строки
  while (j != runcaunt)
        {   
         j++;
         matrix.fillScreen(0);                                           // Очистка экрана
         matrix.setCursor(startrun, 10);                                 // Определяем позицию начала текста (x, y)
         matrix.setFont(&TimesNRCyr7pt8b);                               // Используем наш шрифт  
         matrix.print(runtext);                                          // Выводим текст на экран
         startrun--;
         matrix.show();                                                  // Показываем обновленное изображение на матрице
         delay(30);                                                      // Задерживаем выполнение на 30 миллисекунд
       }
}
//**********************************************************************************************************************************


// Вывод на матрицу информацию о попытках подключения к WiFi сети
void wifistatus1 ()
{   matrix.setBrightness(50);
    matrix.setTextColor(colors[3]);
    matrix.setFont(); 
    matrix.fillScreen(0);
    matrix.setCursor(2, 4);
    matrix.print("WIFI");
    matrix.setTextColor(colors[1]);
    matrix.setCursor(34, 4);
    matrix.print(st1);
    matrix.show();
    return;
}
//**********************************************************************************************************************************

// Вывод на матрицу ожидания данных сети
void wifistatus2 ()
{   matrix.setBrightness(50);
    matrix.setTextColor(colors[2]);
    matrix.setFont(); 
    matrix.fillScreen(0);
    matrix.setCursor(0, 0);
    matrix.print("DATA net");
    matrix.setTextColor(colors[1]);
    matrix.setCursor(20, 8);
    matrix.print(st2);
    matrix.show();
    return;
}
//**********************************************************************************************************************************

// Вывод на матрицу информации о неудачном получении данных точного времени
void wifistatus3 ()
{   matrix.setBrightness(50);
    matrix.setTextColor(colors[2]);
    matrix.setFont(); 
    matrix.fillScreen(0);
    matrix.setCursor(4, 0);
    matrix.print("NO DATA");
    matrix.setTextColor(colors[1]);
    matrix.setCursor(20, 8);
    matrix.print(st3);
    matrix.show();
    return;
}
//**********************************************************************************************************************************


// Функция получения данных от ESP8266
void itime()
 {
wificonn ();
resetESP8266(); 
delay (3000);
resetESP8266();
while ( status != 99 && stcount != 400 )    
    {

    // Условия устраният зависания при включении когда количесво попыток начинает превышать заданное  
    if (status == 6) 
      { 
      wifistatus1 (); 
      st1++;
      if (st1 == 80) status = 99;
      }

    if (status == 77) {wifistatus2 (); st2++; }
    if (status == 88) {wifistatus3 (); st3++; delay (5000);}
    delay (1000);
    inputString = ""; 
    // Serial.println(status);                                                        // Для отладки
  
    while (Serial3.available()) 
                    { 
                      c = Serial3.read();                                             // Посимвольно читаем порт Serial3
                      inputString += c;                                               // Заносим полученные данные в строку
                      if (c == '\n') espdata = inputString.c_str();                    // Если дошли до конца строки
                     }  
  ee = strtok(espdata,":");                                                            //Разделяет строку на токены на основе разделителя ":". Токен — это подстрока, разделённая разделителями, которые могут быть любым символом или набором символов. 
  countitime = 0;
  while (ee!= NULL) {
                     datatime[countitime] = atoi(ee);
                     status = datatime[0];
                     min =    datatime[1];
                     hou =    datatime[2];
                     den =    datatime[3];
                     mon =    datatime[4];
                     year =    datatime[5];
                     week =   datatime[6];
                     ee   =   strtok(NULL,":");
                     countitime ++;
                     }
     stcount++;
     }

  if (year == 0 || year == 1970)
      {
     //  Serial.println("Данные не получены");                         // Для отладки
      errordata = 1;
      }
     else 
      { 
     //Serial.println("Данные  получены");                              // Для отладки
     errordata = 0;
     year=year-2000;                                                    // Получение двузначного значения года
     time.settime(-1 ,min, hou, den, mon, year, week); 
      }
   return;
 }
//******************************************************************************************************************************


// Функция сброса/перезагрузки ESP
void resetESP8266() {
digitalWrite(ESP_RST_PIN, LOW);
delay(100);
digitalWrite(ESP_RST_PIN, HIGH);
delay(4000);                                                        // Даем время на загрузку ESP8266
}
//******************************************************************************************************************************


//Функция прерывания обрабатываем кнопки пульта
void irIsr() {
   ir.tick();
    if (ir.available()) { 
    //Serial.println(ir.readCommand(), HEX);                        // Для отладки. Дает код нажатой клавиши пульта
    korrect = ir.readCommand();
                        }
    }
//*****************************************************************************************************************************

// ДЛЯ РЕЖИМА 1
// Функция вывода времени на матрицу
void clockmatr()
{  
    matrix.setBrightness(10);
    matrix.setTextColor(colors[1]);
    if (errordata == 1) matrix.setTextColor(colors[2]);             // Цвет цифр времени если время с интернета не получено
    switch (mode)
  {      
    case 1:                                        
         matrix.setFont(&FreeSansBold9pt7b);                        // Шрифт цифр времени для режима 1
         matrix.fillScreen(0);
         matrix.setCursor(1, 13);
         break; 
    case 2:  
         matrix.setFont(&FreeSerifBoldItalic9pt7b);                  // Шрифт цифр времени для режима 2
         matrix.fillScreen(0);
         matrix.setCursor(4, 12);
         break;
  }
    matrix.print(time.gettime("H:i"));
    matrix.show();
    return;
}
//****************************************************************************************************************************


// Функция вывода температуры и влажности на матрицу
void tempvlaz()
  {   
    float h = dht.readHumidity();                               //Измеряем влажность
    float t = dht.readTemperature();                            //Измеряем температуру
    if (isnan(h) || isnan(t)) {                                 // Проверка. Если не удается считать показания, выводится «Ошибка считывания», и программа завершает работу
    Serial.println("Ошибка считывания"); 
    return;
    }
     t = (int)t;
    matrix.fillScreen(0);
    matrix.setFont();
    matrix.setTextColor(colors[2]);
    if (t>0) {
            matrix.setCursor(3,  5);        
            matrix.print("+");
            matrix.print(t,0);
            }
        else
            {
            matrix.setCursor(8, 5);
            matrix.print(t,0);
            }
                matrix.setFont();
    matrix.setTextColor(colors[4]);
    matrix.setCursor(28, 5);
    matrix.print(h,0);
    matrix.print("%");
    matrix.show();
    return;
    }
//*****************************************************************************************************************************************************************


// Функция вывода даты   на матрицу. Дни недели обозначены квадратиками. Текущий день недели высокий квадрат (символ A). остальные дни символ @
void matrdate ()
{   matrix.setBrightness(10);
    matrix.setTextColor(colors[7]);
    matrix.setFont(); 
    matrix.fillScreen(0);
    matrix.setCursor(0, 0);
    matrix.print(time.gettime("d-m-y"));
    matrix.setFont(&TimesNRCyr6pt8b);                                //внимание шрифт измененный
    matrix.setTextColor(colors[7]);
    matrix.setCursor(3, 14);
    matrix.print(weekday1);                                          // будние дни
    matrix.setTextColor(colors[2]);
    matrix.print(weekday2);                                           // суббота и воскресенье
    matrix.show();
    return;
}
//************************************************************************************************


// Функция вывода фаз луны на матрицы. Шрифт измененный
void phasemoon ()
{  // matrix.setTextWrap(false);                 // запрет перевода строки в матрице                
    matrix.setBrightness(10);
    matrix.setTextColor(colors[8]);
    matrix.setFont(&TimesNRCyr6pt8b);            //Внимание измененный шрифт
    matrix.fillScreen(0);
    matrix.setCursor(0, 11);
    switch (moon)
         {      
    case 1:                                        
        matrix.print("B");                          // Новая луна; 
        matrix.setCursor(18, 16);
        matrix.print("НОВ."); 
        break; 
    case 2:  
        matrix.print("I");                         // "молодая луна";
        matrix.setCursor(18, 16);
        matrix.print("НОВАЯ"); 
        break;
    case 3:  
        matrix.print("G");                         //"1 четверть";
        matrix.setCursor(18, 16);
        matrix.print("1 ЧТ"); 
        break;
    case 4:  
        matrix.print("F");                         //" растущая луна";
        matrix.setCursor(18, 16);
        matrix.print("РАСТ"); 
        break;
    case 5:  
        matrix.print("E");                         //  "полная луна";
        matrix.setCursor(18, 16);
        matrix.print("ПОЛН"); 
        break;
    case 6:  
        matrix.print("D");                         // "убывающая луна";
        matrix.setCursor(18, 16);
        matrix.print("УБЫВ"); 
        break;
    case 7:  
        matrix.print("C");                          // "2 четверть";
        matrix.setCursor(18, 16);
        matrix.print("2 ЧТ"); 
        break;
    case 8:  
        matrix.print("J");                          // "старая луна";
        matrix.setCursor(18, 16);
        matrix.print("СТАР");  
        break;
        }
    matrix.setTextColor(colors[1]);
    matrix.setCursor(18, 8);
    matrix.print("ЛУНА"); 
    matrix.show();
    return;
}
 //************************************************************************************************

// Функция отлючения матрицы
void matrixoff ()
{    matrix.fillScreen(0) ;
     matrix.show();
     time.gettime("H:i");
     Serial.println(hou);
     Serial.println(mode);
     Serial.println(time.minutes);
     return;
}
//************************************************************************************************


// Функция вывода времени восхода и захода данные забиты или бегущая строка о празднике 
void matrvoshod ()
{    if(mon==5 && den==9 && mode == 1)
    {
      runcaunt = 150;
      runtext = "День победы";
      runstring();
      runstr = 1; }
   if(mon==5 && den==1 && mode == 1)
    { 
      runcaunt = 150;
      runtext = "День труда";
      runstring();
      runstr = 1;}
   if(mon==7 && den==23  && mode == 1)
    {  
      runcaunt = 240;
      runtext = "С днем рождения Леночка";
      runstring();
      runstr = 1;}
    if(mon==7 && den==25  && mode == 1)
    {  
      runcaunt = 200;
      runtext = "С днем рождения Сергей";
      runstring();
      runstr = 1;}
    if(mon==1 && den==1  && mode == 1)
    {  
      runcaunt = 150;
      runtext = "С новым годом";
      runstring();
      runstr = 1;}
   if(mon==12 && den==31  && mode == 1)
    {  
      runcaunt = 150;
      runtext = "С новым годом";
      runstring();
      runstr = 1;}
   if(mon==1  && den==7  && mode == 1)
    {  
      runcaunt = 150;
      runtext = "С Рождеством";
      runstring();
      runstr = 1;}
   if(mon==3 && den==8  && mode == 1)
    {  
      runcaunt = 200;
      runtext = "С праздником 8 марта";
      runstring();
      runstr = 1;}
   if(mon==2 && den==23  && mode == 1)
    {  
      runcaunt = 200;
      runtext = "С днем защитника отечества";
      runstring();
      runstr = 1;}
  if(mon==8 && den==12  && mode == 1)
    { 
      runcaunt = 200;
      runtext = "Неплохой день";
      runstring();
      runstr = 1;}
    if (runstr == 0 )
    {
    matrix.fillScreen(0) ;
    matrix.setTextColor(colors[4]);
    matrix.setCursor(10, 1);
    matrix.print(zahod);
    matrix.setCursor(12, 9);
    matrix.setTextColor(colors[2]);
    matrix.print(voshod);
    matrix.show();
    return;}
}
// *****************************************************************************************************************************
 
//  Режим работы 1
 void mode1()
 {
    if(millis() - last_millis >= 7000 && step == 1 )                  // Вывод часов на 7 сек
    {
    last_millis = millis();                                    
    clockmatr();
    step  = 2;
    }
   if(millis() - last_millis >= 7000 && step  == 2 )                 // Вывод часов на даты и дня недели
    {
    last_millis = millis();
    matrdate ();
    step  = 3;
    }
   if(millis() - last_millis >= 5000 && step  == 3 )                 // Вывод температуры и влажность
    {
    last_millis = millis();
    tempvlaz();
    step  = 4;
    }
   if(millis() - last_millis >= 5000 && step  == 4 )                  // Вывод твремени восхода и захода солнца
    {
    last_millis = millis();
      fromsun();
      matrvoshod ();
      step  = 5;
    }
      if(millis() - last_millis >= 5000 && step  == 5 )
    {
    last_millis = millis();
    clockmatr();
     step  = 1;
    }
 }
//************************************************************************************************************

//  Режим работы 2
 void mode2()
{
if(millis() - last_millis >= 7000 && step  == 1 )
    {
    last_millis = millis();
    clockmatr();
    step  = 2;
    }
   if(millis() - last_millis >= 5000 && step  == 2 )
    {
    last_millis = millis();
     tempvlaz();
     step  = 3;
    }
if(millis() - last_millis >= 5000 && step  == 3 )
    {
    last_millis = millis();
    lordt();
    matrvoshod ();
     step  = 4;
    }
   if(millis() - last_millis >= 5000 && step  == 4 )
    {
    last_millis = millis();
     lordt();
     phasemoon ();
     step  = 5;
    }
   if(millis() - last_millis >= 5000 && step  == 5 )
    {
    last_millis = millis();
    clockmatr();
     step  = 1;
    } 
}
//*****************************************************************************************************


void loop() 
{
    // Вызов прерывания при нажатии клавиши на пульте для установки времени  
    attachInterrupt(0, irIsr, FALLING);
    modechoice();
    if (korrect==0) time.settime(-1, min,hou,den,mon,year,week);
    korrect=1;
  // Serial.println(time.gettime("d-m-Y, H:i:s, D"));
    den =  time.day;    
    mon =  time.month;   
    min =  time.minutes;
    hou =  time.Hours;   
    sekunda = time.seconds;   
    year =  time.year; 
    week = time.weekday; 
    time.gettime("d:m:y");

// Блок присваивающий переменной текущий день недели использует измененный шрифт
    switch (week)
         {      
    case 0:                                        
        weekday1 = "@@@@@";      
        weekday2 = "@A";               
        break; 
    case 1:  
        weekday1 = "A@@@@";  
        weekday2 = "@@";     
        break;
    case 2:  
         weekday1 = "@A@@@";  
        weekday2 = "@@";     
        break;
    case 3:  
        weekday1 = "@@A@@";  
        weekday2 = "@@";     
        break;
    case 4:  
          weekday1 = "@@@A@";  
        weekday2 = "@@";     
        break;
    case 5:  
        weekday1 = "@@@@A";  
        weekday2 = "@@";    
        break;
    case 6:  
        weekday1 = "@@@@@";  
        weekday2 = "A";      
        break;
        }

// Смена режима 1 и 2 каждые 15 минут
   if (moder == 4)
    {
    switch (min)
           {   
            case 5:                                                   // Режим 1-14 сек время, 5 секунд дата, темпрература и влажность, 5 сек  время восхода и хахода солнца
            mode = 1;
            break;
            case 20: 
            mode = 2;
            break;
            case 35: 
            mode = 1;
            break;
            case 55:                                                   // Режим 1-14 сек время, 5 секунд дата, темпрература и влажность, 5 сек  время восхода и хахода солнца
            mode = 2;
            break;
          }
    }

 //Играет гимн в 00.00 и в 12.00
    if (min==0 && hou == 0 && sekunda == 0 || min==0 && hou == 12 && sekunda == 0 ) { clockmatr();  gimn();}                      
     
 // Выключение матрицы в определенное время (ножной режим)
   if (time.Hours == offhour && time.minutes ==  offmin)            
    {  
       while (time.Hours != onhour)    
         { time.gettime("H:i:y");
           while ( time.minutes != onmin)   
           {
            show = 0; 
            matrixoff (); 
           }                             
         }
    }

   
   switch (mode)
           {   
    case 1:                                                   // Режим 1-14 сек время, 5 секунд дата, темпрература и влажность, 5 сек  время восхода и хахода солнца
    mode1();
    break;
    case 2:                                                   // Режим 1-14 сек время, 5 секунд дата, темпрература и влажность, 5 сек  время восхода и хахода солнца
    mode2();
    break;
    case 3: 
    itime();
    mode = 1;
    break;
    case 4:   
    mode = 1;                                               // Режим 1-14 сек время, 5 секунд дата, темпрература и влажность, 5 сек  время восхода и хахода солнца
    moder = 4;
    break;
           } 
  }
//**************************************************************************************************************************** 


// Функция управления с пульта ДУ
void modechoice()
{
    switch (korrect)
  {      
    case 162:                                        // Прибавляем минуты
        min++;  
        if( min == 60) min=0;
        clockmatr();  
        korrect=0;                      
        break; 
    case 34:  
       // clockmatr();                                 // Убавляем минуты
        min--;         
        if( min == -1) min=59;
        clockmatr(); 
        korrect=0;
        break;
    case 98:     
       // clockmatr();                                  // Прибавляем часы
        hou++;
        if( hou == 24) hou=0;
        clockmatr();
        korrect=0;  
        break;
    case 2: 
       // clockmatr();                                  // Убавляем часы
        hou--;
        if( hou == -1) hou=0;
        clockmatr(); 
        korrect=0;  
        break;
    case 226:  
      //  matrdate();                                  // Прибавляем день
        den++;
        if( den == 31) den=1; 
        matrdate();  
        korrect=0;  
        break;
    case 194:                                         // Убавляем день
      //  matrdate(); 
        den--;
        if( den == 0) den=31;                         
        matrdate();  
        korrect=0; 
        break;
    case 224:                                         // Прибавляем месяц
      //  matrdate();                                   
        mon++;
        if( mon == 31) mon=1; 
        matrdate();  
        korrect=0; 
        break; 
    case 104:                                          // Убавляем месяц
       // matrdate();                                  
        mon--;
        if( mon == 0) mon=31; 
        matrdate();  
        korrect=0; 
        break;
    case 168:                                          // Прибавляем год
      //  matrdate();                                  
        year++;
        if( year == 13) year=1; 
        matrdate();  
        korrect=0; 
        break;
    case 152:                                          // Убавляем год
      //  matrdate();                              
        year--;
         if( year == 0) year=12; 
        matrdate();  
        korrect=0; 
        break;
    case 144:                                         // Прибавляем день недели
        week++;
        if( week == 8) week = 1;
        korrect=0; 
        break;
    case 176:                                         // Убавляем день недели
        week--;
        if( week == 0) week = 7;
        korrect=0; 
        break;
    case 24:                                         // Режим 1 стрелка вверх
        mode = 1;
         moder = 1;
        break;
    case 74:                                         // Режим 2 стрелка вниз
        mode = 2;
         moder = 1;
        break;
    case 16:                                         
        mode = 3;                                   // Режим 3 стрелка влево Переподклбчение к интернету
        break;
    case 90:                                        
       mode = 4;                                    // Режим 4 стрелка вправо Переключающийся режим каждые 15 мин
        break;
     case 56:                                        // Режим 4 кнопка ОК
       mode = 5;
        break;    
      }
}
//*********************************************************************************************************************************


 // Получение данных по времени восхода и захода по дням в году и фаз луны. Данные расчитываются
 void lordt()
  {
  time.gettime("d:m:y");
  TimeLord tardis;                                                   // Инициализация объекта TimeLord
  tardis.TimeZone(3 * 60);                                           // Установка часового пояса
  tardis.Position(LATITUDE, LONGITUDE);                              // Устанавливается позиция в координатах
  byte today[] = {sekunda, min, 12, den, mon, year};                 // store today's date (at noon) in an array for TimeLord to use (format SS, MM, HH, DD, MM, YY)
   tardis.SunRise(today);                                            // Данные по времени восхода
   if (today[tl_minute]<10)
   {
    voshod = String(today[tl_hour])+"."+"0"+ String(today[tl_minute]); 
   } else
   {
    voshod = String(today[tl_hour])+"."+ String(today[tl_minute]);
   }
   tardis.SunSet(today);                                             // Данные по времени захода
   if (today[tl_minute]<10)
   {
    zahod = String(today[tl_hour])+"."+"0"+ String(today[tl_minute]); 
   } else
   {
    zahod = String(today[tl_hour])+"."+ String(today[tl_minute]);
   }
   byte tonight[] = {sekunda, min, 0, den, mon, year};
   phase= tardis.MoonPhase(tonight);                                  // Данные по фазе луны
   if (phase == 0) moon = 1;                                          //"новая";          
   if (phase >= 0 && phase < 0.20) moon = 2;                          // "молодая луна";
   if (phase >= 0.20 && phase <= 0.3) moon = 3;                       //"1 четверть";
   if (phase > 0.3 && phase < 0.45) moon = 4;                         //" растущая луна";
   if (phase >= 0.45 && phase <= 0.55) moon = 5;                      //  "полная луна";
   if (phase > 0.55 && phase < 0.70) moon = 6;                        // "убывающая луна";
   if (phase >= 0.70 && phase<=0.8) moon = 7;                         // "2 четверть";
   if (phase > 0.8 && phase <= 0.999) moon = 8;                       // "старая луна";
   Serial.println(moon);
    } 

Откуда это следует?
Эта величина должна быть равна ширине текста в пикселях + ширина экрана, иначе строка будет прокручиваться не полностью, или, наоборот, уходить слишком далеко за край

строка полностью уезжает за край матрицы. Подобрано опытным путем. Это число устраивает. В принципе примерно так и есть как вы пишите

4 вместо 3 попробуете вставить? Чтобы Adafruit думал, что там еще матрица есть.
На границе матриц, не пропадают буквы же?

На строчку 162 добавьте

matrix.setTextWrap(false);

и напишите что изменится

Это помогло. Но как то неправильно мне кажется. Как костыль.

Ну, тут Вы правы.

Память будет выделена под лишнюю матрицу, а больше проблем не вижу. Если мое предложение из #15 не прокатит - вполне себе “костыль”… рабочий :slight_smile:
Ах, да, если точка подключения матриц не слева, могут быть проблемы :slight_smile:

Это тоже помогло. Причем число матриц вернул 3. Как это работает здесь, Это же запрет переноса строки

Вот именно. Если перенос разрешен, буква, попадающая на край матрицы, переносится на новую строку. И переносится, что логично, целиком, а не попиксельно