TFT DISPLAY ILI9341 кириллица

Приветствую ВАС уважаемые. Возникла проблема с русскими букафками. На дисплее ILI9341 240*320 3", с библиотекой Adafruit-GFX. Дело в том что при моделировании в Proteus кириллица виртуально отображается отлично, в реале ни черта не отображается.
В чем может быть проблема? В прошивке указывается кодировка utf8 для отображения русских символов. Но в реальной жизни отображать не хочет.

Ошибка в строке №78.

Не понял!

Чего непонятного?
Скетча нет, схемы нет, а хрустальный шар говорит, что ошибка в строке №78.

а у меня только обрезиненный есть, от мышки, он вообще ничего не говорит

Кароч вот так. При моделировании в протеусе схемы с использованием ардуино Нана и tft дисплеем, с подключенной библиотекой AdafrutGFX, в моделировании кириллица есть, текст написанный в прошивке отображается. На реальном железе нет. Допустим команда для печати на дисплей tft.print(utf8rus(“ВЫСОТА”)), надпись высота не отображается, а если использовать латинские буквы то все печатает. Вот часть скетча.

#include <RTClib.h> // библиотека часов реального времени

#include <Wire.h>

#include “Adafruit_GFX.h” // Библиотека обработчика графики
#include “Adafruit_ILI9341.h” // Программные драйвера для дисплеев ILI9341

#define TFT_DC A0 // Пин подключения вывода D/C дисплея
#define TFT_CS A1 // Пин подключения вывода CS дисплея
// Для управления очисткой экрана с помощью кнопки RESET на Arduino подключить вывод дисплея RESET через резистор к пину RESET на плате Arduino
// Для Mega 2560 вывод дисплея RESET, если не подключен в пин RESET на Arduino, подключить в 3.3V (без резистора), либо в 5V (с резистором)
#define TFT_RST A2 // Пин подключения вывода RESET (Если подключен к питанию или кнопке, то эту строку закомментировать, а следующую раскомментировать)
// #define TFT_RST -1 // Если вывод дисплея RESET подключен к питанию или через кнопку RESET на Arduino
// Uno Hardware SPI
#define TFT_MISO A3 // Пин подключения вывода дисплея SDO(MISO)
#define TFT_MOSI 12 // Пин подключения вывода дисплея SDI(MOSI)
#define TFT_CLK 11 // Пин подключения вывода дисплея SCK
#define CS_PIN 10 // Для часов реального времени
#define buttonZero 13 // Кнопка отбивки нуля
#define deblockPump 10 // Кнопка деблокировки насосов
#define in2 4 // направление вращения

unsigned long timeBut, timeBut1; // Время начала нажатия кнопки

String utf8rus(String source); // Прототип функции отрисовки русских букв

Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC, TFT_MOSI, TFT_CLK, TFT_RST, TFT_MISO); // Создаем объект дисплея и сообщаем библиотеке распиновку для работы с графикой
RTC_DS1307 RTC; // Создаём объект часов реального времени

#define t_SCK 3 // Пин подключения вывода дисплея T_CLK
#define t_CS 4 // Пин подключения вывода дисплея T_CS
#define t_MOSI 5 // Пин подключения вывода дисплея T_DIN
#define t_MISO 6 // Пин подключения вывода дисплея T_DOUT
#define t_IRQ 7 // Пин подключения вывода дисплея T_IRQ

DateTime dt; // Объект для реального времени
char mode; // Режим работы устройства h - настройка часов, m - настройка минут, w - работа
short mm; // минуты
float height, heightBefore; // высота и высота ранее
void drawDisplay(); // Прототип функции отрисовки дисплея
void setTime(); // Прототип настройки времени
void drawSetup(); // Прототип очищения экрана
void setZero(); // Прототип функции отбивки нуля
bool bullshit; // флаг перехода с установки часов на рабочий режим 0 - часы, 1 - работа

void counter1(); // Прототип функции счётчика импульсов

void setup(){
pinMode(CS_PIN, OUTPUT);
tft.begin(); // Инициализируем начало работы с графическим дисплеем
tft.setRotation(1); // Переводим дисплей в альбомную ориентацию
Wire.begin(); // Инициализируем Wire
RTC.begin(); // Инициализируем часы реального времени
mode = ‘w’; // режим работы
pinMode(buttonZero, INPUT_PULLUP); // Кнопка отбивки нуля
pinMode(deblockPump, INPUT_PULLUP); // Кнопка деблокировки насосов
pinMode(in2, INPUT_PULLUP); // Вход от энкодера
//pinMode(, INPUT_PULLUP);
drawSetup(); // Начальная отрисовка экрана
mm = dt.minute(); // Инициализация переменной минут
attachInterrupt(1,counter1, FALLING); // Прерывания по спаду импульса на 3 входе
height = 0; // Высота = 0

heightBefore = height; // Высота была равна нулю
bullshit = 1; // Флаг установлен в режим работы
}

void loop()
{
drawDisplay(); // Отрисовка дисплея
setTime(); // Установка времени
setZero(); // Отбивка нуля

}

// Начало функции обработки кириллических символов
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 >= 0xBF){
  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;
}
// Конец функции обработки кириллических символов

// Функция прерывания
void counter1() {
if (digitalRead(in2)) {
height += 0.01;
} else height -= 0.01;
}

// Функция отрисовки времени
void drawTime() {
tft.setTextSize(2); // Размер текста часов
dt = RTC.now(); // Присваивание объекту значения времени
tft.setCursor(243,220); // Устанавливаем курсор
// Если меняем часы
if (mode == ‘h’) {
tft.setTextColor(ILI9341_YELLOW);
if (dt.hour() < 10) tft.print(utf8rus(“0”));
tft.print(dt.hour(), DEC);
} else {
tft.setTextColor(ILI9341_BLACK);
if ((dt.hour() - 1) < 10) tft.print(utf8rus(“0”));
tft.print(dt.hour() - 1, DEC);
}
// ставим двоеточие между часами и минутами
tft.setTextColor(ILI9341_YELLOW);
tft.print(“:”);
// Если меняем минуты
if (mode == ‘m’) {
tft.setTextColor(ILI9341_YELLOW);
if (dt.minute() < 10) tft.print(utf8rus(“0”));
tft.print(dt.minute(), DEC);
} else {
tft.setTextColor(ILI9341_BLACK);
if ((dt.minute() - 1) < 10) tft.print(utf8rus(“0”));
tft.print(dt.minute() - 1, DEC);
}

tft.setCursor(243,220);
// Если всё поменяли, переходим в рабочий режим
if (mode == ‘w’) {
tft.fillRect(240,219,27,16,ILI9341_BLACK);
tft.fillRect(275,219,27,16,ILI9341_BLACK);
}
tft.setTextColor(ILI9341_YELLOW);
if (dt.hour() < 10) tft.print(utf8rus(“0”));
tft.print(dt.hour(), DEC);
tft.print(“:”);
if (dt.minute() < 10) tft.print(utf8rus(“0”));
tft.print(dt.minute(), DEC);

mm = dt.minute(); // Присваиваем минутам значение времени
}

// Функция отрисовки значения высоты
void drawHeight() {
tft.setTextSize(3);
tft.fillRect(175,5,90,25,ILI9341_BLACK);
tft.setCursor(175,5);
tft.setTextColor(ILI9341_YELLOW);
tft.print(height);
}

// Функция отрисовки дисплея
void drawDisplay() {
dt = RTC.now(); // Инициализируем время
// Если высота изменилась, отрисовываем её
if (height != heightBefore) {
drawHeight();
heightBefore = height;
}
// Если изменились минуты, отрисовываем время
if (mm != dt.minute()) {

drawTime();

}

}

// Функция отбивки нуля
void setZero() {
static bool buttonBefore = false; // Состояние кнопки ранее

// Нажали кнопку, начинаем считать время
if (bullshit && !digitalRead(buttonZero) && !buttonBefore && (mode == ‘w’)) {
timeBut1 = millis();
buttonBefore = true;
//bullshit = true;
}
// При отжатии кнопки обнуляем высоту
if (bullshit && buttonBefore && digitalRead(buttonZero) && ((timeBut1 + 100) <= millis()) && (mode == ‘w’)) {
height = 0;
buttonBefore = false;
}
// При отжатии кнопки спустя время устанавливаем флаг в 1
if (buttonBefore && digitalRead(buttonZero) && ((timeBut1 + 100) <= millis()) && (mode == ‘w’)) {
bullshit = true;
buttonBefore = false;
}

}

// функция установки времени
void setTime() {
short hh = dt.hour(); // переменные для регулирования времени
static bool buttonZeroBefore = false;
// устанавливаем в ложь предыдущее положение кнопки
if (digitalRead(buttonZero)) {
buttonZeroBefore = false;
}

// при нажатии кнопки отсчитываем время
if (!digitalRead(buttonZero) && !buttonZeroBefore && (mode == ‘w’)) {
timeBut = millis();
buttonZeroBefore = true;
}

/if (buttonZeroBefore && digitalRead(buttonZero) && ((timeBut + 100) >= millis()) && (mode == ‘w’)) {
height = 0;
}
/

// через 5 секунд включаем режим настройки часов
if (buttonZeroBefore && (!digitalRead(buttonZero)) && ((timeBut + 5000) <= millis()) && (mode == ‘w’)) {
mode = ‘h’;
tft.fillRect(240,219,27,16,ILI9341_BLUE);
drawTime();
}

static bool deblockPumpBefore = false; // предыдущее положение кнопки

// если кнопка ненажата
if ((mode == ‘h’) && digitalRead(deblockPump)) {
deblockPumpBefore = false;
bullshit = false;
}
// если нажимаем кнопку, начинаем отсчёт времени
if (!digitalRead(deblockPump) && !deblockPumpBefore && (mode == ‘h’)) {
timeBut = millis();
deblockPumpBefore = true;
bullshit = false;

}
// устраняем дребезг контактов
if (deblockPumpBefore && !digitalRead(deblockPump) && ((timeBut + 100) <= millis()) && (mode == ‘h’)) {
hh = (dt.hour() < 23) ? ++hh : 0;
RTC.adjust(DateTime(2014, 1, 21, hh, mm, 0));
deblockPumpBefore = false; // Чтобы только на один час!
tft.fillRect(240,219,27,16,ILI9341_BLUE);
drawTime();
}
static bool mins = false;
// включаем режим настройки минут
if (!digitalRead(buttonZero) && !buttonZeroBefore && (mode == ‘h’)) {
timeBut = millis();
buttonZeroBefore = true;
mins = true;
}

// устраняем дребезг контактов
if ((mins == true) && buttonZeroBefore && (!digitalRead(buttonZero)) && ((timeBut + 100) <= millis()) && (mode == ‘h’)) {
mode = ‘m’;
tft.fillRect(240,219,27,16,ILI9341_BLACK);
tft.fillRect(275,219,27,16,ILI9341_BLUE);
drawTime();
mins = false;
}

 if ((mode == 'm') && digitalRead(deblockPump)) {
deblockPumpBefore = false;

}
// если нажимаем кнопку, начинаем отсчёт времени
if (!digitalRead(deblockPump) && !deblockPumpBefore && (mode == ‘m’)) {
timeBut = millis();
deblockPumpBefore = true;

}
// устраняем дребезг контактов
if (deblockPumpBefore && !digitalRead(deblockPump) && ((timeBut + 100) <= millis()) && (mode == ‘m’)) {
mm = (dt.minute() < 59) ? ++mm : 0;
RTC.adjust(DateTime(2014, 1, 21, hh, mm, 0));
//deblockPumpBefore = false; // Чтобы только на один час!
tft.fillRect(275,219,27,16,ILI9341_BLUE);
drawTime();
timeBut = millis();
}

// если удерживаем
if (deblockPumpBefore && !digitalRead(deblockPump) && ((timeBut + 2000) <= millis()) && (mode == ‘m’)) {
if ((millis() % 1000) == 0) {
mm = (dt.minute() < 50) ? (mm + 10) : 0;
}
}

// включаем режим настройки минут
if (!digitalRead(buttonZero) && !buttonZeroBefore && (mode == ‘m’)) {
timeBut = millis();
buttonZeroBefore = true;
mins = true;
}

// устраняем дребезг контактов
if ((mins == true) && buttonZeroBefore && (!digitalRead(buttonZero)) && ((timeBut + 100) <= millis()) && (mode == ‘m’)) {
mode = ‘w’;
tft.fillRect(240,219,27,16,ILI9341_BLACK);
tft.fillRect(275,219,27,16,ILI9341_BLACK);
drawTime();
mins = false;
}

}

// Очищение экрана
void drawSetup() {
tft.fillScreen(ILI9341_BLACK);
// Рисуем таблицу
tft.drawLine(170,0,170,185, ILI9341_YELLOW);
tft.drawLine(0,30,319,30, ILI9341_YELLOW);
tft.drawLine(0,61,319,61, ILI9341_YELLOW);
tft.drawLine(0,92,319,92, ILI9341_YELLOW);
tft.drawLine(0,123,319,123, ILI9341_YELLOW);
tft.drawLine(0,154,319,154, ILI9341_YELLOW);
tft.drawLine(0,185,319,185, ILI9341_YELLOW);
tft.setTextSize(3); // Определяем размер шрифта для вывода на дисплей

tft.setTextColor(ILI9341_YELLOW); // Определяем цвет текста для вывода на экран
tft.setCursor(5,5); // Определяем координаты верхнего левого угла области вывода
tft.print(utf8rus(“ВЫСОТА”));
tft.setCursor(5,36);
tft.print(utf8rus(“СКОРОСТЬ”));
tft.setCursor(5,67);
tft.print(utf8rus(“ШАР.КРАН”));
tft.setCursor(5,98);
tft.print(utf8rus(“БУР.НАСОС”));
tft.setCursor(5,129);
tft.print(utf8rus(“ЛЕБЕДКА”));
tft.setCursor(5,160);
tft.print(utf8rus(“ШТРОПА”));
drawHeight();
tft.setCursor(5,191);
tft.print(utf8rus(“СТРОКА 7”));
/tft.setCursor(175,5); // Определяем координаты верхнего левого угла области вывода
tft.print(sizeof(long));
/
tft.setCursor(5,36);
tft.setCursor(160,220);
tft.setTextSize(2);
tft.print(utf8rus("Время: "));
dt = RTC.now();
drawTime();
/if (dt.hour() < 10) tft.print(utf8rus(“0”));
tft.print(dt.hour(), DEC);
tft.print(“:”);
if (dt.minute() < 10) tft.print(utf8rus(“0”));
tft.print(dt.minute(), DEC);
/
}

Я честно ещё не разобрался как тут скетчи впихиватт

Интересует как заставить дисплей отображать кириллицу

Вот, другое дело! Тут ошибка в 153 строке. Фууухх! Замаялся считать строки,но это мелочи.
В окне ответа бледным шрифтом написано что и как.

Простите, а можно копию этой строки.

А самому слабо на пальцах отсчитать? Ну раз ума не хватает вставить код правильно, с нумерацией строк…

Я ещё не адаптировался к приложению
Ссорян
Грубиян.

В окне ввода сообщения написано как код вставлять.

Не получается ни как

Это тест на IQ. Если вы не в состоянии скопировать код, нажать на соответствующую кнопку в окне ввода сообщения и сделать Ctrl+V, то чего вы от нас хотите?

#include <RTClib.h> // библиотека часов реального времени


#include <Wire.

#include "Adafruit_GFX.h"     // Библиотека обработчика графики
#include "Adafruit_ILI9341.h" // Программные драйвера для дисплеев ILI9341


#define TFT_DC A0              // Пин подключения вывода D/C дисплея
#define TFT_CS A1             // Пин подключения вывода CS дисплея
// Для управления очисткой экрана с помощью кнопки RESET на Arduino подключить вывод дисплея RESET через резистор к пину RESET на плате Arduino
// Для Mega 2560 вывод дисплея RESET, если не подключен в пин RESET на Arduino, подключить в 3.3V (без резистора), либо в 5V (с резистором)
#define TFT_RST A2             // Пин подключения вывода RESET (Если подключен к питанию или кнопке, то эту строку закомментировать, а следующую раскомментировать)
// #define TFT_RST -1         // Если вывод дисплея RESET подключен к питанию или через кнопку RESET на Arduino
// Uno Hardware SPI
#define TFT_MISO A3           // Пин подключения вывода дисплея SDO(MISO)
#define TFT_MOSI 12           // Пин подключения вывода дисплея SDI(MOSI)
#define TFT_CLK 11            // Пин подключения вывода дисплея SCK
#define CS_PIN 10           // Для часов реального времени
#define buttonZero 13     // Кнопка отбивки нуля
#define deblockPump 10    // Кнопка деблокировки насосов
#define in2 4             // направление вращения



unsigned long timeBut, timeBut1;  // Время начала нажатия кнопки



String utf8rus(String source);  // Прототип функции отрисовки русских букв

Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC, TFT_MOSI, TFT_CLK, TFT_RST, TFT_MISO);  // Создаем объект дисплея и сообщаем библиотеке распиновку для работы с графикой
RTC_DS1307 RTC;     // Создаём объект часов реального времени

#define t_SCK 3               // Пин подключения вывода дисплея T_CLK
#define t_CS 4                // Пин подключения вывода дисплея T_CS
#define t_MOSI 5              // Пин подключения вывода дисплея T_DIN
#define t_MISO 6              // Пин подключения вывода дисплея T_DOUT
#define t_IRQ 7               // Пин подключения вывода дисплея T_IRQ

DateTime dt;      // Объект для реального времени
char mode;  // Режим работы устройства h - настройка часов, m - настройка минут, w -  работа
short mm;   // минуты
float height, heightBefore; // высота и высота ранее
void drawDisplay();   // Прототип функции отрисовки дисплея
void setTime(); // Прототип настройки времени
void drawSetup(); // Прототип очищения экрана
void setZero();   // Прототип функции отбивки нуля
bool bullshit; // флаг перехода с установки часов на рабочий режим 0 - часы, 1 - работа

void counter1(); // Прототип функции счётчика импульсов

void setup(){
  pinMode(CS_PIN, OUTPUT);
  tft.begin();                      // Инициализируем начало работы с графическим дисплеем
  tft.setRotation(1);               // Переводим дисплей в альбомную ориентацию
  Wire.begin();       // Инициализируем Wire
  RTC.begin();    // Инициализируем часы реального времени
  mode = 'w'; // режим работы
  pinMode(buttonZero, INPUT_PULLUP);    // Кнопка отбивки нуля
  pinMode(deblockPump, INPUT_PULLUP); // Кнопка деблокировки насосов
  pinMode(in2, INPUT_PULLUP);     // Вход от энкодера
  //pinMode(, INPUT_PULLUP);
  drawSetup();      // Начальная отрисовка экрана
  mm = dt.minute(); // Инициализация переменной минут
  attachInterrupt(1,counter1, FALLING);   // Прерывания по спаду импульса на 3 входе
  height = 0; // Высота = 0
  
  heightBefore = height;      // Высота была равна нулю
  bullshit = 1;     // Флаг установлен в режим работы
}
 
void loop()
{
  drawDisplay();    // Отрисовка дисплея
  setTime();        // Установка времени
  setZero();        // Отбивка нуля
 
}

// Начало функции обработки кириллических символов
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 >= 0xBF){
      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;
}
// Конец функции обработки кириллических символов

// Функция прерывания
void counter1() {
  if (digitalRead(in2)) {
    height += 0.01;
  } else height -= 0.01;
}



// Функция отрисовки времени
void drawTime() {
  tft.setTextSize(2);     // Размер текста часов
  dt = RTC.now();       // Присваивание объекту значения времени
  tft.setCursor(243,220);   // Устанавливаем курсор 
  // Если меняем часы
  if (mode == 'h') {
    tft.setTextColor(ILI9341_YELLOW);
    if (dt.hour() < 10)  tft.print(utf8rus("0"));
    tft.print(dt.hour(), DEC);
  } else {
    tft.setTextColor(ILI9341_BLACK);
    if ((dt.hour() - 1) < 10)  tft.print(utf8rus("0"));
    tft.print(dt.hour() - 1, DEC);
  } 
  // ставим двоеточие между часами и минутами
   tft.setTextColor(ILI9341_YELLOW);
  tft.print(":");
  // Если меняем минуты
   if (mode == 'm') {
    tft.setTextColor(ILI9341_YELLOW);
    if (dt.minute() < 10)  tft.print(utf8rus("0"));
    tft.print(dt.minute(), DEC);
  } else {
    tft.setTextColor(ILI9341_BLACK);
    if ((dt.minute() - 1) < 10)  tft.print(utf8rus("0"));
    tft.print(dt.minute() - 1, DEC);
  }
  
  tft.setCursor(243,220);
  // Если всё поменяли, переходим в рабочий режим
  if (mode == 'w') {
    tft.fillRect(240,219,27,16,ILI9341_BLACK);
    tft.fillRect(275,219,27,16,ILI9341_BLACK);
  }
  tft.setTextColor(ILI9341_YELLOW);
  if (dt.hour() < 10)  tft.print(utf8rus("0"));
  tft.print(dt.hour(), DEC);
  tft.print(":");
  if (dt.minute() < 10)  tft.print(utf8rus("0"));
  tft.print(dt.minute(), DEC);

  mm = dt.minute();   // Присваиваем минутам значение времени
}

// Функция отрисовки значения высоты
void drawHeight() {
    tft.setTextSize(3);
    tft.fillRect(175,5,90,25,ILI9341_BLACK);
    tft.setCursor(175,5); 
    tft.setTextColor(ILI9341_YELLOW);         
    tft.print(height);
}

// Функция отрисовки дисплея
void drawDisplay() {
  dt = RTC.now();   // Инициализируем время
  // Если высота изменилась, отрисовываем её
  if (height != heightBefore) {
    drawHeight();
    heightBefore = height;
  }
  // Если изменились минуты, отрисовываем время
  if (mm != dt.minute()) {
    
    drawTime();
  }
 
}

// Функция отбивки нуля
void setZero() {
   static bool buttonBefore = false;    // Состояние кнопки ранее
   
 
   // Нажали кнопку, начинаем считать время
   if (bullshit && !digitalRead(buttonZero) && !buttonBefore && (mode == 'w')) {
    timeBut1 = millis();
    buttonBefore = true;
    //bullshit = true;
  }
// При отжатии кнопки обнуляем высоту
  if (bullshit && buttonBefore && digitalRead(buttonZero) && ((timeBut1 + 100) <= millis()) && (mode == 'w')) {
    height = 0;
    buttonBefore = false;
  }
// При отжатии кнопки спустя время устанавливаем флаг в 1
  if (buttonBefore && digitalRead(buttonZero) && ((timeBut1 + 100) <= millis()) && (mode == 'w')) {
    bullshit = true;
    buttonBefore = false;
  }

}



// функция установки времени
void setTime() {
  short hh = dt.hour(); // переменные для регулирования времени
  static bool buttonZeroBefore = false; 
  // устанавливаем в ложь предыдущее положение кнопки
  if (digitalRead(buttonZero)) {
    buttonZeroBefore = false;
  }

  // при нажатии кнопки отсчитываем время
  if (!digitalRead(buttonZero) && !buttonZeroBefore && (mode == 'w')) {
    timeBut = millis();
    buttonZeroBefore = true;
  }

  /*if (buttonZeroBefore && digitalRead(buttonZero) && ((timeBut + 100) >= millis()) && (mode == 'w')) {
    height = 0;
  }*/
  
  // через 5 секунд включаем режим настройки часов
  if (buttonZeroBefore && (!digitalRead(buttonZero)) && ((timeBut + 5000) <= millis()) && (mode == 'w')) {  
    mode = 'h';
    tft.fillRect(240,219,27,16,ILI9341_BLUE);
    drawTime();
    }
  
  static bool deblockPumpBefore = false;  // предыдущее положение кнопки
  
  // если кнопка ненажата
  if ((mode == 'h') && digitalRead(deblockPump)) {
    deblockPumpBefore = false;
    bullshit = false;
  }
  // если нажимаем кнопку, начинаем отсчёт времени
  if (!digitalRead(deblockPump) && !deblockPumpBefore && (mode == 'h')) {
    timeBut = millis();
    deblockPumpBefore = true;
    bullshit = false;
    
  }
  // устраняем дребезг контактов
  if (deblockPumpBefore && !digitalRead(deblockPump) && ((timeBut + 100) <= millis()) && (mode == 'h')) {
    hh = (dt.hour() < 23) ? ++hh : 0;
    RTC.adjust(DateTime(2014, 1, 21, hh, mm, 0));
    deblockPumpBefore = false;  // Чтобы только на один час!
    tft.fillRect(240,219,27,16,ILI9341_BLUE);
    drawTime();
  }
  static bool mins = false;
  // включаем режим настройки минут
   if (!digitalRead(buttonZero) && !buttonZeroBefore && (mode == 'h')) {
    timeBut = millis();
    buttonZeroBefore = true;
    mins = true;
  }

  // устраняем дребезг контактов
  if ((mins == true) && buttonZeroBefore && (!digitalRead(buttonZero)) && ((timeBut + 100) <= millis()) && (mode == 'h')) {  
    mode = 'm';
    tft.fillRect(240,219,27,16,ILI9341_BLACK);
    tft.fillRect(275,219,27,16,ILI9341_BLUE);
    drawTime();
    mins = false;
    }

     if ((mode == 'm') && digitalRead(deblockPump)) {
    deblockPumpBefore = false;
  }
  // если нажимаем кнопку, начинаем отсчёт времени
  if (!digitalRead(deblockPump) && !deblockPumpBefore && (mode == 'm')) {
    timeBut = millis();
    deblockPumpBefore = true;
    
  }
  // устраняем дребезг контактов
  if (deblockPumpBefore && !digitalRead(deblockPump) && ((timeBut + 100) <= millis()) && (mode == 'm')) {
    mm = (dt.minute() < 59) ? ++mm : 0;
    RTC.adjust(DateTime(2014, 1, 21, hh, mm, 0));
    //deblockPumpBefore = false;  // Чтобы только на один час!
    tft.fillRect(275,219,27,16,ILI9341_BLUE);
    drawTime();
    timeBut = millis();
  }

  // если удерживаем
  if (deblockPumpBefore && !digitalRead(deblockPump) && ((timeBut + 2000) <= millis()) && (mode == 'm')) {
    if ((millis() % 1000) == 0) {
      mm = (dt.minute() < 50) ? (mm + 10) : 0;
    }
  }


// включаем режим настройки минут
   if (!digitalRead(buttonZero) && !buttonZeroBefore && (mode == 'm')) {
    timeBut = millis();
    buttonZeroBefore = true;
    mins = true;
  }

  // устраняем дребезг контактов
  if ((mins == true) && buttonZeroBefore && (!digitalRead(buttonZero)) && ((timeBut + 100) <= millis()) && (mode == 'm')) {  
    mode = 'w';
    tft.fillRect(240,219,27,16,ILI9341_BLACK);
    tft.fillRect(275,219,27,16,ILI9341_BLACK);
    drawTime();
    mins = false;
    }


  
}


// Очищение экрана
void drawSetup() {
  tft.fillScreen(ILI9341_BLACK);
  // Рисуем таблицу
  tft.drawLine(170,0,170,185, ILI9341_YELLOW);
  tft.drawLine(0,30,319,30, ILI9341_YELLOW);
  tft.drawLine(0,61,319,61, ILI9341_YELLOW);
  tft.drawLine(0,92,319,92, ILI9341_YELLOW);
  tft.drawLine(0,123,319,123, ILI9341_YELLOW);
  tft.drawLine(0,154,319,154, ILI9341_YELLOW);
  tft.drawLine(0,185,319,185, ILI9341_YELLOW);
  tft.setTextSize(3);               // Определяем размер шрифта для вывода на дисплей
 
  tft.setTextColor(ILI9341_YELLOW);  // Определяем цвет текста для вывода на экран
  tft.setCursor(5,5);            // Определяем координаты верхнего левого угла области вывода
  tft.print(utf8rus("ВЫСОТА"));
  tft.setCursor(5,36);
  tft.print(utf8rus("СКОРОСТЬ"));
  tft.setCursor(5,67);
  tft.print(utf8rus("ШАР.КРАН"));
  tft.setCursor(5,98);
  tft.print(utf8rus("БУР.НАСОС"));
  tft.setCursor(5,129);
  tft.print(utf8rus("ЛЕБЕДКА"));
  tft.setCursor(5,160);
  tft.print(utf8rus("ШТРОПА"));
  drawHeight();
  tft.setCursor(5,191);
  tft.print(utf8rus("СТРОКА 7"));
  /*tft.setCursor(175,5);            // Определяем координаты верхнего левого угла области вывода
  tft.print(sizeof(long));*/
  tft.setCursor(5,36);
  tft.setCursor(160,220);
  tft.setTextSize(2);
  tft.print(utf8rus("Время: "));
  dt = RTC.now();
  drawTime();
  /*if (dt.hour() < 10)  tft.print(utf8rus("0"));
  tft.print(dt.hour(), DEC);
  tft.print(":");
  if (dt.minute() < 10)  tft.print(utf8rus("0"));
  tft.print(dt.minute(), DEC);*/
}

О блин, получилось :grinning:

IQ у меня -2.
Так норм?

К сожалению в телефоне нет функций ctrl+v ctrl+c

Открываем шампанское!:partying_face:
Скоро будет приход…основного стёба) Помни! Веди себя достойно и, не ровен час, тебе таки помогут.