Не работает LCD1602 при подключении библиотеки с поддержкой кириллицы

Доброго времени суток. В своём устройстве использую LCD1602 через I2C. На стандартной библиотеке LiquidCrystal_I2C всё работает отлично. Но при подключении библиотеки с гитхаба , которая поддерживает кириллицу, всё перестаёт работать.
Раньше в проекте использовалась только LCD1602, и библиотека LCD_1602_RUS_ALL работала исправно. Но после добавления в проект TFT-дисплея всё пошло наперекосяк и работает только LiquidCrystal_I2C.
С чем это может быть связано?

Очень, очень качественно описание проблемы. Все бы так.

Ну, тут все сразу ясно, ошибка в строке 29 скетча

Плиз выложите два варианта кода - первый где “все работает отлично”, а второй который не работает.
Просьба коды выкладывать полностью, текстом, с использованием тегов форума.

1 лайк

А заодно не сочтите за труд хотя бы указать, на какой плате вы все это делаете

1 лайк

Вот исправно работающий код

#include <LiquidCrystal_I2C.h>
#include <SPI.h>  //Подключаем библиотеку SPI
#include <SD.h>  //Подключаем библиотеку для работу с micro SDHC
#include <TFT.h>

#define CS   9
#define DC   3
#define RESET 5

LiquidCrystal_I2C lcd(0x27, 16, 2);

void setup() {        
  lcd.init();
  lcd.backlight();

  pinMode(4, OUTPUT);
  digitalWrite(4, HIGH);
  if(SD.remove("data.txt")) SD.remove("data.txt");

  pinMode(CS, OUTPUT);
  pinMode(8, INPUT_PULLUP);  //На вход
  pinMode(10, INPUT_PULLUP);  //На вход
  pinMode(2, OUTPUT);  //На выход
  pinMode(7, OUTPUT);  //На выход
}

void flick(double period){  //Функция осуществляющая мелькания
  digitalWrite(7, 1);
  delayMicroseconds(period);
  delayMicroseconds(period);
  delayMicroseconds(period);
  delayMicroseconds(period);
  delayMicroseconds(period);
  digitalWrite(7, 0);
  delayMicroseconds(period);
  delayMicroseconds(period);
  delayMicroseconds(period);
  delayMicroseconds(period);
  delayMicroseconds(period);
}

void bip(int period){  //Функция осуществляющая звуковой сигнал
  digitalWrite(2, 1);
  delay(period);
  digitalWrite(2, 0);
}

void loop() {
  double test_t[56]={45.5, 41.7, 38.5, 35.7, 33.3, 31.2, 29.4, 27.8, 26.3, 25.0, 23.8, 22.7, 21.7, 
                    20.8, 20.0, 19.2, 18.5, 17.9, 17.2, 16.7, 16.1, 15.6, 15.2, 14.7, 14.3, 13.9, 
                    13.5, 13.2, 12.8, 12.5, 12.2, 11.9, 11.6, 11.4, 11.1, 10.9, 10.6, 10.4, 10.2, 
                    10.0, 9.8, 9.6, 9.3, 9.2, 9.0, 8.8, 8.7, 8.5, 8.4, 8.2, 8.1, 8.0, 7.8, 7.7, 7.6, 7.5}; //Создаём массив периодов для монохромных мельканий в режиме "тест"

  static int Button, button_mode, button_press = 0, lvl = 0, CFFF = 0, CFDF, key = 1, freq;  //Создаём переменные для работы с кнопками и частотой
  static unsigned long timing = 0;  //Создаём переменную для работы со временем
  static double timeF, timeD;  //Создаём переменные для времени принятия сложного решения
  static char mode = 'T';  //Создаём переменную для переключения режимов
  static int time[40];

  static File file;
  
  Button = digitalRead(8);  //Контроль нажатия кнопки "Да"
  button_mode = digitalRead(10);  //Контроль нажатия кнопки Тест/Редакс
  if(!Button){button_press = 1;}  //Если нажата кнопка "Да", то ожидаем
  if(button_mode && !lvl && key){  //Если кнопка Тест/Редакс не нажата  
    mode = 'T'; key = 0;  //Устанавливаем режим "Тест"
    lcd.clear();
    lcd.setCursor(6,0);
    lcd.print("Test");  //Выводим на дипслей "Тест"
    file = SD.open("data.txt", FILE_WRITE);  //Создаём на micro SDHC файл для записи данных
    file.println("0");
  }
  if(!button_mode && key < 2 && !lvl){  //Если кнопка Тест/Редакс нажата
    lcd.setCursor(3,0);
    lcd.print("Relaxation");  //Выводим на дисплей "Релаксация"
    key = 2; mode = 'R';  //Устанавливаем режим "Релакс"
  }
  if(Button && button_press && lvl == 0){  //Если кнопка "Да" отжата после нажатия
    if(mode == 'T'){  //Если режим - "Тест"
      ++lvl; freq = 10;  //Устанавливаем начальную частоту в 10 Гц, переходим на режим КЧСМ
      lcd.clear();
    }else{lvl += 2; freq = 65;}  //Если режим - "Релакс", то устанавливаем начальную частоту в 65 Гц, переходим на режим КЧРМ
    button_press = 0;
    bip(300);  //Звуковой сигнал
  }
  if(lvl == 1){  //Режим КЧСМ
    if(!timing) timing = millis();
    if (millis() - timing < 2000) {  //Таймер на 2 секунды
      flick(test_t[freq-10] * 200);  //Мелькания
      if(button_press && Button){  //Если кнопка "Да" отжата
        timeF = millis() - timing;  //Вычисляем время принятия сложного решения 
        bip(300);  //Звуковой сигнал
        --button_press;
        if(freq!=65)++freq;  //Увеливаем частоту
        else lvl = 6;   //Если нарушен эксперимент, то выводится "Ошибка"
        timing = 0;

        if(freq!=10) file.println(String(ceil(timeF/100)/10));
        if(freq > 25) time[freq - 26] = ceil(timeF/100) * 3;
      }                   
    }else{  //Если отведённое время заканчивается
      if(freq == 10) lvl = 6;  //Если частота равна 10 Гц, то выводим ошибку
        CFFF = freq;  //Запоминаем КЧСМ
        freq = 65;  //Устанавливаем частоту в 65 Гц
        lvl = 2; timing = 0;  //Переходим на измерение КЧРМ
        delay(2000);
        bip(300);  //Звуковой сигнал
      }     
    }
  if(lvl == 2){  //Режим КЧРМ
    if(!timing) timing = millis();
    if (millis() - timing < 2000) {  //Таймер на 2 секунды
      flick(test_t[freq-10] * 200);  //Мелькания
      if(button_press && Button){  //Если кнопка "Да" отжата
        CFDF = freq; lvl = 3;  //Запоминаем КЧРМ
        timeD = millis() - timing;  //Запоминаем время принятия сложного решения
        timing = 0;
        if(CFFF){  //Если режим - "Тест", то записываем время принятия сложного решения и часто-ту
          file.println("-");
          file.println(String(CFDF) + " " + String(ceil(timeD/100)/10));
          file.close();
          digitalWrite(4, LOW);
        }
        --button_press;            
        bip(2000);  //Звуковой сигнал
      }                   
    }else{  //Если отведённое время заканчивается
      if(freq == 10) lvl = 6;   //Если нарушен эксперимент, то выводится "Ошибка"
      --freq; timing = millis();  //Уменьшаем частоту
      bip(300);  //Звуковой сигнал
    }
  }
  if(lvl == 3){  //Вывод данных на дисплей
    lcd.setCursor(0,1);
    lcd.print("CFDF");
    lcd.setCursor(6,1);
    lcd.print(CFDF);
    lcd.setCursor(8,1);
    lcd.print("Hz");
    lcd.setCursor(12,1);
    lcd.print(ceil(timeD/100)/10);
    lcd.setCursor(15,1);
    lcd.print("s");
      
    if(mode == 'T'){
      lcd.setCursor(0,0);
      lcd.print("CFFF");
      lcd.setCursor(6,0);
      lcd.print(CFFF);
      lcd.setCursor(8,0);
      lcd.print("Hz");
      lcd.setCursor(12,0);
      lcd.print(ceil(timeF/100)/10);
      lcd.setCursor(15,0);
      lcd.print("s");
    }else{
      timing = millis();
      while(millis() - timing < 180000) flick(5/(CFDF*1.8)); // Если режим - "Релакс", то проводим релаксацию
    }
    lvl = 5;

    digitalWrite(CS, HIGH);
    TFT tft = TFT(CS, DC, RESET);
    tft.begin();
    tft.background(0,0,0);
    tft.stroke(255,255,255);
    
    tft.line((CFDF - 26)*4, 65, (CFDF - 26)*4, 65 + ceil(timeF/100)*3);
    tft.line((CFDF - 26)*4 + 1, 65, (CFDF - 26)*4 + 1, 65 + ceil(timeF/100)*3);
    for(int i = 0; i < 40; i++){
      tft.line(i*4, 64, i*4, 64 - time[i]);
      tft.line(i*4 + 1, 64, i*4 + 1, 64 - time[i]);
    }
  }
  if(lvl == 6){
    bip(2000);
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("Error");  //Выводим на экран надпись "Ошибка"
    lvl = 5;
  }
}

А вот код при котором LCD перестаёт как-либо реагировать и всё останавливается

#define _LCD_TYPE 1

#include <LCD_1602_RUS_ALL.h>
#include <SPI.h>  //Подключаем библиотеку SPI
#include <SD.h>  //Подключаем библиотеку для работу с micro SDHC
#include <TFT.h>

#define CS   9
#define DC   3
#define RESET 5

LCD_1602_RUS <LiquidCrystal_I2C> lcd(0x27, 16, 2);

void setup() {        
  lcd.init();
  lcd.backlight();

  pinMode(4, OUTPUT);
  digitalWrite(4, HIGH);
  if(SD.remove("data.txt")) SD.remove("data.txt");

  pinMode(CS, OUTPUT);
  pinMode(8, INPUT_PULLUP);  //На вход
  pinMode(10, INPUT_PULLUP);  //На вход
  pinMode(2, OUTPUT);  //На выход
  pinMode(7, OUTPUT);  //На выход
}

void flick(double period){  //Функция осуществляющая мелькания
  digitalWrite(7, 1);
  delayMicroseconds(period);
  delayMicroseconds(period);
  delayMicroseconds(period);
  delayMicroseconds(period);
  delayMicroseconds(period);
  digitalWrite(7, 0);
  delayMicroseconds(period);
  delayMicroseconds(period);
  delayMicroseconds(period);
  delayMicroseconds(period);
  delayMicroseconds(period);
}

void bip(int period){  //Функция осуществляющая звуковой сигнал
  digitalWrite(2, 1);
  delay(period);
  digitalWrite(2, 0);
}

void loop() {
  double test_t[56]={45.5, 41.7, 38.5, 35.7, 33.3, 31.2, 29.4, 27.8, 26.3, 25.0, 23.8, 22.7, 21.7, 
                    20.8, 20.0, 19.2, 18.5, 17.9, 17.2, 16.7, 16.1, 15.6, 15.2, 14.7, 14.3, 13.9, 
                    13.5, 13.2, 12.8, 12.5, 12.2, 11.9, 11.6, 11.4, 11.1, 10.9, 10.6, 10.4, 10.2, 
                    10.0, 9.8, 9.6, 9.3, 9.2, 9.0, 8.8, 8.7, 8.5, 8.4, 8.2, 8.1, 8.0, 7.8, 7.7, 7.6, 7.5}; //Создаём массив периодов для монохромных мельканий в режиме "тест"

  static int Button, button_mode, button_press = 0, lvl = 0, CFFF = 0, CFDF, key = 1, freq;  //Создаём переменные для работы с кнопками и частотой
  static unsigned long timing = 0;  //Создаём переменную для работы со временем
  static double timeF, timeD;  //Создаём переменные для времени принятия сложного решения
  static char mode = 'T';  //Создаём переменную для переключения режимов
  static int time[40];

  static File file;
  
  Button = digitalRead(8);  //Контроль нажатия кнопки "Да"
  button_mode = digitalRead(10);  //Контроль нажатия кнопки Тест/Редакс
  if(!Button){button_press = 1;}  //Если нажата кнопка "Да", то ожидаем
  if(button_mode && !lvl && key){  //Если кнопка Тест/Редакс не нажата  
    mode = 'T'; key = 0;  //Устанавливаем режим "Тест"
    lcd.clear();
    lcd.setCursor(6,0);
    lcd.print("Test");  //Выводим на дипслей "Тест"
    file = SD.open("data.txt", FILE_WRITE);  //Создаём на micro SDHC файл для записи данных
    file.println("0");
  }
  if(!button_mode && key < 2 && !lvl){  //Если кнопка Тест/Редакс нажата
    lcd.setCursor(3,0);
    lcd.print("Relaxation");  //Выводим на дисплей "Релаксация"
    key = 2; mode = 'R';  //Устанавливаем режим "Релакс"
  }
  if(Button && button_press && lvl == 0){  //Если кнопка "Да" отжата после нажатия
    if(mode == 'T'){  //Если режим - "Тест"
      ++lvl; freq = 10;  //Устанавливаем начальную частоту в 10 Гц, переходим на режим КЧСМ
      lcd.clear();
    }else{lvl += 2; freq = 65;}  //Если режим - "Релакс", то устанавливаем начальную частоту в 65 Гц, переходим на режим КЧРМ
    button_press = 0;
    bip(300);  //Звуковой сигнал
  }
  if(lvl == 1){  //Режим КЧСМ
    if(!timing) timing = millis();
    if (millis() - timing < 2000) {  //Таймер на 2 секунды
      flick(test_t[freq-10] * 200);  //Мелькания
      if(button_press && Button){  //Если кнопка "Да" отжата
        timeF = millis() - timing;  //Вычисляем время принятия сложного решения 
        bip(300);  //Звуковой сигнал
        --button_press;
        if(freq!=65)++freq;  //Увеливаем частоту
        else lvl = 6;   //Если нарушен эксперимент, то выводится "Ошибка"
        timing = 0;

        if(freq!=10) file.println(String(ceil(timeF/100)/10));
        if(freq > 25) time[freq - 26] = ceil(timeF/100) * 3;
      }                   
    }else{  //Если отведённое время заканчивается
      if(freq == 10) lvl = 6;  //Если частота равна 10 Гц, то выводим ошибку
        CFFF = freq;  //Запоминаем КЧСМ
        freq = 65;  //Устанавливаем частоту в 65 Гц
        lvl = 2; timing = 0;  //Переходим на измерение КЧРМ
        delay(2000);
        bip(300);  //Звуковой сигнал
      }     
    }
  if(lvl == 2){  //Режим КЧРМ
    if(!timing) timing = millis();
    if (millis() - timing < 2000) {  //Таймер на 2 секунды
      flick(test_t[freq-10] * 200);  //Мелькания
      if(button_press && Button){  //Если кнопка "Да" отжата
        CFDF = freq; lvl = 3;  //Запоминаем КЧРМ
        timeD = millis() - timing;  //Запоминаем время принятия сложного решения
        timing = 0;
        if(CFFF){  //Если режим - "Тест", то записываем время принятия сложного решения и часто-ту
          file.println("-");
          file.println(String(CFDF) + " " + String(ceil(timeD/100)/10));
          file.close();
          digitalWrite(4, LOW);
        }
        --button_press;            
        bip(2000);  //Звуковой сигнал
      }                   
    }else{  //Если отведённое время заканчивается
      if(freq == 10) lvl = 6;   //Если нарушен эксперимент, то выводится "Ошибка"
      --freq; timing = millis();  //Уменьшаем частоту
      bip(300);  //Звуковой сигнал
    }
  }
  if(lvl == 3){  //Вывод данных на дисплей
    lcd.setCursor(0,1);
    lcd.print("CFDF");
    lcd.setCursor(6,1);
    lcd.print(String(CFDF));
    lcd.setCursor(8,1);
    lcd.print("Hz");
    lcd.setCursor(12,1);
    lcd.print(String(ceil(timeD/100)/10));
    lcd.setCursor(15,1);
    lcd.print("s");
      
    if(mode == 'T'){
      lcd.setCursor(0,0);
      lcd.print("CFFF");
      lcd.setCursor(6,0);
      lcd.print(String(CFFF));
      lcd.setCursor(8,0);
      lcd.print("Hz");
      lcd.setCursor(12,0);
      lcd.print(String(ceil(timeF/100)/10));
      lcd.setCursor(15,0);
      lcd.print("s");
    }else{
      timing = millis();
      while(millis() - timing < 180000) flick(5/(CFDF*1.8)); // Если режим - "Релакс", то проводим релаксацию
    }
    lvl = 5;

    digitalWrite(CS, HIGH);
    TFT tft = TFT(CS, DC, RESET);
    tft.begin();
    tft.background(0,0,0);
    tft.stroke(255,255,255);
    
    tft.line((CFDF - 26)*4, 65, (CFDF - 26)*4, 65 + ceil(timeF/100)*3);
    tft.line((CFDF - 26)*4 + 1, 65, (CFDF - 26)*4 + 1, 65 + ceil(timeF/100)*3);
    for(int i = 0; i < 40; i++){
      tft.line(i*4, 64, i*4, 64 - time[i]);
      tft.line(i*4 + 1, 64, i*4 + 1, 64 - time[i]);
    }
  }
  if(lvl == 6){
    bip(2000);
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("Error");  //Выводим на экран надпись "Ошибка"
    lvl = 5;
  }
}

К сожалению я не нашёл теги “lcd” и “tft”

12 строка - это почему так?

Потому что в примерах к библиотеке так

Вранье. Идем по вашей ссылке, заходим в примеры, смотрим строку 8, сравниваем и много думаем

//Пример для подключения дисплея по шине I2C
//
//Тип подключения дисплея: 1 - по шине I2C, 2 - десятиконтактное. Обязательно указывать ДО подключения библиотеки
//Если этого не сделать, при компиляции возникнет ошибка: "LCD type connect has not been declared"
#define _LCD_TYPE 1
#include <LCD_1602_RUS_ALL.h>

LCD_1602_RUS lcd(0x27, 16, 2);

void setup() {
  String str;
  str = ". Hexadecimal";

  lcd.init(); //Инициализация LCD (по умолчанию для ESP8266: 4 - SDA, 5 - SCL)
  //lcd.init(0, 2); //ESP8266-01 I2C: 0 - SDA, 2 - SCL
  
  // Печать сообщения на LCD
  lcd.backlight();
  lcd.setCursor(0, 0);
  lcd.print(1, DEC);
  lcd.print(". Десятичная");
  lcd.setCursor(0, 1);
  lcd.print(15, HEX);
  lcd.print(str);
}

void loop() {
}

все пролистал!
везде нормальное обявление

LCD_1602_RUS lcd(0x27, 16, 2);

Хм. Видно у меня старый вариант библиотеки. Т.к. при написании LCD_1602_RUS lcd(0x27, 16, 2); выдаёт ошибку “invalid use of template-name ‘LCD_1602_RUS’ without an argument list”.
До подключения TFT-дисплея код со строкой LCD_1602_RUS <LiquidCrystal_I2C> lcd(0x27, 16, 2); работал на ура.
При попытке обновления библиотеки выдаёт
Error: 13 INTERNAL: Library install failed: moving extracted archive to destination dir: Library LCD_1602_RUS_ALL is already installed, but with a different version: LCD_1602_RUS_ALL@1.2.0

Вот ссылка на старый вариант Библиотека LCD_1602_RUS_ALL для Ардуино – Focma

Ну так удалите старую перед установкой новой

Обновил библиотеку, но ничего не поменялось
Всё ещё не работающий код

#define _LCD_TYPE 1

#include <LCD_1602_RUS_ALL.h>
#include <SPI.h>  //Подключаем библиотеку SPI
#include <SD.h>  //Подключаем библиотеку для работу с micro SDHC
#include <TFT.h>

#define CS   9
#define DC   3
#define RESET 5

LCD_1602_RUS lcd(0x27, 16, 2);

void setup() {        
  lcd.init();
  lcd.backlight();

  pinMode(4, OUTPUT);
  digitalWrite(4, HIGH);
  if(SD.remove("data.txt")) SD.remove("data.txt");

  pinMode(CS, OUTPUT);
  pinMode(8, INPUT_PULLUP);  //На вход
  pinMode(10, INPUT_PULLUP);  //На вход
  pinMode(2, OUTPUT);  //На выход
  pinMode(7, OUTPUT);  //На выход
}

void flick(double period){  //Функция осуществляющая мелькания
  digitalWrite(7, 1);
  delayMicroseconds(period);
  delayMicroseconds(period);
  delayMicroseconds(period);
  delayMicroseconds(period);
  delayMicroseconds(period);
  digitalWrite(7, 0);
  delayMicroseconds(period);
  delayMicroseconds(period);
  delayMicroseconds(period);
  delayMicroseconds(period);
  delayMicroseconds(period);
}

void bip(int period){  //Функция осуществляющая звуковой сигнал
  digitalWrite(2, 1);
  delay(period);
  digitalWrite(2, 0);
}

void loop() {
  double test_t[56]={45.5, 41.7, 38.5, 35.7, 33.3, 31.2, 29.4, 27.8, 26.3, 25.0, 23.8, 22.7, 21.7, 
                    20.8, 20.0, 19.2, 18.5, 17.9, 17.2, 16.7, 16.1, 15.6, 15.2, 14.7, 14.3, 13.9, 
                    13.5, 13.2, 12.8, 12.5, 12.2, 11.9, 11.6, 11.4, 11.1, 10.9, 10.6, 10.4, 10.2, 
                    10.0, 9.8, 9.6, 9.3, 9.2, 9.0, 8.8, 8.7, 8.5, 8.4, 8.2, 8.1, 8.0, 7.8, 7.7, 7.6, 7.5}; //Создаём массив периодов для монохромных мельканий в режиме "тест"

  static int Button, button_mode, button_press = 0, lvl = 0, CFFF = 0, CFDF, key = 1, freq;  //Создаём переменные для работы с кнопками и частотой
  static unsigned long timing = 0;  //Создаём переменную для работы со временем
  static double timeF, timeD;  //Создаём переменные для времени принятия сложного решения
  static char mode = 'T';  //Создаём переменную для переключения режимов
  static int time[40];

  static File file;
  
  Button = digitalRead(8);  //Контроль нажатия кнопки "Да"
  button_mode = digitalRead(10);  //Контроль нажатия кнопки Тест/Редакс
  if(!Button){button_press = 1;}  //Если нажата кнопка "Да", то ожидаем
  if(button_mode && !lvl && key){  //Если кнопка Тест/Редакс не нажата  
    mode = 'T'; key = 0;  //Устанавливаем режим "Тест"
    lcd.clear();
    lcd.setCursor(6,0);
    lcd.print("Test");  //Выводим на дипслей "Тест"
    file = SD.open("data.txt", FILE_WRITE);  //Создаём на micro SDHC файл для записи данных
    file.println("0");
  }
  if(!button_mode && key < 2 && !lvl){  //Если кнопка Тест/Редакс нажата
    lcd.setCursor(3,0);
    lcd.print("Relaxation");  //Выводим на дисплей "Релаксация"
    key = 2; mode = 'R';  //Устанавливаем режим "Релакс"
  }
  if(Button && button_press && lvl == 0){  //Если кнопка "Да" отжата после нажатия
    if(mode == 'T'){  //Если режим - "Тест"
      ++lvl; freq = 10;  //Устанавливаем начальную частоту в 10 Гц, переходим на режим КЧСМ
      lcd.clear();
    }else{lvl += 2; freq = 65;}  //Если режим - "Релакс", то устанавливаем начальную частоту в 65 Гц, переходим на режим КЧРМ
    button_press = 0;
    bip(300);  //Звуковой сигнал
  }
  if(lvl == 1){  //Режим КЧСМ
    if(!timing) timing = millis();
    if (millis() - timing < 2000) {  //Таймер на 2 секунды
      flick(test_t[freq-10] * 200);  //Мелькания
      if(button_press && Button){  //Если кнопка "Да" отжата
        timeF = millis() - timing;  //Вычисляем время принятия сложного решения 
        bip(300);  //Звуковой сигнал
        --button_press;
        if(freq!=65)++freq;  //Увеливаем частоту
        else lvl = 6;   //Если нарушен эксперимент, то выводится "Ошибка"
        timing = 0;

        if(freq!=10) file.println(String(ceil(timeF/100)/10));
        if(freq > 25) time[freq - 26] = ceil(timeF/100) * 3;
      }                   
    }else{  //Если отведённое время заканчивается
      if(freq == 10) lvl = 6;  //Если частота равна 10 Гц, то выводим ошибку
        CFFF = freq;  //Запоминаем КЧСМ
        freq = 65;  //Устанавливаем частоту в 65 Гц
        lvl = 2; timing = 0;  //Переходим на измерение КЧРМ
        delay(2000);
        bip(300);  //Звуковой сигнал
      }     
    }
  if(lvl == 2){  //Режим КЧРМ
    if(!timing) timing = millis();
    if (millis() - timing < 2000) {  //Таймер на 2 секунды
      flick(test_t[freq-10] * 200);  //Мелькания
      if(button_press && Button){  //Если кнопка "Да" отжата
        CFDF = freq; lvl = 3;  //Запоминаем КЧРМ
        timeD = millis() - timing;  //Запоминаем время принятия сложного решения
        timing = 0;
        if(CFFF){  //Если режим - "Тест", то записываем время принятия сложного решения и часто-ту
          file.println("-");
          file.println(String(CFDF) + " " + String(ceil(timeD/100)/10));
          file.close();
          digitalWrite(4, LOW);
        }
        --button_press;            
        bip(2000);  //Звуковой сигнал
      }                   
    }else{  //Если отведённое время заканчивается
      if(freq == 10) lvl = 6;   //Если нарушен эксперимент, то выводится "Ошибка"
      --freq; timing = millis();  //Уменьшаем частоту
      bip(300);  //Звуковой сигнал
    }
  }
  if(lvl == 3){  //Вывод данных на дисплей
    lcd.setCursor(0,1);
    lcd.print("CFDF");
    lcd.setCursor(6,1);
    lcd.print(String(CFDF));
    lcd.setCursor(8,1);
    lcd.print("Hz");
    lcd.setCursor(12,1);
    lcd.print(String(ceil(timeD/100)/10));
    lcd.setCursor(15,1);
    lcd.print("s");
      
    if(mode == 'T'){
      lcd.setCursor(0,0);
      lcd.print("CFFF");
      lcd.setCursor(6,0);
      lcd.print(String(CFFF));
      lcd.setCursor(8,0);
      lcd.print("Hz");
      lcd.setCursor(12,0);
      lcd.print(String(ceil(timeF/100)/10));
      lcd.setCursor(15,0);
      lcd.print("s");
    }else{
      timing = millis();
      while(millis() - timing < 180000) flick(5/(CFDF*1.8)); // Если режим - "Релакс", то проводим релаксацию
    }
    lvl = 5;

    digitalWrite(CS, HIGH);
    TFT tft = TFT(CS, DC, RESET);
    tft.begin();
    tft.background(0,0,0);
    tft.stroke(255,255,255);
    
    tft.line((CFDF - 26)*4, 65, (CFDF - 26)*4, 65 + ceil(timeF/100)*3);
    tft.line((CFDF - 26)*4 + 1, 65, (CFDF - 26)*4 + 1, 65 + ceil(timeF/100)*3);
    for(int i = 0; i < 40; i++){
      tft.line(i*4, 64, i*4, 64 - time[i]);
      tft.line(i*4 + 1, 64, i*4 + 1, 64 - time[i]);
    }
  }
  if(lvl == 6){
    bip(2000);
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("Error");  //Выводим на экран надпись "Ошибка"
    lvl = 5;
  }
}

Не работающий - это как?

А если пример от библиотеки залить, работает?

вы не ответили на вопрос, какая ардуина используется… или я пропустил?

Прошу прощения. Используется Nano

не кого не напрягает?

Примеры из библиотеки работают исправно.
При загрузке моего кода LCD1602 просто светится и всё, а должна выводить слово “Test”. Ардуинка при этом не подаёт никаких признаков жизни.
До подключения TFT всё исправно работало.

LCD , TFT, Sd-карта, огромный массив каких-то данных типа double… и все это в Нано?
Думаю что у вас просто не хватает памяти

Для проверки поменяйте Нано на Мегу.

2 лайка

При использовании “LiquidCrystal_I2C” всё работает.
Возможно и вправду памяти не хватает на “LCD_1602_RUS_ALL”. Но разве в таком случае при компиляции IDE не должно говорить про недостаточное количество динамической памяти? IDE молчит.
Нано на Мегу не могу поменять, Мега не влезит в корпус