/* **********************************************************************************************************************************************************
V1.00 - первый релиз от 24.07.2025
- замер разгона работает в тестовом режиме, т.к. показания могут быть некорректными
- парктроник в домашних условиях работает нормально, нужны тесты в реальных условиях
- датчик скорости также проверен только в домашних условиях. Нужно подтверждение нормальной работы на автомобиле
- странный "глюк" с неправильным отображением текущего года при использовании GPS модуля. Фиксится при помощи настройки в меню "Коррекция года GPS"
- вероятнее всего есть и другие косяки (а они точно есть), поэтому жду обратной связи
V1.01 - обновление от 16.08.2025
- исправлена работа замера разгона (нужны ваши отзывы о корректной работе)
- небольшая доработка алгоритма работы "сдвига автояркости"
- логотип авто теперь можно включать/выключать независимо от настроек экрана приветствия
- при выключении с активированной настройкой автосохранения одометра (при использовании реле задержки) автоматически будет сохраняться текущее кол-во импульсов
с датчика скорости, чтобы при новом включении не "потерялись" промежуточные импульсы между учетными каждыми 100 метрами пути.
Иными словами теперь одометр будет считать пройденное расстояние более корректно. Ни один импульс с датчика скорости не потеряется
- небольшие изменения в меню, касающиеся реле задержки:
в пункте меню "Настройки LPG" добавлен отдельный подпункт "Реле задержки", который нужно активировать, если у вас в схеме есть такое реле. Ранее это было совмещено
в одной настройке ("Спидометр" - "Сохранять одометр"). Строго говоря, при наличии в схеме реле задержки и датчика скорости, а также при активированных
одноименных подпунктах меню "Реле задержки" и "Датчик скорости", одометр будет сохраняться во внутренней памяти и без активации подпункта "Сохранять одометр",
однако без его активации не будут учитываться "промежуточные" импульсы с датчика скорости, которые важны для ТОЧНОГО измерения пройденного расстояния
- усовершенствован параметр меню "Коррекция скорости". Теперь наглядно видно, на сколько будет корректироваться итоговая скорость.
Корректировка делается так: разгоняемся до 50 км/ч по GPS (или какому-то другому проверенному источнику скорости). Если наше устройство показывает, к примеру - 45 км/ч,
тогда параметр "Коррекция скорости" изменяем до тех пор, пока не увидим на экране нужную нам разницу "+5 км/ч"
- в инстукции обновлены: экран с обозначением кнопок (управление), а также схема подключения датчика расстояния (парктроник)
- пункт меню "Реле" переименован в "Реле вентилятора" для большей конкретики
- задействован пин D4 (подключение к электромагнитному клапану газового редуктора). Обновлен скетч + схема подключения в файле Manual.xlsx
- исправлена проблема с отображением актуального значения литража газа на дисплее при новом включении устройства во время прогрева редуктора (только при наличии реле задержки),
а также при переходе с газа на бензин во время езды (это работает и без реле задержки). Теперь литраж может рассчитываться только по сигналу электромагнитного
клапана редуктора, т.е только когда авто работает на газе. В остальное время литраж не рассчитывается, а просто отображается последнее актуальное значение
********************************************************************************************************************************************************** */
#include <Arduino.h> // Подключаемые библиотеки для корректной работы модуля
#include <GyverOLED.h> // Все эти библиотеки должны быть установлены в программе ArduinoIDE в разделе "Управление библиотеками"
#include <EEManager.h>
#include <EncButton.h>
#include <GyverDS3231.h>
#include <GyverINA.h>
#include <GyverDS18.h>
#include <BH1750FVI.h>
//#include <iarduino_GPS_NMEA.h> // ДАННАЯ БИБЛИОТЕКА НЕ РАБОТАЕТ В СИМУЛЯТОРЕ, ПОЭТОМУ ОНА ОКЛЮЧЕНА
#include <Tachometer.h>
#include <NewPing.h>
#include <toneAC.h>
//__________________________________________НАСТРОЙКИ БИБЛИОТЕКИ EncButton.h_________________________________________________________________________________
#define EB_DEB_TIME 50 // таймаут гашения дребезга кнопки (кнопка)
#define EB_CLICK_TIME 500 // таймаут ожидания кликов (кнопка)
#define EB_HOLD_TIME 500 // таймаут удержания (кнопка)
#define EB_STEP_TIME 200 // таймаут импульсного удержания (кнопка)
#define EB_FAST_TIME 30 // таймаут быстрого поворота (энкодер) - в текущей версии ПО энкодер не используется
#define EB_TOUT_TIME 1000 // таймаут действия (кнопка и энкодер) - в текущей версии ПО энкодер не используется
//__________________________________________ПИНЫ_____________________________________________________________________________________________________________
#define SIGNAL_PIN 31 // пин сигнального напряжения от замка зажигания (D31). !!! НЕ БОЛЕЕ 5В !!!
#define TACH_PIN 3 // пин датчика скорости (D3) / желательна внешняя подтяжка резистором 4.7K к VCC/. !!! НЕ БОЛЕЕ 5В !!!
#define RELAY_PIN 30 // пин подключения реле для управления вентилятором охлаждения (D30)
#define HC_TRIG 29 // Пин Trig сонара (D29)
#define HC_ECHO 28 // Пин Echo сонара (D28)
#define RED_PIN 45 // Пин RGB-светодиода - RED (D45)
#define GREEN_PIN 44 // Пин RGB-светодиода - GREEN (D44)
#define BLUE_PIN 46 // Пин RGB-светодиода - BLUE (D46)
#define SONAR_PIN 27 // Пин лампы заднего хода (D27). !!! НЕ БОЛЕЕ 5В !!!
#define VALVE_LPG 4 // Пин сигнального напряжения клапана LPG (D4). !!! НЕ БОЛЕЕ 5В !!!
Button joy_M(50); // Джойстик. Кнопка "M", нажатие по центру (D50)
Button joy_L(48); // Джойстик. Кнопка "L", влево (D48)
Button joy_R(2); // Джойстик. Кнопка "R", вправо (D2)
Button joy_F(49); // Джойстик. Кнопка "F", вверх (D49)
Button joy_B(51); // Джойстик. Кнопка "B", вниз (D51)
uint8_t sensorPin = 3; // АНАЛОГОВЫЙ пин для расчета напряжения датчика (цифра соответствует № АНАЛОГОВОГО пина. 3 - это пин А3). !!! НЕ БОЛЕЕ 5В !!!
uint8_t batteryPin = 0; // АНАЛОГОВЫЙ пин для расчета напряжения АКБ (А0). !!! НЕ БОЛЕЕ 5В !!!
GyverDS18Single ds(5); // ЦИФРОВОЙ пин датчика температуры 1 (D5). Сигнальный пин датчика должен быть подтянут к питанию резистором 4.7 кОм
GyverDS18Single ds2(6); // ЦИФРОВОЙ пин датчика температуры 2 (D6). Сигнальный пин датчика должен быть подтянут к питанию резистором 4.7 кОм
GyverDS18Single ds3(7); // ЦИФРОВОЙ пин датчика температуры 3 (D7). Сигнальный пин датчика должен быть подтянут к питанию резистором 4.7 кОм
GyverDS18Single ds4(24); // ЦИФРОВОЙ пин датчика температуры 4 (D24). Сигнальный пин датчика должен быть подтянут к питанию резистором 4.7 кОм
GyverDS18Single ds5(25); // ЦИФРОВОЙ пин датчика температуры 5 (D25). Сигнальный пин датчика должен быть подтянут к питанию резистором 4.7 кОм
//___________________________________________________________________________________________________________________________________________________________
#define END_LINE_X 63 // Конечные координаты стрелки указателя уровня газа (X)
#define END_LINE_Y 46 // Конечные координаты стрелки указателя уровня газа (Y)
#define START_MENU_PARAM 8 // С какого пикселя по оси X писать названия параметров в меню
#define START_MENU_HEADER 2 // С какого пикселя по оси X писать имя шапки menu header
#define STRING_MENU_VALUE 6 // Порядковый номер пункта меню, где собраны "строчные" параметры
#define MANUAL_MENU_VALUE 13 // Порядковый номер пункта меню "Manual"
#define SCR_OPT 10 // Кол-во вариантов показателей для мини-скрина (не считая пустого варианта)
#define SW_VERSION 1.02 // Версия ПО устройства. Буду стараться периодически обновлять и улучшать код, поэтому рекомендую время от времени проверять наличие новых версий ПО на Github
const uint8_t ITEMS = 13; // кол-во основных пунктов меню
const uint8_t ITEMS1 = 12; // кол-во пунктов меню "LPG settings" (с учетом back)
const uint8_t ITEMS2 = 19; // кол-во пунктов меню "Inteface" (с учетом back)
const uint8_t ITEMS3 = 12; // кол-во пунктов меню "Featured Screens" (с учетом back)
const uint8_t ITEMS4 = 11; // кол-во пунктов меню "Display brightness" (с учетом back)
const uint8_t ITEMS5 = 10; // кол-во пунктов меню "Date / time" (с учетом back)
const uint8_t ITEMS6 = 7; // кол-во пунктов меню "My titles" (с учетом back)
const uint8_t ITEMS7 = 13; // кол-во пунктов меню "Speedometer" (с учетом back)
const uint8_t ITEMS8 = 5; // кол-во пунктов меню "Sound" (с учетом back)
const uint8_t ITEMS9 = 6; // кол-во пунктов меню "Change" (с учетом back)
const uint8_t ITEMS10 = 5; // кол-во пунктов меню "Relay" (с учетом back)
const uint8_t ITEMS11 = 3; // кол-во пунктов меню "Parking" (с учетом back)
const uint8_t ITEMS12 = 3; // кол-во пунктов меню "Service" (с учетом back)
const uint8_t ITEMS13 = 18; // кол-во пунктов меню "Manual" (с учетом back)
const uint8_t ITEMSSYMBOLNAME = 10; // кол-во символов для вашего имени (data.myName)
const uint8_t ITEMSSYMBOLTEMP1 = 10; // кол-во символов для первого датчика температуры
const uint8_t ITEMSSYMBOLTEMP2 = 10; // кол-во символов для второго датчика температуры
const uint8_t ITEMSSYMBOLTEMP3 = 10; // кол-во символов для третьего датчика температуры
const uint8_t ITEMSSYMBOLTEMP4 = 10; // кол-во символов для четвертого датчика температуры
const uint8_t ITEMSSYMBOLTEMP5 = 10; // кол-во символов для пятого датчика температуры
uint8_t deep = 0; // Счетчик вложенности меню
uint8_t pointerP1 = 0; // Курсор основного меню
uint8_t pointerP2 = 0; // Курсор вложенного меню
uint8_t pointerP3 = 0; // Курсор на странице с редактируемой строкой / информацией
// Строка с выбором символа для своего имени и датчиков t
String symbols = " AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz0123456789-+*_#@&:\|/яЯюЮэЭьЬыЫъЪщЩшШчЧцЦхХфФуУтТсСрРпПоОнНмМлЛкКйЙиИзЗжЖеЕдДгГвВбБаА";
//__________________________________________ОБЪЕКТЫ__________________________________________________________________________________________________________
BH1750FVI LightSensor(BH1750FVI::k_DevModeContLowRes); // Датчик освещенности
GyverDS3231 rtc; // Модуль часов реального времени
INA226 ina; // Модуль, который точно замеряет напряжение на датчике уровня газа (INA226)
INA226 ina2(0x41); // Модуль, который точно замеряет напряжение АКБ (INA226). На обратной стороне модуля необходимо запаять (замкнуть) выводы VCC и A0
//iarduino_GPS_NMEA gps; // Модуль GPS
Tachometer tacho; // Датчик скорости автомобиля
NewPing sonar(HC_TRIG, HC_ECHO, 400); // Датчик расстояния (парктроник)
// _________________________________________ВЫБИРАЕМ ДИСПЛЕЙ (раскомментировать нужный вид дисплея)__________________________________________________________
GyverOLED<SSD1306_128x64, OLED_BUFFER> oled; // oled дисплей SSD1306 (бывают и 0,96", и 1,3") - с буфером
//GyverOLED<SSH1106_128x64> oled; // oled дисплей SH1106 - только программный буфер (обычно 1,3")
//___________________________________________________________________________________________________________________________________________________________
// $$
// $$ $$ $$$$ $$$$ $$$$$$ $$$$$ $$$$ $$ $$ $$ $$ $$ $$
// $$ $$ $$ $$ $$ $$ $$ $$ $$ $$ $$ $$ $$ $$ $$ $$ $$
// $$$$$$ $$$$$$ $$ $$ $$$$$$ $$ $$ $$ $$$ $$$$ $$ $$$
// $$ $$ $$ $$ $$ $$ $$ $$ $$ $$ $$$ $$ $$ $$ $$$ $$
// $$ $$ $$ $$ $$$$ $$ $$ $$$$ $$ $$ $$ $$ $$ $$
//
//
// !!! ВО ВСЕХ ДРОБНЫХ ЧИСЛОВЫХ ЗНАЧЕНИЯХ ИСПОЛЬЗУЙТЕ ТОЧКУ(.) А НЕ ЗАПЯТУЮ(,) !!!
//
#define R1 47000.0 // Сопротивление резистора 1 // Рассчитывайте резисторы с запасом, даже чтобы при большем (чем обычно) напряжении акб
#define R2 23300.0 // Сопротивление резистора 2 // на аналоговый пин не пошло напряжение более 5 вольт!!! К примеру я выбрал макс. напряжение акб = 15 вольт.
// Рассчитать можно здесь: https://cxem.net/calc/divider_calc.php
#define GPS_UART 115200 // Скорость шины UART в зависимости от настроек GPS модуля. Смотреть в программе u-center на компьютере. Обычно по-умолчанию - 9600, но может и отличаться. Можно настроить самому в программе u-center
//__________________________________________ОСНОВНЫЕ НАСТРОЙКИ, КОТОРЫЕ ДУБЛИРУЮТСЯ В МЕНЮ УСТРОЙСТВА________________________________________________________
struct Data {
float a = 0.870; // Минимальное напряжение на датчике - пустой бак (0.000 - 12.000 с шагом 0.001)
float b = 4.730; // Максимальное напряжение на датчике - полный бак (0.000 - 12.000 с шагом 0.001)
float c = 34.0; // Объем газового баллона в литрах (0 - 150 с шагом 0.5)
float d = 10.5; // Средний расход газа на 100км (для расчета запаса хода) (0 - 25 с шагом 0.1)
uint16_t e = 6000; // Частота опроса датчика напряжения в миллисекундах (6000 = один опрос в 6 сек) (200 - 60000)
uint8_t f = 10; // Яркость дисплея при включении (0 - мин, 255 - макс). При значении 0 дисплей может быть выключен (в зависимости от модели oled-дисплея)
uint8_t bright = 25; // На сколько единиц увеличить яркость при нажатии кнопки UP (от 1 до 255)
bool g = 1; // Приветствие при включении (1 - показывать, 0 - не показывать)
bool h = 1; // Тип датчика газа. 1 - трехконтактный (измерение напряжения). 0 - двухконтактный (измерение сопротивления)
bool battVoltSource = 1; // Источник напряжения АКБ авто (0 - стандартный замер аналоговым пином, 1 - INA226 /более предпочтительный вариант/)
bool relayType = 1; // Тип реле для включения вентилятора охлаждения (1 - low level, 0 - high level)
uint8_t tempSensorForRelay = 0; // Указать какой датчик t использовать для включения вентилятора охлаждения (0 - не использовать, 1...5 - датчики температуры)
uint8_t relayTempOn = 100; // Температура, при которой будет срабатывать реле вентилятора (50 - 130)
uint8_t relayTempOff = 90; // Температура, при которой будет отключаться реле вентилятора (45 - 125)
bool saveLiters = 0; // Сохранять текущий литраж газа в EEPROM при выключении зажигания. Работает только с реле задержки (1 - вкл, 0 - выкл)
bool valveSignal = 0; // Подключение к электромагнитному клапану газового редуктора (1 - вкл, 0 - выкл)
bool delayRelay = 0; // Реле задержки выключения устройства (1 - вкл, 0 - выкл)
bool j = 1; // Флаг отображения оставшегося километража (1 - вкл, 0 - выкл)
bool k = 1; // Флаг отображения напряжения акб (1 - вкл, 0 - выкл)
bool l = 1; // Флаг отображения температуры (1 - вкл, 0 - выкл)
bool m = 1; // Флаг отображения времени (1 - вкл, 0 - выкл)
bool n = 1; // Флаг отображения даты (1 - вкл, 0 - выкл)
int8_t timeZone = 3; // Часовой пояс для часов модуля GPS (-12 ... 12)
bool p = 1; // Флаг отображения графического уровня газа (1 - вкл, 0 - выкл)
uint8_t q = 16; // Размер (ширина) графического уровня газа (1 - 29 с шагом 1)
bool r = 1; // Флаг отображения верхней горизонтальной линии (1 - вкл, 0 - выкл)
bool s = 1; // Флаг отображения нижней горизонтальной линии (1 - вкл, 0 - выкл)
uint16_t t = 2025; // Установка текущего года (2025 - 2100)
uint8_t u = 1; // Установка текущего месяца (1 - 12)
uint8_t v = 1; // Установка текущего дня месяца (1 - 31)
uint8_t w = 1; // Установка текущего времени - часы (0 - 23)
uint8_t x = 1; // Установка текущего времени - минуты (0 - 59)
bool y = 0; // Записать новое время в память устройства (0 - не записывать, 1 - записать в память) /здесь не менять - оставить 0/
bool dateSource = 1; // Источник, откуда будут браться дата/время (1 - DS3231, 0 - GPS NEO)
bool yearCorrect = 1; // Использовать ручную коррекцию текущего года для GPS данных (1 - вкл, 0 - выкл)
float vref = 5.00; // точное напряжение на пине 5V (4.00 - 6.00) /желательно замерить и указать, если замер напряжения АКБ делается при помощи аналогового пина, т.к. от реального источника питания до пина могут быть потери/
bool rect = 1; // Тип отображения прямоугольников на одном из скринов устройства (1 - заливка, 0 - обводка)
bool rectOnOff = 1; // Только для дисплея с белыми прямоугольниками! (1 - оставлять прямоугольники при отключении параметра, 0 - убирать прямоугольники вместе с параметрами)
bool screen1 = 1; // Избранный скрин 1 (1 - вкл, 0 - выкл)
bool screen2 = 1; // Избранный скрин 2 (1 - вкл, 0 - выкл)
bool screen3 = 1; // Избранный скрин 3 (1 - вкл, 0 - выкл)
bool screen4 = 1; // Избранный скрин 4 (1 - вкл, 0 - выкл)
bool screen5 = 1; // Избранный скрин 5 (1 - вкл, 0 - выкл)
bool screen6 = 1; // Избранный скрин 6 (1 - вкл, 0 - выкл)
bool screen7 = 1; // Избранный скрин 7 (1 - вкл, 0 - выкл)
bool screen8 = 1; // Избранный скрин 8 (1 - вкл, 0 - выкл)
bool screen9 = 1; // Избранный скрин 9 (1 - вкл, 0 - выкл)
bool screen10 = 1; // Избранный скрин 10 (1 - вкл, 0 - выкл)
uint8_t scr1 = 0; // Первый параметр для скрина с выбором параметров отображения
uint8_t scr2 = 0; // Второй параметр для скрина с выбором параметров отображения
uint8_t scr3 = 0; // Третий параметр для скрина с выбором параметров отображения
uint8_t scr4 = 0; // Четвертый параметр для скрина с выбором параметров отображения
bool screenNum = 0; // Отображать на дисплее номер активного скрина в виде цифры (1 - вкл, 0 - выкл)
bool autoBrightness = 0; // Автояркость дисплея (1 - вкл, 0 - выкл)
uint8_t minBright = 10; // Минимальная яркость дисплея для автояркости (1 - 200)
uint8_t maxBright = 235; // Максимальная яркость дисплея для автояркости (50 - 255)
int8_t brightIntens = 0; // Смещение уровня яркости дисплея в режиме автояркости (от -15 до 15 с шагом 1)
uint8_t brightTimeout = 2; // Скорость отклика работы автояркости дисплея (1 - медленная, 2 - стандартная, 3 - быстрая)
bool brightBoost = 0; // Разрешить увеличивать/уменьшать автояркость дисплея свыше/ниже лимита на 10%, при очень ярком/тусклом освещении (1 - вкл, 0 - выкл)
uint16_t luxLimit = 500; // Максимальное значение яркости в салоне вашего авто (замерять при максимально ярких условиях погоды и прямых солнечных лучах). От 1 до 65535.
bool luxDisplay = 0; // Отображать значение Lux с датчика освещенности на дисплее (1 - вкл, 0 - выкл)
bool lang = 1; // Язык вашего имени на заставке. 1 - латиница. 0 - кириллица. !!! ВАЖНО для правильного центрирования на дисплее !!! (вероятнее всего для данной версии ПО уже не актуально, но пока оставлю на всякий случай)
bool langTemp1 = 1; // Язык названия датчика температуры №1 (1 - латиница. 0 - кириллица). !!! ВАЖНО для правильного центрирования на дисплее !!! (вероятнее всего для данной версии ПО уже не актуально, но пока оставлю на всякий случай)
bool langTemp2 = 1; // Язык названия датчика температуры №2 (1 - латиница. 0 - кириллица). !!! ВАЖНО для правильного центрирования на дисплее !!! (вероятнее всего для данной версии ПО уже не актуально, но пока оставлю на всякий случай)
bool langTemp3 = 1; // Язык названия датчика температуры №3 (1 - латиница. 0 - кириллица). !!! ВАЖНО для правильного центрирования на дисплее !!! (вероятнее всего для данной версии ПО уже не актуально, но пока оставлю на всякий случай)
bool langTemp4 = 1; // Язык названия датчика температуры №4 (1 - латиница. 0 - кириллица). !!! ВАЖНО для правильного центрирования на дисплее !!! (вероятнее всего для данной версии ПО уже не актуально, но пока оставлю на всякий случай)
bool langTemp5 = 1; // Язык названия датчика температуры №5 (1 - латиница. 0 - кириллица). !!! ВАЖНО для правильного центрирования на дисплее !!! (вероятнее всего для данной версии ПО уже не актуально, но пока оставлю на всякий случай)
bool logo = 1; // Логотип авто при загрузке (1 - вкл, 0 - выкл). Если у вас отключена опция показа заставки при включении (data.g = 0), тогда независимо от настроек логотип показываться НЕ БУДЕТ!
uint8_t speedLimit1 = 50; // Первый ограничитель скорости (10 - 250)
uint8_t speedLimit2 = 70; // Второй ограничитель скорости (10 - 250)
uint8_t speedLimit3 = 110; // Третий ограничитель скорости (10 - 250)
bool sensorSpeed = 0; // Использовать или нет датчик скорости авто для обновления одометра (1 - использовать, 0 - нет)
uint8_t sensorPulseNum = 6; // Количество импульсов вашего датчика скорости (импульсов на 1 оборот) /от 2 - до 64/
uint16_t gpsSpeedUpd = 2000; // Частота обновления скорости GPS-спидометра на дисплее (500 - 60000 мс). При значении 1500 и менее отклик кнопок будет хуже.
bool odometerOnOff = 0; // Сохранять в EEPROM показания одометра при отключении питания (1 - вкл, 0 - выкл). Работать будет только при подключении через реле задержки.
float odometer = 0; // Общий пробег авто (0 - 999999)
bool odometer2Reset = 0; // Обнуление сбрасываемого одометра (0 - не обнулять, 1 - обнулить)
uint8_t speedLimitWarning = 3; // Варианты предупреждения о превышении скорости (0 - все откл, 1 - только свет, 2 - только звук, 3 - все вкл)
uint8_t rightOfEntrance = 10; // На сколько км/ч допускается превысить лимит скорости (0 - 100)
uint8_t speedCorrection = 100; // Коррекция скорости от датчика скорости (1 - 200). 100 - БЕЗ корректировки. Чем больше значение, тем меньше скорость и медленнее считается километраж.
uint32_t change1 = 0; // Следующая замена расходника №1, км (0 - 999500)
uint32_t change2 = 0; // Следующая замена расходника №2, км (0 - 999500)
uint32_t change3 = 0; // Следующая замена расходника №3, км (0 - 999500)
uint32_t change4 = 0; // Следующая замена расходника №4, км (0 - 999500)
uint32_t change5 = 0; // Следующая замена расходника №5, км (0 - 999500)
uint8_t melodyStart = 1; // Мелодия включения (её порядковый номер) /от 1 до 10, 0 - без мелодии/
bool btnSound = 1; // Звук при нажатии кнопок (1 - вкл, 0 - выкл)
bool warningSound = 1; // Звук различных предупреждений (1 - вкл, 0 - выкл)
uint8_t volumeSound = 3; // Громкость звуковых эффектов, кроме парктроника (от 0 до 10)
bool parktronic = 0; // Использовать или нет парктроник (1 - вкл, 0 - выкл)
uint8_t parktronicTempSens = 0; // Выбрать датчик температуры для более точных показаний парктроника (0 - без датчика t, 1 ... 5 - датчики t) /датчик должен измерять t на улице/
uint8_t langInterface = 1; // Язык интерфейса (1 - рус, 2 - укр, 3 - eng)
bool z = 0; // СБРОС ДО ЗАВОДСКИХ НАСТРОЕК. НИ В КОЕМ СЛУЧАЕ НЕ МЕНЯТЬ ЗДЕСЬ!!! ТОЛЬКО ЧЕРЕЗ МЕНЮ УСТРОЙСТВА!!!
//________________________________________НАСТРОЙКИ, КОТОРЫЕ ХРАНЯТСЯ В ПАМЯТИ, НО В МЕНЮ УСТРОЙСТВА НЕ ОТОБРАЖАЮТСЯ_______________________________________
uint8_t i = 1; // Вид отображения информации на дисплее (скрин). По умолчанию - 1. Меняется на устройстве
uint8_t spdLimArrCount = 0; // Счетчик активного ограничителя скорости
uint8_t miniScrSpdMode = 1; // Откуда брать данные скорости на мини-скрине (1 - датчик скорости, 0 - GPS) ***В настройках не отображается, переключается прямо на главном экране***
float odometer2 = 0; // Сбрасываемый одометр
float lpgLiters = 0; // Сохраняемое значение литража газа (при соответствующей настройке, при включении будет показывать данное значение литража вместо стандартного значения)
int counterSpdSens = 0; // Тут будет сохраняться кол-во импульсов с датчика скорости при выключении зажигания, чтобы показания одометра были всегда корректными
uint8_t counter2 = 0; // Номер ячейки активного избранного скрина в массиве избранных
uint8_t myName1 = 3; // переменные, которые хранят индекс символов в "Вашем имени" (т.е. в myName)
uint8_t myName2 = 29;
uint8_t myName3 = 37;
uint8_t myName4 = 37;
uint8_t myName5 = 0;
uint8_t myName6 = 0;
uint8_t myName7 = 0;
uint8_t myName8 = 0;
uint8_t myName9 = 0;
uint8_t myName10 = 0;
uint8_t tempA1 = 39; // переменные, которые хранят индекс символов в названии первого датчика температуры
uint8_t tempA2 = 10;
uint8_t tempA3 = 26;
uint8_t tempA4 = 32;
uint8_t tempA5 = 66;
uint8_t tempA6 = 54;
uint8_t tempA7 = 0;
uint8_t tempA8 = 0;
uint8_t tempA9 = 0;
uint8_t tempA10 = 0;
uint8_t tempB1 = 39; // переменные, которые хранят индекс символов в названии второго датчика температуры
uint8_t tempB2 = 10;
uint8_t tempB3 = 26;
uint8_t tempB4 = 32;
uint8_t tempB5 = 66;
uint8_t tempB6 = 55;
uint8_t tempB7 = 0;
uint8_t tempB8 = 0;
uint8_t tempB9 = 0;
uint8_t tempB10 = 0;
uint8_t tempC1 = 39; // переменные, которые хранят индекс символов в названии третьего датчика температуры
uint8_t tempC2 = 10;
uint8_t tempC3 = 26;
uint8_t tempC4 = 32;
uint8_t tempC5 = 66;
uint8_t tempC6 = 56;
uint8_t tempC7 = 0;
uint8_t tempC8 = 0;
uint8_t tempC9 = 0;
uint8_t tempC10 = 0;
uint8_t tempD1 = 39; // переменные, которые хранят индекс символов в названии четвертого датчика температуры
uint8_t tempD2 = 10;
uint8_t tempD3 = 26;
uint8_t tempD4 = 32;
uint8_t tempD5 = 66;
uint8_t tempD6 = 57;
uint8_t tempD7 = 0;
uint8_t tempD8 = 0;
uint8_t tempD9 = 0;
uint8_t tempD10 = 0;
uint8_t tempE1 = 39; // переменные, которые хранят индекс символов в названии пятого датчика температуры
uint8_t tempE2 = 10;
uint8_t tempE3 = 26;
uint8_t tempE4 = 32;
uint8_t tempE5 = 66;
uint8_t tempE6 = 58;
uint8_t tempE7 = 0;
uint8_t tempE8 = 0;
uint8_t tempE9 = 0;
uint8_t tempE10 = 0;
};
//___________________________________________________________________________________________________________________________________________________________
Data data; // переменная структуры меню, с которой мы работаем в программе
EEManager memory(data, 2000); // Переменная объекта EEManager. Вторым аргументом можно задать таймаут обновления (2000). Если не указывать, то по умолч. 5 сек (5000мс)
//__________________________________________ФЛАГИ____________________________________________________________________________________________________________
bool flagIcon = false; // Флаг иконки газовой колонки
bool flagBright = false; // Флаг графического уровня яркости дисплея
bool flagBrightTime = false; // Флаг таймера для отображения уровня яркости дисплея
bool flagAutoBright = false; // Флаг графики режима автояркости
bool ScreenNumber = false; // Флаг номера активного скрина
bool flagDisplay = false; // Флаг вкл/откл дисплея на главном экране по нажатию кнопки OK или кнопки энкодера
bool flagBrightMode = false; // Флаг режима работы яркости
bool flagSettingReset = false; // Флаг сброса настроек по умолчанию
bool flagSettingUpd = false; // Флаг обновления настроек в EEPROM
bool relayFlag = false; // Флаг реле вентилятора
bool changeFlag = false; // Флаг расходников
bool changeRemindFlag = false; // Флаг напоминания про расходники
bool resetOdoFlag = false; // Флаг сброса одометра 2
bool speedLimitFlag = false; // Флаг лимита скорости
bool rgbFlag = false; // Флаг RGB-светодиода (отключается пользователем)
bool rgbFlagAlt = false; // Флаг RGB-светодиода для подтверждения каких-либо действий (отключается автоматически)
//__________________________________________МАССИВЫ ДАННЫХ___________________________________________________________________________________________________
const uint8_t numReadings = 20; // задаем размер основного массива датчика уровня газа (чем больше - тем лучше, но и нагрузка на ардуино больше. 20 - оптимально)
uint16_t readings[numReadings]; // основной массив для хранения значений, полученных с INA226
uint8_t readIndex = 0; // индекс последнего значения датчика уровня газа в основном массиве
uint32_t total = 0; // сумма значений вольтажа с датчика уровня газа в основном массива
const uint8_t firstNumReadings = 20; // задаем размер предварительного массива датчика уровня газа
uint16_t firstReadings[firstNumReadings]; // предварительный массив для хранения значений полученных с INA226
uint8_t firstReadIndex = 0; // индекс последнего значения датчика уровня газа для предварительного массива
uint32_t firstTotal = 0; // сумма значений вольтажа с датчика уровня газа для предварительного массива
const uint8_t numReadBatt = 10; // задаем размер массива вольтажа АКБ (10 - более чем достаточно для стабильных показаний)
uint16_t readBatt[numReadBatt]; // массив для хранения значений вольтажа АКБ
uint8_t readIndexBatt = 0; // индекс последнего значения вольтажа АКБ
uint16_t totalBatt = 0; // сумма значений вольтажа АКБ
uint16_t average = 0; // среднее предварительное значение вольтажа с датчика уровня газа
const uint8_t numLuxArray = 20; // размер массива значений с датчика освещенности
uint16_t luxArray[numLuxArray]; // сам массив значений с датчика освещенности
uint8_t readIndexLux = 0; // индекс последнего значения датчика освещенности в массиве
uint32_t totalLux = 0; // сумма всех значений массива
uint8_t speedLimitArr[4]; // Массив, в котором хранятся значения ограничителей скорости
//___________________________________________________________________________________________________________________________________________________________
String weekday; // Имена дней недели для GPS
char* wd_ru[]={"ВС","ПН","ВТ","СР","ЧТ","ПТ","СБ"}; // Имена дней недели на русском для GPS
char* wd_ukr[]={"НД","ПН","ВТ","СР","ЧТ","ПТ","СБ"}; // Имена дней недели на украинском для GPS
char* wd_en[]={"SU","MO","TU","WE","TH","FR","SA"}; // Имена дней недели на английском для GPS
//___________________________________________________________________________________________________________________________________________________________
uint8_t myFavoriteScreensSum; // Количество ваших избранных скринов
int8_t levelLenght = 0; // В зависимости от скрина: процент заполненности бака газом или длина уровня газа в пикселях
float literInBalloonOled; // Остаток газа в баллоне
uint16_t kilometer; // Остаток в километрах
uint8_t sat; // Кол-во спутников GPS
uint16_t sensorPulseCoef; // Коэффициент для расчета скорости и расстояния по кол-ву импульсов датчика
float increaseOdometer = 0.1; // Шаг увеличения одометра
uint16_t soundDelay = 0; // Длительность звучания мелодии включения
float sonarFilter; // Отфильтрованные значения расстояния с сонара
uint8_t previousState = 0; // Первоначальное либо предыдущее состояние пина D4 (по умолчанию = 0)
uint8_t currentState; // Текущее состояние пина D4
uint16_t countValveSwitch = 0; // Счетчик переключений пина D4 (по умолчанию = 0)
float literInBalloonOledAlt; // Остаток газа в баллоне альтернативный
//__________________________________________RGB-СВЕТОДИОД____________________________________________________________________________________________________
uint8_t red = 0; // RGB светодиод. Красный диод
uint8_t green = 0; // RGB светодиод. Зеленый диод
uint8_t blue = 0; // RGB светодиод. Синий диод
//__________________________________________РЕДАКТИРУЕМЫЕ НАЗВАНИЯ___________________________________________________________________________________________
String myName; // Строка для формирования вашего имени
String myTemp1; // Строка для формирования названия первого температурного датчика
String myTemp2; // Строка для формирования названия второго температурного датчика
String myTemp3; // Строка для формирования названия третьего температурного датчика
String myTemp4; // Строка для формирования названия четвертого температурного датчика
String myTemp5; // Строка для формирования названия пятого температурного датчика
//__________________________________________ЛОГО, ИКОНКИ_____________________________________________________________________________________________________
const uint8_t model[] PROGMEM = { // Логотип Bugatti
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x40, 0x40, 0xc0, 0xe0, 0x20, 0x20, 0x20, 0xf0, 0x90, 0x10, 0x90, 0xf8, 0xf8, 0x88, 0x88, 0x48, 0x78,
0x6c, 0x44, 0x44, 0x6c, 0x7c, 0x64, 0x44, 0xa4, 0xbc, 0xbc, 0xa4, 0xa4, 0xa4, 0xbe, 0xb6, 0xa2, 0xa2, 0xb6, 0xbe, 0xa4, 0xa4, 0xa4, 0xbc, 0xbc,
0xa4, 0x44, 0x64, 0x7c, 0x6c, 0x44, 0x44, 0x6c, 0x78, 0x48, 0x88, 0x88, 0xf8, 0xf8, 0x90, 0x10, 0x90, 0xf0, 0x20, 0x20, 0x20, 0xe0, 0xc0, 0x40,
0x40, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x40, 0x40,
0xe0, 0xf0, 0x10, 0x18, 0x98, 0xfc, 0x64, 0x42, 0xa6, 0xbf, 0xd9, 0xd1, 0xe9, 0xef, 0xf6, 0xf4, 0xf4, 0xfb, 0xfb, 0xfa, 0xfa, 0xfd, 0xfd, 0xfd,
0xfd, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0xf1, 0xf1, 0x19, 0x19, 0x39, 0x01, 0x01,
0x01, 0x39, 0x39, 0x39, 0x31, 0x03, 0x03, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfd,
0xfd, 0xfd, 0xfd, 0xfa, 0xfa, 0xfb, 0xfa, 0xf4, 0xf4, 0xf6, 0xef, 0xe9, 0xd0, 0xd9, 0xbf, 0xa6, 0x42, 0x64, 0xfc, 0x98, 0x18, 0x10, 0xf0, 0xe0,
0x40, 0x40, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x20,
0x30, 0x38, 0xe4, 0xe2, 0x63, 0x9f, 0xdc, 0xec, 0xf4, 0xfb, 0xf9, 0xfd, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xe3, 0xe3, 0xe3, 0xe6, 0xe6, 0xe7, 0xe0, 0xe0, 0xe0, 0xe7, 0xe7, 0xe7, 0xe7, 0xe0, 0xf0, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xfe, 0xfe, 0xfd, 0xf9, 0xfb, 0xf4, 0xec, 0xdc, 0x9f, 0x63, 0xe2, 0xe4, 0x38, 0x30, 0x20, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0xc0, 0x7c, 0x23, 0x63, 0xe3, 0x1e, 0xe6, 0xf9, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0xfe, 0xfe, 0x02, 0x02, 0x02,
0x62, 0x86, 0xfe, 0x7d, 0x03, 0x07, 0x0f, 0xff, 0xff, 0x00, 0xfe, 0xfe, 0x00, 0x00, 0x01, 0xff, 0x00, 0xfe, 0xfe, 0x00, 0x00, 0x01, 0xff, 0xff,
0x0f, 0xf3, 0xfd, 0x1d, 0x0e, 0x06, 0xe6, 0xe6, 0xce, 0x9d, 0x99, 0x83, 0x8f, 0xff, 0xff, 0xff, 0x7f, 0x87, 0xf8, 0x7e, 0x06, 0x06, 0x7e, 0xf8,
0x81, 0x03, 0x3f, 0xff, 0xf8, 0xf6, 0xe6, 0xe6, 0x06, 0xfe, 0xfe, 0x06, 0x06, 0x06, 0xe6, 0xe0, 0xe0, 0xff, 0xf0, 0xe6, 0xe6, 0xe6, 0x06, 0xfe,
0xfe, 0x06, 0x06, 0xe6, 0xe6, 0xe0, 0xe1, 0xff, 0x00, 0xfe, 0xfe, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xf9, 0xe6, 0x1e,
0xe3, 0x63, 0x23, 0x7c, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x3e, 0xc4, 0xc6, 0xc7, 0x78, 0x67, 0x9f, 0x7f, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0x00, 0xff, 0xff, 0x01, 0x01, 0x01, 0x71, 0x93, 0xee, 0xfc, 0x38, 0x00, 0x06, 0xff, 0xff, 0x00, 0xff, 0xff, 0xc0, 0x80, 0x00, 0xbf,
0x80, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x7f, 0xff, 0xc0, 0x80, 0x00, 0x70, 0xa6, 0xc6, 0xfe, 0x7c, 0x01, 0x03, 0xff, 0x7f, 0x87,
0xf8, 0xff, 0x3f, 0x30, 0x30, 0x30, 0x30, 0x3f, 0xff, 0xf8, 0x00, 0x03, 0x3f, 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0x7f, 0x9f, 0x67, 0x78, 0xc7, 0xc6, 0xc4, 0x3e, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x04,
0x0c, 0x1c, 0x27, 0x47, 0xc6, 0xfd, 0x3b, 0x37, 0x2f, 0xdf, 0x9c, 0xb9, 0x73, 0x73, 0xf3, 0xf3, 0xf3, 0xf3, 0xf1, 0xf0, 0xf0, 0xf8, 0xfc, 0xff,
0xff, 0xff, 0xfe, 0xfd, 0xf9, 0xf3, 0xf3, 0xf3, 0xf1, 0xf1, 0xf0, 0xf8, 0xf8, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xfd, 0xf9, 0xf3, 0xf3, 0xf3, 0xf3,
0xf1, 0xf0, 0xf0, 0xf8, 0xfc, 0xff, 0xf8, 0xf3, 0xf3, 0xf0, 0xf0, 0xf0, 0xfe, 0xfe, 0xfe, 0xfe, 0xf9, 0xf3, 0xf3, 0xf0, 0xf0, 0xf3, 0xff, 0xff,
0xf8, 0xf3, 0xf3, 0xf0, 0xf0, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xf3, 0xf3, 0xf0, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff,
0xf8, 0xf3, 0x73, 0x70, 0xb0, 0x90, 0xdf, 0x2f, 0x37, 0x3b, 0xf9, 0xc6, 0x47, 0x27, 0x1c, 0x0c, 0x04, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x02, 0x07, 0x0f, 0x08, 0x18, 0x19, 0x3f, 0x26, 0x42,
0x65, 0xfd, 0x9b, 0x8b, 0x97, 0xf7, 0x77, 0x2f, 0x2f, 0x6f, 0xdf, 0x5f, 0x5f, 0xbf, 0xbf, 0xbf, 0xbf, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0xbf, 0xbf, 0xbf, 0xbf, 0x5f, 0x5f, 0xdf, 0x6f, 0x2f,
0x2f, 0x77, 0xf7, 0x97, 0x8b, 0x9b, 0xfd, 0x65, 0x42, 0x26, 0x3f, 0x19, 0x18, 0x08, 0x0f, 0x07, 0x02, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x02, 0x02, 0x03, 0x07, 0x04, 0x04, 0x04, 0x0f, 0x09,
0x08, 0x09, 0x0f, 0x1f, 0x11, 0x11, 0x13, 0x1e, 0x16, 0x22, 0x22, 0x36, 0x3e, 0x26, 0x22, 0x26, 0x3d, 0x3d, 0x25, 0x25, 0x25, 0x3d, 0x2d, 0x25,
0x25, 0x2d, 0x3d, 0x25, 0x25, 0x25, 0x3d, 0x3d, 0x26, 0x22, 0x26, 0x3e, 0x36, 0x22, 0x22, 0x16, 0x1e, 0x13, 0x11, 0x11, 0x1f, 0x0f, 0x09, 0x08,
0x09, 0x0f, 0x04, 0x04, 0x04, 0x07, 0x03, 0x02, 0x02, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};
/*const uint8_t model[] PROGMEM = { // Логотип Lada
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0xC0, 0xC0, 0x40, 0x60, 0x60, 0x20, 0x20, 0x30, 0x10, 0x10, 0x10, 0x18, 0x08, 0x08, 0x08, 0x08, 0x08, 0x84, 0x84, 0x84, 0x84, 0x84, 0xC4, 0xC4, 0xC4, 0xC2, 0x02, 0x02, 0x02, 0x82, 0xFE, 0xCE, 0xC2, 0x82, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x04, 0x04, 0xC4, 0x84, 0x84, 0x84, 0x84, 0x84, 0x8C, 0x08, 0x08, 0x08, 0x08, 0x18, 0x10, 0x10, 0x10, 0x30, 0x20, 0x20, 0x20, 0x60, 0x40, 0xC0, 0xC0, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xE0, 0xE0, 0xF0, 0x78, 0x38, 0x1C, 0x0E, 0x06, 0x06, 0x03, 0x01, 0x81, 0x80, 0xC0, 0xE0, 0xE0, 0xF0, 0xF8, 0xF8, 0xF8, 0xFC, 0xFC, 0xFE, 0xFE, 0xFE, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0x01, 0x00, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFE, 0xFE, 0xFC, 0xFC, 0xF8, 0xF8, 0xF8, 0xF0, 0xF0, 0xE0, 0xC0, 0xC0, 0x81, 0x01, 0x03, 0x07, 0x06, 0x0E, 0x1C, 0x38, 0x78, 0xF0, 0xE0, 0xE0, 0xC0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0xFE, 0xFF, 0xFF, 0x0F, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0xFC, 0x7F, 0x3F, 0x1F, 0x0F, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x70, 0x78, 0x7E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x07, 0xFF, 0xFF, 0xFE, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x0F, 0x1F, 0x3F, 0x7C, 0xF0, 0xE0, 0xC0, 0x80, 0x80, 0x00, 0x00, 0x03, 0x07, 0x0F, 0x1F, 0x3F, 0x3F, 0x7F, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0xFF, 0xFF, 0xE1, 0xC0, 0x80, 0x80, 0x81, 0x80, 0x80, 0xC0, 0xC0, 0xC0, 0xE0, 0xE0, 0xE0, 0xF0, 0x70, 0x78, 0x3C, 0x3C, 0x18, 0x00, 0x00, 0x00, 0x02, 0x06, 0x04, 0x0C, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x7F, 0x3F, 0x3F, 0x1F, 0x0F, 0x07, 0x03, 0x00, 0x00, 0x00, 0x80, 0xC0, 0xE0, 0xF0, 0x7C, 0x3F, 0x1F, 0x0F, 0x07, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x03, 0x03, 0x06, 0x06, 0x0C, 0x0C, 0x18, 0x18, 0x10, 0x30, 0x20, 0x20, 0x60, 0x41, 0x41, 0x43, 0xC3, 0x83, 0x87, 0x87, 0x87, 0x87, 0x0F, 0x0F, 0x0F, 0x08, 0x08, 0x18, 0x18, 0x18, 0x18, 0x10, 0x10, 0x11, 0x11, 0x31, 0x31, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x18, 0x18, 0x18, 0x1C, 0x1C, 0x1E, 0x1F, 0x1F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x07, 0x87, 0x87, 0x87, 0x83, 0xC3, 0x43, 0x41, 0x41, 0x60, 0x20, 0x20, 0x30, 0x10, 0x18, 0x18, 0x08, 0x0C, 0x06, 0x06, 0x07, 0x03, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xF0, 0xFC, 0xFF, 0x3F, 0x0F, 0x07, 0x07, 0x3F, 0x7F, 0xFF, 0xFC, 0xF8, 0xE0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x07, 0x0F, 0x1E, 0xFE, 0xFE, 0xFC, 0xF8, 0xF0, 0xC0, 0x00, 0x00, 0x00, 0xC0, 0xF0, 0xF8, 0xFE, 0x3F, 0x0F, 0x07, 0x07, 0x3F, 0x7F, 0xFF, 0xFE, 0xF8, 0xE0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x00, 0x00, 0x60, 0x70, 0x7C, 0x7F, 0x3F, 0x0F, 0x07, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x07, 0x0F, 0x3F, 0x7F, 0x7F, 0x7E, 0x78, 0x70, 0x40, 0x00, 0x00, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x70, 0x70, 0x78, 0x3E, 0x3F, 0x1F, 0x1F, 0x0F, 0x07, 0x61, 0x70, 0x7C, 0x7F, 0x3F, 0x0F, 0x07, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x07, 0x0F, 0x3F, 0x7F, 0x7F, 0x7E, 0x78, 0x70, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
};*/
const uint8_t background[] PROGMEM = { // Фон для всех всплывающих подсказок и предупреждений
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f,
0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f,
0x7f, 0x7f, 0x7f, 0xff, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f,
0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f,
0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f,
0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe,
0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xff, 0xfe, 0xfe, 0xfe, 0xfe,
0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe,
0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe,
0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
};
const uint8_t menuNav_1[] PROGMEM = { // Помощь навигации в меню
0xff, 0xff, 0xff, 0x9f, 0x87, 0x81, 0x87, 0x9f, 0xff, 0xff, 0xf9, 0xe1, 0x81, 0xe1, 0xf9, 0xff, 0xff, 0xef, 0xef, 0xff, 0xff, 0xbb, 0xb1, 0xbb,
0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x81, 0xf3, 0xc7, 0xf3, 0x81, 0xff, 0xff, 0xef, 0xef, 0xff, 0xff, 0xc3, 0xbd, 0xbd, 0xbd, 0xc3, 0xff, 0x81,
0xe7, 0xdb, 0xbd, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xc3, 0xff, 0x81, 0xf3, 0xc7, 0xf3, 0x81, 0xff, 0xc3, 0xff, 0xff, 0xef, 0xef, 0xff, 0xff,
0xb7, 0x85, 0xbf, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x81, 0xbf, 0xbf, 0xbf, 0xff, 0xff, 0xef, 0xef, 0xff, 0xff, 0xef, 0xc7, 0x83, 0xef, 0xef,
0xef, 0xef, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xc3, 0xff, 0x81, 0xbf, 0xbf, 0xbf, 0xff, 0xc3, 0xff, 0xff, 0xef, 0xef, 0xff, 0xff, 0xf7, 0x83,
0x99, 0x81, 0x99, 0x83, 0xf7, 0xff, 0xff, 0xff
};
const uint8_t satellite[] PROGMEM = {0x60, 0x00, 0x70, 0x00, 0x7c, 0x00, 0x7f}; // Иконка спутника
const uint8_t arrowUp[] PROGMEM = {0x08, 0x0c, 0x0e, 0x7f, 0x0e, 0x0c, 0x08}; // Иконка стрелки вверх
const uint8_t cooler[] PROGMEM = {0x70, 0x30, 0x10, 0x0f, 0x37, 0x72, 0x60}; // Иконка вентилятора
const uint8_t coolerBig[] PROGMEM = {0x00, 0x00, 0x00, 0x80, 0x8e, 0xbf, 0x7f, 0xbf, 0x8e, 0x80, 0x00, 0x00, 0x00, 0x1e, 0x1f, 0x1f, 0x0f, 0x03, 0x00, 0x00, 0x00, 0x03, 0x0f, 0x0f, 0x1f, 0x1e}; // Иконка вентилятора большая
const uint8_t drop[] PROGMEM = {0x38, 0x7e, 0x5f, 0x4e, 0x38}; // Иконка капли
const uint8_t dropBig[] PROGMEM = {0x80, 0xe0, 0xf8, 0xfe, 0xff, 0xfe, 0x78, 0xe0, 0x80, 0x07, 0x0f, 0x1f, 0x1f, 0x19, 0x10, 0x18, 0x0c, 0x07}; // Иконка капли большая
const uint8_t attention[] PROGMEM = {0x7f, 0x7f, 0x51, 0x7f, 0x7f}; // восклицательный знак (маленький)
const uint8_t attentionBig[] PROGMEM = {0xff, 0xff, 0xff, 0x01, 0x01, 0xff, 0xff, 0xff, 0x1f, 0x1f, 0x1f, 0x12, 0x12, 0x1f, 0x1f, 0x1f}; // восклицательный знак (большой)
const uint8_t car[] PROGMEM = { // Иконка автомобиля
0xe0, 0xfc, 0xf4, 0x0e, 0x02, 0x02, 0x06, 0x0d, 0x19, 0xf1, 0xf1, 0xf1, 0xf1, 0xfd, 0xf3, 0xf1, 0xf1, 0xf1, 0x31, 0x09, 0x09, 0x05, 0x02, 0x0e,
0x3e, 0xf4, 0xe4, 0xf8, 0xe0, 0x03, 0x1f, 0x17, 0x38, 0x20, 0x20, 0x30, 0x58, 0x4c, 0x47, 0x47, 0x47, 0x47, 0x5f, 0x67, 0x47, 0x47, 0x47, 0x46,
0x48, 0x48, 0x50, 0x20, 0x38, 0x3e, 0x17, 0x13, 0x0f, 0x03
};
const uint8_t save[] PROGMEM = { // Иконка дискеты
0x00, 0x00, 0x00, 0xf8, 0xfc, 0x0c, 0x0c, 0x0c, 0xfc, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0xfc, 0xfc, 0x0c, 0x0c, 0xfc, 0x0c, 0x1c,
0x38, 0xf0, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x81, 0x83, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82,
0x82, 0x82, 0x83, 0x81, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0x01, 0x00, 0xcc, 0xcc,
0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0x00, 0x01, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xc0, 0xc0, 0xc0, 0xc7, 0xcf, 0xcc,
0xcc, 0xcf, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcf, 0xcc, 0xcc, 0xcf, 0xc7, 0xc0, 0xc0, 0xc0
};
const uint8_t oil[] PROGMEM = { // Иконка расходников
0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x7f, 0xe3, 0xc7, 0x8e, 0xfc, 0xf8, 0x30, 0x30, 0x30, 0x3f, 0x3f, 0x30, 0x30, 0x30, 0x70, 0xe0,
0xc0, 0xe0, 0x60, 0x30, 0x30, 0xd8, 0xfc, 0x3c, 0x0e, 0x1e, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0xff, 0xff, 0xc0, 0xc0, 0xc0, 0xc0,
0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xe0, 0x70, 0x38, 0x0e, 0x07, 0x01, 0x00, 0x00, 0x00, 0x38, 0x38, 0x00, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0,
0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0
};
const uint8_t sun[] PROGMEM = { // Иконка солнца
0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x0c, 0x18, 0x30, 0x80, 0x80, 0xc0, 0xc0, 0x60, 0x6e, 0x6e, 0x60, 0xc0, 0xc0, 0x80, 0x80, 0x30, 0x18, 0x0c,
0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x00, 0xc0, 0xc0, 0xc1, 0x03, 0xe2, 0xf8, 0x1e, 0x07, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x01, 0x03, 0x07, 0x1e, 0xf8, 0xe2, 0x03, 0xc1, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0x40, 0x60, 0x30, 0x11, 0x07, 0x1e, 0x38, 0x70, 0x60, 0xc0,
0xc0, 0x80, 0x80, 0x80, 0x80, 0xc0, 0xc0, 0x60, 0x70, 0x38, 0x1e, 0x07, 0x11, 0x30, 0x60, 0x40, 0x00, 0x00, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0,
0xcc, 0xc6, 0xc3, 0xc0, 0xc0, 0xc0, 0xc0, 0xc1, 0xdd, 0xdd, 0xc1, 0xc0, 0xc0, 0xc0, 0xc0, 0xc3, 0xc6, 0xcc, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0
};
const uint8_t zero[] PROGMEM = { // Иконка одометра
0x00, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0,
0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0x00, 0x00, 0xff, 0x00, 0xf8, 0x04, 0x04, 0x04, 0x04, 0xf8, 0x00, 0xff, 0x00, 0xf8, 0x04, 0x04, 0x04, 0x04, 0xf8,
0x00, 0xff, 0x00, 0x30, 0x08, 0x06, 0x01, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xc0, 0xc7, 0xc8, 0xc8, 0xc8, 0xc8, 0xc7, 0xc0, 0xff, 0xc0,
0xc7, 0xc8, 0xc8, 0xc8, 0xc8, 0xc7, 0xc0, 0xff, 0xc0, 0xee, 0xd1, 0xd1, 0xd1, 0xd1, 0xee, 0xc0, 0xff, 0x00, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0,
0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0
};
const uint8_t limit[] PROGMEM = { // Иконка ограничителя скорости
0x00, 0x00, 0x00, 0x00, 0xc0, 0xe0, 0x70, 0x30, 0x18, 0x38, 0x7c, 0xcc, 0x0c, 0x06, 0x06, 0x06, 0x06, 0x0c, 0xcc, 0x7c, 0x38, 0x18, 0x30, 0x70,
0xe0, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xfc, 0x1f, 0x07, 0x06, 0x0c, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xe0, 0x70, 0x38,
0x1c, 0x0e, 0x07, 0x03, 0x08, 0x0c, 0x06, 0x07, 0x1f, 0xfc, 0xe0, 0x00, 0x00, 0x01, 0x0f, 0x3e, 0xf8, 0xd8, 0x8c, 0x04, 0x00, 0x00, 0x80, 0xc0,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x8c, 0xd8, 0xf8, 0x3e, 0x0f, 0x01, 0x00, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc1,
0xc3, 0xc3, 0xc6, 0xc7, 0xcf, 0xcc, 0xcc, 0xd8, 0xd8, 0xd8, 0xd8, 0xcc, 0xcc, 0xcc, 0xc6, 0xc6, 0xc3, 0xc3, 0xc1, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0
};
const uint8_t ukr_e[] PROGMEM = {0x38, 0x54, 0x54, 0x44, 0x00}; // Українська маленька літера "є"
const uint8_t ukr_i[] PROGMEM = {0x00, 0x45, 0x7c, 0x41, 0x00}; // Українська маленька літера "ї"
const uint8_t temp_ukr[] PROGMEM = { // Шапка скрина с температурами на ру/укр
0x03, 0x03, 0x03, 0xff, 0x03, 0x03, 0x03, 0x00, 0xff, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0x03, 0x00, 0xff, 0x1e, 0x78, 0xe0, 0x78, 0x1e, 0xff, 0x00,
0xff, 0x03, 0x03, 0x03, 0x03, 0x03, 0xff, 0x00, 0xff, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0x03, 0x00, 0xff, 0xc3, 0xc3, 0xc3, 0xc3, 0x66, 0x3c, 0x00,
0xf0, 0xdc, 0xc6, 0xc2, 0xc3, 0xc1, 0xff, 0x00, 0x03, 0x03, 0x03, 0xff, 0x03, 0x03, 0x03, 0x00, 0x3f, 0x60, 0xc0, 0xc0, 0xc0, 0x60, 0xff, 0x00,
0xff, 0xc3, 0xc3, 0xc3, 0xc3, 0x66, 0x3c, 0x00, 0xf0, 0xdc, 0xc6, 0xc2, 0xc3, 0xc1, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00,
0x00, 0x00, 0x3f, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x00, 0x3f, 0x00, 0x00, 0x01, 0x00, 0x00, 0x3f, 0x00, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00,
0x3f, 0x00, 0x3f, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x00, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00,
0x3f, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x20, 0x20, 0x20, 0x20, 0x10, 0x0c, 0x03, 0x00, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00
};
const uint8_t temp_en[] PROGMEM = { // Шапка скрина с температурами на eng
0x03, 0x03, 0x03, 0xff, 0x03, 0x03, 0x03, 0x00, 0xff, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0x03, 0x00, 0xff, 0x1e, 0x78, 0xe0, 0x78, 0x1e, 0xff, 0x00,
0xff, 0xc3, 0xc3, 0xc3, 0xc3, 0x66, 0x3c, 0x00, 0xff, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0x03, 0x00, 0xff, 0xc3, 0xc3, 0xc3, 0xc3, 0x66, 0x3c, 0x00,
0xf0, 0xdc, 0xc6, 0xc2, 0xc3, 0xc1, 0xff, 0x00, 0x03, 0x03, 0x03, 0xff, 0x03, 0x03, 0x03, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00,
0xff, 0xc3, 0xc3, 0xc3, 0xc3, 0x66, 0x3c, 0x00, 0xff, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00,
0x00, 0x00, 0x3f, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x00, 0x3f, 0x00, 0x00, 0x01, 0x00, 0x00, 0x3f, 0x00, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x3f, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x00, 0x3f, 0x01, 0x03, 0x06, 0x0c, 0x18, 0x30, 0x00, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00,
0x3f, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x18, 0x30, 0x30, 0x30, 0x18, 0x0f, 0x00, 0x3f, 0x01, 0x03, 0x06, 0x0c, 0x18,
0x30, 0x00, 0x3f, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x00, 0x00, 0x00
};
const uint8_t buttons[] PROGMEM = { // Для инструкции картинка с обозначением кнопок джойстика
0xff, 0xff, 0xff, 0xff, 0x0f, 0xaf, 0xaf, 0xef, 0xff, 0xff, 0xbf, 0xbf, 0xbf, 0xbf, 0xdf, 0xef, 0xf7, 0xf7, 0x37, 0xb7, 0xb7, 0x77, 0xf7, 0xf7,
0xf7, 0xf7, 0xf7, 0xf7, 0xf7, 0xf7, 0xf7, 0xf7, 0xf7, 0x37, 0xf7, 0xf7, 0xf7, 0xf7, 0xf7, 0x77, 0x37, 0xf7, 0x3f, 0xd7, 0x93, 0x11, 0x93, 0xd7,
0x3f, 0xff, 0x3f, 0x7f, 0xff, 0xff, 0xff, 0x3f, 0xbf, 0xbf, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0xff, 0x01, 0x7d, 0x01, 0x11, 0x01,
0x7d, 0x01, 0x11, 0x11, 0x11, 0x01, 0x7d, 0x11, 0x11, 0x7d, 0x01, 0x39, 0x45, 0x45, 0x39, 0x01, 0x7d, 0x41, 0x41, 0x01, 0x7d, 0x45, 0x45, 0x39,
0x01, 0x01, 0x01, 0x7d, 0x45, 0x7d, 0x01, 0x41, 0x01, 0x5d, 0x55, 0x75, 0x01, 0x01, 0x01, 0x49, 0x55, 0x55, 0x25, 0x01, 0x7d, 0x55, 0x45, 0x01,
0x39, 0x45, 0x45, 0x01, 0x01, 0x01, 0x01, 0xff, 0x7f, 0x7f, 0x7f, 0x7f, 0x7e, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f,
0x7f, 0x7f, 0x78, 0x7a, 0x7a, 0x7d, 0x7f, 0x7f, 0x7e, 0x7e, 0x7e, 0x7e, 0x7d, 0x7b, 0x77, 0x6f, 0x5f, 0x58, 0x5b, 0xdb, 0xdf, 0xdf, 0xde, 0xdc,
0xd8, 0xdf, 0xf8, 0xd7, 0x90, 0x11, 0x90, 0xd7, 0xf8, 0xff, 0xf8, 0xfc, 0xfe, 0x7f, 0x7f, 0x78, 0x7d, 0x7d, 0x7a, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f,
0xff, 0x00, 0x7f, 0x40, 0x5f, 0x5f, 0x40, 0x44, 0x40, 0x5f, 0x5f, 0x40, 0x44, 0x44, 0x44, 0x40, 0x5f, 0x44, 0x44, 0x5f, 0x40, 0x4e, 0x51, 0x51,
0x4e, 0x40, 0x5f, 0x50, 0x50, 0x40, 0x5f, 0x51, 0x51, 0x4e, 0x40, 0x40, 0x40, 0x55, 0x55, 0x5f, 0x40, 0x50, 0x40, 0x57, 0x55, 0x5d, 0x40, 0x40,
0x40, 0x52, 0x55, 0x55, 0x49, 0x40, 0x5f, 0x55, 0x51, 0x40, 0x4e, 0x51, 0x51, 0x40, 0x40, 0x7f, 0x3e, 0x00, 0x3e, 0x04, 0x08, 0x04, 0x3e, 0x00,
0x3e, 0x00, 0x08, 0x08, 0x08, 0x00, 0x3e, 0x04, 0x08, 0x04, 0x3e, 0x00, 0x3e, 0x2a, 0x22, 0x00, 0x3e, 0x02, 0x02, 0x3c, 0x00, 0x1e, 0x20, 0x20,
0x1e, 0x00, 0x00, 0x00, 0x01, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x3e, 0x20, 0x20, 0x00, 0x20, 0x00, 0x3e, 0x12, 0x12, 0x2c, 0x00, 0x08, 0x08,
0x08, 0x00, 0x24, 0x2a, 0x2a, 0x12, 0x00, 0x1c, 0x22, 0x22, 0x00, 0x3e, 0x12, 0x12, 0x2c, 0x00, 0x20, 0x00, 0x00, 0x00, 0x08, 0x08, 0x08, 0x00,
0x20, 0x10, 0x08, 0x04, 0x02, 0x00, 0x08, 0x1c, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x9f, 0x02, 0x84, 0x82, 0x9f, 0x00, 0x04, 0x84, 0x04, 0x00, 0x1f, 0x11, 0x11, 0x8e, 0x80, 0x9d, 0x00, 0x12, 0x95, 0x95, 0x89, 0x00, 0x1f, 0x89,
0x09, 0x06, 0x90, 0x80, 0x80, 0x00, 0x8e, 0x11, 0x11, 0x8e, 0x00, 0x9f, 0x81, 0x81, 0x1e, 0x00, 0x10, 0x08, 0x84, 0x02, 0x01, 0x00, 0x8e, 0x11,
0x11, 0x8e, 0x80, 0x1f, 0x05, 0x81, 0x80, 0x9f, 0x05, 0x01, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0xff, 0xc0, 0xc0, 0xdf, 0xdf, 0xc0, 0xdf, 0xc2,
0xc4, 0xc2, 0xdf, 0xc0, 0xdf, 0xdf, 0xc0, 0xc4, 0xc4, 0xc4, 0xc0, 0xde, 0xc9, 0xc9, 0xde, 0xc0, 0x4e, 0xd1, 0xd1, 0xc0, 0x4e, 0xd1, 0x51, 0x40,
0x5f, 0xd5, 0x51, 0x40, 0x5f, 0xd0, 0xd0, 0x40, 0xdf, 0xd5, 0x51, 0xc0, 0xdf, 0xc9, 0xc9, 0xd6, 0xc0, 0xde, 0xc9, 0xc9, 0xde, 0xc0, 0xc1, 0xdf,
0xc1, 0xd0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xcf, 0x40, 0x4f, 0x0a, 0x0a, 0x05, 0xc0, 0x4f, 0x40, 0x82, 0x02, 0x02, 0x00, 0x0f, 0x0a, 0xca,
0x45, 0x40, 0x8f, 0x04, 0xc4, 0x4b, 0x40, 0x8e, 0x00, 0x47, 0x08, 0x8a, 0x4e, 0x40, 0x4f, 0x02, 0xc2, 0x0f, 0x00, 0xc0, 0x0f, 0x40, 0xc0, 0x40,
0x00, 0x00, 0x0f, 0x01, 0x82, 0x01, 0x0f, 0x00, 0x07, 0x08, 0x88, 0x47, 0x00, 0x0f, 0x08, 0x08, 0x07, 0x00, 0x0f, 0x0a, 0x08, 0x00, 0x00, 0x00,
0xff, 0x1f, 0x1f, 0xdf, 0x5f, 0x5f, 0x1f, 0x1f, 0xdf, 0x5f, 0x5e, 0x9d, 0x1b, 0x1d, 0x1e, 0x1f, 0x1f, 0xdf, 0x5f, 0x5f, 0x9f, 0x1f, 0x9f, 0x5f,
0x50, 0x9e, 0x1d, 0xde, 0x10, 0x1f, 0x10, 0xd5, 0x17, 0x5f, 0x10, 0x9f, 0x5f, 0x50, 0x5f, 0x18, 0x97, 0x57, 0x58, 0x9f, 0x1f, 0x5f, 0xdf, 0x5f,
0x1f, 0x5f, 0x1f, 0x9e, 0x5d, 0x5b, 0x9d, 0x1e, 0xdf, 0x5f, 0x5f, 0x9f, 0x1f, 0x1f, 0x1f, 0x1f, 0xe7, 0x01, 0xe0, 0x00, 0x04, 0x00, 0xe7, 0x05,
0x05, 0x42, 0xa0, 0xa1, 0x21, 0x01, 0x40, 0xa7, 0xa5, 0x45, 0x02, 0x80, 0x87, 0x82, 0x02, 0xe5, 0x20, 0x27, 0xc0, 0x03, 0xe4, 0xa5, 0x27, 0x00,
0x47, 0xa1, 0xa1, 0x27, 0x00, 0xe0, 0xa7, 0x20, 0x00, 0x20, 0xe0, 0x21, 0x03, 0x01, 0x00, 0xc4, 0x22, 0x21, 0xc0, 0x00, 0xe0, 0x21, 0x21, 0xc1,
0x00, 0xc0, 0x20, 0x20, 0xc0, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0xe7, 0x01, 0xe0, 0x44, 0x80, 0x47, 0xe5, 0x05, 0xe2, 0x00, 0x81, 0x81, 0x81,
0x00, 0x47, 0xa0, 0xa0, 0x27, 0x00, 0xc7, 0x22, 0x22, 0xc7, 0x00, 0x60, 0x83, 0x04, 0x83, 0x60, 0x00, 0xe7, 0xa0, 0x23, 0x04, 0x85, 0xc7, 0x80,
0x07, 0xe2, 0x82, 0x87, 0xe0, 0x00, 0xc7, 0x20, 0x20, 0xc7, 0x00, 0xe3, 0x44, 0x84, 0x43, 0xe0, 0x07, 0xe0, 0xa0, 0x27, 0x00, 0x00, 0x00, 0x00,
0xf3, 0x00, 0xf3, 0x92, 0x92, 0x60, 0x03, 0xf0, 0x00, 0x02, 0x22, 0x52, 0x51, 0x90, 0x01, 0xe2, 0x52, 0x51, 0x80, 0x00, 0x40, 0x40, 0x40, 0x03,
0x21, 0x51, 0x52, 0x90, 0x03, 0xf2, 0x92, 0x90, 0x62, 0x02, 0xf2, 0x11, 0x10, 0xe3, 0x02, 0x02, 0x00, 0x00, 0x03, 0xf0, 0x20, 0x40, 0x20, 0xf1,
0x02, 0xe2, 0x11, 0x10, 0xe3, 0x02, 0xf2, 0x11, 0x10, 0xe1, 0x02, 0xf2, 0x51, 0x10, 0x00, 0x00, 0xff, 0x00, 0x00, 0xf3, 0x20, 0x43, 0x20, 0xf0,
0x00, 0x03, 0x00, 0xf3, 0x90, 0x90, 0x60, 0x00, 0x40, 0x42, 0x42, 0x02, 0xf1, 0x50, 0x13, 0x01, 0xf1, 0x13, 0x10, 0xe0, 0x01, 0x12, 0xf1, 0x10,
0x00, 0xf3, 0x52, 0x12, 0x00, 0xf0, 0x91, 0x90, 0x60, 0x03, 0x00, 0x00, 0x03, 0x00, 0x01, 0x02, 0x02, 0x01, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03,
0x00, 0x03, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0xf9, 0x00, 0xf9, 0x28, 0x08, 0x01, 0xf8, 0x01, 0x20, 0x20, 0x21, 0x01, 0x91, 0xa8, 0xa8, 0x48,
0x01, 0xf9, 0x48, 0x48, 0x30, 0x00, 0xf8, 0x88, 0x89, 0x71, 0x01, 0x80, 0x00, 0x01, 0x00, 0xf8, 0x80, 0x80, 0x01, 0xe9, 0x01, 0x00, 0xf8, 0x11,
0x20, 0x10, 0xf8, 0x01, 0xe8, 0x00, 0x08, 0xf9, 0x08, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x01, 0x00, 0x00,
0xff, 0x00, 0x00, 0xf9, 0x00, 0xf8, 0x80, 0x81, 0x00, 0xf9, 0x00, 0x21, 0x20, 0x20, 0x01, 0xf8, 0x20, 0x20, 0xf8, 0x00, 0x71, 0x89, 0x89, 0x70,
0x01, 0xf8, 0x10, 0x21, 0x10, 0xf8, 0x01, 0xf8, 0xa8, 0x89, 0x01, 0x01, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};
const uint8_t sonar_scheme[] PROGMEM = { // Для инструкции схема подключения датчика расстояния (для парктроника)
0x8e, 0x91, 0x95, 0x9d, 0x00, 0x1f, 0x82, 0x84, 0x08, 0x9f, 0x00, 0x1f, 0x91, 0x11, 0x0e, 0x80, 0x80, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04,
0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x00, 0x00, 0x8e, 0x91, 0x95, 0x1d, 0x00, 0x9f, 0x82, 0x84, 0x08, 0x1f, 0x80, 0x9f, 0x11,
0x11, 0x0e, 0x00, 0x00, 0x04, 0x04, 0x04, 0xfc, 0x04, 0x04, 0x24, 0xf4, 0x04, 0x04, 0xf4, 0x14, 0xf4, 0x04, 0xf4, 0x44, 0xa4, 0x14, 0x04, 0x04,
0xff, 0x7f, 0x77, 0x77, 0x77, 0x7f, 0x7f, 0x01, 0x01, 0x81, 0x01, 0x01, 0x01, 0x81, 0x01, 0x81, 0x01, 0x81, 0x81, 0x81, 0x01, 0x01, 0x81, 0x01,
0x01, 0x01, 0x81, 0x81, 0x81, 0x01, 0x81, 0x81, 0x81, 0x01, 0x81, 0x81, 0x81, 0x01, 0x01, 0x7f, 0x7f, 0x77, 0x77, 0x77, 0x7f, 0xff, 0x04, 0x04,
0x04, 0x04, 0x04, 0x04, 0x04, 0xfc, 0x00, 0x00, 0x4f, 0x4a, 0xca, 0x48, 0x40, 0x07, 0xc8, 0x48, 0x40, 0x8f, 0x02, 0x42, 0x0f, 0x80, 0x47, 0x48,
0x48, 0x07, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0xcf, 0x48, 0x48, 0x87, 0x00,
0x4e, 0x4a, 0xcb, 0x00, 0xc5, 0x4a, 0xca, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x7d, 0x25, 0x25, 0x58, 0x01, 0x49,
0x7d, 0x40, 0x01, 0x1c, 0x10, 0x7d, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x01, 0x02, 0x01, 0x0f, 0x00, 0x0e,
0xc0, 0x4f, 0x40, 0x80, 0x0f, 0xc0, 0x4e, 0x40, 0x80, 0x00, 0x8b, 0x4a, 0x4e, 0x80, 0x0f, 0x0a, 0x0e, 0x00, 0x0f, 0x08, 0x0f, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0xe0, 0xa0, 0xa7, 0x00, 0x60, 0x80, 0x07, 0x82,
0x62, 0x05, 0x00, 0x87, 0x80, 0x83, 0x84, 0x85, 0x87, 0x80, 0x80, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81,
0x81, 0x00, 0x00, 0xe7, 0xa4, 0xa4, 0x03, 0x60, 0x87, 0x05, 0x85, 0x60, 0x05, 0x05, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f,
0x08, 0x08, 0x3e, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x3e, 0x08, 0x08, 0xf8, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x02, 0xe2, 0xa1, 0xa0, 0x07, 0x02, 0x62, 0x85, 0x00, 0x83, 0x64, 0x04, 0x03, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
0x02, 0x02, 0x03, 0x00, 0x00, 0x01, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf2, 0x12, 0x13, 0xe0, 0x00, 0xd1, 0x52, 0x71, 0x00, 0x10, 0x10, 0xf0, 0x00,
0x00, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x7f, 0x40, 0x40,
0xff, 0xfc, 0xdc, 0x8c, 0xdc, 0xfc, 0xfc, 0x00, 0x00, 0x00, 0x10, 0x38, 0x7c, 0x10, 0x10, 0x10, 0x10, 0x10, 0x12, 0x12, 0x13, 0x10, 0x10, 0x10,
0x11, 0x12, 0x11, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x00, 0xfc, 0xfc, 0xdc, 0x8c, 0xdc, 0xfc, 0xff, 0x40, 0x40,
0xc0, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x20, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x11, 0x11, 0x11, 0x10, 0x10,
0x11, 0x11, 0x11, 0x10, 0x10, 0x10, 0x11, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,
0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0xf1, 0x11, 0x91, 0xd1,
0x91, 0x11, 0xf1, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x41, 0x21, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x10, 0x10, 0x1f, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x12, 0x12,
0x2c, 0x00, 0x3e, 0x2a, 0x22, 0x00, 0x06, 0x18, 0x20, 0x18, 0x06, 0x00, 0x3e, 0x2a, 0x22, 0x00, 0x3e, 0x12, 0x12, 0x2c, 0x00, 0x24, 0x2a, 0x2a,
0x12, 0x00, 0x3e, 0x2a, 0x22, 0x00, 0x00, 0x00, 0x3e, 0x20, 0x20, 0x00, 0x3a, 0x00, 0x1c, 0x22, 0x2a, 0x3a, 0x00, 0x3e, 0x08, 0x08, 0x3e, 0x00,
0x02, 0x3e, 0x02, 0x00, 0xff, 0x08, 0x88, 0x89, 0x88, 0x08, 0xff, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x01, 0x02, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04,
0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04,
0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x07, 0x04, 0x04, 0x04, 0x04, 0x04, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x01, 0x02, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04,
0x04, 0x04, 0x04, 0x04, 0x04, 0x07, 0x00, 0x00
};
const uint8_t mainScr[] PROGMEM = { // Для меню обозначение главного экрана
0xff, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff,
0xff, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xff
};
const uint8_t mainScrTemp[] PROGMEM = { // Для меню температура
0xff, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff,
0xff, 0x80, 0xa2, 0xb2, 0xac, 0x80, 0xa2, 0xaa, 0x94, 0x80, 0x98, 0xa4, 0xa4, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xff
};
const uint8_t mainScrKM[] PROGMEM = { // Для меню расстояние
0xff, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff,
0xff, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
0xa2, 0xb2, 0xac, 0x80, 0xa2, 0xaa, 0x94, 0x80, 0xbe, 0x88, 0x94, 0xa2, 0x80, 0xbe, 0x84, 0x88, 0x84, 0xbe, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xff
};
const uint8_t mainScrBattery[] PROGMEM = { // Для меню АКБ
0xff, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff,
0xff, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
0xa2, 0xbe, 0xa0, 0x80, 0xa2, 0xb2, 0xac, 0x80, 0x80, 0x86, 0x98, 0xa0, 0x98, 0x86, 0x80, 0xff
};
const uint8_t mainScrTime[] PROGMEM = { // Для меню время
0xff, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x45, 0x65, 0x59, 0x01,
0x45, 0x55, 0x29, 0x01, 0x29, 0x01, 0x45, 0x7d, 0x41, 0x01, 0x39, 0x45, 0x45, 0x39, 0x01, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff,
0xff, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xff
};
const uint8_t mainScrDate[] PROGMEM = { // Для меню дата
0xff, 0x01, 0x05, 0x7d, 0x05, 0x01, 0x3d, 0x41, 0x41, 0x3d, 0x01, 0x01, 0x45, 0x7d, 0x41, 0x01, 0x41, 0x01, 0x1d, 0x11, 0x7d, 0x01, 0x41, 0x01,
0x45, 0x65, 0x59, 0x01, 0x39, 0x45, 0x45, 0x39, 0x01, 0x45, 0x65, 0x59, 0x01, 0x5d, 0x55, 0x75, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff,
0xff, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xff
};
const uint8_t mainScrGas[] PROGMEM = { // Для меню гор. уровень газа
0xff, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78,
0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78,
0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x78, 0x00, 0x00, 0xff,
0xff, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xff
};
const uint8_t mainScrGasWidth[] PROGMEM = { // Для меню ширина уровеня газа
0xff, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x01, 0x01, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0,
0xc0, 0xc0, 0xc0, 0xc0, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff,
0xff, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
0x80, 0x80, 0xbe, 0x88, 0x9c, 0xbe, 0x88, 0x88, 0x88, 0xbe, 0x9c, 0x88, 0xbe, 0x80, 0x80, 0xff
};
const uint8_t mainScrTopLine[] PROGMEM = { // Для меню верхняя линия
0xff, 0x01, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81,
0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81,
0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x01, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff,
0xff, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xff
};
const uint8_t mainScrBotLine[] PROGMEM = { // Для меню нижняя линия
0xff, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff,
0xff, 0x80, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81,
0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81,
0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x80, 0xff
};
const uint8_t mainScrRect[] PROGMEM = { // Для меню прямоуг-ки на скрине 3
0xff, 0x01, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0x01, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd,
0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0x01, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd,
0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0x01, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e,
0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0x00, 0xff,
0xff, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f,
0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x80, 0xff
};
const uint8_t mainScrRectStroke[] PROGMEM = { // Для меню обводка прямоуг-ков на скрине 3
0xff, 0x01, 0x1d, 0x15, 0x15, 0x1d, 0x01, 0x1d, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x1d, 0x01, 0xdd, 0x55, 0x55,
0x55, 0x55, 0x55, 0x55, 0x55, 0xdd, 0x01, 0xff, 0x7f, 0x40, 0x52, 0x55, 0x49, 0x40, 0x4e, 0x51, 0x51, 0x40, 0x5f, 0x45, 0x5a, 0x40, 0x51, 0x55,
0x4a, 0x40, 0x40, 0x40, 0x40, 0x5d, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x5d, 0x40, 0x7f
};
const uint8_t mainScrRectFill[] PROGMEM = { // Для меню заливка прямоуг-ков на скрине 3
0xff, 0x01, 0x1d, 0x1d, 0x1d, 0x1d, 0x01, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x01, 0xdd, 0xdd, 0xdd,
0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0x01, 0xff, 0x7f, 0x40, 0x52, 0x55, 0x49, 0x40, 0x4e, 0x51, 0x51, 0x40, 0x5f, 0x45, 0x5a, 0x40, 0x51, 0x55,
0x4a, 0x40, 0x40, 0x40, 0x40, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x40, 0x7f
};
const uint8_t accelerationBtn[] PROGMEM = { // Обозначение кнопок окна замера времени разгона
0xff, 0xff, 0xff, 0xff, 0x9f, 0x87, 0x81, 0x87, 0x9f, 0xff, 0xff, 0xf9, 0xe1, 0x81, 0xe1, 0xf9, 0xff, 0xff, 0xef, 0xef, 0xff, 0xff, 0xd3, 0xb5,
0xad, 0xcb, 0xff, 0x81, 0xed, 0xed, 0xf3, 0xff, 0x81, 0xb5, 0xb5, 0xb5, 0xff, 0x81, 0xb5, 0xb5, 0xb5, 0xff, 0x81, 0xbd, 0xbd, 0xc3, 0xff, 0xff,
0xbb, 0xb1, 0xbb, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x81, 0xbf, 0xbf, 0xbf, 0xff, 0xff, 0xef, 0xef, 0xff, 0xff, 0xef, 0xc7,
0x83, 0xef, 0xef, 0xef, 0xef, 0xef, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x81, 0xf3, 0xc7, 0xf3, 0x81, 0xff, 0xff, 0xef, 0xef,
0xff, 0xff, 0x81, 0xed, 0xcd, 0xb3, 0xff, 0x81, 0xb5, 0xb5, 0xb5, 0xff, 0xd3, 0xb5, 0xad, 0xcb, 0xff, 0x81, 0xb5, 0xb5, 0xb5, 0xff, 0xfd, 0xfd,
0x81, 0xfd, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff
};
const uint8_t bell[] PROGMEM = { // Колокольчик для таймера
0xc0, 0xfc, 0xfe, 0xff, 0xfe, 0xfc, 0xc0, 0x00, 0x00, 0x02, 0x03, 0x02, 0x00, 0x00
};
//__________________________________________ПЕРЕМЕННЫЕ ПРЕРЫВАНИЙ____________________________________________________________________________________________
volatile int counterSpeedSensor; // переменная-счётчик импульсов с датчика скорости (начальное значение присваивается в блоке "Setup")
//__________________________________________ТИКЕРЫ АППАРАТНЫХ ПРЕРЫВАНИЙ_____________________________________________________________________________________
void isr() {
tacho.tick(); // Для спидометра + подсчет одометра
if (data.sensorSpeed) {
if (counterSpeedSensor == 100 * data.sensorPulseNum) {
counterSpeedSensor = 0;
data.odometer += increaseOdometer;
data.odometer2 += increaseOdometer;
} else counterSpeedSensor++;
}
}
void isr2() { // Для кнопки
joy_R.pressISR();
}
//___________________________________________________________________________________________________________________________________________________________
void setup() {
pinMode(RED_PIN, OUTPUT); // Светодиод RED
pinMode(GREEN_PIN, OUTPUT); // Светодиод GREEN
pinMode(BLUE_PIN, OUTPUT); // Светодиод BLUE
pinMode(VALVE_LPG, INPUT); // Пин сигнального напряжения электромагнитного клапана газового редуктора. Необходима подтяжка к GND через внешний резистор 10 кОм (!!! НЕ БОЛЕЕ 5-и ВОЛЬТ !!!)
pinMode(SIGNAL_PIN, INPUT); // Пин сигнального напряжения от замка зажигания. Необходима подтяжка к GND через внешний резистор 10 кОм (!!! НЕ БОЛЕЕ 5-и ВОЛЬТ !!!)
pinMode(RELAY_PIN, OUTPUT); // Пин реле настраиваем как выход
if (data.relayType) digitalWrite(RELAY_PIN, HIGH); // Выход пина реле изначально высокого уровня (HIGH) для реле low level,
else digitalWrite(RELAY_PIN, LOW); // ... либо низкого уровня (low) для реле high level
pinMode(TACH_PIN, INPUT); // Сигнальный пин датчика скорости тянем к VCC через внешний резистор 4,7 кОм (!!! НЕ БОЛЕЕ 5-и ВОЛЬТ !!!)
//tacho.setWindow(20); // установка количества тиков для счёта времени (по умолчанию 10)
//tacho.setTimeout(2000); // таймаут прерываний (мс), после которого считается что вращение датчика скорости прекратилось
attachInterrupt(1, isr, FALLING); // Подключаем прерывания для нормального подсчета импульсов с датчика скорости
Serial3.begin(GPS_UART); // Скорость шины UART в зависимости от настроек GPS модуля.
//Serial3.setTimeout(100); // Таймаут ожидания данных
//gps.begin(Serial3); // Инициируем расшифровку строк NMEA указав объект используемой шины UART
//gps.timeZone(data.timeZone); // Часовой пояс
//gps.timeOut(1000); // Читать данные GPS не дольше миллисекунд с момента обращения к функции gps.read().
attachInterrupt(0, isr2, FALLING); // Подключаем одну кнопку на аппаратные прерывания (на всякий случай, чтобы была возможность обработать нажатие кнопки /смена скрина/ в очень загруженной ситуации)
LightSensor.begin(); // Датчик освещенности
Wire.begin();
rtc.begin();
if (rtc.isReset()) rtc.setBuildTime(); // Если был сброс питания RTC, тогда установить время последней компиляции прошивки
//*******************************************************************************************************************************************************************************************************************
memory.begin(0, 'w'); // Сменить здесь букву в кавычках на любую другую латинскую букву и прошить Arduino, если не получается сбросить настройки через устройство *
//*******************************************************************************************************************************************************************************************************************
ds.requestTemp(); // первый запрос на измерение температуры датчика 1
ds2.requestTemp(); // первый запрос на измерение температуры датчика 2
ds3.requestTemp(); // первый запрос на измерение температуры датчика 3
ds4.requestTemp(); // первый запрос на измерение температуры датчика 4
ds5.requestTemp(); // первый запрос на измерение температуры датчика 5
oled.init(); // Инициализация дисплея
if (data.autoBrightness) oled.setContrast(data.minBright); // Установка первоначальной яркости дисплея
else oled.setContrast(data.f);
// Для повышения помехозащищенности INA226 имеет возможность настроить время выборки напряжения и тока
// INA226 будет захватывать "кусок" сигнала выбранной продолжительности, что повысит точность на шумном сигнале
// По умолчанию выборка занимает 1100 мкс, но может быть изменена методом .setSampleTime(канал, время);
// Варианты времени выборки см. в таблице (файл INA226.h)
ina.setSampleTime(INA226_VBUS, INA226_CONV_2116US); // Время выборки напряжения (INA датчика уровня газа)
ina.setSampleTime(INA226_VSHUNT, INA226_CONV_8244US); // Время выборки тока (INA датчика уровня газа)
ina2.setSampleTime(INA226_VBUS, INA226_CONV_2116US); // Время выборки напряжения (INA АКБ)
ina2.setSampleTime(INA226_VSHUNT, INA226_CONV_8244US); // Время выборки тока (INA АКБ)
// Так же имеется возможность использовать встроенное усреднение выборок
// Усреднение применяется и для напряжения и для тока и пропорционально увеличивает время оцифровки
// Рекомендуется на шумной нагрузке, устанавливается методом .setAveraging(кол-во усреднений) (см. таблицу в INA226.h)
ina.setAveraging(INA226_AVG_X4); // 4х кратное усреднение
ina2.setAveraging(INA226_AVG_X4); // 4х кратное усреднение
viewScreensaver(); // Показывать приветствие при запуске устройства (будет отображаться то, что включено для показа в настройках)
//_________________________________________________________________________________________________________________________________________________________
float lpg = ((data.b - data.a) / (data.c / data.lpgLiters) + data.a) * 1000; // Вичисляем приблизительный вольтаж при последнем сохраненном литраже (умножение на 1000 для избавления от float и ускорения вычислений)
for (byte i = 0; i < numReadings; i++) { // заполняем основной массив значениями вольтажа с датчика уровня газа первый раз...
if (data.saveLiters) readings[i] = lpg; // если включено сохранение значений литража...
else { // или ...
if (data.h == 1) readings[i] = ina.getVoltage() * 1000; // если трехконтактный датчик (по вольтажу)
else readings[i] = getVout() * 1000; // если двухконтактный датчик (по сопротивлению)
}
total += readings[i]; // суммируем все значения вольтажа
}
for (byte i = 0; i < numLuxArray; i++) { // заполняем первый раз массив датчика освещенности
luxArray[i] = LightSensor.GetLightIntensity();
totalLux += luxArray[i];
}
myFavoriteScreensSum = data.screen1 + data.screen2 + data.screen3 + data.screen4 + data.screen5 + data.screen6 + data.screen7 + data.screen8 + data.screen9 + data.screen10; // узнаем количество избранных скринов
speedLimitArr[0] = data.speedLimit1; // Заполняем массив ограничителей скорости
speedLimitArr[1] = data.speedLimit2;
speedLimitArr[2] = data.speedLimit3;
speedLimitArr[3] = 255; // 255 - это макс. значение для переменной типа uint8_t (здесь указано, как отсутствующий ограничитель, но по факту работает ограничение в 255 км/ч)
sensorPulseCoef = round(data.speedCorrection * data.sensorPulseNum / 6); // Узнаем коэффициент для вашего датчика скорости
increaseOdometer = 100.0 / (data.speedCorrection * 10); // Обновляем шаг одометра
counterSpeedSensor = data.counterSpdSens; // Начальное значение кол-ва импульсов с датчика скорости
getNameTemp1(); // Формируем названия датчиков температуры
getNameTemp2();
getNameTemp3();
getNameTemp4();
getNameTemp5();
if (data.change1 != 0 and data.odometer >= data.change1) {deep = 6; changeFlag = true;} // Проверяем, не просрочили ли с каким-то расходником...
else if (data.change2 != 0 and data.odometer >= data.change2) {deep = 6; changeFlag = true;} // если да, то выводим предупреждение на дисплей
else if (data.change3 != 0 and data.odometer >= data.change3) {deep = 6; changeFlag = true;}
else if (data.change4 != 0 and data.odometer >= data.change4) {deep = 6; changeFlag = true;}
else if (data.change5 != 0 and data.odometer >= data.change5) {deep = 6; changeFlag = true;}
if (changeFlag == true) {red = 255; green = 0; blue = 0; rgbFlag = true;} // Включается красный светодиод
if (changeFlag == true and data.warningSound == true) { // Также звучит предупреждающий сигнал
for (byte i = 0; i < 3; i++) {
toneAC (523, data.volumeSound, 120);
delay(50);
}
}
if (deep != 6) {
if (data.change1 != 0) {if (data.change1 - data.odometer <= 500 and data.change1 - data.odometer >= 1) changeRemindFlag = true;} // Если с расходниками не просрочили, то проверим как скоро нужно их менять...
else if (data.change2 != 0) {if (data.change2 - data.odometer <= 500 and data.change2 - data.odometer >= 1) changeRemindFlag = true;} // и если осталось 500 км или менее, то выводится восклицательный знак на дисплее
else if (data.change3 != 0) {if (data.change3 - data.odometer <= 500 and data.change3 - data.odometer >= 1) changeRemindFlag = true;}
else if (data.change4 != 0) {if (data.change4 - data.odometer <= 500 and data.change4 - data.odometer >= 1) changeRemindFlag = true;}
else if (data.change5 != 0) {if (data.change5 - data.odometer <= 500 and data.change5 - data.odometer >= 1) changeRemindFlag = true;}
}
}
//___________________________________________________________________________________________________________________________________________________________
void loop () { // ОСНОВНОЙ ЦИКЛ
joy_M.tick(); // тикеры кнопок или джойстика
joy_L.tick();
joy_R.tick();
joy_F.tick();
joy_B.tick();
memory.tick(); // тикер EEPROM
currentState = digitalRead(VALVE_LPG); // постоянно считываем состояние пина D4
if (currentState != previousState) { // при смене состояния пина D4 увеличиваем счетчик
countValveSwitch += 1;
previousState = currentState;
literInBalloonOledAlt = literInBalloonOled;
}
if (data.btnSound) {
if (joy_M.press() or joy_L.press() or joy_R.press() or joy_F.press() or joy_B.press()) toneAC(880, data.volumeSound, 40); // писк зуммером при нажатии кнопок / джойстика
}
if (rgbFlag) {rgbFlagAlt = false; color(red, green, blue);} // Мигание или простое свечение светодиодом в различных ситуациях
else if (rgbFlagAlt) {rgbFlag = false; color(red, green, blue);}
else color(0, 0, 0);
if (data.tempSensorForRelay != 0) relaySwitch(data.tempSensorForRelay); // Переключать реле вентилятора в зависимости от температуры
if (data.delayRelay) { // Если подключено реле задержки...
if (digitalRead(SIGNAL_PIN) == 0) { // и если замок зажигания выключили...
static uint32_t timing9; // запускаем таймер
if (millis() - timing9 >= 20000) {
timing9 = millis();
if (data.odometerOnOff) data.counterSpdSens = counterSpeedSensor; // сохраняем в переменную кол-во импульсов с датчика скорости (если нужно)
if (data.saveLiters) data.lpgLiters = literInBalloonOled; // сохраняем в переменную текущий литраж (если нужно)
memory.update(); // и заносим все сохраненные данные вместе с текущими показания одометра в EEPROM
flagSettingUpd = true;
red = 0; green = 255; blue = 0; // Для подтверждения моргнуть светодиодом
rgbFlagAlt = true;
}
}
}
if (data.autoBrightness) {
uint16_t brightDelay;
switch (data.brightTimeout) { // Скорость смены яркости в авто режиме:
case 1: brightDelay = 300; break; // slow
case 2: brightDelay = 150; break; // norm
case 3: brightDelay = 20; break; // fast
}
static uint32_t timing6;
if (millis() - timing6 >= brightDelay) {
timing6 = millis();
oled.setContrast(getAutoBrightDisplay(data.luxLimit)); // Яркость дисплея в режиме автояркости
}
}
static uint32_t timing5;
if (millis() - timing5 >= 100) {
timing5 = millis();
average = firstAverageVoltage(); // постоянно получаем среднее значение вольтажа с датчика уровня газа
}
if (flagDisplay) oled.setPower(0); // Дисплей вкл/выкл
else oled.setPower(1);
switch (deep) { // Структура вложенности меню устройства
case 0: display(); break; // Основной экран
case 1: menu(); break; // Меню
case 2: subMenu(pointerP1); break; // Подменю
case 3: setMenu(pointerP1, pointerP2); break; // Параметр меню
case 4: wiewInfoMenuParam(pointerP1, pointerP2); break; // Инфо по параметру меню
case 5: setNameParam(pointerP1, pointerP2); break; // Меню своих имен/названий
case 6: warningMsg(); break; // Предупреждение о замене расходников
case 7: getSonar(data.parktronicTempSens); break; // Парктроник
case 8: getManual(pointerP1, pointerP2); break; // Инструкция
case 9: getAcceleration(); break; // Окно замера разгона
case 10: stopwatch(); break; // Окно секундомера/таймера
}
if (data.parktronic) {
if (digitalRead(SONAR_PIN) == 1) deep = 7; // Переключаться на экран парктроника, если включена задняя передача
}
if (joy_M.hold()) { // Поведение при удержании кнопки M в разных ситуациях
switch (deep) {
case 0: pointerP1 = 0; deep = 1; break;
case 1:
case 2: myFavoriteScreensSum = data.screen1 + data.screen2 + data.screen3 + data.screen4 + data.screen5 + data.screen6 + data.screen7 + data.screen8 + data.screen9 + data.screen10; // Обновляем количество избранных скринов на случай смены их кол-ва в настройках
pointerP1 = 0; deep = 0;
if(data.odometer2Reset) {
data.odometer2 = 0;
data.odometer2Reset = 0;
}
if(data.z) {
memory.reset();
flagSettingReset = true;
red = 0; green = 255; blue = 0;
rgbFlagAlt = true;
} else {
if (data.dateSource and data.y) {
rtc.setTime(data.t, data.u, data.v, data.w, data.x, 0); // записать дату / время в память если используется DS3231
data.y = 0;
}
memory.update();
flagSettingUpd = true;
red = 0; green = 255; blue = 0;
rgbFlagAlt = true;
}
break;
case 3: deep = 4; break;
}
}
if (joy_M.pressFor(3500)) deep = 9; // Удержание кнопки М 3,5 сек. включает окно замера разгона
if (joy_M.pressFor(5000)) deep = 10; // Удержание кнопки М 5 сек. включает окно секундомера/таймера
if (joy_M.click()) { // Нажатие на кнопку M на главном экране - вкл/откл дисплей
switch (deep) {
case 0: flagDisplay = !flagDisplay; break;
case 6: deep = 0; rgbFlag = false; break;
}
}
if (deep == 0) { // Нажатие кнопки R на дисплее с информацией переключает вид дисплея по кругу от меньшего к большему
if (joy_R.click()) {
byte counter = 0; // Временный счетчик, который формирует массив избранных скринов
byte allScreens[] = {data.screen1, data.screen2, data.screen3, data.screen4, data.screen5, data.screen6, data.screen7, data.screen8, data.screen9, data.screen10};// Массив всех скринов, что есть на устройстве
static uint8_t allScreensSum = sizeof(allScreens); // Количество всех скринов
myFavoriteScreensSum = data.screen1 + data.screen2 + data.screen3 + data.screen4 + data.screen5 + data.screen6 + data.screen7 + data.screen8 + data.screen9 + data.screen10; // Узнаем количество избранных скринов
byte myFavoriteScreens[myFavoriteScreensSum]; // Формируем массив ваших избранных скринов.
for (byte i = 0; i < allScreensSum; i++) {
if (allScreens[i]) {
myFavoriteScreens[counter] = i + 1;
counter += 1;
}
}
if (data.i == myFavoriteScreens[myFavoriteScreensSum - 1] or data.counter2 >= myFavoriteScreensSum - 1) data.counter2 = 0; // Цикл, который переключает избранные скрины по кругу
else data.counter2 += 1;
data.i = myFavoriteScreens[data.counter2];
ScreenNumber = true;
}
}
if (joy_L.click()) { // Действия по нажатию кнопки L
switch (deep) {
case 0:
byte counter = 0; // Временный счетчик, который формирует массив избранных скринов
byte allScreens[] = {data.screen1, data.screen2, data.screen3, data.screen4, data.screen5, data.screen6, data.screen7, data.screen8, data.screen9, data.screen10}; // Массив всех скринов, что есть на устройстве
static uint8_t allScreensSum = sizeof(allScreens); // Количество всех скринов
myFavoriteScreensSum = data.screen1 + data.screen2 + data.screen3 + data.screen4 + data.screen5 + data.screen6 + data.screen7 + data.screen8 + data.screen9 + data.screen10; // Узнаем количество избранных скринов
byte myFavoriteScreens[myFavoriteScreensSum]; // Формируем массив ваших избранных скринов.
for (byte i = 0; i < allScreensSum; i++) {
if (allScreens[i]) {
myFavoriteScreens[counter] = i + 1;
counter += 1;
}
}
if (data.i == myFavoriteScreens[0] or data.counter2 <= 0) data.counter2 = myFavoriteScreensSum - 1; // Цикл, который переключает избранные скрины по кругу
else data.counter2 -= 1;
data.i = myFavoriteScreens[data.counter2];
ScreenNumber = true;
break;
}
}
if (deep == 9) { // Выход из окна замера разгона
if (joy_L.click()) deep = 0;
}
if (deep == 0) { // Нажатие кнопки F на дисплее с информацией переключает яркость дисплея вверх (при ручной установке),
if (joy_F.click()) {
switch (data.autoBrightness) {
case 0:
if(data.f + data.bright > 255) data.f = 0;
else data.f += data.bright;
oled.setContrast(data.f);
flagBright = true;
red = data.f; green = data.f; blue = 0;
rgbFlagAlt = true;
break;
case 1: // либо переключается скорость отклика вверх (при автояркости)
if(data.brightTimeout == 3) data.brightTimeout = 1;
else data.brightTimeout += 1;
flagAutoBright = true;
switch (data.brightTimeout) {
case 1: red = 0; green = 255; blue = 0; break;
case 2: red = 255; green = 80; blue = 0; break;
case 3: red = 255; green = 0; blue = 0; break;
}
rgbFlagAlt = true;
break;
}
}
}
if (deep == 0) {
if (joy_B.click()) { // Нажатие кнопки B на дисплее с информацией переключает яркость дисплея вниз (при ручной установке),
switch (data.autoBrightness) {
case 0:
if(data.f - data.bright <= 0) data.f = 255;
else data.f -= data.bright;
oled.setContrast(data.f);
flagBright = true;
red = data.f; green = data.f; blue = 0;
rgbFlagAlt = true;
break;
case 1: // либо переключается скорость отклика вниз (при автояркости)
if(data.brightTimeout == 1) data.brightTimeout = 3;
else data.brightTimeout -= 1;
flagAutoBright = true;
switch (data.brightTimeout) {
case 1: red = 0; green = 255; blue = 0; break;
case 2: red = 255; green = 80; blue = 0; break;
case 3: red = 255; green = 0; blue = 0; break;
}
rgbFlagAlt = true;
break;
}
}
}
if (joy_B.hold()) { // Поведение при удержании кнопки B
switch (deep) {
case 0: data.autoBrightness = !data.autoBrightness; // На главном экране переключается режим яркость/автояркость
flagBrightMode = true;
switch (data.autoBrightness) {
case 0: red = 0; green = 0; blue = 255; break;
case 1: red = 0; green = 255; blue = 0; break;
}
rgbFlagAlt = true;
break;
case 10: deep = 0; break;
}
}
if (joy_F.hold()) { // Удержание кнопки F меняет скоростные лимиты
switch (deep) {
case 0: if(data.spdLimArrCount == 3) data.spdLimArrCount = 0;
else data.spdLimArrCount += 1;
speedLimitFlag = true;
switch (data.spdLimArrCount) {
case 0: red = 0; green = 0; blue = 255; break;
case 1: red = 255; green = 90; blue = 0; break;
case 2: red = 255; green = 15; blue = 0; break;
case 3: red = 0; green = 255; blue = 0; break;
}
rgbFlagAlt = true;
break;
}
}
static uint32_t timing7;
if (data.autoBrightness == false and flagBright and !flagBrightTime) { // если нажали кнопку смены яркости (не в режиме автояркости)
timing7 = millis(); // засекаем время
flagBrightTime = true; // ставим флаг, чтобы время засекалось один раз
}
if (data.autoBrightness == true and flagAutoBright and !flagBrightTime) { // если нажали кнопку смены яркости (в режиме автояркости)
timing7 = millis();
flagBrightTime = true;
}
if (ScreenNumber && !flagBrightTime) { // если нажали кнопку смены скрина
timing7 = millis();
flagBrightTime = true;
}
if (flagBrightMode and !flagBrightTime) { // если меняем режим яркости
timing7 = millis();
flagBrightTime = true;
}
if (flagSettingUpd and !flagBrightTime) { // если обновляем настройки в EEPROM
timing7 = millis();
flagBrightTime = true;
}
if (resetOdoFlag and !flagBrightTime) { // если обнуляем одометр 2
timing7 = millis();
flagBrightTime = true;
}
if (flagSettingReset and !flagBrightTime) { // если сбросили настройки по-умолчанию
timing7 = millis();
flagBrightTime = true;
}
if (speedLimitFlag and !flagBrightTime) { // если сменили лимит скорости
timing7 = millis();
flagBrightTime = true;
}
if (flagBrightTime && millis() - timing7 >= 1500) { // проверяем, прошло ли заданное время работы
flagBright = false; // убираем флаги
flagAutoBright = false;
ScreenNumber = false;
flagBrightTime = false;
flagBrightMode = false;
flagSettingUpd = false;
flagSettingReset = false;
resetOdoFlag = false;
speedLimitFlag = false;
rgbFlagAlt = false;
}
if(flagBrightTime) { // Не убирать анимацию, если одну из кнопок нажали еще раз во время отсчета таймера
if(joy_L.click() or joy_R.click() or joy_F.click() or joy_B.click() or joy_B.hold() or joy_L.hold() or joy_R.hold() or joy_F.hold()) {
timing7 = millis();
flagBrightTime = true;
}
}
}
void display() { // ОСНОВНЫЕ СКРИНЫ
oled.clear();
Datime dt = rtc; // Получаем дату/время с модуля часов DS3231
static uint32_t timing2;
switch (data.i) { // Условие, когда нужно рассчитывать остаток газа в литрах
case 1:
case 2:
case 3:
case 4:
case 10: if (millis() - timing2 >= data.e) { // задержка опроса датчика
timing2 = millis();
if (data.valveSignal) {
if (currentState == 0) {
if (countValveSwitch == 0) literInBalloonOled = data.lpgLiters;
else literInBalloonOled = literInBalloonOledAlt;
} else {
literInBalloonOled = getLiterInBalloon(averageVoltage());
}
} else {
literInBalloonOled = getLiterInBalloon(averageVoltage());
}
}
break;
case 6: if (data.scr1 == 2 or data.scr2 == 2 or data.scr3 == 2 or data.scr4 == 2) {
if (millis() - timing2 >= data.e) { // задержка опроса датчика
timing2 = millis();
if (data.valveSignal) {
if (currentState == 0) {
if (countValveSwitch == 0) literInBalloonOled = data.lpgLiters;
else literInBalloonOled = literInBalloonOledAlt;
} else {
literInBalloonOled = getLiterInBalloon(averageVoltage());
}
} else {
literInBalloonOled = getLiterInBalloon(averageVoltage());
}
}
}
break;
}
static uint32_t gpsDataDelay; // Задержка обновления данных с GPS модуля (мс)
switch (data.i) { // Период обновления данных с GPS модуля в зависимости от отображаемой информации на дисплее
case 1:
case 2:
case 3:
case 4:
if (data.dateSource == 0) {if (data.m or data.n) gpsDataDelay = 30000; else gpsDataDelay = 1000000000;}
else gpsDataDelay = 1000000000;
break;
case 5: gpsDataDelay = 1000000000; break;
case 6:
if (data.dateSource == 0) {if (data.scr1 == 1 or data.scr2 == 1 or data.scr3 == 1 or data.scr4 == 1) gpsDataDelay = 30000; else gpsDataDelay = 1000000000;}
else gpsDataDelay = 1000000000;
if (data.scr1 == 9 or data.scr2 == 9 or data.scr3 == 9 or data.scr4 == 9) {if (data.miniScrSpdMode) gpsDataDelay = 1000000000; else gpsDataDelay = data.gpsSpeedUpd;}
break;
case 7: gpsDataDelay = data.gpsSpeedUpd; break;
case 8:
case 9:
case 10: gpsDataDelay = 1000000000; break;
}
/*static uint32_t timing8;
if (millis() - timing8 >= gpsDataDelay) { // Читать GPS данные каждые gpsDataDelay миллисекунд
timing8 = millis();
gps.read();
}*/
switch (data.i) { // Условие, когда нужно формировать названия датчиков температур DS18b20
case 1:
case 2:
case 3:
case 4: if(data.l) getNameTemp1(); break;
case 5: getNameTemp1(); getNameTemp2(); getNameTemp3(); getNameTemp4(); getNameTemp5(); break;
case 6: if(data.scr1 == 4 or data.scr1 == 5 or data.scr1 == 6 or data.scr1 == 7 or data.scr1 == 8 or data.scr2 == 4 or data.scr2 == 5 or data.scr2 == 6 or data.scr2 == 7 or data.scr2 == 8 or data.scr3 == 4 or data.scr3 == 5 or data.scr3 == 6 or data.scr3 == 7 or data.scr3 == 8 or data.scr4 == 4 or data.scr4 == 5 or data.scr4 == 6 or data.scr4 == 7 or data.scr4 == 8) {
getNameTemp1(); getNameTemp2(); getNameTemp3(); getNameTemp4(); getNameTemp5();}
break;
}
switch (data.i) { // Условие, когда нужно вычислять остаток в километрах
case 1:
case 2:
case 3:
case 4: if(data.j) kilometer = literInBalloonOled / data.d * 100; break;
case 6: if(data.scr1 == 3 or data.scr2 == 3 or data.scr3 == 3 or data.scr4 == 3) kilometer = literInBalloonOled / data.d * 100; break;
}
if (relayFlag) { // Показывать иконку вентилятора, если реле активно
switch (data.i) {
case 1: oled.drawBitmap(97, 15, cooler, 7, 7); break;
case 2: oled.drawBitmap(121, 15, cooler, 7, 7); break;
case 3: oled.drawBitmap(0, 15, cooler, 7, 7); break;
case 4: oled.drawBitmap(121, 15, cooler, 7, 7); break;
case 5: oled.drawBitmap(114, 1, coolerBig, 13, 13); break;
case 7: oled.drawBitmap(76, 0, cooler, 7, 7); break;
case 8: oled.drawBitmap(83, 0, cooler, 7, 7); break;
}
}
if (changeFlag) { // Показывать иконку капли, если расходники не заменены
switch (data.i) {
case 1: oled.drawBitmap(98, 42, drop, 5, 7); break;
case 2: oled.drawBitmap(122, 38, drop, 5, 7); break;
case 3: oled.drawBitmap(1, 35, drop, 5, 7); break;
case 4: oled.drawBitmap(122, 32, drop, 5, 7); break;
case 5: oled.drawBitmap(100, 1, dropBig, 9, 13); break;
case 7: oled.drawBitmap(69, 0, drop, 5, 7); break;
case 8: oled.drawBitmap(75, 0, drop, 5, 7); break;
}
}
if (changeRemindFlag) { // Показывать восклицательный знак, если до замены расходников осталось не более 500 км
oled.setScale(1);
switch (data.i) {
case 1: oled.drawBitmap(98, 42, attention, 5, 7); break;
case 2: oled.drawBitmap(122, 38, attention, 5, 7); break;
case 3: oled.drawBitmap(1, 35, attention, 5, 7); break;
case 4: oled.drawBitmap(122, 32, attention, 5, 7); break;
case 5: oled.drawBitmap(101, 1, attentionBig, 8, 13); break;
case 7: oled.drawBitmap(69, 0, attention, 5, 7); break;
case 8: oled.drawBitmap(75, 0, attention, 5, 7); break;
}
}
//____________________________________________________________________________________________________________________
oled.setScale(1);
static uint32_t timing4;
if (data.k) { // напряжение акб
switch (data.i) {
case 1:
case 2:
case 4:
oled.setCursorXY(98, 56);
if (millis() - timing4 >= 100) {timing4 = millis(); oled.print(averageBatteryVoltage(), 1);} // задержка опроса
oled.setCursorXY(123, 56);
break;
case 3:
if (data.rectOnOff) {whiteRectangle(88, 51, 127, 61, data.rect); if (data.rect) oled.textMode(1);}
oled.setCursorXY(90, 53);
if (millis() - timing4 >= 100) {timing4 = millis(); oled.print(averageBatteryVoltage(), 1);} // задержка опроса
oled.setCursorXY(121, 53);
break;
}
if (data.i == 1 or data.i == 2 or data.i == 3 or data.i == 4) {
switch (data.langInterface) {
case 1:
case 2: oled.print(F("В")); break;
case 3: oled.print(F("V")); break;
}
oled.textMode(0);
}
} else {
if (data.i == 3) {
if (data.rectOnOff) whiteRectangle(88, 51, 127, 61, data.rect);
}
}
//____________________________________________________________________________________________________________________
if (data.l) { // температура с датчиков
switch (data.i) {
case 1:
case 2:
case 4:
oled.setCursorXY(0, 56);
oled.print(getTempDS(), 1);
if (getTempDS() >= 100 or getTempDS() <= -10) oled.setCursorXY(31, 56);
else oled.setCursorXY(25, 56);
break;
case 3:
if (data.rectOnOff) {
whiteRectangle(88, 34, 127, 44, data.rect);
if (data.rect) oled.textMode(1);
}
oled.setCursorXY(90, 36);
oled.print(getTempDS(), 1);
oled.setCursorXY(121, 36);
break;
case 5:
switch (data.langInterface) {
case 1:
case 2: oled.drawBitmap(0, 0, temp_ukr, 90, 14); break;
case 3: oled.drawBitmap(0, 0, temp_en, 90, 14); break;
}
oled.line(0, 16, 128, 16);
oled.setScale(1);
oled.setCursorXY(0, 20);
oled.print(myTemp1);
oled.setCursorXY(82, 20);
oled.print(getTempDS(), 1); // Датчик 1
oled.setCursorXY(0, 29);
oled.print(myTemp2);
oled.setCursorXY(82, 29);
oled.print(getTempDS2(), 1); // Датчик 2
oled.setCursorXY(0, 38);
oled.print(myTemp3);
oled.setCursorXY(82, 38);
oled.print(getTempDS3(), 1); // Датчик 3
oled.setCursorXY(0, 47);
oled.print(myTemp4);
oled.setCursorXY(82, 47);
oled.print(getTempDS4(), 1); // Датчик 4
oled.setCursorXY(0, 56);
oled.print(myTemp5);
oled.setCursorXY(82, 56);
oled.print(getTempDS5(), 1); // Датчик 5
for (byte i = 0; i < 5; i++) {
oled.setCursorXY(122, i * 9 + 20);
oled.print(F("C"));
}
break;
}
if (data.i == 1 or data.i == 2 or data.i == 3 or data.i == 4) oled.print(F("C"));
oled.textMode(0);
} else {
if (data.i == 3) {
if (data.rectOnOff) whiteRectangle(88, 34, 127, 44, data.rect);
}
}
//____________________________________________________________________________________________________________________
if (data.dateSource) {
switch (dt.weekDay) { // дни недели
case 1:
switch (data.langInterface) {
case 1:
case 2: weekday = F("ПH"); break;
case 3: weekday = F("MO"); break;
}
break;
case 2:
switch (data.langInterface) {
case 1:
case 2: weekday = F("ВТ"); break;
case 3: weekday = F("TU"); break;
}
break;
case 3:
switch (data.langInterface) {
case 1:
case 2: weekday = F("СР"); break;
case 3: weekday = F("WE"); break;
}
break;
case 4:
switch (data.langInterface) {
case 1:
case 2: weekday = F("ЧТ"); break;
case 3: weekday = F("TH"); break;
}
break;
case 5:
switch (data.langInterface) {
case 1:
case 2: weekday = F("ПТ"); break;
case 3: weekday = F("FR"); break;
}
break;
case 6:
switch (data.langInterface) {
case 1:
case 2: weekday = F("СБ"); break;
case 3: weekday = F("SA"); break;
}
break;
case 7:
switch (data.langInterface) {
case 1: weekday = F("ВС"); break;
case 2: weekday = F("НД"); break;
case 3: weekday = F("SU"); break;
}
break;
}
}
if (data.n) { // дата
switch (data.i) {
case 1:
case 2:
case 4:
oled.setCursorXY(0, 0);
if(data.dateSource) oled.print(weekday);
else {
switch (data.langInterface) {
//case 1: oled.print(wd_ru[gps.weekday]); break;
//case 2: oled.print(wd_ukr[gps.weekday]); break;
//case 3: oled.print(wd_en[gps.weekday]); break;
}
}
oled.setCursorXY(24, 0);
break;
case 3:
if (data.rectOnOff) {
whiteRectangle(19, 0, 83, 10, data.rect);
whiteRectangle(0, 0, 14, 10, data.rect);
if (data.rect) oled.textMode(1);
}
oled.setCursorXY(2, 2);
if(data.dateSource) oled.print(weekday);
else {
switch (data.langInterface) {
//case 1: oled.print(wd_ru[gps.weekday]); break;
//case 2: oled.print(wd_ukr[gps.weekday]); break;
//case 3: oled.print(wd_en[gps.weekday]); break;
}
}
oled.setCursorXY(22, 2);
break;
case 10:
oled.setCursorXY(0, 56);
if(data.dateSource) oled.print(weekday);
else {
switch (data.langInterface) {
//case 1: oled.print(wd_ru[gps.weekday]); break;
//case 2: oled.print(wd_ukr[gps.weekday]); break;
//case 3: oled.print(wd_en[gps.weekday]); break;
}
}
oled.setCursorXY(18, 56);
break;
}
if (data.i == 1 or data.i == 2 or data.i == 4) {
switch (data.dateSource) {
/*case 0:
if (gps.day < 10) {oled.print(0); oled.setCursorXY(30, 0);}
oled.print(gps.day);
oled.setCursorXY(37, 0);
oled.print(F("."));
oled.setCursorXY(42, 0);
if (gps.month < 10) {oled.print(0); oled.setCursorXY(48, 0);}
oled.print(gps.month);
oled.setCursorXY(55, 0);
oled.print(F("."));
oled.setCursorXY(60, 0);
if (data.yearCorrect) oled.print(data.t);
else oled.print(gps.Year);
break;*/
case 1: oled.print(rtc.dateToString()); break;
}
} else if (data.i == 3) {
switch (data.dateSource) {
/*case 0:
if (gps.day < 10) {oled.print(0); oled.setCursorXY(28, 2);}
oled.print(gps.day);
oled.setCursorXY(35, 2);
oled.print(F("."));
oled.setCursorXY(40, 2);
if (gps.month < 10) {oled.print(0); oled.setCursorXY(46, 2);}
oled.print(gps.month);
oled.setCursorXY(53, 2);
oled.print(F("."));
oled.setCursorXY(58, 2);
if (data.yearCorrect) oled.print(data.t);
else oled.print(gps.Year);
break;*/
case 1: oled.print(rtc.dateToString()); break;
}
} else if (data.i == 10) {
switch (data.dateSource) {
/*case 0:
if (gps.day < 10) {oled.print(0); oled.setCursorXY(24, 56);}
oled.print(gps.day);
oled.setCursorXY(31, 56);
oled.print(F("."));
oled.setCursorXY(36, 56);
if (gps.month < 10) {oled.print(0); oled.setCursorXY(42, 56);}
oled.print(gps.month);
oled.setCursorXY(49, 56);
oled.print(F("."));
oled.setCursorXY(54, 56);
if (data.yearCorrect) oled.print(data.t);
else oled.print(gps.Year);
break;*/
case 1: {oled.setCursorXY(18, 56); oled.print(rtc.dateToString());} break;
}
}
oled.textMode(0);
} else {
if (data.i == 3) {
if (data.rectOnOff) {
whiteRectangle(19, 0, 83, 10, data.rect);
whiteRectangle(0, 0, 14, 10, data.rect);
}
}
}
if (data.m) { // время
switch (data.i) {
case 1:
case 2:
case 4:
oled.setCursorXY(99, 0); break;
case 3:
if (data.rectOnOff) {whiteRectangle(88, 0, 127, 10, data.rect); if (data.rect) oled.textMode(1);}
oled.setCursorXY(94, 2);
break;
}
if (data.i == 1 or data.i == 2 or data.i == 4) {
switch (data.dateSource) {
/*case 0:
if (gps.Hours < 10) {oled.print(0); oled.setCursorXY(105, 0);}
oled.print(gps.Hours);
oled.setCursorXY(112, 0);
oled.print(F(":"));
oled.setCursorXY(117, 0);
if (gps.minutes < 10) {oled.print(0); oled.setCursorXY(123, 0);}
oled.print(gps.minutes);
break;*/
case 1:
if (dt.hour < 10) {oled.print(0); oled.setCursorXY(105, 0);}
oled.print(dt.hour);
oled.setCursorXY(112, 0);
oled.print(F(":"));
oled.setCursorXY(117, 0);
if (dt.minute < 10) {oled.print(0); oled.setCursorXY(123, 0);}
oled.print(dt.minute);
break;
}
} else if (data.i == 3) {
switch (data.dateSource) {
/*case 0:
if (gps.Hours < 10) {oled.print(0); oled.setCursorXY(100, 2);}
oled.print(gps.Hours);
oled.setCursorXY(107, 2);
oled.print(F(":"));
oled.setCursorXY(112, 2);
if (gps.minutes < 10) {oled.print(0); oled.setCursorXY(118, 2);}
oled.print(gps.minutes);
break;*/
case 1:
if (dt.hour < 10) {oled.print(0); oled.setCursorXY(100, 2);}
oled.print(dt.hour);
oled.setCursorXY(107, 2);
oled.print(F(":"));
oled.setCursorXY(112, 2);
if (dt.minute < 10) {oled.print(0); oled.setCursorXY(118, 2);}
oled.print(dt.minute);
break;
}
} else if (data.i == 10) {
uint8_t timeDigit[] = {0, 0, 0, 0};
oled.roundRect(62, 10, 65, 13, OLED_FILL);
oled.roundRect(62, 35, 65, 38, OLED_FILL);
switch (data.dateSource) {
/*case 0:
if (gps.Hours < 10) timeDigit[0] = 0;
else timeDigit[0] = gps.Hours / 10;
timeDigit[1] = gps.Hours % 10;
if (gps.minutes < 10) timeDigit[2] = 0;
else timeDigit[2] = gps.minutes / 10;
timeDigit[3] = gps.minutes % 10;
break;*/
case 1:
if (dt.hour < 10) timeDigit[0] = 0;
else timeDigit[0] = dt.hour / 10;
timeDigit[1] = dt.hour % 10;
if (dt.minute < 10) timeDigit[2] = 0;
else timeDigit[2] = dt.minute / 10;
timeDigit[3] = dt.minute % 10;
break;
}
for (uint8_t i = 0; i <= 3; i++) {
switch (timeDigit[i]) {
case 0: zeroForClock(i); break;
case 1: oneForClock(i); break;
case 2: twoForClock(i); break;
case 3: threeForClock(i); break;
case 4: fourForClock(i); break;
case 5: fiveForClock(i); break;
case 6: sixForClock(i); break;
case 7: sevenForClock(i); break;
case 8: eightForClock(i); break;
case 9: nineForClock(i); break;
}
}
}
oled.textMode(0);
} else {
if (data.i == 3) {
if (data.rectOnOff) whiteRectangle(88, 0, 127, 10, data.rect);
}
}
//____________________________________________________________________________________________________________________
if (data.p) {
switch (data.i) { // уровень газа горизонтальный / вертикальный
case 1: gasLevelRect (2, 0, 14, 126, 48, 124, literInBalloonOled); break;
case 2: gasLevelRect (1, 0, 48, 127, 52, 0, literInBalloonOled); break;
case 3: gasLevelRect (1, 0, 51, 83, 61, 0, literInBalloonOled); break;
case 10: gasLevelRect (1, 85, 56, 127, 62, 0, literInBalloonOled); break;
}
}
//____________________________________________________________________________________________________________________
oled.setScale(3); // значение литража
switch (data.i) {
case 1:
if (literInBalloonOled < 10) oled.setCursorXY(27, 21);
else oled.setCursorXY(20, 21);
break;
case 2:
if (literInBalloonOled < 10) oled.setCursorXY(38, 19);
else oled.setCursorXY(30, 19);
break;
case 3:
if (literInBalloonOled < 10) oled.setCursorXY(15, 21);
else oled.setCursorXY(12, 21);
break;
case 4:
oled.setScale(1); oled.setCursorXY(17, 42); break;
}
if (data.i == 1 or data.i == 2 or data.i == 3 or data.i == 4) oled.print(literInBalloonOled, 1);
//____________________________________________________________________________________________________________________
iconBlink(); // иконка газовой колонки (когда газ заканчивается)
if (flagIcon) {
switch (data.i) {
case 1:
case 2:
case 4: gasStationIcon(1, 14); break;
case 3: gasStationIcon(73, 15); break;
}
}
//____________________________________________________________________________________________________________________
oled.setScale(1);
if (data.j) { // значение остатка в километрах
switch (data.i) {
case 1:
case 2:
case 4:
if (kilometer < 10) oled.setCursorXY(56, 56);
else if (kilometer >= 1000) oled.setCursorXY(44, 56);
else oled.setCursorXY(50, 56);
oled.print(kilometer);
oled.setCursorXY(69, 56);
break;
case 3:
if (data.rectOnOff) {whiteRectangle(88, 17, 127, 27, data.rect); if (data.rect) oled.textMode(1);}
oled.setCursorXY(90, 19);
oled.print(kilometer);
oled.setCursorXY(115, 19);
break;
}
if (data.i == 1 or data.i == 2 or data.i == 3 or data.i == 4) {
oled.print(F("KM"));
oled.textMode(0);
}
} else {
if (data.i == 3) {
if (data.rectOnOff) whiteRectangle(88, 17, 127, 27, data.rect);
}
}
//____________________________________________________________________________________________________________________
if (data.i == 4) { // Стрелочный указатель уровня газа
levelLenght = round((100 / data.c) * literInBalloonOled); // Процент заполненности бака газом
float arrow = 30.0; // Длина стрелки
if (levelLenght > 30 and levelLenght < 70 or levelLenght < 7) arrow = 24.0;
float startLineX = END_LINE_X + sin(radians(90.0 - (1.8 * (100 - levelLenght)))) * arrow;
float startLineY = END_LINE_Y - cos(radians(90.0 - (1.8 * (100 - levelLenght)))) * arrow;
oled.line(round(startLineX), round(startLineY), END_LINE_X, END_LINE_Y, OLED_FILL);
dotsIndicator(63, 46, 2); // начало стрелки
dotsIndicator(11, 46, 2); // 0%
dotsIndicator(12, 38, 0); // 5%
dotsIndicator(15, 31, 0); // 10%
dotsIndicator(20, 24, 0); // 15%
dotsIndicator(26, 19, 0); // 20%
dotsIndicator(32, 15, 1); // 25%
dotsIndicator(38, 15, 0); // 30%
dotsIndicator(44, 15, 0); // 35%
dotsIndicator(51, 15, 0); // 40%
dotsIndicator(57, 15, 0); // 45%
dotsIndicator(63, 15, 2); // 50%
dotsIndicator(69, 15, 0); // 55%
dotsIndicator(75, 15, 0); // 60%
dotsIndicator(82, 15, 0); // 65%
dotsIndicator(88, 15, 0); // 70%
dotsIndicator(94, 15, 1); // 75%
dotsIndicator(100, 19, 0); // 80%
dotsIndicator(106, 24, 0); // 85%
dotsIndicator(111, 31, 0); // 90%
dotsIndicator(114, 38, 0); // 95%
dotsIndicator(116, 46, 2); // 100%
}
//____________________________________________________________________________________________________________________
if (data.i == 6) { // Экран с мини-скринами
if (data.scr1 == 9 or data.scr2 == 9 or data.scr3 == 9 or data.scr4 == 9) {
if (joy_R.hold()) {
if(data.miniScrSpdMode == 1) data.miniScrSpdMode = 0;
else data.miniScrSpdMode += 1;
}
}
oled.line(0, 31, 127, 31);
oled.line(63, 0, 63, 63);
getMiniScreen(data.scr1, 1);
getMiniScreen(data.scr2, 2);
getMiniScreen(data.scr3, 3);
getMiniScreen(data.scr4, 4);
}
//____________________________________________________________________________________________________________________
if (data.i == 7) { // GPS
//if(gps.satellites[GPS_ACTIVE] != 0) sat = gps.satellites[GPS_ACTIVE];
oled.setScale(4);
oled.setCursorXY(1, 5);
oled.print(0);
oled.setScale(2);
oled.setCursorXY(82, 19);
switch (data.langInterface) {
case 1: oled.print(F("КМ/Ч")); break;
case 2: oled.print(F("КМ/Г")); break;
case 3: oled.print(F("KMPH")); break;
}
oled.setScale(1);
oled.setCursorXY(86, 0);
oled.print(F("GPS"));
oled.drawBitmap(106, 0, satellite, 7, 7);
oled.setCursorXY(117, 0);
oled.print(5);
oled.line(0, 39, 127, 39);
oled.setCursorXY(81, 44);
oled.print("12.34567");
oled.setCursorXY(81, 55);
oled.print("23.45678");
oled.line(76, 39, 76, 63);
oled.drawBitmap(57, 44, arrowUp, 7, 7);
oled.setCursorXY(49, 55);
oled.print("75.2");
oled.line(44, 39, 44, 63);
oled.setScale(2);
/*if (gps.speed > speedLimitArr[data.spdLimArrCount] + data.rightOfEntrance) {
oled.rect(0, 40, 43, 63, OLED_FILL);
if (data.speedLimitWarning == 1 or data.speedLimitWarning == 3) {
red = 255; green = 0; blue = 0;
rgbFlag = true;
}
if (data.speedLimitWarning == 2 or data.speedLimitWarning == 3) toneAC(600, data.volumeSound, 250, true);
oled.textMode(1);
} else if (gps.speed > speedLimitArr[data.spdLimArrCount] and gps.speed <= speedLimitArr[data.spdLimArrCount] + data.rightOfEntrance) {
oled.rect(0, 40, 43, 63, OLED_FILL);
if (data.speedLimitWarning == 1 or data.speedLimitWarning == 3) {
red = 255; green = 18; blue = 0;
rgbFlag = true;
}
oled.textMode(1);
} else rgbFlag = false;*/
if (speedLimitArr[data.spdLimArrCount] < 100) oled.setCursorXY(11, 46);
else if (speedLimitArr[data.spdLimArrCount] >= 100 and speedLimitArr[data.spdLimArrCount] < 255) oled.setCursorXY(5, 46);
if (speedLimitArr[data.spdLimArrCount] == 255) {
oled.setCursorXY(5, 46);
oled.print(F("---"));
} else oled.print(speedLimitArr[data.spdLimArrCount]);
oled.textMode(0);
}
//____________________________________________________________________________________________________________________
if (data.i == 8) { // Спидометр от датчика скорости
if (joy_L.hold()) {
data.odometer2 = 0;
memory.update();
resetOdoFlag = true;
red = 255; green = 25; blue = 0;
rgbFlagAlt = true;
}
oled.setCursorXY(1, 5);
oled.setScale(4);
static uint32_t timerSpeedSensor;
if (millis() - timerSpeedSensor > 100) {
timerSpeedSensor = millis();
oled.print(tacho.getRPM() / sensorPulseCoef);
}
oled.setScale(2);
oled.setCursorXY(82, 19);
switch (data.langInterface) {
case 1: oled.print(F("КМ/Ч")); break;
case 2: oled.print(F("КМ/Г")); break;
case 3: oled.print(F("KMPH")); break;
}
oled.setScale(1);
oled.setCursorXY(93, 0);
switch (data.langInterface) {
case 1:
case 2: oled.print(F("Датчик")); break;
case 3: oled.print(F("Sensor")); break;
}
oled.line(0, 39, 127, 39);
oled.setCursorXY(81, 44);
oled.print(data.odometer, 1);
oled.setCursorXY(81, 55);
oled.print(data.odometer2, 1);
oled.line(76, 39, 76, 63);
oled.setCursorXY(49, 43);
switch (data.langInterface) {
case 1:
case 2: oled.print(F("Темп")); break;
case 3: oled.print(F("Temp")); break;
}
oled.setCursorXY(49, 55);
oled.print(getTempDS(), 0);
oled.setCursorXY(67, 55);
oled.print(F("C"));
oled.line(44, 39, 44, 63);
oled.setScale(2);
if (tacho.getRPM() / sensorPulseCoef > speedLimitArr[data.spdLimArrCount] + data.rightOfEntrance) {
oled.rect(0, 40, 43, 63, OLED_FILL);
if (data.speedLimitWarning == 1 or data.speedLimitWarning == 3) {
red = 255; green = 0; blue = 0;
rgbFlag = true;
}
if (data.speedLimitWarning == 2 or data.speedLimitWarning == 3) toneAC(600, data.volumeSound, 250, true);
oled.textMode(1);
} else if (tacho.getRPM() / sensorPulseCoef > speedLimitArr[data.spdLimArrCount] and tacho.getRPM() / sensorPulseCoef <= speedLimitArr[data.spdLimArrCount] + data.rightOfEntrance) {
oled.rect(0, 40, 43, 63, OLED_FILL);
if (data.speedLimitWarning == 1 or data.speedLimitWarning == 3) {
red = 255; green = 18; blue = 0;
rgbFlag = true;
}
oled.textMode(1);
} else rgbFlag = false;
if (speedLimitArr[data.spdLimArrCount] < 100) oled.setCursorXY(11, 46);
else if (speedLimitArr[data.spdLimArrCount] >= 100 and speedLimitArr[data.spdLimArrCount] < 255) oled.setCursorXY(5, 46);
if (speedLimitArr[data.spdLimArrCount] == 255) {
oled.setCursorXY(5, 46);
oled.print(F("---"));
} else oled.print(speedLimitArr[data.spdLimArrCount]);
oled.textMode(0);
}
//____________________________________________________________________________________________________________________
if (data.i == 9) { // Скрин замены расходников
oled.setScale(2);
oled.setCursorXY(0, 0);
switch (data.langInterface) {
case 1: oled.print(F("ЗАМЕНА")); break;
case 2: oled.print(F("ЗАМIНА")); break;
case 3: oled.print(F("CHANGE")); break;
}
oled.line(74, 0, 74, 15);
oled.setScale(1);
oled.setCursorXY(79, 0);
oled.print(data.odometer, 1);
oled.line(0, 16, 128, 16);
oled.setCursorXY(0, 20);
switch (data.langInterface) { // Масло, фильтр
case 1: oled.print(F("Масло")); break;
case 2: oled.print(F("Олива")); break;
case 3: oled.print(F("Oil, filter")); break;
}
if (data.change1 != 0 and data.odometer >= data.change1) {
oled.rect(75, 19, 113, 27, OLED_FILL);
oled.textMode(1);
}
oled.setCursorXY(77, 20);
oled.print(data.change1);
oled.textMode(0);
oled.setCursorXY(0, 29);
switch (data.langInterface) { // Воздушный фильтр
case 1: oled.print(F("Воздушный")); break;
case 2: oled.print(F("Повiтряний")); break;
case 3: oled.print(F("Air filter")); break;
}
if (data.change2 != 0 and data.odometer >= data.change2) {
oled.rect(75, 28, 113, 36, OLED_FILL);
oled.textMode(1);
}
oled.setCursorXY(77, 29);
oled.print(data.change2);
oled.textMode(0);
oled.setCursorXY(0, 38);
switch (data.langInterface) { // ГБО (фильтры)
case 1: oled.print(F("Фильтры LPG")); break;
case 2: oled.print(F("Фiльтри LPG")); break;
case 3: oled.print(F("LPG filter")); break;
}
if (data.change3 != 0 and data.odometer >= data.change3) {
oled.rect(75, 37, 113, 45, OLED_FILL);
oled.textMode(1);
}
oled.setCursorXY(77, 38);
oled.print(data.change3);
oled.textMode(0);
oled.setCursorXY(0, 47);
switch (data.langInterface) { // Тормозная жидкость
case 1: oled.print(F("Тормоза")); break;
case 2: oled.print(F("Гальма")); break;
case 3: oled.print(F("Brake")); break;
}
if (data.change4 != 0 and data.odometer >= data.change4) {
oled.rect(75, 46, 113, 54, OLED_FILL);
oled.textMode(1);
}
oled.setCursorXY(77, 47);
oled.print(data.change4);
oled.textMode(0);
oled.setCursorXY(0, 56);
switch (data.langInterface) { // Регулировка клапанов
case 1: oled.print(F("Клапаны")); break;
case 2: oled.print(F("Клапани")); break;
case 3: oled.print(F("Valves")); break;
}
if (data.change5 != 0 and data.odometer >= data.change5) {
oled.rect(75, 55, 113, 63, OLED_FILL);
oled.textMode(1);
}
oled.setCursorXY(77, 56);
oled.print(data.change5);
oled.textMode(0);
for (byte i = 0; i < 5; i++) {
oled.setCursorXY(117, i * 9 + 20);
oled.print(F("KM"));
}
}
//____________________________________________________________________________________________________________________
if (data.r) {
if (data.i == 1 or data.i == 2 or data.i == 4) oled.line(0, 10, 127, 10); // горизонтальные линии
}
if (data.s) {
if (data.i == 1 or data.i == 2 or data.i == 4) oled.line(0, 52, 127, 52);
}
//____________________________________________________________________________________________________________________
if (data.screenNum or ScreenNumber) { // отображать на дисплее номер активного скрина в виде цифры
oled.circle(14, 14, 14, OLED_FILL);
oled.setScale(2);
if (data.i < 10) oled.setCursorXY(10, 7);
else oled.setCursorXY(3, 7);
oled.textMode(1);
oled.print(data.i);
oled.textMode(0);
}
if (data.luxDisplay) { // отображать на дисплее уровень Lux с датчика освещенности
oled.rect(97, 43, 127, 51, OLED_FILL);
oled.setScale(1);
oled.setCursorXY(98, 44);
oled.textMode(1);
oled.print(LightSensor.GetLightIntensity());
oled.textMode(0);
}
//_____________________________ВСПЛЫВАЮЩАЯ ГРАФИКА ПРИ НАЖАТИИ НА КНОПКИ______________________________________________
if (flagBright) { // Графический уровень яркости дисплея
oled.clear();
displayBrightLevel (1, 0, 0, 127, 10, data.f);
oled.setScale(3);
if (data.f < 10) oled.setCursorXY(55, 25);
else if (data.f < 100) oled.setCursorXY(46, 25);
else oled.setCursorXY(37, 25);
oled.print(data.f);
}
if (flagAutoBright) { // Режим автояркости графический
oled.clear();
oled.setScale(1);
oled.drawBitmap(0, 0, background, 128, 64);
oled.drawBitmap(11, 17, sun, 30, 32, 1);
switch (data.langInterface) {
case 1:
oled.setCursorXY(69, 19);
oled.print(F("АВТО"));
oled.setCursorXY(60, 29);
oled.print(F("ЯРКОСТЬ"));
break;
case 2:
oled.setCursorXY(69, 19);
oled.print(F("АВТО"));
oled.setCursorXY(51, 29);
oled.print(F("ЯСКРАВIСТЬ"));
break;
case 3:
oled.setCursorXY(69, 19);
oled.print(F("AUTO"));
oled.setCursorXY(51, 29);
oled.print(F("BRIGHTNESS"));
break;
}
switch (data.brightTimeout) {
case 1:
switch (data.langInterface) {
case 1: oled.setCursorXY(54, 39); break;
case 2: oled.setCursorXY(57, 39); break;
case 3: oled.setCursorXY(69, 39); break;
}
break;
case 2:
switch (data.langInterface) {
case 1: oled.setCursorXY(48, 39); break;
case 2: oled.setCursorXY(51, 39); break;
case 3: oled.setCursorXY(63, 39); break;
}
break;
case 3:
switch (data.langInterface) {
case 1: oled.setCursorXY(60, 39); break;
case 2: oled.setCursorXY(63, 39); break;
case 3: oled.setCursorXY(69, 39); break;
}
break;
}
oled.print(menuBrightSpeedNotification(data.brightTimeout));
oled.update();
}
if (flagBrightMode) { // Режим работы яркости (ручной/авто) графический
oled.clear();
oled.setScale(1);
oled.drawBitmap(0, 0, background, 128, 64);
oled.drawBitmap(11, 17, sun, 30, 32, 1);
switch (data.langInterface) {
case 1:
oled.setCursorXY(60, 21);
oled.print(F("ЯРКОСТЬ"));
break;
case 2:
oled.setCursorXY(51, 21);
oled.print(F("ЯСКРАВIСТЬ"));
break;
case 3:
oled.setCursorXY(51, 21);
oled.print(F("BRIGHTNESS"));
break;
}
switch (data.autoBrightness) {
case 0: oled.setCursorXY(63, 36); break;
case 1: oled.setCursorXY(69, 36); break;
}
oled.print(menuBrightMode(data.autoBrightness));
oled.update();
}
if (flagSettingUpd) { // Обновление данных в EEPROM
oled.clear();
oled.setScale(1);
oled.drawBitmap(0, 0, background, 128, 64);
oled.drawBitmap(11, 17, save, 30, 32, 1);
switch (data.langInterface) {
case 1:
oled.setCursorXY(54, 21);
oled.print(F("НАСТРОЙКИ"));
oled.setCursorXY(54, 36);
oled.print(F("ОБНОВЛЕНЫ"));
break;
case 2:
oled.setCursorXY(46, 21);
oled.print(F("НАЛАШТУВАННЯ"));
oled.setCursorXY(57, 36);
oled.print(F("ОНОВЛЕНО"));
break;
case 3:
oled.setCursorXY(57, 21);
oled.print(F("SETTINGS"));
oled.setCursorXY(60, 36);
oled.print(F("UPDATED"));
break;
}
oled.update();
}
if (flagSettingReset) { // Сброс настроек по-умолчанию
oled.clear();
oled.setScale(1);
oled.drawBitmap(0, 0, background, 128, 64);
oled.drawBitmap(11, 17, save, 30, 32, 1);
switch (data.langInterface) {
case 1:
oled.setCursorXY(54, 21);
oled.print(F("НАСТРОЙКИ"));
oled.setCursorXY(57, 36);
oled.print(F("СБРОШЕНЫ"));
break;
case 2:
oled.setCursorXY(46, 21);
oled.print(F("НАЛАШТУВАННЯ"));
oled.setCursorXY(60, 36);
oled.print(F("СКИНУТI"));
break;
case 3:
oled.setCursorXY(57, 21);
oled.print(F("SETTINGS"));
oled.setCursorXY(66, 36);
oled.print(F("RESET"));
break;
}
oled.update();
}
if (resetOdoFlag) { // Сброс одометра 2
oled.clear();
oled.setScale(1);
oled.drawBitmap(0, 0, background, 128, 64);
oled.drawBitmap(11, 17, zero, 30, 32, 1);
switch (data.langInterface) {
case 1:
oled.setCursorXY(60, 21);
oled.print(F("ОДОМЕТР"));
oled.setCursorXY(60, 36);
oled.print(F("ОБНУЛЁН"));
break;
case 2:
oled.setCursorXY(60, 21);
oled.print(F("ОДОМЕТР"));
oled.setCursorXY(57, 36);
oled.print(F("ОБНУЛЕНО"));
break;
case 3:
oled.setCursorXY(57, 21);
oled.print(F("ODOMETER"));
oled.setCursorXY(66, 36);
oled.print(F("RESET"));
break;
}
oled.update();
}
if (speedLimitFlag) { // Выбор лимита скорости
oled.clear();
oled.setScale(1);
oled.drawBitmap(0, 0, background, 128, 64);
oled.drawBitmap(11, 17, limit, 30, 32, 1);
switch (data.langInterface) {
case 1:
oled.setCursorXY(66, 19);
oled.print(F("ЛИМИТ"));
oled.setCursorXY(57, 29);
oled.print(F("СКОРОСТИ"));
if (speedLimitArr[data.spdLimArrCount] == 255) {
oled.setCursorXY(48, 39);
oled.print(F("ОТСУТСТВУЕТ"));
} else {
oled.setCursorXY(57, 39);
oled.print(speedLimitArr[data.spdLimArrCount]);
oled.setCursorXY(81, 39);
oled.print(F("КМ/Ч"));
}
break;
case 2:
oled.setCursorXY(66, 19);
oled.print(F("ЛIМIТ"));
oled.setCursorXY(54, 29);
oled.print(F("ШВИДКОСТI"));
if (speedLimitArr[data.spdLimArrCount] == 255) {
oled.setCursorXY(54, 39);
oled.print(F("ВIДСУТНIЙ"));
} else {
oled.setCursorXY(57, 39);
oled.print(speedLimitArr[data.spdLimArrCount]);
oled.setCursorXY(81, 39);
oled.print(F("КМ/Г"));
}
break;
case 3:
oled.setCursorXY(66, 19);
oled.print(F("SPEED"));
oled.setCursorXY(63, 29);
oled.print(F("LIMIT:"));
if (speedLimitArr[data.spdLimArrCount] == 255) {
oled.setCursorXY(57, 39);
oled.print(F("NO LIMIT"));
} else {
oled.setCursorXY(57, 39);
oled.print(speedLimitArr[data.spdLimArrCount]);
oled.setCursorXY(81, 39);
oled.print(F("KM/H"));
}
break;
}
oled.update();
}
//____________________________________________________________________________________________________________________
static uint32_t timing;
if (millis() - timing >= 100) { // обновлять дисплей каждые n миллисекунд (настроено на 10 обновлений в секунду)
timing = millis();
oled.update();
}
}
float getLiterInBalloon(float a) { // Расчет объема газа в баллоне и округление его значения до 0.5
float literInBalloon; // переменная, которая будет хранить текущий уровень газа в литрах
int literInBalloonX10NoFloat = round(data.c * (10 / (data.b - data.a) * (a - data.a))); // уровень газа в литрах * 10
uint8_t t = literInBalloonX10NoFloat % 10; // правила округления литража до 0,5
if (t < 3) t = 0;
if (t > 7) t = 10;
if (t >= 3 && t <= 7) t = 5;
literInBalloonX10NoFloat = literInBalloonX10NoFloat / 10 * 10 + t; // предварительное округление литража
literInBalloon = literInBalloonX10NoFloat / 10.0; // окончательное округление литража
if (literInBalloon > data.c) literInBalloon = data.c; // пара условий, чтобы литраж не выходил за рамки установленных значений
else if (literInBalloon < 0.5) literInBalloon = 0;
return literInBalloon; // возвращаем значение литража
}
void viewScreensaver() { // ЗАСТАВКА (ЭКРАН ПРИВЕТСТВИЯ)
if (data.logo) { // Отображать или нет логотип
oled.drawBitmap(0, 0, model, 128, 64);
oled.update();
melodyOn(data.melodyStart); // Играть мелодию
delay(1500 - soundDelay); // Отображать лого 1,5 секунды, либо пока играет мелодия (если её длительность превышает 1,5 сек.)
}
if (data.g) { // Отображать или нет всю остальную заставку
oled.clear();
myName.remove(0);
myName.reserve(20); // Формируем строку с вашим именем
myName += symbols[data.myName1];
myName += symbols[data.myName2];
myName += symbols[data.myName3];
myName += symbols[data.myName4];
myName += symbols[data.myName5];
myName += symbols[data.myName6];
myName += symbols[data.myName7];
myName += symbols[data.myName8];
myName += symbols[data.myName9];
myName += symbols[data.myName10];
myName.remove(myName.indexOf(" "));
uint8_t startName = middleLine(128, myName.length()); // Выравниваем строку с вашим именем по центру дисплея
oled.setScale(1);
oled.setCursor(47, 0);
switch (data.langInterface) { // Название шапки
case 1: oled.print(F("ПРИВЕТ")); break;
case 2: oled.print(F("ПРИВIТ")); break;
case 3: oled.print(F("HELLO!")); break;
}
oled.update();
delay(200);
oled.setScale(2);
if (startName < 0) {
oled.setCursorXY(62, 13); // Ваше имя, либо восклицательный знак, если длина имени превышает ширину дисплея
oled.print(F("!"));
} else {
oled.setCursorXY(startName, 13);
oled.print(myName);
}
oled.update();
soundDelay = 0;
if (data.logo == false) melodyOn(data.melodyStart); // Если лого отключено, то играть мелодию во время показа вашего имени...
if (soundDelay < 800) delay(800 - soundDelay); // ... и показывать имя 0,8 сек., либо пока играет мелодия (если её длительность превышает 0,8 сек)
oled.setScale(1);
oled.setCursorXY(99, 0);
oled.print(F("V"));
oled.setCursorXY(105, 0);
oled.print(SW_VERSION);
oled.setCursorXY(14, 38);
oled.print(F("GBO GAS in LITERS"));
oled.rect(5, 34, 122, 48, OLED_STROKE);
oled.update();
delay(1000);
oled.rect(5, 55, 122, 63, OLED_FILL);
oled.setCursorXY(23, 56);
oled.textMode(1);
oled.print(F("by Kalistratus"));
oled.textMode(0);
oled.update();
delay(1000);
}
}
void menu() { // МЕНЮ
if (joy_M.click() or joy_R.click()) { // Действие при нажатии кнопки R или кнопки M джойстика в основном меню
deep = 2;
pointerP2 = 0;
}
if (joy_F.click() or joy_F.holding()) { // Если кнопку F нажали или удерживают...
if (pointerP1 == 0) pointerP1 = ITEMS - 1; // двигаем указатель по пунктам меню вверх
else pointerP1 -= 1;
}
if (joy_B.click() or joy_B.holding()) { // Если кнопку B нажали или удерживают...
if (pointerP1 == ITEMS - 1) pointerP1 = 0;
else pointerP1 += 1;
}
if (joy_L.hold()) deep = 0; // Если кнопку L удерживают...
//__________________________________ПАРАМЕТРЫ МЕНЮ_______________________________________
oled.clear();
oled.rect(0, 0, 127, 8, OLED_FILL);
oled.setScale(1);
oled.setCursorXY(START_MENU_HEADER, 1); // Координаты шапки
oled.textMode(1);
switch (data.langInterface) { // Название шапки
case 1: oled.print(F("ГЛАВНОЕ МЕНЮ")); break;
case 2: oled.print(F("ГОЛОВНЕ МЕНЮ")); break;
case 3: oled.print(F("MAIN MENU")); break;
}
oled.setCursorXY(116, 1); // Положение указателя номера выбранного пункта меню
oled.print(pointerP1 + 1); // Указатель номера выбранного пункта меню
oled.textMode(0);
oled.setCursorXY(START_MENU_PARAM, 11);
if (pointerP1 < 6) { // Первая страница меню (максимум 18 символов в названии пункта меню)
switch (data.langInterface) { // Параметр 1 (ITEMS1)
case 1: oled.print(F("LPG настройки")); break;
case 2: oled.print(F("LPG налаштування")); break;
case 3: oled.print(F("LPG settings")); break;
}
oled.setCursorXY(START_MENU_PARAM, 20);
switch (data.langInterface) { // Параметр 2 (ITEMS2)
case 1: oled.print(F("Интерфейс")); break;
case 2: oled.print(F("Iнтерфейс")); break;
case 3: oled.print(F("Inteface")); break;
}
oled.setCursorXY(START_MENU_PARAM, 29);
switch (data.langInterface) { // Параметр 3 (ITEMS3)
case 1: oled.print(F("Избранные скрины")); break;
case 2: oled.print(F("Обранi скрiни")); break;
case 3: oled.print(F("Featured Screens")); break;
}
oled.setCursorXY(START_MENU_PARAM, 38);
switch (data.langInterface) { // Параметр 4 (ITEMS4)
case 1: oled.print(F("Яркость дисплея")); break;
case 2: oled.print(F("Яскравiсть дисплею")); break;
case 3: oled.print(F("Display brightness")); break;
}
oled.setCursorXY(START_MENU_PARAM, 47);
switch (data.langInterface) { // Параметр 5 (ITEMS5)
case 1: oled.print(F("Дата / время")); break;
case 2: oled.print(F("Дата / час")); break;
case 3: oled.print(F("Date / time")); break;
}
oled.setCursorXY(START_MENU_PARAM, 56);
switch (data.langInterface) { // Параметр 6 (ITEMS6)
case 1: oled.print(F("Мои названия")); break;
case 2: oled.print(F("Мо назви")); oled.drawBitmap(20, 56, ukr_i, 5, 7); break;
case 3: oled.print(F("My titles")); break;
}
} else if (pointerP1 < 12) { // Вторая страница меню
switch (data.langInterface) { // Параметр 1 (ITEMS7)
case 1: oled.print(F("Спидометр")); break;
case 2: oled.print(F("Спiдометр")); break;
case 3: oled.print(F("Speedometer")); break;
}
oled.setCursorXY(START_MENU_PARAM, 20);
switch (data.langInterface) { // Параметр 2 (ITEMS8)
case 1:
case 2: oled.print(F("Звук")); break;
case 3: oled.print(F("Sound")); break;
}
oled.setCursorXY(START_MENU_PARAM, 29);
switch (data.langInterface) { // Параметр 3 (ITEMS9)
case 1: oled.print(F("Расходники")); break;
case 2: oled.print(F("Витратнi матерiали")); break;
case 3: oled.print(F("Change")); break;
}
oled.setCursorXY(START_MENU_PARAM, 38);
switch (data.langInterface) { // Параметр 4 (ITEMS10)
case 1:
case 2: oled.print(F("Реле вентилятора")); break;
case 3: oled.print(F("Fan relay")); break;
}
oled.setCursorXY(START_MENU_PARAM, 47);
switch (data.langInterface) { // Параметр 5 (ITEMS11)
case 1: oled.print(F("Парктроник")); break;
case 2: oled.print(F("Парктронiк")); break;
case 3: oled.print(F("Parking")); break;
}
oled.setCursorXY(START_MENU_PARAM, 56);
switch (data.langInterface) { // Параметр 6 (ITEMS12)
case 1: oled.print(F("Сервис")); break;
case 2: oled.print(F("Сервiс")); break;
case 3: oled.print(F("Service")); break;
}
} else { // Третья страница меню
switch (data.langInterface) { // Параметр 1 (ITEMS13)
case 1: oled.print(F("Инструкция")); break;
case 2: oled.print(F("Iнструкцiя")); break;
case 3: oled.print(F("Manual")); break;
}
}
printPointer(pointerP1); // Вывод указателя
oled.update(); // Выводим кадр на дисплей
}
void subMenu(uint8_t num) { // МЕНЮ ПЕРВОГО УРОВНЯ ВЛОЖЕННОСТИ
if (joy_M.click() or joy_R.click()) { // Действия при нажатии кнопок M,R
if (pointerP1 == STRING_MENU_VALUE - 1 and pointerP2 == getITEMS(num) - 1) deep = 1;
else if (pointerP1 == STRING_MENU_VALUE - 1 and pointerP2 != getITEMS(num) - 1) { deep = 5; pointerP3 = 0; }
else if (pointerP1 == MANUAL_MENU_VALUE - 1 and pointerP2 == getITEMS(num) - 1) deep = 1;
else if (pointerP1 == MANUAL_MENU_VALUE - 1 and pointerP2 != getITEMS(num) - 1) { deep = 8; pointerP3 = 0; }
else if (pointerP2 == getITEMS(num) - 1) deep = 1;
else if (pointerP2 != getITEMS(num) - 1) deep = 3;
}
if (joy_F.click() or joy_F.holding()) { // Если кнопку F нажали или удерживают...
if (pointerP2 == 0) pointerP2 = getITEMS(num) - 1;
else pointerP2 -= 1;
}
if (joy_B.click() or joy_B.holding()) { // Если кнопку B нажали или удерживают...
if (pointerP2 == getITEMS(num) - 1) pointerP2 = 0;
else pointerP2 += 1;
}
if (joy_L.hold()) deep = 0;
if (joy_L.click()) deep = 1;
//__________________________________ПАРАМЕТРЫ МЕНЮ_______________________________________
oled.clear();
oled.rect(0, 0, 127, 8, OLED_FILL);
oled.setScale(1);
oled.textMode(1);
oled.setCursorXY(116, 1); // Положение указателя номера выбранного пункта меню
oled.print(pointerP2 + 1); // Указатель номера выбранного пункта меню
oled.setCursorXY(START_MENU_HEADER, 1); // Координаты шапки
switch (num) {
case 0: // Подменю первого пункта меню (максимум 18 символов в названии пункта меню)
switch (data.langInterface) { // Название шапки
case 1: oled.print(F("LPG НАСТРОЙКИ")); break;
case 2: oled.print(F("LPG НАЛАШТУВАННЯ")); break;
case 3: oled.print(F("LPG SETTINGS")); break;
}
oled.textMode(0);
if (pointerP2 < 6) { // Первая страница меню
oled.setCursorXY(START_MENU_PARAM, 11);
switch (data.langInterface) {
case 1: oled.print(F("Мин вольтаж LPG")); break;
case 2: oled.print(F("Мiн напруга LPG")); break;
case 3: oled.print(F("Min LPG voltage")); break;
}
oled.setCursorXY(START_MENU_PARAM, 20);
switch (data.langInterface) {
case 1: oled.print(F("Макс вольтаж LPG")); break;
case 2: oled.print(F("Макс напруга LPG")); break;
case 3: oled.print(F("Max LPG voltage")); break;
}
oled.setCursorXY(START_MENU_PARAM, 29);
switch (data.langInterface) {
case 1: oled.print(F("Объем баллона")); break;
case 2: oled.print(F("Об` м балона")); oled.drawBitmap(26, 29, ukr_e, 5, 7); break;
case 3: oled.print(F("Balloon volume")); break;
}
oled.setCursorXY(START_MENU_PARAM, 38);
switch (data.langInterface) {
case 1: oled.print(F("Расход газа")); break;
case 2: oled.print(F("Витрата газу")); break;
case 3: oled.print(F("Consumption")); break;
}
oled.setCursorXY(START_MENU_PARAM, 47);
switch (data.langInterface) {
case 1:
case 2: oled.print(F("Тип датчика LPG")); break;
case 3: oled.print(F("Sensor type")); break;
}
oled.setCursorXY(START_MENU_PARAM, 56);
switch (data.langInterface) {
case 1: oled.print(F("Частота обновления")); break;
case 2: oled.print(F("Частота оновлення")); break;
case 3: oled.print(F("Sensor update")); break;
}
} else { // Вторая страница меню
oled.setCursorXY(START_MENU_PARAM, 11);
switch (data.langInterface) {
case 1: oled.print(F("Напряжение пина 5V")); break;
case 2: oled.print(F("Напруга пiна 5V")); break;
case 3: oled.print(F("5V pin voltage")); break;
}
oled.setCursorXY(START_MENU_PARAM, 20);
switch (data.langInterface) {
case 1: oled.print(F("Напряжение АКБ")); break;
case 2: oled.print(F("Напруга АКБ")); break;
case 3: oled.print(F("Battery voltage")); break;
}
oled.setCursorXY(START_MENU_PARAM, 29);
switch (data.langInterface) {
case 1: oled.print(F("Сохранять литраж")); break;
case 2: oled.print(F("Зберiгати лiтраж")); break;
case 3: oled.print(F("Save LPG liters")); break;
}
oled.setCursorXY(START_MENU_PARAM, 38);
switch (data.langInterface) {
case 1:
case 2: oled.print(F("Сигнал клапана LPG")); break;
case 3: oled.print(F("LPG valve signal")); break;
}
oled.setCursorXY(START_MENU_PARAM, 47);
switch (data.langInterface) {
case 1: oled.print(F("Реле задержки")); break;
case 2: oled.print(F("Реле затримки")); break;
case 3: oled.print(F("Delay off relay")); break;
}
oled.setCursorXY(START_MENU_PARAM, 56);
switch (data.langInterface) {
case 1:
case 2: oled.print(F("...назад")); break;
case 3: oled.print(F("...back")); break;
}
}
break;
case 1: // Подменю второго пункта меню
switch (data.langInterface) { // Название шапки
case 1: oled.print(F("ИНТЕРФЕЙС")); break;
case 2: oled.print(F("IНТЕРФЕЙС")); break;
case 3: oled.print(F("INTERFACE")); break;
}
oled.textMode(0);
if (pointerP2 < 6) { // Первая страница меню
oled.setCursorXY(START_MENU_PARAM, 11);
switch (data.langInterface) {
case 1: oled.print(F("Экран приветствия")); break;
case 2: oled.print(F("Екран привiтання")); break;
case 3: oled.print(F("Screensaver")); break;
}
oled.setCursorXY(START_MENU_PARAM, 20);
switch (data.langInterface) {
case 1:
case 2: oled.print(F("Логотип авто")); break;
case 3: oled.print(F("Car logo")); break;
}
oled.setCursorXY(START_MENU_PARAM, 29);
switch (data.langInterface) {
case 1: oled.print(F("Остаток КМ")); break;
case 2: oled.print(F("Залишок КМ")); break;
case 3: oled.print(F("KM")); break;
}
oled.setCursorXY(START_MENU_PARAM, 38);
switch (data.langInterface) {
case 1: oled.print(F("Аккумулятор")); break;
case 2: oled.print(F("Акумулятор")); break;
case 3: oled.print(F("Battery")); break;
}
oled.setCursorXY(START_MENU_PARAM, 47);
switch (data.langInterface) {
case 1:
case 2: oled.print(F("Температура")); break;
case 3: oled.print(F("Temperature")); break;
}
oled.setCursorXY(START_MENU_PARAM, 56);
switch (data.langInterface) {
case 1: oled.print(F("Время")); break;
case 2: oled.print(F("Час")); break;
case 3: oled.print(F("Time")); break;
}
} else if (pointerP2 < 12) { // Вторая страница меню
oled.setCursorXY(START_MENU_PARAM, 11);
switch (data.langInterface) {
case 1:
case 2: oled.print(F("Дата")); break;
case 3: oled.print(F("Date")); break;
}
oled.setCursorXY(START_MENU_PARAM, 20);
switch (data.langInterface) {
case 1: oled.print(F("Символ уровня газа")); break;
case 2: oled.print(F("Символ рiвня газу")); break;
case 3: oled.print(F("Gas level icon")); break;
}
oled.setCursorXY(START_MENU_PARAM, 29);
switch (data.langInterface) {
case 1: oled.print(F("Ширина уровня газа")); break;
case 2: oled.print(F("Ширина рiвня газу")); break;
case 3: oled.print(F("Gas level width")); break;
}
oled.setCursorXY(START_MENU_PARAM, 38);
switch (data.langInterface) {
case 1: oled.print(F("Верхняя линия")); break;
case 2: oled.print(F("Верхня лiнiя")); break;
case 3: oled.print(F("Line top")); break;
}
oled.setCursorXY(START_MENU_PARAM, 47);
switch (data.langInterface) {
case 1: oled.print(F("Нижняя линия")); break;
case 2: oled.print(F("Нижня лiнiя")); break;
case 3: oled.print(F("Line bottom")); break;
}
oled.setCursorXY(START_MENU_PARAM, 56);
switch (data.langInterface) {
case 1: oled.print(F("Прямоуг-ки скрин 3")); break;
case 2: oled.print(F("Прямокут. скрiн 3")); break;
case 3: oled.print(F("Rectangle scr.3")); break;
}
} else if (pointerP2 < 18) { // Третья страница меню
oled.setCursorXY(START_MENU_PARAM, 11);
switch (data.langInterface) {
case 1: oled.print(F("Вид прямоуг-ов")); break;
case 2: oled.print(F("Вид прямокутникiв")); break;
case 3: oled.print(F("Rectangle type")); break;
}
oled.setCursorXY(START_MENU_PARAM, 20);
switch (data.langInterface) {
case 1: oled.print(F("Мини скрин 1")); break;
case 2: oled.print(F("Мiнi скрiн 1")); break;
case 3: oled.print(F("Mini screen 1")); break;
}
oled.setCursorXY(START_MENU_PARAM, 29);
switch (data.langInterface) {
case 1: oled.print(F("Мини скрин 2")); break;
case 2: oled.print(F("Мiнi скрiн 2")); break;
case 3: oled.print(F("Mini screen 2")); break;
}
oled.setCursorXY(START_MENU_PARAM, 38);
switch (data.langInterface) {
case 1: oled.print(F("Мини скрин 3")); break;
case 2: oled.print(F("Мiнi скрiн 3")); break;
case 3: oled.print(F("Mini screen 3")); break;
}
oled.setCursorXY(START_MENU_PARAM, 47);
switch (data.langInterface) {
case 1: oled.print(F("Мини скрин 4")); break;
case 2: oled.print(F("Мiнi скрiн 4")); break;
case 3: oled.print(F("Mini screen 4")); break;
}
oled.setCursorXY(START_MENU_PARAM, 56);
switch (data.langInterface) {
case 1: oled.print(F("Язык")); break;
case 2: oled.print(F("Мова")); break;
case 3: oled.print(F("Language")); break;
}
} else { // Четвертая страница меню
oled.setCursorXY(START_MENU_PARAM, 11);
switch (data.langInterface) {
case 1:
case 2: oled.print(F("...назад")); break;
case 3: oled.print(F("...back")); break;
}
}
break;
case 2: // Подменю третьего пункта меню
switch (data.langInterface) { // Название шапки
case 1: oled.print(F("ИЗБРАННЫЕ СКРИНЫ")); break;
case 2: oled.print(F("ОБРАНI СКРIНИ")); break;
case 3: oled.print(F("FEATURED SCREENS")); break;
}
oled.textMode(0);
if (pointerP2 < 6) { // Первая страница меню
oled.setCursorXY(START_MENU_PARAM, 11);
switch (data.langInterface) {
case 1: oled.print(F("Скрин 1")); break;
case 2: oled.print(F("Скрiн 1")); break;
case 3: oled.print(F("Screen 1")); break;
}
oled.setCursorXY(START_MENU_PARAM, 20);
switch (data.langInterface) {
case 1: oled.print(F("Скрин 2")); break;
case 2: oled.print(F("Скрiн 2")); break;
case 3: oled.print(F("Screen 2")); break;
}
oled.setCursorXY(START_MENU_PARAM, 29);
switch (data.langInterface) {
case 1: oled.print(F("Скрин 3")); break;
case 2: oled.print(F("Скрiн 3")); break;
case 3: oled.print(F("Screen 3")); break;
}
oled.setCursorXY(START_MENU_PARAM, 38);
switch (data.langInterface) {
case 1: oled.print(F("Скрин 4")); break;
case 2: oled.print(F("Скрiн 4")); break;
case 3: oled.print(F("Screen 4")); break;
}
oled.setCursorXY(START_MENU_PARAM, 47);
switch (data.langInterface) {
case 1: oled.print(F("Скрин 5")); break;
case 2: oled.print(F("Скрiн 5")); break;
case 3: oled.print(F("Screen 5")); break;
}
oled.setCursorXY(START_MENU_PARAM, 56);
switch (data.langInterface) {
case 1: oled.print(F("Скрин 6")); break;
case 2: oled.print(F("Скрiн 6")); break;
case 3: oled.print(F("Screen 6")); break;
}
} else { // Вторая страница меню
oled.setCursorXY(START_MENU_PARAM, 11);
switch (data.langInterface) {
case 1: oled.print(F("Скрин 7")); break;
case 2: oled.print(F("Скрiн 7")); break;
case 3: oled.print(F("Screen 7")); break;
}
oled.setCursorXY(START_MENU_PARAM, 20);
switch (data.langInterface) {
case 1: oled.print(F("Скрин 8")); break;
case 2: oled.print(F("Скрiн 8")); break;
case 3: oled.print(F("Screen 8")); break;
}
oled.setCursorXY(START_MENU_PARAM, 29);
switch (data.langInterface) {
case 1: oled.print(F("Скрин 9")); break;
case 2: oled.print(F("Скрiн 9")); break;
case 3: oled.print(F("Screen 9")); break;
}
oled.setCursorXY(START_MENU_PARAM, 38);
switch (data.langInterface) {
case 1: oled.print(F("Скрин 10")); break;
case 2: oled.print(F("Скрiн 10")); break;
case 3: oled.print(F("Screen 10")); break;
}
oled.setCursorXY(START_MENU_PARAM, 47);
switch (data.langInterface) {
case 1: oled.print(F("Номер скрина")); break;
case 2: oled.print(F("Номер скрiна")); break;
case 3: oled.print(F("Show screen num")); break;
}
oled.setCursorXY(START_MENU_PARAM, 56);
switch (data.langInterface) {
case 1:
case 2: oled.print(F("...назад")); break;
case 3: oled.print(F("...back")); break;
}
}
break;
case 3: // Подменю четвертого пункта меню
switch (data.langInterface) { // Название шапки
case 1: oled.print(F("ЯРКОСТЬ ДИСПЛЕЯ")); break;
case 2: oled.print(F("ЯСКРАВIСТЬ ДИСПЛЕЮ")); break;
case 3: oled.print(F("DISPLAY BRIGHTNESS")); break;
}
oled.textMode(0);
if (pointerP2 < 6) { // Первая страница меню
oled.setCursorXY(START_MENU_PARAM, 11);
switch (data.langInterface) {
case 1: oled.print(F("Автояркость")); break;
case 2: oled.print(F("Автояскравiсть")); break;
case 3: oled.print(F("Auto brightness")); break;
}
oled.setCursorXY(START_MENU_PARAM, 20);
switch (data.langInterface) {
case 1: oled.print(F("Уровень яркости")); break;
case 2: oled.print(F("Рiвень яскравостi")); break;
case 3: oled.print(F("Brightness lvl")); break;
}
oled.setCursorXY(START_MENU_PARAM, 29);
switch (data.langInterface) {
case 1: oled.print(F("Шаг яркости")); break;
case 2: oled.print(F("Крок яскравостi")); break;
case 3: oled.print(F("Brightness step")); break;
}
oled.setCursorXY(START_MENU_PARAM, 38);
switch (data.langInterface) {
case 1: oled.print(F("Мин автояркость")); break;
case 2: oled.print(F("Мiн автояскравiсть")); break;
case 3: oled.print(F("Min autobright")); break;
}
oled.setCursorXY(START_MENU_PARAM, 47);
switch (data.langInterface) {
case 1: oled.print(F("Макс автояркость")); break;
case 2: oled.print(F("Макс автояскрав-ть")); break;
case 3: oled.print(F("Max autobright")); break;
}
oled.setCursorXY(START_MENU_PARAM, 56);
switch (data.langInterface) {
case 1: oled.print(F("Режим автояркости")); break;
case 2: oled.print(F("Режим автояскр-тi")); break;
case 3: oled.print(F("Speed autobright")); break;
}
} else { // Вторая страница меню
oled.setCursorXY(START_MENU_PARAM, 11);
switch (data.langInterface) {
case 1: oled.print(F("Сдвиг автояркости")); break;
case 2: oled.print(F("Зрушення автояскр.")); break;
case 3: oled.print(F("Shift autobright")); break;
}
oled.setCursorXY(START_MENU_PARAM, 20);
switch (data.langInterface) {
case 1: oled.print(F("Буст автояркости")); break;
case 2: oled.print(F("Буст автояскрав-тi")); break;
case 3: oled.print(F("Boost autobright")); break;
}
oled.setCursorXY(START_MENU_PARAM, 29);
switch (data.langInterface) {
case 1: oled.print(F("Макс значение LUX")); break;
case 2: oled.print(F("Макс значення LUX")); break;
case 3: oled.print(F("Max LUX value")); break;
}
oled.setCursorXY(START_MENU_PARAM, 38);
switch (data.langInterface) {
case 1: oled.print(F("Показывать LUX")); break;
case 2: oled.print(F("Показувати LUX")); break;
case 3: oled.print(F("Show LUX value")); break;
}
oled.setCursorXY(START_MENU_PARAM, 47);
switch (data.langInterface) {
case 1:
case 2: oled.print(F("...назад")); break;
case 3: oled.print(F("...back")); break;
}
}
break;
case 4: // Подменю пятого пункта меню
switch (data.langInterface) { // Название шапки
case 1: oled.print(F("ДАТА / ВРЕМЯ")); break;
case 2: oled.print(F("ДАТА / ЧАС")); break;
case 3: oled.print(F("DATE / TIME")); break;
}
oled.textMode(0);
if (pointerP2 < 6) { // Первая страница меню
oled.setCursorXY(START_MENU_PARAM, 11);
switch (data.langInterface) {
case 1: oled.print(F("Часы")); break;
case 2: oled.print(F("Години")); break;
case 3: oled.print(F("Hours")); break;
}
oled.setCursorXY(START_MENU_PARAM, 20);
switch (data.langInterface) {
case 1: oled.print(F("Минуты")); break;
case 2: oled.print(F("Хвилини")); break;
case 3: oled.print(F("Minutes")); break;
}
oled.setCursorXY(START_MENU_PARAM, 29);
switch (data.langInterface) {
case 1: oled.print(F("Год")); break;
case 2: oled.print(F("Рiк")); break;
case 3: oled.print(F("Year")); break;
}
oled.setCursorXY(START_MENU_PARAM, 38);
switch (data.langInterface) {
case 1: oled.print(F("Месяц")); break;
case 2: oled.print(F("Мiсяць")); break;
case 3: oled.print(F("Month")); break;
}
oled.setCursorXY(START_MENU_PARAM, 47);
switch (data.langInterface) {
case 1:
case 2: oled.print(F("День")); break;
case 3: oled.print(F("Day")); break;
}
oled.setCursorXY(START_MENU_PARAM, 56);
switch (data.langInterface) {
case 1: oled.print(F("Установить время")); break;
case 2: oled.print(F("Встановити час")); break;
case 3: oled.print(F("Set date / time")); break;
}
} else { // Вторая страница меню
oled.setCursorXY(START_MENU_PARAM, 11);
switch (data.langInterface) {
case 1: oled.print(F("Часовой пояс")); break;
case 2: oled.print(F("Часовий пояс")); break;
case 3: oled.print(F("Time zone")); break;
}
oled.setCursorXY(START_MENU_PARAM, 20);
switch (data.langInterface) {
case 1: oled.print(F("Источник времени")); break;
case 2: oled.print(F("Джерело часу")); break;
case 3: oled.print(F("Date/time source")); break;
}
oled.setCursorXY(START_MENU_PARAM, 29);
switch (data.langInterface) {
case 1: oled.print(F("Коррекция года GPS")); break;
case 2: oled.print(F("Корекцiя року GPS")); break;
case 3: oled.print(F("GPS year correct.")); break;
}
oled.setCursorXY(START_MENU_PARAM, 38);
switch (data.langInterface) {
case 1:
case 2: oled.print(F("...назад")); break;
case 3: oled.print(F("...back")); break;
}
}
break;
case 5: // Подменю шестого пункта меню
switch (data.langInterface) { // Название шапки
case 1: oled.print(F("МОИ НАЗВАНИЯ")); break;
case 2: oled.print(F("МОI НАЗВИ")); break;
case 3: oled.print(F("MY TITLES")); break;
}
oled.textMode(0);
if (pointerP2 < 6) { // Первая страница меню
oled.setCursorXY(START_MENU_PARAM, 11);
switch (data.langInterface) {
case 1: oled.print(F("Ваше имя")); break;
case 2: oled.print(F("Ваше iм`я")); break;
case 3: oled.print(F("Your name")); break;
}
oled.setCursorXY(START_MENU_PARAM, 20);
switch (data.langInterface) {
case 1: oled.print(F("Датчик темпер-ры 1")); break;
case 2: oled.print(F("Датчик темпер-ри 1")); break;
case 3: oled.print(F("Temp sensor 1")); break;
}
oled.setCursorXY(START_MENU_PARAM, 29);
switch (data.langInterface) {
case 1: oled.print(F("Датчик темпер-ры 2")); break;
case 2: oled.print(F("Датчик темпер-ри 2")); break;
case 3: oled.print(F("Temp sensor 2")); break;
}
oled.setCursorXY(START_MENU_PARAM, 38);
switch (data.langInterface) {
case 1: oled.print(F("Датчик темпер-ры 3")); break;
case 2: oled.print(F("Датчик темпер-ри 3")); break;
case 3: oled.print(F("Temp sensor 3")); break;
}
oled.setCursorXY(START_MENU_PARAM, 47);
switch (data.langInterface) {
case 1: oled.print(F("Датчик темпер-ры 4")); break;
case 2: oled.print(F("Датчик темпер-ри 4")); break;
case 3: oled.print(F("Temp sensor 4")); break;
}
oled.setCursorXY(START_MENU_PARAM, 56);
switch (data.langInterface) {
case 1: oled.print(F("Датчик темпер-ры 5")); break;
case 2: oled.print(F("Датчик темпер-ри 5")); break;
case 3: oled.print(F("Temp sensor 5")); break;
}
} else { // Вторая страница меню
oled.setCursorXY(START_MENU_PARAM, 11);
switch (data.langInterface) {
case 1:
case 2: oled.print(F("...назад")); break;
case 3: oled.print(F("...back")); break;
}
}
break;
case 6: // Подменю седьмого пункта меню
switch (data.langInterface) { // Название шапки
case 1: oled.print(F("СПИДОМЕТР")); break;
case 2: oled.print(F("СПIДОМЕТР")); break;
case 3: oled.print(F("SPEEDOMETER")); break;
}
oled.textMode(0);
if (pointerP2 < 6) { // Первая страница меню
oled.setCursorXY(START_MENU_PARAM, 11);
switch (data.langInterface) {
case 1: oled.print(F("Лимит скорости 1")); break;
case 2: oled.print(F("Лiмiт швидкостi 1")); break;
case 3: oled.print(F("Speed limit 1")); break;
}
oled.setCursorXY(START_MENU_PARAM, 20);
switch (data.langInterface) {
case 1: oled.print(F("Лимит скорости 2")); break;
case 2: oled.print(F("Лiмiт швидкостi 2")); break;
case 3: oled.print(F("Speed limit 2")); break;
}
oled.setCursorXY(START_MENU_PARAM, 29);
switch (data.langInterface) {
case 1: oled.print(F("Лимит скорости 3")); break;
case 2: oled.print(F("Лiмiт швидкостi 3")); break;
case 3: oled.print(F("Speed limit 3")); break;
}
oled.setCursorXY(START_MENU_PARAM, 38);
switch (data.langInterface) {
case 1: oled.print(F("Обновление GPS")); break;
case 2: oled.print(F("Оновлення GPS")); break;
case 3: oled.print(F("GPS speed update")); break;
}
oled.setCursorXY(START_MENU_PARAM, 47);
switch (data.langInterface) {
case 1: oled.print(F("Датчик скорости")); break;
case 2: oled.print(F("Датчик швидкостi")); break;
case 3: oled.print(F("Speed sensor use")); break;
}
oled.setCursorXY(START_MENU_PARAM, 56);
switch (data.langInterface) {
case 1: oled.print(F("Кол-во импульсов")); break;
case 2: oled.print(F("Кiл-ть iмпульсiв")); break;
case 3: oled.print(F("Sensor impulse")); break;
}
} else if (pointerP2 < 12) { // Вторая страница меню
oled.setCursorXY(START_MENU_PARAM, 11);
switch (data.langInterface) {
case 1: oled.print(F("Сохранять одометр")); break;
case 2: oled.print(F("Зберiгати одометр")); break;
case 3: oled.print(F("Auto update odo")); break;
}
oled.setCursorXY(START_MENU_PARAM, 20);
switch (data.langInterface) {
case 1: oled.print(F("Общий пробег")); break;
case 2: oled.print(F("Загальний пробiг")); break;
case 3: oled.print(F("Total mileage")); break;
}
oled.setCursorXY(START_MENU_PARAM, 29);
switch (data.langInterface) {
case 1: oled.print(F("Сброс одометра")); break;
case 2: oled.print(F("Скидання одометра")); break;
case 3: oled.print(F("Reset odometer")); break;
}
oled.setCursorXY(START_MENU_PARAM, 38);
switch (data.langInterface) {
case 1: oled.print(F("Превышение скор-ти")); break;
case 2: oled.print(F("Перевищ-ня швид-тi")); break;
case 3: oled.print(F("Speeding")); break;
}
oled.setCursorXY(START_MENU_PARAM, 47);
switch (data.langInterface) {
case 1: oled.print(F("Допуст. превышение")); break;
case 2: oled.print(F("Допуст перевищення")); break;
case 3: oled.print(F("Permissible excess")); break;
}
oled.setCursorXY(START_MENU_PARAM, 56);
switch (data.langInterface) {
case 1: oled.print(F("Коррекция скорости")); break;
case 2: oled.print(F("Корекцiя швидкостi")); break;
case 3: oled.print(F("Speed correction")); break;
}
} else {
oled.setCursorXY(START_MENU_PARAM, 11);
switch (data.langInterface) {
case 1:
case 2: oled.print(F("...назад")); break;
case 3: oled.print(F("...back")); break;
}
}
break;
case 7: // Подменю восьмого пункта меню
switch (data.langInterface) { // Название шапки
case 1:
case 2: oled.print(F("ЗВУК")); break;
case 3: oled.print(F("SOUND")); break;
}
oled.textMode(0);
if (pointerP2 < 6) { // Первая страница меню
oled.setCursorXY(START_MENU_PARAM, 11);
switch (data.langInterface) {
case 1: oled.print(F("Мелодия")); break;
case 2: oled.print(F("Мелодiя")); break;
case 3: oled.print(F("Melody")); break;
}
oled.setCursorXY(START_MENU_PARAM, 20);
switch (data.langInterface) {
case 1:
case 2: oled.print(F("Звук кнопок")); break;
case 3: oled.print(F("Button sound")); break;
}
oled.setCursorXY(START_MENU_PARAM, 29);
switch (data.langInterface) {
case 1: oled.print(F("Звук предупрежд-ий")); break;
case 2: oled.print(F("Звук попереджень")); break;
case 3: oled.print(F("Warning sound")); break;
}
oled.setCursorXY(START_MENU_PARAM, 38);
switch (data.langInterface) {
case 1: oled.print(F("Громкость")); break;
case 2: oled.print(F("Гучнiсть")); break;
case 3: oled.print(F("Volume")); break;
}
oled.setCursorXY(START_MENU_PARAM, 47);
switch (data.langInterface) {
case 1:
case 2: oled.print(F("...назад")); break;
case 3: oled.print(F("...back")); break;
}
}
break;
case 8: // Подменю девятого пункта меню
switch (data.langInterface) { // Название шапки
case 1: oled.print(F("РАСХОДНИКИ")); break;
case 2: oled.print(F("ВИТРАТНI МАТЕРIАЛИ")); break;
case 3: oled.print(F("CHANGE")); break;
}
oled.textMode(0);
if (pointerP2 < 6) { // Первая страница меню
oled.setCursorXY(START_MENU_PARAM, 11);
switch (data.langInterface) {
case 1: oled.print(F("Масло, фильтр")); break;
case 2: oled.print(F("Олива, фiльтр")); break;
case 3: oled.print(F("Oil, filter")); break;
}
oled.setCursorXY(START_MENU_PARAM, 20);
switch (data.langInterface) {
case 1: oled.print(F("Воздушный фильтр")); break;
case 2: oled.print(F("Повiтряний фiльтр")); break;
case 3: oled.print(F("Air filter")); break;
}
oled.setCursorXY(START_MENU_PARAM, 29);
switch (data.langInterface) {
case 1: oled.print(F("Фильтры LPG")); break;
case 2: oled.print(F("Фiльтри LPG")); break;
case 3: oled.print(F("LPG filter")); break;
}
oled.setCursorXY(START_MENU_PARAM, 38);
switch (data.langInterface) {
case 1: oled.print(F("Тормозная сиистема")); break;
case 2: oled.print(F("Гальмiвна система")); break;
case 3: oled.print(F("Brake")); break;
}
oled.setCursorXY(START_MENU_PARAM, 47);
switch (data.langInterface) {
case 1: oled.print(F("Зазоры клапанов")); break;
case 2: oled.print(F("Зазори клапанiв")); break;
case 3: oled.print(F("Valve")); break;
}
oled.setCursorXY(START_MENU_PARAM, 56);
switch (data.langInterface) {
case 1:
case 2: oled.print(F("...назад")); break;
case 3: oled.print(F("...back")); break;
}
}
break;
case 9: // Подменю десятого пункта меню
switch (data.langInterface) { // Название шапки
case 1:
case 2: oled.print(F("РЕЛЕ ВЕНТИЛЯТОРА")); break;
case 3: oled.print(F("FAN RELAY")); break;
}
oled.textMode(0);
if (pointerP2 < 6) { // Первая страница меню
oled.setCursorXY(START_MENU_PARAM, 11);
switch (data.langInterface) {
case 1:
case 2: oled.print(F("Тип реле")); break;
case 3: oled.print(F("Relay type")); break;
}
oled.setCursorXY(START_MENU_PARAM, 20);
switch (data.langInterface) {
case 1: oled.print(F("Датчик температуры")); break;
case 2: oled.print(F("Датчик температури")); break;
case 3: oled.print(F("Temp sensor")); break;
}
oled.setCursorXY(START_MENU_PARAM, 29);
switch (data.langInterface) {
case 1: oled.print(F("Темп-ра вкл реле")); break;
case 2: oled.print(F("Темп-ра увiмк реле")); break;
case 3: oled.print(F("Relay on temp")); break;
}
oled.setCursorXY(START_MENU_PARAM, 38);
switch (data.langInterface) {
case 1: oled.print(F("Темп-ра выкл реле")); break;
case 2: oled.print(F("Темп-ра вимк реле")); break;
case 3: oled.print(F("Relay off temp")); break;
}
oled.setCursorXY(START_MENU_PARAM, 47);
switch (data.langInterface) {
case 1:
case 2: oled.print(F("...назад")); break;
case 3: oled.print(F("...back")); break;
}
}
break;
case 10: // Подменю одинадцатого пункта меню
switch (data.langInterface) { // Название шапки
case 1: oled.print(F("ПАРКТРОНИК")); break;
case 2: oled.print(F("ПАРКТРОНIК")); break;
case 3: oled.print(F("PARKING")); break;
}
oled.textMode(0);
if (pointerP2 < 6) { // Первая страница меню
oled.setCursorXY(START_MENU_PARAM, 11);
switch (data.langInterface) {
case 1: oled.print(F("Вкл парктроник")); break;
case 2: oled.print(F("Увiмк парктронiк")); break;
case 3: oled.print(F("Sonar use")); break;
}
oled.setCursorXY(START_MENU_PARAM, 20);
switch (data.langInterface) {
case 1: oled.print(F("Датчик температуры")); break;
case 2: oled.print(F("Датчик температури")); break;
case 3: oled.print(F("Temp sensor")); break;
}
oled.setCursorXY(START_MENU_PARAM, 29);
switch (data.langInterface) {
case 1:
case 2: oled.print(F("...назад")); break;
case 3: oled.print(F("...back")); break;
}
}
break;
case 11: // Подменю двенадцатого пункта меню
switch (data.langInterface) { // Название шапки
case 1: oled.print(F("СЕРВИС")); break;
case 2: oled.print(F("СЕРВIС")); break;
case 3: oled.print(F("SERVICE")); break;
}
oled.textMode(0);
if (pointerP2 < 6) { // Первая страница меню
oled.setCursorXY(START_MENU_PARAM, 11);
switch (data.langInterface) {
case 1: oled.print(F("Сброс настроек")); break;
case 2: oled.print(F("Скидання")); break;
case 3: oled.print(F("Reset all")); break;
}
oled.setCursorXY(START_MENU_PARAM, 20);
switch (data.langInterface) {
case 1: oled.print(F("Версия ПО")); break;
case 2: oled.print(F("Версiя ПЗ")); break;
case 3: oled.print(F("Software version")); break;
}
oled.setCursorXY(START_MENU_PARAM, 29);
switch (data.langInterface) {
case 1:
case 2: oled.print(F("...назад")); break;
case 3: oled.print(F("...back")); break;
}
}
break;
case 12: // Подменю тринадцатого пункта меню
switch (data.langInterface) { // Название шапки
case 1: oled.print(F("ИНСТРУКЦИЯ")); break;
case 2: oled.print(F("IНСТРУКЦIЯ")); break;
case 3: oled.print(F("MANUAL")); break;
}
oled.textMode(0);
if (pointerP2 < 6) { // Первая страница меню
oled.setCursorXY(START_MENU_PARAM, 11);
switch (data.langInterface) {
case 1:
case 2: oled.print(F("Акб ina226")); break;
case 3: oled.print(F("Battery ina226")); break;
}
oled.setCursorXY(START_MENU_PARAM, 20);
switch (data.langInterface) {
case 1:
case 2: oled.print(F("Акб arduino")); break;
case 3: oled.print(F("Battery arduino")); break;
}
oled.setCursorXY(START_MENU_PARAM, 29);
switch (data.langInterface) {
case 1: oled.print(F("Датчик скорости")); break;
case 2: oled.print(F("Датчик швидкостi")); break;
case 3: oled.print(F("Speed sensor")); break;
}
oled.setCursorXY(START_MENU_PARAM, 38);
switch (data.langInterface) {
case 1: oled.print(F("Датчик темпер-ры 1")); break;
case 2: oled.print(F("Датчик темпер-ри 1")); break;
case 3: oled.print(F("Temp sensor 1")); break;
}
oled.setCursorXY(START_MENU_PARAM, 47);
switch (data.langInterface) {
case 1: oled.print(F("Датчик темпер-ры 2")); break;
case 2: oled.print(F("Датчик темпер-ри 2")); break;
case 3: oled.print(F("Temp sensor 2")); break;
}
oled.setCursorXY(START_MENU_PARAM, 56);
switch (data.langInterface) {
case 1: oled.print(F("Датчик темпер-ры 3")); break;
case 2: oled.print(F("Датчик темпер-ри 3")); break;
case 3: oled.print(F("Temp sensor 3")); break;
}
} else if (pointerP2 < 12) { // Вторая страница меню
oled.setCursorXY(START_MENU_PARAM, 11);
switch (data.langInterface) {
case 1: oled.print(F("Датчик темпер-ры 4")); break;
case 2: oled.print(F("Датчик темпер-ри 4")); break;
case 3: oled.print(F("Temp sensor 4")); break;
}
oled.setCursorXY(START_MENU_PARAM, 20);
switch (data.langInterface) {
case 1: oled.print(F("Датчик темпер-ры 5")); break;
case 2: oled.print(F("Датчик темпер-ри 5")); break;
case 3: oled.print(F("Temp sensor 5")); break;
}
oled.setCursorXY(START_MENU_PARAM, 29);
switch (data.langInterface) {
case 1: oled.print(F("Зуммер")); break;
case 2: oled.print(F("Зумер")); break;
case 3: oled.print(F("Buzzer")); break;
}
oled.setCursorXY(START_MENU_PARAM, 38);
switch (data.langInterface) {
case 1:
case 2:
case 3: oled.print(F("GPS")); break;
}
oled.setCursorXY(START_MENU_PARAM, 47);
switch (data.langInterface) {
case 1: oled.print(F("Парктроник")); break;
case 2: oled.print(F("Парктронiк")); break;
case 3: oled.print(F("Parking sensor")); break;
}
oled.setCursorXY(START_MENU_PARAM, 56);
switch (data.langInterface) {
case 1:
case 2: oled.print(F("Реле")); break;
case 3: oled.print(F("Relay")); break;
}
} else if (pointerP2 < 18) { // Третья страница меню
oled.setCursorXY(START_MENU_PARAM, 11);
switch (data.langInterface) {
case 1: oled.print(F("Светодиод RGB")); break;
case 2: oled.print(F("Свiтлодiод RGB")); break;
case 3: oled.print(F("Led RGB")); break;
}
oled.setCursorXY(START_MENU_PARAM, 20);
switch (data.langInterface) {
case 1: oled.print(F("Датчик LPG 3 пина")); break;
case 2: oled.print(F("Датчик LPG 3 пiна")); break;
case 3: oled.print(F("LPG sensor 3 pin")); break;
}
oled.setCursorXY(START_MENU_PARAM, 29);
switch (data.langInterface) {
case 1: oled.print(F("Датчик LPG 2 пина")); break;
case 2: oled.print(F("Датчик LPG 2 пiна")); break;
case 3: oled.print(F("LPG sensor 2 pin")); break;
}
oled.setCursorXY(START_MENU_PARAM, 38);
switch (data.langInterface) {
case 1:
case 2: oled.print(F("Кнопки, джойстик")); break;
case 3: oled.print(F("Buttons, joystick")); break;
}
oled.setCursorXY(START_MENU_PARAM, 47);
switch (data.langInterface) {
case 1: oled.print(F("Управление")); break;
case 2: oled.print(F("Керування")); break;
case 3: oled.print(F("Control")); break;
}
oled.setCursorXY(START_MENU_PARAM, 56);
switch (data.langInterface) {
case 1:
case 2: oled.print(F("...назад")); break;
case 3: oled.print(F("...back")); break;
}
}
break;
}
printPointer(pointerP2); // Вывод указателя
oled.update(); // Выводим кадр на дисплей
}
void setMenu(uint8_t num1, uint8_t num2) {
oled.clear();
oled.rect(0, 0, 127, 8, OLED_FILL);
oled.setScale(1);
oled.setCursorXY(START_MENU_HEADER, 1);
oled.textMode(1);
switch(num1) {
case 0: // Меню 1
switch(num2) {
case 0: // Подменю 1
switch (data.langInterface) {
case 1: oled.print(F("МИН ВОЛЬТАЖ LPG")); break;
case 2: oled.print(F("МIН НАПРУГА LPG")); break;
case 3: oled.print(F("MIN LPG VOLTAGE")); break;
}
oled.rect(85, 14, 127, 28, OLED_FILL);
oled.setCursorXY(88, 18);
if (data.h == 1) oled.print(ina.getVoltage(), 3);
else oled.print(getVout(), 3);
oled.setCursorXY(120, 18);
switch (data.langInterface) {
case 1:
case 2: oled.print(F("В")); break;
case 3: oled.print(F("V")); break;
}
oled.textMode(0);
oled.setCursorXY(2, 36);
switch (data.langInterface) {
case 1:
case 2: oled.print(F("ВОЛЬТ")); break;
case 3: oled.print(F("VOLT")); break;
}
oled.setCursorXY(1, 46);
oled.print(F("(0 - 12)"));
if (data.a > 12) data.a = 0;
else if (data.a < 0) data.a = 12;
break;
case 1: // Подменю 2
switch (data.langInterface) {
case 1: oled.print(F("МАКС ВОЛЬТАЖ LPG")); break;
case 2: oled.print(F("МАКС НАПРУГА LPG")); break;
case 3: oled.print(F("MAX LPG VOLTAGE")); break;
}
oled.rect(85, 14, 127, 28, OLED_FILL);
oled.setCursorXY(88, 18);
if (data.h == 1) oled.print(ina.getVoltage(), 3);
else oled.print(getVout(), 3);
oled.setCursorXY(120, 18);
switch (data.langInterface) {
case 1:
case 2: oled.print(F("В")); break;
case 3: oled.print(F("V")); break;
}
oled.textMode(0);
oled.setCursorXY(2, 36);
switch (data.langInterface) {
case 1:
case 2: oled.print(F("ВОЛЬТ")); break;
case 3: oled.print(F("VOLT")); break;
}
oled.setCursorXY(1, 46);
oled.print(F("(0 - 12)"));
if (data.b > 12) data.b = 0;
else if (data.b < 0) data.b = 12;
break;
case 2: // Подменю 3
switch (data.langInterface) {
case 1: oled.print(F("ОБЪЕМ БАЛЛОНА")); break;
case 2: oled.print(F("ОБ`ЕМ БАЛОНА")); oled.dot(20, 1); oled.dot(20, 7); break;
case 3: oled.print(F("BALLOON VOLUME")); break;
}
oled.textMode(0);
oled.setCursorXY(2, 36);
switch (data.langInterface) {
case 1: oled.print(F("ЛИТРОВ")); break;
case 2: oled.print(F("ЛIТРIВ")); break;
case 3: oled.print(F("LITERS")); break;
}
oled.setCursorXY(1, 46);
oled.print(F("(0 - 150)"));
if (data.c > 150) data.c = 0;
else if (data.c < 0) data.c = 150;
break;
case 3: // Подменю 4
switch (data.langInterface) {
case 1: oled.print(F("РАСХОД ГАЗА")); break;
case 2: oled.print(F("ВИТРАТА ГАЗУ")); break;
case 3: oled.print(F("CONSUMPTION")); break;
}
oled.textMode(0);
oled.setCursorXY(2, 36);
switch (data.langInterface) {
case 1:
case 2: oled.print(F("Л / 100КМ")); break;
case 3: oled.print(F("L / 100KM")); break;
}
oled.setCursorXY(1, 46);
oled.print(F("(0 - 25)"));
if (data.d > 25) data.d = 0;
else if (data.d < 0) data.d = 25;
break;
case 4: // Подменю 5
switch (data.langInterface) {
case 1:
case 2: oled.print(F("ТИП ДАТЧИКА LPG")); break;
case 3: oled.print(F("SENSOR TYPE")); break;
}
if (data.h > 1) data.h = 0;
else if (data.h < 0) data.h = 1;
break;
case 5: // Подменю 6
switch (data.langInterface) {
case 1: oled.print(F("ЧАСТОТА ОБНОВЛЕНИЯ")); break;
case 2: oled.print(F("ЧАСТОТА ОНОВЛЕННЯ")); break;
case 3: oled.print(F("SENSOR UPDATE")); break;
}
oled.textMode(0);
oled.setCursorXY(2, 36);
switch (data.langInterface) {
case 1: oled.print(F("МИЛЛИСЕКУНД")); break;
case 2: oled.print(F("МIЛIСЕКУНД")); break;
case 3: oled.print(F("MILLISECONDS")); break;
}
oled.setCursorXY(1, 46);
oled.print(F("(200 - 60000)"));
if (data.e > 60000) data.e = 200;
else if (data.e < 200) data.e = 60000;
break;
case 6: // Подменю 7
switch (data.langInterface) {
case 1: oled.print(F("НАПРЯЖЕНИЕ ПИНА 5V")); break;
case 2: oled.print(F("НАПРУГА ПIНА 5V")); break;
case 3: oled.print(F("5V PIN VOLTAGE")); break;
}
oled.textMode(0);
oled.setCursorXY(2, 36);
switch (data.langInterface) {
case 1:
case 2: oled.print(F("ВОЛЬТ")); break;
case 3: oled.print(F("VOLT")); break;
}
oled.setCursorXY(1, 46);
oled.print(F("(4 - 6)"));
if (data.vref > 6) data.vref = 4;
else if (data.vref < 4) data.vref = 6;
break;
case 7: // Подменю 8
switch (data.langInterface) {
case 1: oled.print(F("НАПРЯЖЕНИЕ АКБ")); break;
case 2: oled.print(F("НАПРУГА АКБ")); break;
case 3: oled.print(F("BATTERY VOLTAGE")); break;
}
if (data.battVoltSource > 1) data.battVoltSource = 0;
else if (data.battVoltSource < 0) data.battVoltSource = 1;
break;
case 8: // Подменю 9
switch (data.langInterface) {
case 1: oled.print(F("СОХРАНЯТЬ ЛИТРАЖ")); break;
case 2: oled.print(F("ЗБЕРIГАТИ ЛIТРАЖ")); break;
case 3: oled.print(F("SAVE LPG LITERS")); break;
}
if (data.saveLiters > 1) data.saveLiters = 0;
else if (data.saveLiters < 0) data.saveLiters = 1;
break;
case 9: // Подменю 10
switch (data.langInterface) {
case 1:
case 2: oled.print(F("СИГНАЛ КЛАПАНА LPG")); break;
case 3: oled.print(F("LPG VALVE SIGNAL")); break;
}
if (data.valveSignal > 1) data.valveSignal = 0;
else if (data.valveSignal < 0) data.valveSignal = 1;
break;
case 10: // Подменю 11
switch (data.langInterface) {
case 1: oled.print(F("РЕЛЕ ЗАДЕРЖКИ")); break;
case 2: oled.print(F("РЕЛЕ ЗАТРИМКИ")); break;
case 3: oled.print(F("DELAY OFF RELAY")); break;
}
if (data.delayRelay > 1) data.delayRelay = 0;
else if (data.delayRelay < 0) data.delayRelay = 1;
break;
}
if (joy_R.click()) {
if (pointerP2 < ITEMS1 - 2) pointerP2 += 1;
else pointerP2 = 0;
}
break;
case 1: // Меню 2
switch(num2) {
case 0: // Подменю 1
switch (data.langInterface) {
case 1: oled.print(F("ЭКРАН ПРИВЕТСТВИЯ")); break;
case 2: oled.print(F("ЕКРАН ПРИВIТАННЯ")); break;
case 3: oled.print(F("SCREENSAVER")); break;
}
if (data.g > 1) data.g = 0;
else if (data.g < 0) data.g = 1;
break;
case 1: // Подменю 2
switch (data.langInterface) {
case 1:
case 2: oled.print(F("ЛОГОТИП АВТО")); break;
case 3: oled.print(F("CAR LOGO")); break;
}
if (data.logo > 1) data.logo = 0;
else if (data.logo < 0) data.logo = 1;
break;
case 2: // Подменю 3
switch (data.langInterface) {
case 1: oled.print(F("ОСТАТОК КМ")); break;
case 2: oled.print(F("ЗАЛИШОК КМ")); break;
case 3: oled.print(F("KM")); break;
}
if (data.j) oled.drawBitmap(63, 16, mainScrKM, 64, 32);
else oled.drawBitmap(63, 16, mainScr, 64, 32);
if (data.j > 1) data.j = 0;
else if (data.j < 0) data.j = 1;
break;
case 3: // Подменю 4
switch (data.langInterface) {
case 1: oled.print(F("АККУМУЛЯТОР")); break;
case 2: oled.print(F("АКУМУЛЯТОР")); break;
case 3: oled.print(F("BATTERY")); break;
}
if (data.k) oled.drawBitmap(63, 16, mainScrBattery, 64, 32);
else oled.drawBitmap(63, 16, mainScr, 64, 32);
if (data.k > 1) data.k = 0;
else if (data.k < 0) data.k = 1;
break;
case 4: // Подменю 5
switch (data.langInterface) {
case 1:
case 2: oled.print(F("ТЕМПЕРАТУРА")); break;
case 3: oled.print(F("TEMPERATURE")); break;
}
if (data.l) oled.drawBitmap(63, 16, mainScrTemp, 64, 32);
else oled.drawBitmap(63, 16, mainScr, 64, 32);
if (data.l > 1) data.l = 0;
else if (data.l < 0) data.l = 1;
break;
case 5: // Подменю 6
switch (data.langInterface) {
case 1: oled.print(F("ВРЕМЯ")); break;
case 2: oled.print(F("ЧАС")); break;
case 3: oled.print(F("TIME")); break;
}
if (data.m) oled.drawBitmap(63, 16, mainScrTime, 64, 32);
else oled.drawBitmap(63, 16, mainScr, 64, 32);
if (data.m > 1) data.m = 0;
else if (data.m < 0) data.m = 1;
break;
case 6: // Подменю 7
switch (data.langInterface) {
case 1:
case 2: oled.print(F("ДАТА")); break;
case 3: oled.print(F("DATE")); break;
}
if (data.n) oled.drawBitmap(63, 16, mainScrDate, 64, 32);
else oled.drawBitmap(63, 16, mainScr, 64, 32);
if (data.n > 1) data.n = 0;
else if (data.n < 0) data.n = 1;
break;
case 7: // Подменю 8
switch (data.langInterface) {
case 1: oled.print(F("СИМВОЛ УРОВНЯ ГАЗА")); break;
case 2: oled.print(F("СИМВОЛ РIВНЯ ГАЗУ")); break;
case 3: oled.print(F("GAS LEVEL ICON")); break;
}
if (data.p) oled.drawBitmap(63, 16, mainScrGas, 64, 32);
else oled.drawBitmap(63, 16, mainScr, 64, 32);
if (data.p > 1) data.p = 0;
else if (data.p < 0) data.p = 1;
break;
case 8: // Подменю 9
switch (data.langInterface) {
case 1: oled.print(F("ШИРИНА УРОВНЯ ГАЗА")); break;
case 2: oled.print(F("ШИРИНА РIВНЯ ГАЗУ")); break;
case 3: oled.print(F("GAS LEVEL WIDTH")); break;
}
oled.drawBitmap(63, 16, mainScrGasWidth, 64, 32);
oled.textMode(0);
oled.setCursorXY(1, 36);
oled.print(F("(1 - 29)"));
if (data.q > 29) data.q = 1;
else if (data.q < 1) data.q = 29;
break;
case 9: // Подменю 10
switch (data.langInterface) {
case 1: oled.print(F("ВЕРХНЯЯ ЛИНИЯ")); break;
case 2: oled.print(F("ВЕРХНЯ ЛIНIЯ")); break;
case 3: oled.print(F("LINE TOP")); break;
}
if (data.r) oled.drawBitmap(63, 16, mainScrTopLine, 64, 32);
else oled.drawBitmap(63, 16, mainScr, 64, 32);
if (data.r > 1) data.r = 0;
else if (data.r < 0) data.r = 1;
break;
case 10: // Подменю 11
switch (data.langInterface) {
case 1: oled.print(F("НИЖНЯЯ ЛИНИЯ")); break;
case 2: oled.print(F("НИЖНЯ ЛIНIЯ")); break;
case 3: oled.print(F("LINE BOTTOM")); break;
}
if (data.s) oled.drawBitmap(63, 16, mainScrBotLine, 64, 32);
else oled.drawBitmap(63, 16, mainScr, 64, 32);
if (data.s > 1) data.s = 0;
else if (data.s < 0) data.s = 1;
break;
case 11: // Подменю 12
switch (data.langInterface) {
case 1: oled.print(F("ПРЯМОУГ-КИ СКРИН 3")); break;
case 2: oled.print(F("ПРЯМОКУТ. СКРIН 3")); break;
case 3: oled.print(F("RECTANGLE SCR.3")); break;
}
if (data.rectOnOff) oled.drawBitmap(63, 16, mainScrRect, 64, 32);
else oled.drawBitmap(63, 16, mainScr, 64, 32);
if (data.rectOnOff > 1) data.rectOnOff = 0;
else if (data.rectOnOff < 0) data.rectOnOff = 1;
break;
case 12: // Подменю 13
switch (data.langInterface) {
case 1: oled.print(F("ВИД ПРЯМОУГ-ОВ")); break;
case 2: oled.print(F("ВИД ПРЯМОКУТНИКIВ")); break;
case 3: oled.print(F("RECTANGLE TYPE")); break;
}
if (data.rect) oled.drawBitmap(96, 35, mainScrRectFill, 32, 15);
else oled.drawBitmap(96, 35, mainScrRectStroke, 32, 15);
if (data.rect > 1) data.rect = 0;
else if (data.rect < 0) data.rect = 1;
break;
case 13: // Подменю 14
switch (data.langInterface) {
case 1: oled.print(F("МИНИ СКРИН 1")); break;
case 2: oled.print(F("МIНI СКРIН 1")); break;
case 3: oled.print(F("MINI SCREEN 1")); break;
}
if (data.scr1 > SCR_OPT) data.scr1 = 0;
else if (data.scr1 < 0) data.scr1 = SCR_OPT;
break;
case 14: // Подменю 15
switch (data.langInterface) {
case 1: oled.print(F("МИНИ СКРИН 2")); break;
case 2: oled.print(F("МIНI СКРIН 2")); break;
case 3: oled.print(F("MINI SCREEN 2")); break;
}
if (data.scr2 > SCR_OPT) data.scr2 = 0;
else if (data.scr2 < 0) data.scr2 = SCR_OPT;
break;
case 15: // Подменю 16
switch (data.langInterface) {
case 1: oled.print(F("МИНИ СКРИН 3")); break;
case 2: oled.print(F("МIНI СКРIН 3")); break;
case 3: oled.print(F("MINI SCREEN 3")); break;
}
if (data.scr3 > SCR_OPT) data.scr3 = 0;
else if (data.scr3 < 0) data.scr3 = SCR_OPT;
break;
case 16: // Подменю 17
switch (data.langInterface) {
case 1: oled.print(F("МИНИ СКРИН 4")); break;
case 2: oled.print(F("МIНI СКРIН 4")); break;
case 3: oled.print(F("MINI SCREEN 4")); break;
}
if (data.scr4 > SCR_OPT) data.scr4 = 0;
else if (data.scr4 < 0) data.scr4 = SCR_OPT;
break;
case 17: // Подменю 18
switch (data.langInterface) {
case 1: oled.print(F("ЯЗЫК")); break;
case 2: oled.print(F("МОВА")); break;
case 3: oled.print(F("LANGUAGE")); break;
}
if (data.langInterface > 3) data.langInterface = 1;
else if (data.langInterface < 1) data.langInterface = 3;
break;
}
if (joy_R.click()) {
if (pointerP2 < ITEMS2 - 2) pointerP2 += 1;
else pointerP2 = 0;
}
break;
case 2: // Меню 3
switch(num2) {
case 0: // Подменю 1
switch (data.langInterface) {
case 1: oled.print(F("СКРИН 1")); break;
case 2: oled.print(F("СКРIН 1")); break;
case 3: oled.print(F("SCREEN 1")); break;
}
if (data.screen1 > 1) data.screen1 = 0;
else if (data.screen1 < 0) data.screen1 = 1;
break;
case 1: // Подменю 2
switch (data.langInterface) {
case 1: oled.print(F("СКРИН 2")); break;
case 2: oled.print(F("СКРIН 2")); break;
case 3: oled.print(F("SCREEN 2")); break;
}
if (data.screen2 > 1) data.screen2 = 0;
else if (data.screen2 < 0) data.screen2 = 1;
break;
case 2: // Подменю 3
switch (data.langInterface) {
case 1: oled.print(F("СКРИН 3")); break;
case 2: oled.print(F("СКРIН 3")); break;
case 3: oled.print(F("SCREEN 3")); break;
}
if (data.screen3 > 1) data.screen3 = 0;
else if (data.screen3 < 0) data.screen3 = 1;
break;
case 3: // Подменю 4
switch (data.langInterface) {
case 1: oled.print(F("СКРИН 4")); break;
case 2: oled.print(F("СКРIН 4")); break;
case 3: oled.print(F("SCREEN 4")); break;
}
if (data.screen4 > 1) data.screen4 = 0;
else if (data.screen4 < 0) data.screen4 = 1;
break;
case 4: // Подменю 5
switch (data.langInterface) {
case 1: oled.print(F("СКРИН 5")); break;
case 2: oled.print(F("СКРIН 5")); break;
case 3: oled.print(F("SCREEN 5")); break;
}
if (data.screen5 > 1) data.screen5 = 0;
else if (data.screen5 < 0) data.screen5 = 1;
break;
case 5: // Подменю 6
switch (data.langInterface) {
case 1: oled.print(F("СКРИН 6")); break;
case 2: oled.print(F("СКРIН 6")); break;
case 3: oled.print(F("SCREEN 6")); break;
}
if (data.screen6 > 1) data.screen6 = 0;
else if (data.screen6 < 0) data.screen6 = 1;
break;
case 6: // Подменю 7
switch (data.langInterface) {
case 1: oled.print(F("СКРИН 7")); break;
case 2: oled.print(F("СКРIН 7")); break;
case 3: oled.print(F("SCREEN 7")); break;
}
if (data.screen7 > 1) data.screen7 = 0;
else if (data.screen7 < 0) data.screen7 = 1;
break;
case 7: // Подменю 8
switch (data.langInterface) {
case 1: oled.print(F("СКРИН 8")); break;
case 2: oled.print(F("СКРIН 8")); break;
case 3: oled.print(F("SCREEN 8")); break;
}
if (data.screen8 > 1) data.screen8 = 0;
else if (data.screen8 < 0) data.screen8 = 1;
break;
case 8: // Подменю 9
switch (data.langInterface) {
case 1: oled.print(F("СКРИН 9")); break;
case 2: oled.print(F("СКРIН 9")); break;
case 3: oled.print(F("SCREEN 9")); break;
}
if (data.screen9 > 1) data.screen9 = 0;
else if (data.screen9 < 0) data.screen9 = 1;
break;
case 9: // Подменю 10
switch (data.langInterface) {
case 1: oled.print(F("СКРИН 10")); break;
case 2: oled.print(F("СКРIН 10")); break;
case 3: oled.print(F("SCREEN 10")); break;
}
if (data.screen10 > 1) data.screen10 = 0;
else if (data.screen10 < 0) data.screen10 = 1;
break;
case 10: // Подменю 11
switch (data.langInterface) {
case 1: oled.print(F("НОМЕР СКРИНА")); break;
case 2: oled.print(F("НОМЕР СКРIНА")); break;
case 3: oled.print(F("SHOW SCREEN NUM")); break;
}
if (data.screenNum > 1) data.screenNum = 0;
else if (data.screenNum < 0) data.screenNum = 1;
break;
}
if (joy_R.click()) {
if (pointerP2 < ITEMS3 - 2) pointerP2 += 1;
else pointerP2 = 0;
}
break;
case 3: // Меню 4
switch(num2) {
case 0: // Подменю 1
switch (data.langInterface) {
case 1: oled.print(F("АВТОЯРКОСТЬ")); break;
case 2: oled.print(F("АВТОЯСКРАВIСТЬ")); break;
case 3: oled.print(F("AUTO BRIGHTNESS")); break;
}
if (data.autoBrightness > 1) data.autoBrightness = 0;
else if (data.autoBrightness < 0) data.autoBrightness = 1;
break;
case 1: // Подменю 2
switch (data.langInterface) {
case 1: oled.print(F("УРОВЕНЬ ЯРКОСТИ")); break;
case 2: oled.print(F("РIВЕНЬ ЯСКРАВОСТI")); break;
case 3: oled.print(F("BRIGHTNESS LVL")); break;
}
oled.textMode(0);
oled.setCursorXY(1, 36);
oled.print(F("(0 - 255)"));
oled.textMode(1);
if (data.f > 255) data.f = 0;
else if (data.f < 0) data.f = 255;
break;
case 2: // Подменю 3
switch (data.langInterface) {
case 1: oled.print(F("ШАГ ЯРКОСТИ")); break;
case 2: oled.print(F("КРОК ЯСКРАВОСТI")); break;
case 3: oled.print(F("BRIGHTNESS STEP")); break;
}
oled.textMode(0);
oled.setCursorXY(1, 36);
oled.print(F("(1 - 255)"));
oled.textMode(1);
if (data.bright > 255) data.bright = 1;
else if (data.bright < 1) data.bright = 255;
break;
case 3: // Подменю 4
switch (data.langInterface) {
case 1: oled.print(F("МИН АВТОЯРКОСТЬ")); break;
case 2: oled.print(F("МIН АВТОЯСКРАВ-ТЬ")); break;
case 3: oled.print(F("MIN AUTOBRIGHT")); break;
}
oled.textMode(0);
oled.setCursorXY(1, 36);
oled.print(F("(1 - 200)"));
oled.textMode(1);
if (data.minBright > 200) data.minBright = 1;
else if (data.minBright < 1) data.minBright = 200;
break;
case 4: // Подменю 5
switch (data.langInterface) {
case 1: oled.print(F("МАКС АВТОЯРКОСТЬ")); break;
case 2: oled.print(F("МАКС АВТОЯСКРАВ-ТЬ")); break;
case 3: oled.print(F("MAX AUTOBRIGHT")); break;
}
oled.textMode(0);
oled.setCursorXY(1, 36);
oled.print(F("(50 - 255)"));
oled.textMode(1);
if (data.maxBright > 255) data.maxBright = 50;
else if (data.maxBright < 50) data.maxBright = 255;
break;
case 5: // Подменю 6
switch (data.langInterface) {
case 1: oled.print(F("РЕЖИМ АВТОЯРКОСТИ")); break;
case 2: oled.print(F("РЕЖИМ АВТОЯСКРАВ-ТI")); break;
case 3: oled.print(F("SPEED AUTOBRIGHT")); break;
}
if (data.brightTimeout > 3) data.brightTimeout = 1;
else if (data.brightTimeout < 1) data.brightTimeout = 3;
break;
case 6: // Подменю 7
switch (data.langInterface) {
case 1: oled.print(F("СДВИГ АВТОЯРКОСТИ")); break;
case 2: oled.print(F("ЗРУШЕННЯ АВТОЯСКР.")); break;
case 3: oled.print(F("SHIFT AUTOBRIGHT")); break;
}
oled.textMode(0);
oled.setCursorXY(1, 36);
oled.print(F("(-15...+15)"));
oled.textMode(1);
if (data.brightIntens > 15) data.brightIntens = -15;
else if (data.brightIntens < -15) data.brightIntens = 15;
break;
case 7: // Подменю 8
switch (data.langInterface) {
case 1: oled.print(F("БУСТ АВТОЯРКОСТИ")); break;
case 2: oled.print(F("БУСТ АВТОЯСКРАВ-ТI")); break;
case 3: oled.print(F("BOOST AUTOBRIGHT")); break;
}
if (data.brightBoost > 1) data.brightBoost = 0;
else if (data.brightBoost < 0) data.brightBoost = 1;
break;
case 8: // Подменю 9
switch (data.langInterface) {
case 1: oled.print(F("МАКС ЗНАЧЕНИЕ LUX")); break;
case 2: oled.print(F("МАКС ЗНАЧЕННЯ LUX")); break;
case 3: oled.print(F("MAX LUX VALUE")); break;
}
oled.textMode(0);
oled.setCursorXY(2, 36);
oled.print(F("LUX"));
oled.setCursorXY(1, 46);
oled.print(F("(1 - 65535)"));
oled.textMode(1);
if (data.luxLimit > 65535) data.luxLimit = 1;
else if (data.luxLimit < 1) data.luxLimit = 65535;
break;
case 9: // Подменю 10
switch (data.langInterface) {
case 1: oled.print(F("ПОКАЗЫВАТЬ LUX")); break;
case 2: oled.print(F("ПОКАЗУВАТИ LUX")); break;
case 3: oled.print(F("SHOW LUX VALUE")); break;
}
if (data.luxDisplay > 1) data.luxDisplay = 0;
else if (data.luxDisplay < 0) data.luxDisplay = 1;
break;
}
oled.rect(73, 35, 127, 49, OLED_FILL);
oled.setCursorXY(76, 39);
oled.print(LightSensor.GetLightIntensity());
oled.setCursorXY(108, 39);
oled.print(F("Lux"));
if (joy_R.click()) {
if (pointerP2 < ITEMS4 - 2) pointerP2 += 1;
else pointerP2 = 0;
}
break;
case 4: // Меню 5
switch(num2) {
case 0: // Подменю 1
switch (data.langInterface) {
case 1: oled.print(F("ЧАСЫ")); break;
case 2: oled.print(F("ГОДИНИ")); break;
case 3: oled.print(F("HOURS")); break;
}
oled.textMode(0);
oled.setCursorXY(1, 36);
oled.print(F("(0 - 23)"));
if (data.w > 23) data.w = 0;
else if (data.w < 0) data.w = 23;
break;
case 1: // Подменю 2
switch (data.langInterface) {
case 1: oled.print(F("МИНУТЫ")); break;
case 2: oled.print(F("ХВИЛИНИ")); break;
case 3: oled.print(F("MINUTES")); break;
}
oled.textMode(0);
oled.setCursorXY(1, 36);
oled.print(F("(0 - 59)"));
if (data.x > 59) data.x = 0;
else if (data.x < 0) data.x = 59;
break;
case 2: // Подменю 3
switch (data.langInterface) {
case 1: oled.print(F("ГОД")); break;
case 2: oled.print(F("РIК")); break;
case 3: oled.print(F("YEAR")); break;
}
oled.textMode(0);
oled.setCursorXY(1, 36);
oled.print(F("(2025 - 2100)"));
if (data.t > 2100) data.t = 2025;
else if (data.t < 2025) data.t = 2100;
break;
case 3: // Подменю 4
switch (data.langInterface) {
case 1: oled.print(F("МЕСЯЦ")); break;
case 2: oled.print(F("МIСЯЦЬ")); break;
case 3: oled.print(F("MONTH")); break;
}
oled.textMode(0);
oled.setCursorXY(1, 36);
oled.print(F("(1 - 12)"));
if (data.u > 12) data.u = 1;
else if (data.u < 1) data.u = 12;
break;
case 4: // Подменю 5
switch (data.langInterface) {
case 1:
case 2: oled.print(F("ДЕНЬ")); break;
case 3: oled.print(F("DAY")); break;
}
oled.textMode(0);
oled.setCursorXY(1, 36);
oled.print(F("(1 - 31)"));
if (data.v > 31) data.v = 1;
else if (data.v < 1) data.v = 31;
break;
case 5: // Подменю 6
switch (data.langInterface) {
case 1: oled.print(F("УСТАНОВИТЬ ВРЕМЯ")); break;
case 2: oled.print(F("ВСТАНОВИТИ ЧАС")); break;
case 3: oled.print(F("SET DATE / TIME")); break;
}
oled.textMode(0);
if(data.w >= 10) oled.setCursorXY(1, 36);
else {oled.setCursorXY(1, 36); oled.print(0); oled.setCursorXY(7, 36);}
oled.print(data.w);
oled.setCursorXY(13, 36);
oled.print(F(":"));
if(data.x >= 10) oled.setCursorXY(19, 36);
else {oled.setCursorXY(19, 36); oled.print(0); oled.setCursorXY(25, 36);}
oled.print(data.x);
if(data.v >= 10) oled.setCursorXY(37, 36);
else {oled.setCursorXY(37, 36); oled.print(0); oled.setCursorXY(43, 36);}
oled.print(data.v);
oled.setCursorXY(49, 36);
oled.print(F("."));
if(data.u >= 10) oled.setCursorXY(55, 36);
else {oled.setCursorXY(55, 36); oled.print(0); oled.setCursorXY(61, 36);}
oled.print(data.u);
oled.setCursorXY(67, 36);
oled.print(F("."));
oled.setCursorXY(73, 36);
oled.print(data.t);
if (data.y > 1) data.y = 0;
else if (data.y < 0) data.y = 1;
break;
case 6: // Подменю 7
switch (data.langInterface) {
case 1: oled.print(F("ЧАСОВОЙ ПОЯС")); break;
case 2: oled.print(F("ЧАСОВИЙ ПОЯС")); break;
case 3: oled.print(F("TIME ZONE")); break;
}
oled.textMode(0);
oled.setCursorXY(1, 36);
oled.print(F("(-12 ... +12)"));
if (data.timeZone > 12) data.timeZone = -12;
else if (data.timeZone < -12) data.timeZone = 12;
break;
case 7: // Подменю 8
switch (data.langInterface) {
case 1: oled.print(F("ИСТОЧНИК ВРЕМЕНИ")); break;
case 2: oled.print(F("ДЖЕРЕЛО ЧАСУ")); break;
case 3: oled.print(F("DATE/TIME SOURCE")); break;
}
if (data.dateSource > 1) data.dateSource = 0;
else if (data.dateSource < 0) data.dateSource = 1;
break;
case 8: // Подменю 9
switch (data.langInterface) {
case 1: oled.print(F("КОРРЕКЦИЯ ГОДА GPS")); break;
case 2: oled.print(F("КОРЕКЦIЯ РОКУ GPS")); break;
case 3: oled.print(F("GPS YEAR CORRECT.")); break;
}
if (data.yearCorrect > 1) data.yearCorrect = 0;
else if (data.yearCorrect < 0) data.yearCorrect = 1;
break;
}
if (joy_R.click()) {
if (pointerP2 < ITEMS5 - 2) pointerP2 += 1;
else pointerP2 = 0;
}
break;
case 6: // Меню 7
switch(num2) {
case 0: // Подменю 1
switch (data.langInterface) {
case 1: oled.print(F("ЛИМИТ СКОРОСТИ 1")); break;
case 2: oled.print(F("ЛIМIТ ШВИДКОСТI 1")); break;
case 3: oled.print(F("SPEED LIMIT 1")); break;
}
oled.textMode(0);
oled.setCursorXY(2, 36);
switch (data.langInterface) {
case 1: oled.print(F("КМ/Ч")); break;
case 2: oled.print(F("КМ/Г")); break;
case 3: oled.print(F("KM/H")); break;
}
oled.setCursorXY(1, 46);
oled.print(F("(10 - 250)"));
if (data.speedLimit1 > 250) data.speedLimit1 = 10;
else if (data.speedLimit1 < 10) data.speedLimit1 = 250;
break;
case 1: // Подменю 2
switch (data.langInterface) {
case 1: oled.print(F("ЛИМИТ СКОРОСТИ 2")); break;
case 2: oled.print(F("ЛIМIТ ШВИДКОСТI 2")); break;
case 3: oled.print(F("SPEED LIMIT 2")); break;
}
oled.textMode(0);
oled.setCursorXY(2, 36);
switch (data.langInterface) {
case 1: oled.print(F("КМ/Ч")); break;
case 2: oled.print(F("КМ/Г")); break;
case 3: oled.print(F("KM/H")); break;
}
oled.setCursorXY(1, 46);
oled.print(F("(10 - 250)"));
if (data.speedLimit2 > 250) data.speedLimit2 = 10;
else if (data.speedLimit2 < 10) data.speedLimit2 = 250;
break;
case 2: // Подменю 3
switch (data.langInterface) {
case 1: oled.print(F("ЛИМИТ СКОРОСТИ 3")); break;
case 2: oled.print(F("ЛIМIТ ШВИДКОСТI 3")); break;
case 3: oled.print(F("SPEED LIMIT 3")); break;
}
oled.textMode(0);
oled.setCursorXY(2, 36);
switch (data.langInterface) {
case 1: oled.print(F("КМ/Ч")); break;
case 2: oled.print(F("КМ/Г")); break;
case 3: oled.print(F("KM/H")); break;
}
oled.setCursorXY(1, 46);
oled.print(F("(10 - 250)"));
if (data.speedLimit3 > 250) data.speedLimit3 = 10;
else if (data.speedLimit3 < 10) data.speedLimit3 = 250;
break;
case 3: // Подменю 4
switch (data.langInterface) {
case 1: oled.print(F("ОБНОВЛЕНИЕ GPS")); break;
case 2: oled.print(F("ОНОВЛЕННЯ GPS")); break;
case 3: oled.print(F("GPS SPEED UPDATE")); break;
}
oled.textMode(0);
oled.setCursorXY(2, 36);
switch (data.langInterface) {
case 1: oled.print(F("МИЛЛИСЕКУНД")); break;
case 2: oled.print(F("МIЛIСЕКУНД")); break;
case 3: oled.print(F("MILLISECONDS")); break;
}
oled.setCursorXY(1, 46);
oled.print(F("(500 - 60000)"));
if (data.gpsSpeedUpd > 60000) data.gpsSpeedUpd = 500;
else if (data.gpsSpeedUpd < 500) data.gpsSpeedUpd = 60000;
break;
case 4: // Подменю 5
switch (data.langInterface) {
case 1: oled.print(F("ДАТЧИК СКОРОСТИ")); break;
case 2: oled.print(F("ДАТЧИК ШВИДКОСТI")); break;
case 3: oled.print(F("SPEED SENSOR USE")); break;
}
if (data.sensorSpeed > 1) data.sensorSpeed = 0;
else if (data.sensorSpeed < 0) data.sensorSpeed = 1;
break;
case 5: // Подменю 6
switch (data.langInterface) {
case 1: oled.print(F("КОЛ-ВО ИМПУЛЬСОВ")); break;
case 2: oled.print(F("КIЛ-ТЬ IМПУЛЬСIВ")); break;
case 3: oled.print(F("SENSOR IMPULSE")); break;
}
oled.textMode(0);
oled.setCursorXY(2, 36);
switch (data.langInterface) {
case 1: oled.print(F("ИМПУЛЬСОВ")); break;
case 2: oled.print(F("IМПУЛЬСIВ")); break;
case 3: oled.print(F("IMPULSES")); break;
}
oled.setCursorXY(1, 46);
oled.print(F("(2 - 64)"));
if (data.sensorPulseNum > 64) data.sensorPulseNum = 2;
else if (data.sensorPulseNum < 2) data.sensorPulseNum = 64;
break;
case 6: // Подменю 7
switch (data.langInterface) {
case 1: oled.print(F("СОХРАНЯТЬ ОДОМЕТР")); break;
case 2: oled.print(F("ЗБЕРIГАТИ ОДОМЕТР")); break;
case 3: oled.print(F("AUTO UPDATE ODO")); break;
}
if (data.odometerOnOff > 1) data.odometerOnOff = 0;
else if (data.odometerOnOff < 0) data.odometerOnOff = 1;
break;
case 7: // Подменю 8
switch (data.langInterface) {
case 1: oled.print(F("ОБЩИЙ ПРОБЕГ")); break;
case 2: oled.print(F("ЗАГАЛЬНИЙ ПРОБIГ")); break;
case 3: oled.print(F("TOTAL MILEAGE")); break;
}
oled.textMode(0);
oled.setCursorXY(2, 36);
oled.print(F("KM"));
oled.setCursorXY(1, 46);
oled.print(F("(0 - 999999)"));
if (data.odometer > 999999) data.odometer = 0;
else if (data.odometer < 0) data.odometer = 999999;
break;
case 8: // Подменю 9
switch (data.langInterface) {
case 1: oled.print(F("СБРОС ОДОМЕТРА")); break;
case 2: oled.print(F("СКИДАННЯ ОДОМЕТРА")); break;
case 3: oled.print(F("RESET ODOMETER")); break;
}
oled.rect(57, 35, 127, 49, OLED_FILL);
oled.setCursorXY(60, 39);
oled.print(data.odometer2, 1);
oled.setCursorXY(114, 39);
oled.print(F("КМ"));
if (data.odometer2Reset > 1) data.odometer2Reset = 0;
else if (data.odometer2Reset < 0) data.odometer2Reset = 1;
break;
case 9: // Подменю 10
switch (data.langInterface) {
case 1: oled.print(F("ПРЕВЫШЕНИЕ СКОР-ТИ")); break;
case 2: oled.print(F("ПЕРЕВИЩЕННЯ ШВИДК-ТI")); break;
case 3: oled.print(F("SPEEDING")); break;
}
if (data.speedLimitWarning > 3) data.speedLimitWarning = 0;
else if (data.speedLimitWarning < 0) data.speedLimitWarning = 3;
break;
case 10: // Подменю 11
switch (data.langInterface) {
case 1: oled.print(F("ДОПУСТ. ПРЕВЫШЕНИЕ")); break;
case 2: oled.print(F("ДОПУСТ ПЕРЕВИЩЕННЯ")); break;
case 3: oled.print(F("PERMISSIBLE EXCESS")); break;
}
oled.textMode(0);
oled.setCursorXY(2, 36);
switch (data.langInterface) {
case 1: oled.print(F("КМ/Ч")); break;
case 2: oled.print(F("КМ/Г")); break;
case 3: oled.print(F("KM/H")); break;
}
oled.setCursorXY(1, 46);
oled.print(F("(0 - 100)"));
if (data.rightOfEntrance > 100) data.rightOfEntrance = 0;
else if (data.rightOfEntrance < 0) data.rightOfEntrance = 100;
break;
case 11: // Подменю 12
switch (data.langInterface) {
case 1: oled.print(F("КОРРЕКЦИЯ СКОРОСТИ")); break;
case 2: oled.print(F("КОРЕКЦIЯ ШВИДКОСТI")); break;
case 3: oled.print(F("SPEED CORRECTION")); break;
}
float spdCor = ((100.0 * data.sensorPulseNum / 6.0 * 50.0) / round(data.speedCorrection * data.sensorPulseNum / 6.0)) - 50.0;
oled.circle(75, 23, 12, OLED_FILL);
oled.setCursorXY(70, 20);
oled.print(50);
oled.rect(92, 11, 127, 35, OLED_FILL);
if (spdCor >= 0) {
oled.setCursorXY(95, 14);
oled.print(F("+"));
oled.setCursorXY(101, 14);
} else {
oled.setCursorXY(95, 14);
}
oled.print(spdCor, 1);
oled.setCursorXY(95, 26);
switch (data.langInterface) {
case 1: oled.print(F("КМ/Ч")); break;
case 2: oled.print(F("КМ/Г")); break;
case 3: oled.print(F("KM/H")); break;
}
oled.textMode(0);
oled.setCursorXY(1, 36);
oled.print(F("(1 - 200)"));
oled.setCursorXY(1, 46);
switch (data.langInterface) {
case 1: oled.print(F("Замерять при 50 км/ч!")); break;
case 2: oled.print(F("Замiряти при 50 км/г!")); break;
case 3: oled.print(F("Measure at 50 km/h!")); break;
}
if (data.speedCorrection > 200) data.speedCorrection = 1;
else if (data.speedCorrection < 1) data.speedCorrection = 200;
break;
}
if (joy_R.click()) {
if (pointerP2 < ITEMS7 - 2) pointerP2 += 1;
else pointerP2 = 0;
}
break;
case 7: // Меню 8
switch(num2) {
case 0: // Подменю 1
switch (data.langInterface) {
case 1: oled.print(F("МЕЛОДИЯ")); break;
case 2: oled.print(F("МЕЛОДIЯ")); break;
case 3: oled.print(F("MELODY")); break;
}
if (data.melodyStart > 10) data.melodyStart = 0;
else if (data.melodyStart < 0) data.melodyStart = 10;
break;
case 1: // Подменю 2
switch (data.langInterface) {
case 1:
case 2: oled.print(F("ЗВУК КНОПОК")); break;
case 3: oled.print(F("BUTTON SOUND")); break;
}
if (data.btnSound > 1) data.btnSound = 0;
else if (data.btnSound < 0) data.btnSound = 1;
break;
case 2: // Подменю 3
switch (data.langInterface) {
case 1: oled.print(F("ЗВУК ПРЕДУПРЕЖД-ИЙ")); break;
case 2: oled.print(F("ЗВУК ПОПЕРЕДЖЕНЬ")); break;
case 3: oled.print(F("WARNING SOUND")); break;
}
if (data.warningSound > 1) data.warningSound = 0;
else if (data.warningSound < 0) data.warningSound = 1;
break;
case 3: // Подменю 4
switch (data.langInterface) {
case 1: oled.print(F("ГРОМКОСТЬ")); break;
case 2: oled.print(F("ГУЧНIСТЬ")); break;
case 3: oled.print(F("VOLUME")); break;
}
oled.textMode(0);
oled.setCursorXY(1, 36);
oled.print(F("(0 - 10)"));
if (data.volumeSound > 10) data.volumeSound = 0;
else if (data.volumeSound < 0) data.volumeSound = 10;
break;
}
if (joy_R.click()) {
if (pointerP2 < ITEMS8 - 2) pointerP2 += 1;
else pointerP2 = 0;
}
break;
case 8: // Меню 9
switch(num2) {
case 0: // Подменю 1
switch (data.langInterface) {
case 1: oled.print(F("МАСЛО, ФИЛЬТР")); break;
case 2: oled.print(F("ОЛИВА, ФIЛЬТР")); break;
case 3: oled.print(F("OIL, FILTER")); break;
}
oled.textMode(0);
oled.setCursorXY(2, 36);
oled.print(F("KM"));
oled.setCursorXY(1, 46);
oled.print(F("(0 - 999500)"));
if (data.change1 > 999500) data.change1 = 0;
else if (data.change1 < 0) data.change1 = 999500;
break;
case 1: // Подменю 2
switch (data.langInterface) {
case 1: oled.print(F("ВОЗДУШНЫЙ ФИЛЬТР")); break;
case 2: oled.print(F("ПОВIТРЯНИЙ ФIЛЬТР")); break;
case 3: oled.print(F("AIR FILTER")); break;
}
oled.textMode(0);
oled.setCursorXY(2, 36);
oled.print(F("KM"));
oled.setCursorXY(1, 46);
oled.print(F("(0 - 999500)"));
if (data.change2 > 999500) data.change2 = 0;
else if (data.change2 < 0) data.change2 = 999500;
break;
case 2: // Подменю 3
switch (data.langInterface) {
case 1: oled.print(F("ФИЛЬТРЫ LPG")); break;
case 2: oled.print(F("ФIЛЬТРИ LPG")); break;
case 3: oled.print(F("LPG FILTER")); break;
}
oled.textMode(0);
oled.setCursorXY(2, 36);
oled.print(F("KM"));
oled.setCursorXY(1, 46);
oled.print(F("(0 - 999500)"));
if (data.change3 > 999500) data.change3 = 0;
else if (data.change3 < 0) data.change3 = 999500;
break;
case 3: // Подменю 4
switch (data.langInterface) {
case 1: oled.print(F("ТОРМОЗНАЯ СИСТЕМА")); break;
case 2: oled.print(F("ГАЛЬМIВНА СИСТЕМА")); break;
case 3: oled.print(F("BRAKE")); break;
}
oled.textMode(0);
oled.setCursorXY(2, 36);
oled.print(F("KM"));
oled.setCursorXY(1, 46);
oled.print(F("(0 - 999500)"));
if (data.change4 > 999500) data.change4 = 0;
else if (data.change4 < 0) data.change4 = 999500;
break;
case 4: // Подменю 5
switch (data.langInterface) {
case 1: oled.print(F("ЗАЗОРЫ КЛАПАНОВ")); break;
case 2: oled.print(F("ЗАЗОРЫ КЛАПАНIВ")); break;
case 3: oled.print(F("VALVE")); break;
}
oled.textMode(0);
oled.setCursorXY(2, 36);
oled.print(F("KM"));
oled.setCursorXY(1, 46);
oled.print(F("(0 - 999500)"));
if (data.change5 > 999500) data.change5 = 0;
else if (data.change5 < 0) data.change5 = 999500;
break;
}
if (joy_R.click()) {
if (pointerP2 < ITEMS9 - 2) pointerP2 += 1;
else pointerP2 = 0;
}
break;
case 9: // Меню 10
switch(num2) {
case 0: // Подменю 1
switch (data.langInterface) {
case 1:
case 2: oled.print(F("ТИП РЕЛЕ")); break;
case 3: oled.print(F("RELAY TYPE")); break;
}
if (data.relayType > 1) data.relayType = 0;
else if (data.relayType < 0) data.relayType = 1;
break;
case 1: // Подменю 2
switch (data.langInterface) {
case 1: oled.print(F("ДАТЧИК ТЕМПЕРАТУРЫ")); break;
case 2: oled.print(F("ДАТЧИК ТЕМПЕРАТУРИ")); break;
case 3: oled.print(F("TEMP SENSOR")); break;
}
if (data.tempSensorForRelay > 5) data.tempSensorForRelay = 0;
else if (data.tempSensorForRelay < 0) data.tempSensorForRelay = 5;
break;
case 2: // Подменю 3
switch (data.langInterface) {
case 1: oled.print(F("ТЕМ-РА ВКЛ РЕЛЕ")); break;
case 2: oled.print(F("ТЕМ-РА УВIМК РЕЛЕ")); break;
case 3: oled.print(F("RELAY ON TEMP")); break;
}
oled.textMode(0);
oled.setCursorXY(2, 36);
switch (data.langInterface) {
case 1: oled.print(F("ГРАДУСОВ ЦЕЛЬСИЯ")); break;
case 2: oled.print(F("ГРАДУСIВ ЦЕЛЬСIЯ")); break;
case 3: oled.print(F("CELSIUS")); break;
}
oled.setCursorXY(1, 46);
oled.print(F("(50 - 130)"));
if (data.relayTempOn > 130) data.relayTempOn = 50;
else if (data.relayTempOn < 50) data.relayTempOn = 130;
break;
case 3: // Подменю 4
switch (data.langInterface) {
case 1: oled.print(F("ТЕМ-РА ВЫКЛ РЕЛЕ")); break;
case 2: oled.print(F("ТЕМ-РА ВИМК РЕЛЕ")); break;
case 3: oled.print(F("RELAY OFF TEMP")); break;
}
oled.textMode(0);
oled.setCursorXY(2, 36);
switch (data.langInterface) {
case 1: oled.print(F("ГРАДУСОВ ЦЕЛЬСИЯ")); break;
case 2: oled.print(F("ГРАДУСIВ ЦЕЛЬСIЯ")); break;
case 3: oled.print(F("CELSIUS")); break;
}
oled.setCursorXY(1, 46);
oled.print(F("(45 - 125)"));
if (data.relayTempOff > 125) data.relayTempOff = 45;
else if (data.relayTempOff < 45) data.relayTempOff = 125;
break;
}
if (joy_R.click()) {
if (pointerP2 < ITEMS10 - 2) pointerP2 += 1;
else pointerP2 = 0;
}
break;
case 10: // Меню 11
switch(num2) {
case 0: // Подменю 1
switch (data.langInterface) {
case 1: oled.print(F("ВКЛ ПАРКТРОНИК")); break;
case 2: oled.print(F("УВIМК ПАРКТРОНIК")); break;
case 3: oled.print(F("SONAR USE")); break;
}
if (data.parktronic > 1) data.parktronic = 0;
else if (data.parktronic < 0) data.parktronic = 1;
break;
case 1: // Подменю 2
switch (data.langInterface) {
case 1: oled.print(F("ДАТЧИК ТЕМПЕРАТУРЫ")); break;
case 2: oled.print(F("ДАТЧИК ТЕМПЕРАТУРИ")); break;
case 3: oled.print(F("TEMP SENSOR")); break;
}
if (data.parktronicTempSens > 5) data.parktronicTempSens = 0;
else if (data.parktronicTempSens < 0) data.parktronicTempSens = 5;
break;
}
if (joy_R.click()) {
if (pointerP2 < ITEMS11 - 2) pointerP2 += 1;
else pointerP2 = 0;
}
break;
case 11: // Меню 12
switch(num2) {
case 0: // Подменю 1
switch (data.langInterface) {
case 1: oled.print(F("СБРОС НАСТРОЕК")); break;
case 2: oled.print(F("СКИДАННЯ")); break;
case 3: oled.print(F("RESET ALL")); break;
}
if (data.z > 1) data.z = 0;
else if (data.z < 0) data.z = 1;
break;
case 1: // Подменю 2
switch (data.langInterface) {
case 1: oled.print(F("ВЕРСИЯ ПО")); break;
case 2: oled.print(F("ВЕРСIЯ ПЗ")); break;
case 3: oled.print(F("SOFTWARE VERSION")); break;
}
break;
}
if (joy_R.click()) {
if (pointerP2 < ITEMS12 - 2) pointerP2 += 1;
else pointerP2 = 0;
}
break;
}
oled.textMode(0);
oled.setScale(2);
oled.setCursorXY(2, 15);
switch(num1) {
case 0: // Меню 1
switch(num2) {
case 0: oled.print(data.a, 3); break; // Подменю 1
case 1: oled.print(data.b, 3); break; // Подменю 2
case 2: oled.print(data.c, 1); break; // Подменю 3
case 3: oled.print(data.d, 1); break; // Подменю 4
case 4: oled.print(menuSensorType(data.h)); break; // Подменю 5
case 5: oled.print(data.e); break; // Подменю 6
case 6: oled.print(data.vref); break; // Подменю 7
case 7: oled.print(menuBattVoltSource(data.battVoltSource)); break; // Подменю 8
case 8: oled.print(onOff(data.saveLiters)); break; // Подменю 9
case 9: oled.print(onOff(data.valveSignal)); break; // Подменю 10
case 10: oled.print(onOff(data.delayRelay)); break; // Подменю 11
}
break;
case 1: // Меню 2
switch(num2) {
case 0: oled.print(onOff(data.g)); break; // Подменю 1
case 1: oled.print(onOff(data.logo)); break; // Подменю 2
case 2: oled.print(onOff(data.j)); break; // Подменю 3
case 3: oled.print(onOff(data.k)); break; // Подменю 4
case 4: oled.print(onOff(data.l)); break; // Подменю 5
case 5: oled.print(onOff(data.m)); break; // Подменю 6
case 6: oled.print(onOff(data.n)); break; // Подменю 7
case 7: oled.print(onOff(data.p)); break; // Подменю 8
case 8: oled.print(data.q); break; // Подменю 9
case 9: oled.print(onOff(data.r)); break; // Подменю 10
case 10: oled.print(onOff(data.s)); break; // Подменю 11
case 11: oled.print(onOff(data.rectOnOff)); break; // Подменю 12
case 12: oled.print(menuRectType(data.rect)); break; // Подменю 13
case 13: oled.print(menuMiniScreenName(data.scr1)); break; // Подменю 14
case 14: oled.print(menuMiniScreenName(data.scr2)); break; // Подменю 15
case 15: oled.print(menuMiniScreenName(data.scr3)); break; // Подменю 16
case 16: oled.print(menuMiniScreenName(data.scr4)); break; // Подменю 17
case 17: oled.print(menuLang(data.langInterface)); break; // Подменю 18
}
break;
case 2: // Меню 3
switch(num2) {
case 0: oled.print(onOff(data.screen1)); break; // Подменю 1
case 1: oled.print(onOff(data.screen2)); break; // Подменю 2
case 2: oled.print(onOff(data.screen3)); break; // Подменю 3
case 3: oled.print(onOff(data.screen4)); break; // Подменю 4
case 4: oled.print(onOff(data.screen5)); break; // Подменю 5
case 5: oled.print(onOff(data.screen6)); break; // Подменю 6
case 6: oled.print(onOff(data.screen7)); break; // Подменю 7
case 7: oled.print(onOff(data.screen8)); break; // Подменю 8
case 8: oled.print(onOff(data.screen9)); break; // Подменю 9
case 9: oled.print(onOff(data.screen10)); break; // Подменю 10
case 10: oled.print(onOff(data.screenNum)); break; // Подменю 11
}
break;
case 3: // Меню 4
switch(num2) {
case 0: oled.print(onOff(data.autoBrightness)); break; // Подменю 1
case 1: oled.print(data.f); break; // Подменю 2
case 2: oled.print(data.bright); break; // Подменю 3
case 3: oled.print(data.minBright); break; // Подменю 4
case 4: oled.print(data.maxBright); break; // Подменю 5
case 5: oled.print(menuBrightSpeed(data.brightTimeout)); break; // Подменю 6
case 6: oled.print(data.brightIntens); break; // Подменю 7
case 7: oled.print(onOff(data.brightBoost)); break; // Подменю 8
case 8: oled.print(data.luxLimit); break; // Подменю 9
case 9: oled.print(onOff(data.luxDisplay)); break; // Подменю 10
}
break;
case 4: // Меню 5
switch(num2) {
case 0: oled.print(data.w); break; // Подменю 1
case 1: oled.print(data.x); break; // Подменю 2
case 2: oled.print(data.t); break; // Подменю 3
case 3: oled.print(data.u); break; // Подменю 4
case 4: oled.print(data.v); break; // Подменю 5
case 5: oled.print(menuSaveTimeDS(data.y)); break; // Подменю 6
case 6: oled.print(data.timeZone); break; // Подменю 7
case 7: oled.print(menuDateSource(data.dateSource)); break; // Подменю 8
case 8: oled.print(onOff(data.yearCorrect)); break; // Подменю 9
}
break;
case 6: // Меню 7
switch(num2) {
case 0: oled.print(data.speedLimit1); break; // Подменю 1
case 1: oled.print(data.speedLimit2); break; // Подменю 2
case 2: oled.print(data.speedLimit3); break; // Подменю 3
case 3: oled.print(data.gpsSpeedUpd); break; // Подменю 4
case 4: oled.print(onOff(data.sensorSpeed)); break; // Подменю 5
case 5: oled.print(data.sensorPulseNum); break; // Подменю 6
case 6: oled.print(onOff(data.odometerOnOff)); break; // Подменю 7
case 7: oled.print(data.odometer, 1); break; // Подменю 8
case 8: oled.print(menuResetOdometer(data.odometer2Reset)); break; // Подменю 9
case 9: oled.print(menuSpdLimitWarning(data.speedLimitWarning)); break; // Подменю 10
case 10: oled.print(data.rightOfEntrance); break; // Подменю 11
case 11: oled.print(data.speedCorrection); break; // Подменю 12
}
break;
case 7: // Меню 8
switch(num2) {
case 0: oled.print(menuMelodyStart(data.melodyStart)); break; // Подменю 1
case 1: oled.print(onOff(data.btnSound)); break; // Подменю 2
case 2: oled.print(onOff(data.warningSound)); break; // Подменю 3
case 3: oled.print(data.volumeSound); break; // Подменю 4
}
break;
case 8: // Меню 9
switch(num2) {
case 0: oled.print(data.change1); break; // Подменю 1
case 1: oled.print(data.change2); break; // Подменю 2
case 2: oled.print(data.change3); break; // Подменю 3
case 3: oled.print(data.change4); break; // Подменю 4
case 4: oled.print(data.change5); break; // Подменю 5
}
break;
case 9: // Меню 10
switch(num2) {
case 0: oled.print(menuRelayType(data.relayType)); break; // Подменю 1
case 1: oled.print(menutempSensorForRelay(data.tempSensorForRelay)); break; // Подменю 2
case 2: oled.print(data.relayTempOn); break; // Подменю 3
case 3: oled.print(data.relayTempOff); break; // Подменю 4
}
break;
case 10: // Меню 11
switch(num2) {
case 0: oled.print(onOff(data.parktronic)); break; // Подменю 1
case 1: oled.print(menutempSensorForRelay(data.parktronicTempSens)); break; // Подменю 2
}
break;
case 11: // Меню 12
switch(num2) {
case 0: oled.print(menuResetOdometer(data.z)); break; // Подменю 1
case 1: oled.print(SW_VERSION); break; // Подменю 2
}
break;
}
if (joy_M.click() or joy_L.click()) deep = 2; // Обрабатываем нажатия кнопок
if (joy_L.hold()) deep = 0;
if (joy_F.click()) {
switch(num1) {
case 0: // Меню 1
switch(num2) {
case 0: if (data.a == 12) data.a = 0;
else data.a += 0.001; break;
case 1: if (data.b == 12) data.b = 0;
else data.b += 0.001; break;
case 2: if (data.c == 150) data.c = 0;
else data.c += 0.5; break;
case 3: if (data.d == 25) data.d = 0;
else data.d += 0.1; break;
case 4: if (data.h == 1) data.h = 0;
else data.h += 1; break;
case 5: if (data.e == 60000) data.e = 200;
else data.e += 50; break;
case 6: if (data.vref == 6) data.vref = 4;
else data.vref += 0.01; break;
case 7: if (data.battVoltSource == 1) data.battVoltSource = 0;
else data.battVoltSource += 1; break;
case 8: if (data.saveLiters == 1) data.saveLiters = 0;
else data.saveLiters += 1; break;
case 9: if (data.valveSignal == 1) data.valveSignal = 0;
else data.valveSignal += 1; break;
case 10: if (data.delayRelay == 1) data.delayRelay = 0;
else data.delayRelay += 1; break;
}
break;
case 1: // Меню 2
switch(num2) {
case 0: if (data.g == 1) data.g = 0;
else data.g += 1; break;
case 1: if (data.logo == 1) data.logo = 0;
else data.logo += 1; break;
case 2: if (data.j == 1) data.j = 0;
else data.j += 1; break;
case 3: if (data.k == 1) data.k = 0;
else data.k += 1; break;
case 4: if (data.l == 1) data.l = 0;
else data.l += 1; break;
case 5: if (data.m == 1) data.m = 0;
else data.m += 1; break;
case 6: if (data.n == 1) data.n = 0;
else data.n += 1; break;
case 7: if (data.p == 1) data.p = 0;
else data.p += 1; break;
case 8: if (data.q == 29) data.q = 1;
else data.q += 1; break;
case 9: if (data.r == 1) data.r = 0;
else data.r += 1; break;
case 10: if (data.s == 1) data.s = 0;
else data.s += 1; break;
case 11: if (data.rectOnOff == 1) data.rectOnOff = 0;
else data.rectOnOff += 1; break;
case 12: if (data.rect == 1) data.rect = 0;
else data.rect += 1; break;
case 13: if (data.scr1 == SCR_OPT) data.scr1 = 0;
else data.scr1 += 1; break;
case 14: if (data.scr2 == SCR_OPT) data.scr2 = 0;
else data.scr2 += 1; break;
case 15: if (data.scr3 == SCR_OPT) data.scr3 = 0;
else data.scr3 += 1; break;
case 16: if (data.scr4 == SCR_OPT) data.scr4 = 0;
else data.scr4 += 1; break;
case 17: if (data.langInterface == 3) data.langInterface = 1;
else data.langInterface += 1; break;
}
break;
case 2: // Меню 3
switch(num2) {
case 0: if (data.screen1 == 1) data.screen1 = 0;
else data.screen1 += 1; break;
case 1: if (data.screen2 == 1) data.screen2 = 0;
else data.screen2 += 1; break;
case 2: if (data.screen3 == 1) data.screen3 = 0;
else data.screen3 += 1; break;
case 3: if (data.screen4 == 1) data.screen4 = 0;
else data.screen4 += 1; break;
case 4: if (data.screen5 == 1) data.screen5 = 0;
else data.screen5 += 1; break;
case 5: if (data.screen6 == 1) data.screen6 = 0;
else data.screen6 += 1; break;
case 6: if (data.screen7 == 1) data.screen7 = 0;
else data.screen7 += 1; break;
case 7: if (data.screen8 == 1) data.screen8 = 0;
else data.screen8 += 1; break;
case 8: if (data.screen9 == 1) data.screen9 = 0;
else data.screen9 += 1; break;
case 9: if (data.screen10 == 1) data.screen10 = 0;
else data.screen10 += 1; break;
case 10: if (data.screenNum == 1) data.screenNum = 0;
else data.screenNum += 1; break;
}
break;
case 3: // Меню 4
switch(num2) {
case 0: if (data.autoBrightness == 1) data.autoBrightness = 0;
else data.autoBrightness += 1; break;
case 1: if (data.f == 255) data.f = 0;
else data.f += 1; break;
case 2: if (data.bright == 255) data.bright = 1;
else data.bright += 1; break;
case 3: if (data.minBright == 200) data.minBright = 1;
else data.minBright += 1; break;
case 4: if (data.maxBright == 255) data.maxBright = 50;
else data.maxBright += 1; break;
case 5: if (data.brightTimeout == 3) data.brightTimeout = 1;
else data.brightTimeout += 1; break;
case 6: if (data.brightIntens == 15) data.brightIntens = -15;
else data.brightIntens += 1; break;
case 7: if (data.brightBoost == 1) data.brightBoost = 0;
else data.brightBoost += 1; break;
case 8: if (data.luxLimit == 65535) data.luxLimit = 1;
else data.luxLimit += 1; break;
case 9: if (data.luxDisplay == 1) data.luxDisplay = 0;
else data.luxDisplay += 1; break;
}
break;
case 4: // Меню 5
switch(num2) {
case 0: if (data.w == 23) data.w = 0;
else data.w += 1; break;
case 1: if (data.x == 59) data.x = 0;
else data.x += 1; break;
case 2: if (data.t == 2100) data.t = 2025;
else data.t += 1; break;
case 3: if (data.u == 12) data.u = 1;
else data.u += 1; break;
case 4: if (data.v == 31) data.v = 1;
else data.v += 1; break;
case 5: if (data.y == 1) data.y = 0;
else data.y += 1; break;
case 6: if (data.timeZone == 12) data.timeZone = -12;
else data.timeZone += 1; break;
case 7: if (data.dateSource == 1) data.dateSource = 0;
else data.dateSource += 1; break;
case 8: if (data.yearCorrect == 1) data.yearCorrect = 0;
else data.yearCorrect += 1; break;
}
break;
case 6: // Меню 7
switch(num2) {
case 0: if (data.speedLimit1 == 250) data.speedLimit1 = 10;
else data.speedLimit1 += 1; break;
case 1: if (data.speedLimit2 == 250) data.speedLimit2 = 10;
else data.speedLimit2 += 1; break;
case 2: if (data.speedLimit3 == 250) data.speedLimit3 = 10;
else data.speedLimit3 += 1; break;
case 3: if (data.gpsSpeedUpd == 60000) data.gpsSpeedUpd = 500;
else data.gpsSpeedUpd += 50; break;
case 4: if (data.sensorSpeed == 1) data.sensorSpeed = 0;
else data.sensorSpeed += 1; break;
case 5: if (data.sensorPulseNum == 64) data.sensorPulseNum = 2;
else data.sensorPulseNum += 1; break;
case 6: if (data.odometerOnOff == 1) data.odometerOnOff = 0;
else data.odometerOnOff += 1; break;
case 7: if (data.odometer == 999999) data.odometer = 0;
else data.odometer += 0.1; break;
case 8: if (data.odometer2Reset == 1) data.odometer2Reset = 0;
else data.odometer2Reset += 1; break;
case 9: if (data.speedLimitWarning == 3) data.speedLimitWarning = 0;
else data.speedLimitWarning += 1; break;
case 10: if (data.rightOfEntrance == 100) data.rightOfEntrance = 0;
else data.rightOfEntrance += 1; break;
case 11: if (data.speedCorrection == 200) data.speedCorrection = 1;
else data.speedCorrection += 1; break;
}
break;
case 7: // Меню 8
switch(num2) {
case 0: if (data.melodyStart == 10) data.melodyStart = 0;
else data.melodyStart += 1;
melodyOn(data.melodyStart); break;
case 1: if (data.btnSound == 1) data.btnSound = 0;
else data.btnSound += 1; break;
case 2: if (data.warningSound == 1) data.warningSound = 0;
else data.warningSound += 1; break;
case 3: if (data.volumeSound == 10) data.volumeSound = 0;
else data.volumeSound += 1; break;
}
break;
case 8: // Меню 9
switch(num2) {
case 0: if (data.change1 == 999500) data.change1 = 0;
else data.change1 += 100; break;
case 1: if (data.change2 == 999500) data.change2 = 0;
else data.change2 += 100; break;
case 2: if (data.change3 == 999500) data.change3 = 0;
else data.change3 += 100; break;
case 3: if (data.change4 == 999500) data.change4 = 0;
else data.change4 += 100; break;
case 4: if (data.change5 == 999500) data.change5 = 0;
else data.change5 += 100; break;
}
break;
case 9: // Меню 10
switch(num2) {
case 0: if (data.relayType == 1) data.relayType = 0;
else data.relayType += 1; break;
case 1: if (data.tempSensorForRelay == 5) data.tempSensorForRelay = 0;
else data.tempSensorForRelay += 1; break;
case 2: if (data.relayTempOn == 130) data.relayTempOn = 50;
else data.relayTempOn += 1; break;
case 3: if (data.relayTempOff == 125) data.relayTempOff = 45;
else data.relayTempOff += 1; break;
}
break;
case 10: // Меню 11
switch(num2) {
case 0: if (data.parktronic == 1) data.parktronic = 0;
else data.parktronic += 1; break;
case 1: if (data.parktronicTempSens == 5) data.parktronicTempSens = 0;
else data.parktronicTempSens += 1; break;
}
break;
case 11: // Меню 12
switch(num2) {
case 0: if (data.z == 1) data.z = 0;
else data.z += 1; break;
}
break;
}
}
if (joy_F.holding()) { // Если кнопку F удерживают...
switch(num1) {
case 1: // Меню 2
switch(num2) {
case 8: if (data.q == 29) data.q = 1;
else data.q += 1; break;
case 13: if (data.scr1 == SCR_OPT) data.scr1 = 0;
else data.scr1 += 1; break;
case 14: if (data.scr2 == SCR_OPT) data.scr2 = 0;
else data.scr2 += 1; break;
case 15: if (data.scr3 == SCR_OPT) data.scr3 = 0;
else data.scr3 += 1; break;
case 16: if (data.scr4 == SCR_OPT) data.scr4 = 0;
else data.scr4 += 1; break;
case 17: if (data.langInterface == 3) data.langInterface = 1;
else data.langInterface += 1; break;
}
break;
case 3: // Меню 4
switch(num2) {
case 5: if (data.brightTimeout == 3) data.brightTimeout = 1;
else data.brightTimeout += 1; break;
case 6: if (data.brightIntens == 15) data.brightIntens = -15;
else data.brightIntens += 1; break;
}
break;
case 4: // Меню 5
switch(num2) {
case 0: if (data.w == 23) data.w = 0;
else data.w += 1; break;
case 1: if (data.x == 59) data.x = 0;
else data.x += 1; break;
case 2: if (data.t == 2100) data.t = 2025;
else data.t += 1; break;
case 3: if (data.u == 12) data.u = 1;
else data.u += 1; break;
case 4: if (data.v == 31) data.v = 1;
else data.v += 1; break;
case 6: if (data.timeZone == 12) data.timeZone = -12;
else data.timeZone += 1; break;
}
break;
case 6: // Меню 7
switch(num2) {
case 5: if (data.sensorPulseNum == 64) data.sensorPulseNum = 2;
else data.sensorPulseNum += 1; break;
case 9: if (data.speedLimitWarning == 3) data.speedLimitWarning = 0;
else data.speedLimitWarning += 1; break;
case 10: if (data.rightOfEntrance == 100) data.rightOfEntrance = 0;
else data.rightOfEntrance += 1; break;
}
break;
case 9: // Меню 10
switch(num2) {
case 1: if (data.tempSensorForRelay == 5) data.tempSensorForRelay = 0;
else data.tempSensorForRelay += 1; break;
case 2: if (data.relayTempOn == 130) data.relayTempOn = 50;
else data.relayTempOn += 1; break;
case 3: if (data.relayTempOff == 125) data.relayTempOff = 45;
else data.relayTempOff += 1; break;
}
break;
case 10: // Меню 11
switch(num2) {
case 1: if (data.parktronicTempSens == 5) data.parktronicTempSens = 0;
else data.parktronicTempSens += 1; break;
}
break;
}
}
if (joy_F.holding() and joy_F.holdFor() < 3000) { // Если кнопку F нажали и удерживают не более 3000 мс
switch(num1) {
case 0: // Меню 1
switch(num2) {
case 0: if (data.a == 12) data.a = 0;
else data.a += 0.001; break;
case 1: if (data.b == 12) data.b = 0;
else data.b += 0.001; break;
case 2: if (data.c == 150) data.c = 0;
else data.c += 0.5; break;
case 3: if (data.d == 25) data.d = 0;
else data.d += 0.1; break;
case 5: if (data.e == 60000) data.e = 200;
else data.e += 50; break;
case 6: if (data.vref == 6) data.vref = 4;
else data.vref += 0.01; break;
}
break;
case 3: // Меню 4
switch(num2) {
case 1: if (data.f == 255) data.f = 0;
else data.f += 1; break;
case 2: if (data.bright == 255) data.bright = 1;
else data.bright += 1; break;
case 3: if (data.minBright == 200) data.minBright = 1;
else data.minBright += 1; break;
case 4: if (data.maxBright == 255) data.maxBright = 50;
else data.maxBright += 1; break;
case 8: if (data.luxLimit == 65535) data.luxLimit = 1;
else data.luxLimit += 1; break;
}
break;
case 6: // Меню 7
switch(num2) {
case 0: if (data.speedLimit1 == 250) data.speedLimit1 = 10;
else data.speedLimit1 += 1; break;
case 1: if (data.speedLimit2 == 250) data.speedLimit2 = 10;
else data.speedLimit2 += 1; break;
case 2: if (data.speedLimit3 == 250) data.speedLimit3 = 10;
else data.speedLimit3 += 1; break;
case 3: if (data.gpsSpeedUpd == 60000) data.gpsSpeedUpd = 500;
else data.gpsSpeedUpd += 50; break;
case 7: if (data.odometer == 999999) data.odometer = 0;
else data.odometer += 0.1; break;
case 11: if (data.speedCorrection == 200) data.speedCorrection = 1;
else data.speedCorrection += 1; break;
}
break;
case 8: // Меню 9
switch(num2) {
case 0: if (data.change1 == 999500) data.change1 = 0;
else data.change1 += 100; break;
case 1: if (data.change2 == 999500) data.change2 = 0;
else data.change2 += 100; break;
case 2: if (data.change3 == 999500) data.change3 = 0;
else data.change3 += 100; break;
case 3: if (data.change4 == 999500) data.change4 = 0;
else data.change4 += 100; break;
case 4: if (data.change5 == 999500) data.change5 = 0;
else data.change5 += 100; break;
}
break;
}
}
if (joy_F.holdFor() >= 3000 and joy_F.holdFor() < 7000) { // Если кнопку F нажали и удерживают не более 7000 мс
switch(num1) {
case 0: // Меню 1
switch(num2) {
case 0: if (data.a == 12) data.a = 0;
else data.a += 0.01; break;
case 1: if (data.b == 12) data.b = 0;
else data.b += 0.01; break;
case 2: if (data.c == 150) data.c = 0;
else data.c += 5; break;
case 3: if (data.d == 25) data.d = 0;
else data.d += 0.5; break;
case 5: if (data.e == 60000) data.e = 200;
else data.e += 200; break;
case 6: if (data.vref == 6) data.vref = 4;
else data.vref += 0.1; break;
}
break;
case 3: // Меню 4
switch(num2) {
case 1: if (data.f == 255) data.f = 0;
else data.f += 5; break;
case 2: if (data.bright == 255) data.bright = 1;
else data.bright += 5; break;
case 3: if (data.minBright == 200) data.minBright = 1;
else data.minBright += 5; break;
case 4: if (data.maxBright == 255) data.maxBright = 50;
else data.maxBright += 5; break;
case 8: if (data.luxLimit == 65535) data.luxLimit = 1;
else data.luxLimit += 10; break;
}
break;
case 6: // Меню 7
switch(num2) {
case 0: if (data.speedLimit1 == 250) data.speedLimit1 = 10;
else data.speedLimit1 += 5; break;
case 1: if (data.speedLimit2 == 250) data.speedLimit2 = 10;
else data.speedLimit2 += 5; break;
case 2: if (data.speedLimit3 == 250) data.speedLimit3 = 10;
else data.speedLimit3 += 5; break;
case 3: if (data.gpsSpeedUpd == 60000) data.gpsSpeedUpd = 500;
else data.gpsSpeedUpd += 200; break;
case 7: if (data.odometer == 999999) data.odometer = 0;
else data.odometer += 10; break;
case 11: if (data.speedCorrection == 200) data.speedCorrection = 1;
else data.speedCorrection += 2; break;
}
break;
case 8: // Меню 9
switch(num2) {
case 0: if (data.change1 == 999500) data.change1 = 0;
else data.change1 += 1000; break;
case 1: if (data.change2 == 999500) data.change2 = 0;
else data.change2 += 1000; break;
case 2: if (data.change3 == 999500) data.change3 = 0;
else data.change3 += 1000; break;
case 3: if (data.change4 == 999500) data.change4 = 0;
else data.change4 += 1000; break;
case 4: if (data.change5 == 999500) data.change5 = 0;
else data.change5 += 1000; break;
}
break;
}
}
if (joy_F.holdFor() >= 7000 and joy_F.holdFor() < 10000) { // Если кнопку F нажали и удерживают не более 10000 мс
switch(num1) {
case 0: // Меню 1
switch(num2) {
case 0: if (data.a == 12) data.a = 0;
else data.a += 0.1; break;
case 1: if (data.b == 12) data.b = 0;
else data.b += 0.1; break;
case 2: if (data.c == 150) data.c = 0;
else data.c += 10; break;
case 3: if (data.d == 25) data.d = 0;
else data.d += 1; break;
case 5: if (data.e == 60000) data.e = 200;
else data.e += 1000; break;
case 6: if (data.vref == 6) data.vref = 4;
else data.vref += 0.1; break;
}
break;
case 3: // Меню 4
switch(num2) {
case 1: if (data.f == 255) data.f = 0;
else data.f += 10; break;
case 2: if (data.bright == 255) data.bright = 1;
else data.bright += 10; break;
case 3: if (data.minBright == 200) data.minBright = 1;
else data.minBright += 10; break;
case 4: if (data.maxBright == 255) data.maxBright = 50;
else data.maxBright += 10; break;
case 8: if (data.luxLimit == 65535) data.luxLimit = 1;
else data.luxLimit += 50; break;
}
break;
case 6: // Меню 7
switch(num2) {
case 0: if (data.speedLimit1 == 250) data.speedLimit1 = 10;
else data.speedLimit1 += 10; break;
case 1: if (data.speedLimit2 == 250) data.speedLimit2 = 10;
else data.speedLimit2 += 10; break;
case 2: if (data.speedLimit3 == 250) data.speedLimit3 = 10;
else data.speedLimit3 += 10; break;
case 3: if (data.gpsSpeedUpd == 60000) data.gpsSpeedUpd = 500;
else data.gpsSpeedUpd += 1000; break;
case 7: if (data.odometer == 999999) data.odometer = 0;
else data.odometer += 100; break;
case 11: if (data.speedCorrection == 200) data.speedCorrection = 1;
else data.speedCorrection += 2; break;
}
break;
case 8: // Меню 9
switch(num2) {
case 0: if (data.change1 == 999500) data.change1 = 0;
else data.change1 += 10000; break;
case 1: if (data.change2 == 999500) data.change2 = 0;
else data.change2 += 10000; break;
case 2: if (data.change3 == 999500) data.change3 = 0;
else data.change3 += 10000; break;
case 3: if (data.change4 == 999500) data.change4 = 0;
else data.change4 += 10000; break;
case 4: if (data.change5 == 999500) data.change5 = 0;
else data.change5 += 10000; break;
}
break;
}
}
if (joy_F.holdFor() >= 10000 and joy_F.holdFor() < 13000) { // Если кнопку F нажали и удерживают не более 13000 мс
switch(num1) {
case 0: // Меню 1
switch(num2) {
case 0: if (data.a == 12) data.a = 0;
else data.a += 0.5; break;
case 1: if (data.b == 12) data.b = 0;
else data.b += 0.5; break;
case 2: if (data.c == 150) data.c = 0;
else data.c += 10; break;
case 3: if (data.d == 25) data.d = 0;
else data.d += 1; break;
case 5: if (data.e == 60000) data.e = 200;
else data.e += 5000; break;
case 6: if (data.vref == 6) data.vref = 4;
else data.vref += 0.1; break;
}
break;
case 3: // Меню 4
switch(num2) {
case 1: if (data.f == 255) data.f = 0;
else data.f += 10; break;
case 2: if (data.bright == 255) data.bright = 1;
else data.bright += 10; break;
case 3: if (data.minBright == 200) data.minBright = 1;
else data.minBright += 10; break;
case 4: if (data.maxBright == 255) data.maxBright = 50;
else data.maxBright += 10; break;
case 8: if (data.luxLimit == 65535) data.luxLimit = 1;
else data.luxLimit += 100; break;
}
break;
case 6: // Меню 7
switch(num2) {
case 0: if (data.speedLimit1 == 250) data.speedLimit1 = 10;
else data.speedLimit1 += 10; break;
case 1: if (data.speedLimit2 == 250) data.speedLimit2 = 10;
else data.speedLimit2 += 10; break;
case 2: if (data.speedLimit3 == 250) data.speedLimit3 = 10;
else data.speedLimit3 += 10; break;
case 3: if (data.gpsSpeedUpd == 60000) data.gpsSpeedUpd = 500;
else data.gpsSpeedUpd += 5000; break;
case 7: if (data.odometer == 999999) data.odometer = 0;
else data.odometer += 1000; break;
case 11: if (data.speedCorrection == 200) data.speedCorrection = 1;
else data.speedCorrection += 2; break;
}
break;
case 8: // Меню 9
switch(num2) {
case 0: if (data.change1 == 999500) data.change1 = 0;
else data.change1 += 50000; break;
case 1: if (data.change2 == 999500) data.change2 = 0;
else data.change2 += 50000; break;
case 2: if (data.change3 == 999500) data.change3 = 0;
else data.change3 += 50000; break;
case 3: if (data.change4 == 999500) data.change4 = 0;
else data.change4 += 50000; break;
case 4: if (data.change5 == 999500) data.change5 = 0;
else data.change5 += 50000; break;
}
break;
}
}
if (joy_F.holdFor() >= 13000) { // Если кнопку F нажали и удерживают 13000 мс и более
switch(num1) {
case 0: // Меню 1
switch(num2) {
case 0: if (data.a == 12) data.a = 0;
else data.a += 0.5; break;
case 1: if (data.b == 12) data.b = 0;
else data.b += 0.5; break;
case 2: if (data.c == 150) data.c = 0;
else data.c += 10; break;
case 3: if (data.d == 25) data.d = 0;
else data.d += 1; break;
case 5: if (data.e == 60000) data.e = 200;
else data.e += 5000; break;
case 6: if (data.vref == 6) data.vref = 4;
else data.vref += 0.1; break;
}
break;
case 3: // Меню 4
switch(num2) {
case 1: if (data.f == 255) data.f = 0;
else data.f += 10; break;
case 2: if (data.bright == 255) data.bright = 1;
else data.bright += 10; break;
case 3: if (data.minBright == 200) data.minBright = 1;
else data.minBright += 10; break;
case 4: if (data.maxBright == 255) data.maxBright = 50;
else data.maxBright += 10; break;
case 8: if (data.luxLimit == 65535) data.luxLimit = 1;
else data.luxLimit += 1000; break;
}
break;
case 6: // Меню 7
switch(num2) {
case 0: if (data.speedLimit1 == 250) data.speedLimit1 = 10;
else data.speedLimit1 += 10; break;
case 1: if (data.speedLimit2 == 250) data.speedLimit2 = 10;
else data.speedLimit2 += 10; break;
case 2: if (data.speedLimit3 == 250) data.speedLimit3 = 10;
else data.speedLimit3 += 10; break;
case 3: if (data.gpsSpeedUpd == 60000) data.gpsSpeedUpd = 500;
else data.gpsSpeedUpd += 5000; break;
case 7: if (data.odometer == 999999) data.odometer = 0;
else data.odometer += 10000; break;
case 11: if (data.speedCorrection == 200) data.speedCorrection = 1;
else data.speedCorrection += 2; break;
}
break;
case 8: // Меню 9
switch(num2) {
case 0: if (data.change1 == 999500) data.change1 = 0;
else data.change1 += 50000; break;
case 1: if (data.change2 == 999500) data.change2 = 0;
else data.change2 += 50000; break;
case 2: if (data.change3 == 999500) data.change3 = 0;
else data.change3 += 50000; break;
case 3: if (data.change4 == 999500) data.change4 = 0;
else data.change4 += 50000; break;
case 4: if (data.change5 == 999500) data.change5 = 0;
else data.change5 += 50000; break;
}
break;
}
}
if (joy_B.click()) { // Если кнопку B нажали...
switch(num1) {
case 0: // Меню 1
switch(num2) {
case 0: if (data.a == 0) data.a = 12;
else data.a -= 0.001; break;
case 1: if (data.b == 0) data.b = 12;
else data.b -= 0.001; break;
case 2: if (data.c == 0) data.c = 150;
else data.c -= 0.5; break;
case 3: if (data.d == 0) data.d = 25;
else data.d -= 0.1; break;
case 4: if (data.h == 1) data.h = 1;
else data.h -= 1; break;
case 5: if (data.e == 200) data.e = 60000;
else data.e -= 50; break;
case 6: if (data.vref == 4) data.vref = 6;
else data.vref -= 0.01; break;
case 7: if (data.battVoltSource == 0) data.battVoltSource = 1;
else data.battVoltSource -= 1; break;
case 8: if (data.saveLiters == 0) data.saveLiters = 1;
else data.saveLiters -= 1; break;
case 9: if (data.valveSignal == 0) data.valveSignal = 1;
else data.valveSignal -= 1; break;
case 10: if (data.delayRelay == 0) data.delayRelay = 1;
else data.delayRelay -= 1; break;
}
break;
case 1: // Меню 2
switch(num2) {
case 0: if (data.g == 0) data.g = 1;
else data.g -= 1; break;
case 1: if (data.logo == 0) data.logo = 1;
else data.logo -= 1; break;
case 2: if (data.j == 0) data.j = 1;
else data.j -= 1; break;
case 3: if (data.k == 0) data.k = 1;
else data.k -= 1; break;
case 4: if (data.l == 0) data.l = 1;
else data.l -= 1; break;
case 5: if (data.m == 0) data.m = 1;
else data.m -= 1; break;
case 6: if (data.n == 0) data.n = 1;
else data.n -= 1; break;
case 7: if (data.p == 0) data.p = 1;
else data.p -= 1; break;
case 8: if (data.q == 1) data.q = 29;
else data.q -= 1; break;
case 9: if (data.r == 0) data.r = 1;
else data.r -= 1; break;
case 10: if (data.s == 0) data.s = 1;
else data.s -= 1; break;
case 11: if (data.rectOnOff == 0) data.rectOnOff = 1;
else data.rectOnOff -= 1; break;
case 12: if (data.rect == 0) data.rect = 1;
else data.rect -= 1; break;
case 13: if (data.scr1 == 0) data.scr1 = SCR_OPT;
else data.scr1 -= 1; break;
case 14: if (data.scr2 == 0) data.scr2 = SCR_OPT;
else data.scr2 -= 1; break;
case 15: if (data.scr3 == 0) data.scr3 = SCR_OPT;
else data.scr3 -= 1; break;
case 16: if (data.scr4 == 0) data.scr4 = SCR_OPT;
else data.scr4 -= 1; break;
case 17: if (data.langInterface == 1) data.langInterface = 3;
else data.langInterface -= 1; break;
}
break;
case 2: // Меню 3
switch(num2) {
case 0: if (data.screen1 == 0) data.screen1 = 1;
else data.screen1 -= 1; break;
case 1: if (data.screen2 == 0) data.screen2 = 1;
else data.screen2 -= 1; break;
case 2: if (data.screen3 == 0) data.screen3 = 1;
else data.screen3 -= 1; break;
case 3: if (data.screen4 == 0) data.screen4 = 1;
else data.screen4 -= 1; break;
case 4: if (data.screen5 == 0) data.screen5 = 1;
else data.screen5 -= 1; break;
case 5: if (data.screen6 == 0) data.screen6 = 1;
else data.screen6 -= 1; break;
case 6: if (data.screen7 == 0) data.screen7 = 1;
else data.screen7 -= 1; break;
case 7: if (data.screen8 == 0) data.screen8 = 1;
else data.screen8 -= 1; break;
case 8: if (data.screen9 == 0) data.screen9 = 1;
else data.screen9 -= 1; break;
case 9: if (data.screen10 == 0) data.screen10 = 1;
else data.screen10 -= 1; break;
case 10: if (data.screenNum == 0) data.screenNum = 1;
else data.screenNum -= 1; break;
}
break;
case 3: // Меню 4
switch(num2) {
case 0: if (data.autoBrightness == 0) data.autoBrightness = 1;
else data.autoBrightness -= 1; break;
case 1: if (data.f == 0) data.f = 255;
else data.f -= 1; break;
case 2: if (data.bright == 1) data.bright = 255;
else data.bright -= 1; break;
case 3: if (data.minBright == 1) data.minBright = 200;
else data.minBright -= 1; break;
case 4: if (data.maxBright == 50) data.maxBright = 255;
else data.maxBright -= 1; break;
case 5: if (data.brightTimeout == 1) data.brightTimeout = 3;
else data.brightTimeout -= 1; break;
case 6: if (data.brightIntens == -15) data.brightIntens = 15;
else data.brightIntens -= 1; break;
case 7: if (data.brightBoost == 0) data.brightBoost = 1;
else data.brightBoost -= 1; break;
case 8: if (data.luxLimit == 1) data.luxLimit = 65535;
else data.luxLimit -= 1; break;
case 9: if (data.luxDisplay == 0) data.luxDisplay = 1;
else data.luxDisplay -= 1; break;
}
break;
case 4: // Меню 5
switch(num2) {
case 0: if (data.w == 0) data.w = 23;
else data.w -= 1; break;
case 1: if (data.x == 0) data.x = 59;
else data.x -= 1; break;
case 2: if (data.t == 2025) data.t = 2100;
else data.t -= 1; break;
case 3: if (data.u == 1) data.u = 12;
else data.u -= 1; break;
case 4: if (data.v == 1) data.v = 31;
else data.v -= 1; break;
case 5: if (data.y == 0) data.y = 1;
else data.y -= 1; break;
case 6: if (data.timeZone == -12) data.timeZone = 12;
else data.timeZone -= 1; break;
case 7: if (data.dateSource == 0) data.dateSource = 1;
else data.dateSource -= 1; break;
case 8: if (data.yearCorrect == 0) data.yearCorrect = 1;
else data.yearCorrect -= 1; break;
}
break;
case 6: // Меню 7
switch(num2) {
case 0: if (data.speedLimit1 == 10) data.speedLimit1 = 250;
else data.speedLimit1 -= 1; break;
case 1: if (data.speedLimit2 == 10) data.speedLimit2 = 250;
else data.speedLimit2 -= 1; break;
case 2: if (data.speedLimit3 == 10) data.speedLimit3 = 250;
else data.speedLimit3 -= 1; break;
case 3: if (data.gpsSpeedUpd == 500) data.gpsSpeedUpd = 60000;
else data.gpsSpeedUpd -= 50; break;
case 4: if (data.sensorSpeed == 0) data.sensorSpeed = 1;
else data.sensorSpeed -= 1; break;
case 5: if (data.sensorPulseNum == 2) data.sensorPulseNum = 64;
else data.sensorPulseNum -= 1; break;
case 6: if (data.odometerOnOff == 0) data.odometerOnOff = 1;
else data.odometerOnOff -= 1; break;
case 7: if (data.odometer == 0) data.odometer = 999999;
else data.odometer -= 0.1; break;
case 8: if (data.odometer2Reset == 0) data.odometer2Reset = 1;
else data.odometer2Reset -= 1; break;
case 9: if (data.speedLimitWarning == 0) data.speedLimitWarning = 3;
else data.speedLimitWarning -= 1; break;
case 10: if (data.rightOfEntrance == 0) data.rightOfEntrance = 100;
else data.rightOfEntrance -= 1; break;
case 11: if (data.speedCorrection == 0) data.speedCorrection = 200;
else data.speedCorrection -= 1; break;
}
break;
case 7: // Меню 8
switch(num2) {
case 0: if (data.melodyStart == 0) data.melodyStart = 10;
else data.melodyStart -= 1;
melodyOn(data.melodyStart); break;
case 1: if (data.btnSound == 0) data.btnSound = 1;
else data.btnSound -= 1; break;
case 2: if (data.warningSound == 0) data.warningSound = 1;
else data.warningSound -= 1; break;
case 3: if (data.volumeSound == 0) data.volumeSound = 10;
else data.volumeSound -= 1; break;
}
break;
case 8: // Меню 9
switch(num2) {
case 0: if (data.change1 == 0) data.change1 = 999500;
else data.change1 -= 100; break;
case 1: if (data.change2 == 0) data.change2 = 999500;
else data.change2 -= 100; break;
case 2: if (data.change3 == 0) data.change3 = 999500;
else data.change3 -= 100; break;
case 3: if (data.change4 == 0) data.change4 = 999500;
else data.change4 -= 100; break;
case 4: if (data.change5 == 0) data.change5 = 999500;
else data.change5 -= 100; break;
}
break;
case 9: // Меню 10
switch(num2) {
case 0: if (data.relayType == 0) data.relayType = 1;
else data.relayType -= 1; break;
case 1: if (data.tempSensorForRelay == 0) data.tempSensorForRelay = 5;
else data.tempSensorForRelay -= 1; break;
case 2: if (data.relayTempOn == 50) data.relayTempOn = 130;
else data.relayTempOn -= 1; break;
case 3: if (data.relayTempOff == 45) data.relayTempOff = 125;
else data.relayTempOff -= 1; break;
}
break;
case 10: // Меню 11
switch(num2) {
case 0: if (data.parktronic == 0) data.parktronic = 1;
else data.parktronic -= 1; break;
case 1: if (data.parktronicTempSens == 0) data.parktronicTempSens = 5;
else data.parktronicTempSens -= 1; break;
}
break;
case 11: // Меню 12
switch(num2) {
case 0: if (data.z == 0) data.z = 1;
else data.z -= 1; break;
}
break;
}
}
if (joy_B.holding()) { // Если кнопку B удерживают...
switch(num1) {
case 1: // Меню 2
switch(num2) {
case 8: if (data.q == 1) data.q = 29;
else data.q -= 1; break;
case 13: if (data.scr1 == 0) data.scr1 = SCR_OPT;
else data.scr1 -= 1; break;
case 14: if (data.scr2 == 0) data.scr2 = SCR_OPT;
else data.scr2 -= 1; break;
case 15: if (data.scr3 == 0) data.scr3 = SCR_OPT;
else data.scr3 -= 1; break;
case 16: if (data.scr4 == 0) data.scr4 = SCR_OPT;
else data.scr4 -= 1; break;
case 17: if (data.langInterface == 1) data.langInterface = 3;
else data.langInterface -= 1; break;
}
break;
case 3: // Меню 4
switch(num2) {
case 5: if (data.brightTimeout == 1) data.brightTimeout = 3;
else data.brightTimeout -= 1; break;
case 6: if (data.brightIntens == -15) data.brightIntens = 15;
else data.brightIntens -= 1; break;
}
break;
case 4: // Меню 5
switch(num2) {
case 0: if (data.w == 0) data.w = 23;
else data.w -= 1; break;
case 1: if (data.x == 0) data.x = 59;
else data.x -= 1; break;
case 2: if (data.t == 2025) data.t = 2100;
else data.t -= 1; break;
case 3: if (data.u == 1) data.u = 12;
else data.u -= 1; break;
case 4: if (data.v == 1) data.v = 31;
else data.v -= 1; break;
case 6: if (data.timeZone == -12) data.timeZone = 12;
else data.timeZone -= 1; break;
}
break;
case 6: // Меню 7
switch(num2) {
case 5: if (data.sensorPulseNum == 2) data.sensorPulseNum = 64;
else data.sensorPulseNum -= 1; break;
case 9: if (data.speedLimitWarning == 0) data.speedLimitWarning = 3;
else data.speedLimitWarning -= 1; break;
case 10: if (data.rightOfEntrance == 0) data.rightOfEntrance = 100;
else data.rightOfEntrance -= 1; break;
}
break;
case 9: // Меню 10
switch(num2) {
case 1: if (data.tempSensorForRelay == 0) data.tempSensorForRelay = 5;
else data.tempSensorForRelay -= 1; break;
case 2: if (data.relayTempOn == 50) data.relayTempOn = 130;
else data.relayTempOn -= 1; break;
case 3: if (data.relayTempOff == 45) data.relayTempOff = 125;
else data.relayTempOff -= 1; break;
}
break;
case 10: // Меню 11
switch(num2) {
case 1: if (data.parktronicTempSens == 0) data.parktronicTempSens = 5;
else data.parktronicTempSens -= 1; break;
}
break;
}
}
if (joy_B.holding() and joy_B.holdFor() < 3000) { // Если кнопку B нажали и удерживают не более 3000 мс
switch(num1) {
case 0: // Меню 1
switch(num2) {
case 0: if (data.a == 0) data.a = 12;
else data.a -= 0.001; break;
case 1: if (data.b == 0) data.b = 12;
else data.b -= 0.001; break;
case 2: if (data.c == 0) data.c = 150;
else data.c -= 0.5; break;
case 3: if (data.d == 0) data.d = 25;
else data.d -= 0.1; break;
case 5: if (data.e == 200) data.e = 60000;
else data.e -= 50; break;
case 6: if (data.vref == 4) data.vref = 6;
else data.vref -= 0.01; break;
}
break;
case 3: // Меню 4
switch(num2) {
case 1: if (data.f == 0) data.f = 255;
else data.f -= 1; break;
case 2: if (data.bright == 1) data.bright = 255;
else data.bright -= 1; break;
case 3: if (data.minBright == 1) data.minBright = 200;
else data.minBright -= 1; break;
case 4: if (data.maxBright == 50) data.maxBright = 255;
else data.maxBright -= 1; break;
case 8: if (data.luxLimit == 1) data.luxLimit = 65535;
else data.luxLimit -= 1; break;
}
break;
case 6: // Меню 7
switch(num2) {
case 0: if (data.speedLimit1 == 10) data.speedLimit1 = 250;
else data.speedLimit1 -= 1; break;
case 1: if (data.speedLimit2 == 10) data.speedLimit2 = 250;
else data.speedLimit2 -= 1; break;
case 2: if (data.speedLimit3 == 10) data.speedLimit3 = 250;
else data.speedLimit3 -= 1; break;
case 3: if (data.gpsSpeedUpd == 500) data.gpsSpeedUpd = 60000;
else data.gpsSpeedUpd -= 50; break;
case 7: if (data.odometer == 0) data.odometer = 999999;
else data.odometer -= 0.1; break;
case 11: if (data.speedCorrection == 0) data.speedCorrection = 200;
else data.speedCorrection -= 1; break;
}
break;
case 8: // Меню 9
switch(num2) {
case 0: if (data.change1 == 0) data.change1 = 999500;
else data.change1 -= 100; break;
case 1: if (data.change2 == 0) data.change2 = 999500;
else data.change2 -= 100; break;
case 2: if (data.change3 == 0) data.change3 = 999500;
else data.change3 -= 100; break;
case 3: if (data.change4 == 0) data.change4 = 999500;
else data.change4 -= 100; break;
case 4: if (data.change5 == 0) data.change5 = 999500;
else data.change5 -= 100; break;
}
break;
}
}
if (joy_B.holdFor() >= 3000 and joy_B.holdFor() < 7000) { // Если кнопку B нажали и удерживают не более 7000 мс
switch(num1) {
case 0: // Меню 1
switch(num2) {
case 0: if (data.a == 0) data.a = 12;
else data.a -= 0.01; break;
case 1: if (data.b == 0) data.b = 12;
else data.b -= 0.01; break;
case 2: if (data.c == 0) data.c = 150;
else data.c -= 5; break;
case 3: if (data.d == 0) data.d = 25;
else data.d -= 0.5; break;
case 5: if (data.e == 200) data.e = 60000;
else data.e -= 200; break;
case 6: if (data.vref == 4) data.vref = 6;
else data.vref -= 0.1; break;
}
break;
case 3: // Меню 4
switch(num2) {
case 1: if (data.f == 0) data.f = 255;
else data.f -= 5; break;
case 2: if (data.bright == 1) data.bright = 255;
else data.bright -= 5; break;
case 3: if (data.minBright == 1) data.minBright = 200;
else data.minBright -= 5; break;
case 4: if (data.maxBright == 50) data.maxBright = 255;
else data.maxBright -= 5; break;
case 8: if (data.luxLimit == 1) data.luxLimit = 65535;
else data.luxLimit -= 10; break;
}
break;
case 6: // Меню 7
switch(num2) {
case 0: if (data.speedLimit1 == 10) data.speedLimit1 = 250;
else data.speedLimit1 -= 5; break;
case 1: if (data.speedLimit2 == 10) data.speedLimit2 = 250;
else data.speedLimit2 -= 5; break;
case 2: if (data.speedLimit3 == 10) data.speedLimit3 = 250;
else data.speedLimit3 -= 5; break;
case 3: if (data.gpsSpeedUpd == 500) data.gpsSpeedUpd = 60000;
else data.gpsSpeedUpd -= 200; break;
case 7: if (data.odometer == 0) data.odometer = 999999;
else data.odometer -= 10; break;
case 11: if (data.speedCorrection == 0) data.speedCorrection = 200;
else data.speedCorrection -= 2; break;
}
break;
case 8: // Меню 9
switch(num2) {
case 0: if (data.change1 == 0) data.change1 = 999500;
else data.change1 -= 1000; break;
case 1: if (data.change2 == 0) data.change2 = 999500;
else data.change2 -= 1000; break;
case 2: if (data.change3 == 0) data.change3 = 999500;
else data.change3 -= 1000; break;
case 3: if (data.change4 == 0) data.change4 = 999500;
else data.change4 -= 1000; break;
case 4: if (data.change5 == 0) data.change5 = 999500;
else data.change5 -= 1000; break;
}
break;
}
}
if (joy_B.holdFor() >= 7000 and joy_B.holdFor() < 10000) { // Если кнопку B нажали и удерживают не более 10000 мс
switch(num1) {
case 0: // Меню 1
switch(num2) {
case 0: if (data.a == 0) data.a = 12;
else data.a -= 0.1; break;
case 1: if (data.b == 0) data.b = 12;
else data.b -= 0.1; break;
case 2: if (data.c == 0) data.c = 150;
else data.c -= 10; break;
case 3: if (data.d == 0) data.d = 25;
else data.d -= 1; break;
case 5: if (data.e == 200) data.e = 60000;
else data.e -= 1000; break;
case 6: if (data.vref == 4) data.vref = 6;
else data.vref -= 0.1; break;
}
break;
case 3: // Меню 4
switch(num2) {
case 1: if (data.f == 0) data.f = 255;
else data.f -= 10; break;
case 2: if (data.bright == 1) data.bright = 255;
else data.bright -= 10; break;
case 3: if (data.minBright == 1) data.minBright = 200;
else data.minBright -= 10; break;
case 4: if (data.maxBright == 50) data.maxBright = 255;
else data.maxBright -= 10; break;
case 8: if (data.luxLimit == 1) data.luxLimit = 65535;
else data.luxLimit -= 50; break;
}
break;
case 6: // Меню 7
switch(num2) {
case 0: if (data.speedLimit1 == 10) data.speedLimit1 = 250;
else data.speedLimit1 -= 10; break;
case 1: if (data.speedLimit2 == 10) data.speedLimit2 = 250;
else data.speedLimit2 -= 10; break;
case 2: if (data.speedLimit3 == 10) data.speedLimit3 = 250;
else data.speedLimit3 -= 10; break;
case 3: if (data.gpsSpeedUpd == 500) data.gpsSpeedUpd = 60000;
else data.gpsSpeedUpd -= 1000; break;
case 7: if (data.odometer == 0) data.odometer = 999999;
else data.odometer -= 100; break;
case 11: if (data.speedCorrection == 0) data.speedCorrection = 200;
else data.speedCorrection -= 2; break;
}
break;
case 8: // Меню 9
switch(num2) {
case 0: if (data.change1 == 0) data.change1 = 999500;
else data.change1 -= 10000; break;
case 1: if (data.change2 == 0) data.change2 = 999500;
else data.change2 -= 10000; break;
case 2: if (data.change3 == 0) data.change3 = 999500;
else data.change3 -= 10000; break;
case 3: if (data.change4 == 0) data.change4 = 999500;
else data.change4 -= 10000; break;
case 4: if (data.change5 == 0) data.change5 = 999500;
else data.change5 -= 10000; break;
}
break;
}
}
if (joy_B.holdFor() >= 10000 and joy_B.holdFor() < 13000) { // Если кнопку B нажали и удерживают не более 13000 мс
switch(num1) {
case 0: // Меню 1
switch(num2) {
case 0: if (data.a == 0) data.a = 12;
else data.a -= 0.5; break;
case 1: if (data.b == 0) data.b = 12;
else data.b -= 0.5; break;
case 2: if (data.c == 0) data.c = 150;
else data.c -= 10; break;
case 3: if (data.d == 0) data.d = 25;
else data.d -= 1; break;
case 5: if (data.e == 200) data.e = 60000;
else data.e -= 5000; break;
case 6: if (data.vref == 4) data.vref = 6;
else data.vref -= 0.1; break;
}
break;
case 3: // Меню 4
switch(num2) {
case 1: if (data.f == 0) data.f = 255;
else data.f -= 10; break;
case 2: if (data.bright == 1) data.bright = 255;
else data.bright -= 10; break;
case 3: if (data.minBright == 1) data.minBright = 200;
else data.minBright -= 10; break;
case 4: if (data.maxBright == 50) data.maxBright = 255;
else data.maxBright -= 10; break;
case 8: if (data.luxLimit == 1) data.luxLimit = 65535;
else data.luxLimit -= 100; break;
}
break;
case 6: // Меню 7
switch(num2) {
case 0: if (data.speedLimit1 == 10) data.speedLimit1 = 250;
else data.speedLimit1 -= 10; break;
case 1: if (data.speedLimit2 == 10) data.speedLimit2 = 250;
else data.speedLimit2 -= 10; break;
case 2: if (data.speedLimit3 == 10) data.speedLimit3 = 250;
else data.speedLimit3 -= 10; break;
case 3: if (data.gpsSpeedUpd == 500) data.gpsSpeedUpd = 60000;
else data.gpsSpeedUpd -= 5000; break;
case 7: if (data.odometer == 0) data.odometer = 999999;
else data.odometer -= 1000; break;
case 11: if (data.speedCorrection == 0) data.speedCorrection = 200;
else data.speedCorrection -= 2; break;
}
break;
case 8: // Меню 9
switch(num2) {
case 0: if (data.change1 == 0) data.change1 = 999500;
else data.change1 -= 50000; break;
case 1: if (data.change2 == 0) data.change2 = 999500;
else data.change2 -= 50000; break;
case 2: if (data.change3 == 0) data.change3 = 999500;
else data.change3 -= 50000; break;
case 3: if (data.change4 == 0) data.change4 = 999500;
else data.change4 -= 50000; break;
case 4: if (data.change5 == 0) data.change5 = 999500;
else data.change5 -= 50000; break;
}
break;
}
}
if (joy_B.holdFor() >= 13000) { // Если кнопку B нажали и удерживают 13000 мс и более
switch(num1) {
case 0: // Меню 1
switch(num2) {
case 0: if (data.a == 0) data.a = 12;
else data.a -= 0.5; break;
case 1: if (data.b == 0) data.b = 12;
else data.b -= 0.5; break;
case 2: if (data.c == 0) data.c = 150;
else data.c -= 10; break;
case 3: if (data.d == 0) data.d = 25;
else data.d -= 1; break;
case 5: if (data.e == 200) data.e = 60000;
else data.e -= 5000; break;
case 6: if (data.vref == 4) data.vref = 6;
else data.vref -= 0.1; break;
}
break;
case 3: // Меню 4
switch(num2) {
case 1: if (data.f == 0) data.f = 255;
else data.f -= 10; break;
case 2: if (data.bright == 1) data.bright = 255;
else data.bright -= 10; break;
case 3: if (data.minBright == 1) data.minBright = 200;
else data.minBright -= 10; break;
case 4: if (data.maxBright == 50) data.maxBright = 255;
else data.maxBright -= 10; break;
case 8: if (data.luxLimit == 1) data.luxLimit = 65535;
else data.luxLimit -= 1000; break;
}
break;
case 6: // Меню 7
switch(num2) {
case 0: if (data.speedLimit1 == 10) data.speedLimit1 = 250;
else data.speedLimit1 -= 10; break;
case 1: if (data.speedLimit2 == 10) data.speedLimit2 = 250;
else data.speedLimit2 -= 10; break;
case 2: if (data.speedLimit3 == 10) data.speedLimit3 = 250;
else data.speedLimit3 -= 10; break;
case 3: if (data.gpsSpeedUpd == 500) data.gpsSpeedUpd = 60000;
else data.gpsSpeedUpd -= 5000; break;
case 7: if (data.odometer == 0) data.odometer = 999999;
else data.odometer -= 10000; break;
case 11: if (data.speedCorrection == 0) data.speedCorrection = 200;
else data.speedCorrection -= 2; break;
}
break;
case 8: // Меню 9
switch(num2) {
case 0: if (data.change1 == 0) data.change1 = 999500;
else data.change1 -= 50000; break;
case 1: if (data.change2 == 0) data.change2 = 999500;
else data.change2 -= 50000; break;
case 2: if (data.change3 == 0) data.change3 = 999500;
else data.change3 -= 50000; break;
case 3: if (data.change4 == 0) data.change4 = 999500;
else data.change4 -= 50000; break;
case 4: if (data.change5 == 0) data.change5 = 999500;
else data.change5 -= 50000; break;
}
break;
}
}
oled.drawBitmap(0, 56, menuNav_1, 128, 8);
oled.update();
}
void wiewInfoMenuParam(uint8_t num1, uint8_t num2) { // Доп инфо для каждого пункта меню
oled.clear();
oled.rect(0, 0, 127, 8, OLED_FILL);
oled.setScale(1);
oled.setCursorXY(START_MENU_HEADER, 1); // Координаты шапки
oled.textMode(1);
if (joy_M.click() or joy_L.click()) deep = 3;
if (joy_M.hold()) deep = 0;
switch(num1) {
case 0: // Меню 1
switch(num2) {
case 0: // Подменю 1
switch (data.langInterface) {
case 1: oled.print(F("МИН ВОЛЬТАЖ LPG")); break;
case 2: oled.print(F("МIН НАПРУГА LPG")); break;
case 3: oled.print(F("MIN LPG VOLTAGE")); break;
}
break;
case 1: // Подменю 2
switch (data.langInterface) {
case 1: oled.print(F("МАКС ВОЛЬТАЖ LPG")); break;
case 2: oled.print(F("МАКС НАПРУГА LPG")); break;
case 3: oled.print(F("MAX LPG VOLTAGE")); break;
}
break;
case 2: // Подменю 3
switch (data.langInterface) {
case 1: oled.print(F("ОБЪЕМ БАЛЛОНА")); break;
case 2: oled.print(F("ОБ`ЕМ БАЛОНА")); oled.dot(20, 1); oled.dot(20, 7); break;
case 3: oled.print(F("BALLOON VOLUME")); break;
}
break;
case 3: // Подменю 4
switch (data.langInterface) {
case 1: oled.print(F("РАСХОД ГАЗА")); break;
case 2: oled.print(F("ВИТРАТА ГАЗУ")); break;
case 3: oled.print(F("CONSUMPTION")); break;
}
break;
case 4: // Подменю 5
switch (data.langInterface) {
case 1:
case 2: oled.print(F("ТИП ДАТЧИКА LPG")); break;
case 3: oled.print(F("SENSOR TYPE")); break;
}
break;
case 5: // Подменю 6
switch (data.langInterface) {
case 1: oled.print(F("ЧАСТОТА ОБНОВЛЕНИЯ")); break;
case 2: oled.print(F("ЧАСТОТА ОНОВЛЕННЯ")); break;
case 3: oled.print(F("SENSOR UPDATE")); break;
}
break;
case 6: // Подменю 7
switch (data.langInterface) {
case 1: oled.print(F("НАПРЯЖЕНИЕ ПИНА 5V")); break;
case 2: oled.print(F("НАПРУГА ПIНА 5V")); break;
case 3: oled.print(F("5V PIN VOLTAGE")); break;
}
break;
case 7: // Подменю 8
switch (data.langInterface) {
case 1: oled.print(F("НАПРЯЖЕНИЕ АКБ")); break;
case 2: oled.print(F("НАПРУГА АКБ")); break;
case 3: oled.print(F("BATTERY VOLTAGE")); break;
}
break;
case 8: // Подменю 9
switch (data.langInterface) {
case 1: oled.print(F("СОХРАНЯТЬ ЛИТРАЖ")); break;
case 2: oled.print(F("ЗБЕРIГАТИ ЛIТРАЖ")); break;
case 3: oled.print(F("SAVE LPG LITERS")); break;
}
break;
case 9: // Подменю 10
switch (data.langInterface) {
case 1:
case 2: oled.print(F("СИГНАЛ КЛАПАНА LPG")); break;
case 3: oled.print(F("LPG VALVE SIGNAL")); break;
}
break;
case 10: // Подменю 11
switch (data.langInterface) {
case 1: oled.print(F("РЕЛЕ ЗАДЕРЖКИ")); break;
case 2: oled.print(F("РЕЛЕ ЗАТРИМКИ")); break;
case 3: oled.print(F("DELAY OFF RELAY")); break;
}
break;
}
break;
case 1: // Меню 2
switch(num2) {
case 0: // Подменю 1
switch (data.langInterface) {
case 1: oled.print(F("ЭКРАН ПРИВЕТСТВИЯ")); break;
case 2: oled.print(F("ЕКРАН ПРИВIТАННЯ")); break;
case 3: oled.print(F("SCREENSAVER")); break;
}
break;
case 1: // Подменю 2
switch (data.langInterface) {
case 1:
case 2: oled.print(F("ЛОГОТИП АВТО")); break;
case 3: oled.print(F("CAR LOGO")); break;
}
break;
case 2: // Подменю 3
switch (data.langInterface) {
case 1: oled.print(F("ОСТАТОК КМ")); break;
case 2: oled.print(F("ЗАЛИШОК КМ")); break;
case 3: oled.print(F("KM")); break;
}
break;
case 3: // Подменю 4
switch (data.langInterface) {
case 1: oled.print(F("АККУМУЛЯТОР")); break;
case 2: oled.print(F("АКУМУЛЯТОР")); break;
case 3: oled.print(F("BATTERY")); break;
}
break;
case 4: // Подменю 5
switch (data.langInterface) {
case 1:
case 2: oled.print(F("ТЕМПЕРАТУРА")); break;
case 3: oled.print(F("TEMPERATURE")); break;
}
break;
case 5: // Подменю 6
switch (data.langInterface) {
case 1: oled.print(F("ВРЕМЯ")); break;
case 2: oled.print(F("ЧАС")); break;
case 3: oled.print(F("TIME")); break;
}
break;
case 6: // Подменю 7
switch (data.langInterface) {
case 1:
case 2: oled.print(F("ДАТА")); break;
case 3: oled.print(F("DATE")); break;
}
break;
case 7: // Подменю 8
switch (data.langInterface) {
case 1: oled.print(F("СИМВОЛ УРОВНЯ ГАЗА")); break;
case 2: oled.print(F("СИМВОЛ РIВНЯ ГАЗУ")); break;
case 3: oled.print(F("GAS LEVEL ICON")); break;
}
break;
case 8: // Подменю 9
switch (data.langInterface) {
case 1: oled.print(F("ШИРИНА УРОВНЯ ГАЗА")); break;
case 2: oled.print(F("ШИРИНА РIВНЯ ГАЗУ")); break;
case 3: oled.print(F("GAS LEVEL WIDTH")); break;
}
break;
case 9: // Подменю 10
switch (data.langInterface) {
case 1: oled.print(F("ВЕРХНЯЯ ЛИНИЯ")); break;
case 2: oled.print(F("ВЕРХНЯ ЛIНIЯ")); break;
case 3: oled.print(F("LINE TOP")); break;
}
break;
case 10: // Подменю 11
switch (data.langInterface) {
case 1: oled.print(F("НИЖНЯЯ ЛИНИЯ")); break;
case 2: oled.print(F("НИЖНЯ ЛIНIЯ")); break;
case 3: oled.print(F("LINE BOTTOM")); break;
}
break;
case 11: // Подменю 12
switch (data.langInterface) {
case 1: oled.print(F("ПРЯМОУГ-КИ СКРИН 3")); break;
case 2: oled.print(F("ПРЯМОКУТ. СКРIН 3")); break;
case 3: oled.print(F("RECTANGLE SCR.3")); break;
}
break;
case 12: // Подменю 13
switch (data.langInterface) {
case 1: oled.print(F("ВИД ПРЯМОУГ-ОВ")); break;
case 2: oled.print(F("ВИД ПРЯМОКУТНИКIВ")); break;
case 3: oled.print(F("RECTANGLE TYPE")); break;
}
break;
case 13: // Подменю 14
switch (data.langInterface) {
case 1: oled.print(F("МИНИ СКРИН 1")); break;
case 2: oled.print(F("МIНI СКРIН 1")); break;
case 3: oled.print(F("MINI SCREEN 1")); break;
}
break;
case 14: // Подменю 15
switch (data.langInterface) {
case 1: oled.print(F("МИНИ СКРИН 2")); break;
case 2: oled.print(F("МIНI СКРIН 2")); break;
case 3: oled.print(F("MINI SCREEN 2")); break;
}
break;
case 15: // Подменю 16
switch (data.langInterface) {
case 1: oled.print(F("МИНИ СКРИН 3")); break;
case 2: oled.print(F("МIНI СКРIН 3")); break;
case 3: oled.print(F("MINI SCREEN 3")); break;
}
break;
case 16: // Подменю 17
switch (data.langInterface) {
case 1: oled.print(F("МИНИ СКРИН 4")); break;
case 2: oled.print(F("МIНI СКРIН 4")); break;
case 3: oled.print(F("MINI SCREEN 4")); break;
}
break;
case 17: // Подменю 18
switch (data.langInterface) {
case 1: oled.print(F("ЯЗЫК")); break;
case 2: oled.print(F("МОВА")); break;
case 3: oled.print(F("LANGUAGE")); break;
}
break;
}
break;
case 2: // Меню 3
switch(num2) {
case 0: // Подменю 1
switch (data.langInterface) {
case 1: oled.print(F("СКРИН 1")); break;
case 2: oled.print(F("СКРIН 1")); break;
case 3: oled.print(F("SCREEN 1")); break;
}
break;
case 1: // Подменю 2
switch (data.langInterface) {
case 1: oled.print(F("СКРИН 2")); break;
case 2: oled.print(F("СКРIН 2")); break;
case 3: oled.print(F("SCREEN 2")); break;
}
break;
case 2: // Подменю 3
switch (data.langInterface) {
case 1: oled.print(F("СКРИН 3")); break;
case 2: oled.print(F("СКРIН 3")); break;
case 3: oled.print(F("SCREEN 3")); break;
}
break;
case 3: // Подменю 4
switch (data.langInterface) {
case 1: oled.print(F("СКРИН 4")); break;
case 2: oled.print(F("СКРIН 4")); break;
case 3: oled.print(F("SCREEN 4")); break;
}
break;
case 4: // Подменю 5
switch (data.langInterface) {
case 1: oled.print(F("СКРИН 5")); break;
case 2: oled.print(F("СКРIН 5")); break;
case 3: oled.print(F("SCREEN 5")); break;
}
break;
case 5: // Подменю 6
switch (data.langInterface) {
case 1: oled.print(F("СКРИН 6")); break;
case 2: oled.print(F("СКРIН 6")); break;
case 3: oled.print(F("SCREEN 6")); break;
}
break;
case 6: // Подменю 7
switch (data.langInterface) {
case 1: oled.print(F("СКРИН 7")); break;
case 2: oled.print(F("СКРIН 7")); break;
case 3: oled.print(F("SCREEN 7")); break;
}
break;
case 7: // Подменю 8
switch (data.langInterface) {
case 1: oled.print(F("СКРИН 8")); break;
case 2: oled.print(F("СКРIН 8")); break;
case 3: oled.print(F("SCREEN 8")); break;
}
break;
case 8: // Подменю 9
switch (data.langInterface) {
case 1: oled.print(F("СКРИН 9")); break;
case 2: oled.print(F("СКРIН 9")); break;
case 3: oled.print(F("SCREEN 9")); break;
}
break;
case 9: // Подменю 10
switch (data.langInterface) {
case 1: oled.print(F("СКРИН 10")); break;
case 2: oled.print(F("СКРIН 10")); break;
case 3: oled.print(F("SCREEN 10")); break;
}
break;
case 10: // Подменю 11
switch (data.langInterface) {
case 1: oled.print(F("НОМЕР СКРИНА")); break;
case 2: oled.print(F("НОМЕР СКРIНА")); break;
case 3: oled.print(F("SHOW SCREEN NUM")); break;
}
break;
}
break;
case 3: // Меню 4
switch(num2) {
case 0: // Подменю 1
switch (data.langInterface) {
case 1: oled.print(F("АВТОЯРКОСТЬ")); break;
case 2: oled.print(F("АВТОЯСКРАВIСТЬ")); break;
case 3: oled.print(F("AUTO BRIGHTNESS")); break;
}
break;
case 1: // Подменю 2
switch (data.langInterface) {
case 1: oled.print(F("УРОВЕНЬ ЯРКОСТИ")); break;
case 2: oled.print(F("РIВЕНЬ ЯСКРАВОСТI")); break;
case 3: oled.print(F("BRIGHTNESS LVL")); break;
}
break;
case 2: // Подменю 3
switch (data.langInterface) {
case 1: oled.print(F("ШАГ ЯРКОСТИ")); break;
case 2: oled.print(F("КРОК ЯСКРАВОСТI")); break;
case 3: oled.print(F("BRIGHTNESS STEP")); break;
}
break;
case 3: // Подменю 4
switch (data.langInterface) {
case 1: oled.print(F("МИН АВТОЯРКОСТЬ")); break;
case 2: oled.print(F("МIН АВТОЯСКРАВ-ТЬ")); break;
case 3: oled.print(F("MIN AUTOBRIGHT")); break;
}
break;
case 4: // Подменю 5
switch (data.langInterface) {
case 1: oled.print(F("МАКС АВТОЯРКОСТЬ")); break;
case 2: oled.print(F("МАКС АВТОЯСКРАВ-ТЬ")); break;
case 3: oled.print(F("MAX AUTOBRIGHT")); break;
}
break;
case 5: // Подменю 6
switch (data.langInterface) {
case 1: oled.print(F("РЕЖИМ АВТОЯРКОСТИ")); break;
case 2: oled.print(F("РЕЖИМ АВТОЯСКРАВ-ТI")); break;
case 3: oled.print(F("SPEED AUTOBRIGHT")); break;
}
break;
case 6: // Подменю 7
switch (data.langInterface) {
case 1: oled.print(F("СДВИГ АВТОЯРКОСТИ")); break;
case 2: oled.print(F("ЗРУШЕННЯ АВТОЯСКР.")); break;
case 3: oled.print(F("SHIFT AUTOBRIGHT")); break;
}
break;
case 7: // Подменю 8
switch (data.langInterface) {
case 1: oled.print(F("БУСТ АВТОЯРКОСТИ")); break;
case 2: oled.print(F("БУСТ АВТОЯСКРАВ-ТI")); break;
case 3: oled.print(F("BOOST AUTOBRIGHT")); break;
}
break;
case 8: // Подменю 9
switch (data.langInterface) {
case 1: oled.print(F("МАКС ЗНАЧЕНИЕ LUX")); break;
case 2: oled.print(F("МАКС ЗНАЧЕННЯ LUX")); break;
case 3: oled.print(F("MAX LUX VALUE")); break;
}
break;
case 9: // Подменю 10
switch (data.langInterface) {
case 1: oled.print(F("ПОКАЗЫВАТЬ LUX")); break;
case 2: oled.print(F("ПОКАЗУВАТИ LUX")); break;
case 3: oled.print(F("SHOW LUX VALUE")); break;
}
break;
}
break;
case 4: // Меню 5
switch(num2) {
case 0: // Подменю 1
switch (data.langInterface) {
case 1: oled.print(F("ЧАСЫ")); break;
case 2: oled.print(F("ГОДИНИ")); break;
case 3: oled.print(F("HOURS")); break;
}
break;
case 1: // Подменю 2
switch (data.langInterface) {
case 1: oled.print(F("МИНУТЫ")); break;
case 2: oled.print(F("ХВИЛИНИ")); break;
case 3: oled.print(F("MINUTES")); break;
}
break;
case 2: // Подменю 3
switch (data.langInterface) {
case 1: oled.print(F("ГОД")); break;
case 2: oled.print(F("РIК")); break;
case 3: oled.print(F("YEAR")); break;
}
break;
case 3: // Подменю 4
switch (data.langInterface) {
case 1: oled.print(F("МЕСЯЦ")); break;
case 2: oled.print(F("МIСЯЦЬ")); break;
case 3: oled.print(F("MONTH")); break;
}
break;
case 4: // Подменю 5
switch (data.langInterface) {
case 1:
case 2: oled.print(F("ДЕНЬ")); break;
case 3: oled.print(F("DAY")); break;
}
break;
case 5: // Подменю 6
switch (data.langInterface) {
case 1: oled.print(F("УСТАНОВИТЬ ВРЕМЯ")); break;
case 2: oled.print(F("ВСТАНОВИТИ ЧАС")); break;
case 3: oled.print(F("SET DATE / TIME")); break;
}
break;
case 6: // Подменю 7
switch (data.langInterface) {
case 1: oled.print(F("ЧАСОВОЙ ПОЯС")); break;
case 2: oled.print(F("ЧАСОВИЙ ПОЯС")); break;
case 3: oled.print(F("TIME ZONE")); break;
}
break;
case 7: // Подменю 8
switch (data.langInterface) {
case 1: oled.print(F("ИСТОЧНИК ВРЕМЕНИ")); break;
case 2: oled.print(F("ДЖЕРЕЛО ЧАСУ")); break;
case 3: oled.print(F("DATE/TIME SOURCE")); break;
}
break;
case 8: // Подменю 9
switch (data.langInterface) {
case 1: oled.print(F("КОРРЕКЦИЯ ГОДА GPS")); break;
case 2: oled.print(F("КОРЕКЦIЯ РОКУ GPS")); break;
case 3: oled.print(F("GPS YEAR CORRECT.")); break;
}
break;
}
break;
case 6: // Меню 7
switch(num2) {
case 0: // Подменю 1
switch (data.langInterface) {
case 1: oled.print(F("ЛИМИТ СКОРОСТИ 1")); break;
case 2: oled.print(F("ЛIМIТ ШВИДКОСТI 1")); break;
case 3: oled.print(F("SPEED LIMIT 1")); break;
}
break;
case 1: // Подменю 2
switch (data.langInterface) {
case 1: oled.print(F("ЛИМИТ СКОРОСТИ 2")); break;
case 2: oled.print(F("ЛIМIТ ШВИДКОСТI 2")); break;
case 3: oled.print(F("SPEED LIMIT 2")); break;
}
break;
case 2: // Подменю 3
switch (data.langInterface) {
case 1: oled.print(F("ЛИМИТ СКОРОСТИ 3")); break;
case 2: oled.print(F("ЛIМIТ ШВИДКОСТI 3")); break;
case 3: oled.print(F("SPEED LIMIT 3")); break;
}
break;
case 3: // Подменю 4
switch (data.langInterface) {
case 1: oled.print(F("ОБНОВЛЕНИЕ GPS")); break;
case 2: oled.print(F("ОНОВЛЕННЯ GPS")); break;
case 3: oled.print(F("GPS SPEED UPDATE")); break;
}
break;
case 4: // Подменю 5
switch (data.langInterface) {
case 1: oled.print(F("ДАТЧИК СКОРОСТИ")); break;
case 2: oled.print(F("ДАТЧИК ШВИДКОСТI")); break;
case 3: oled.print(F("SPEED SENSOR USE")); break;
}
break;
case 5: // Подменю 6
switch (data.langInterface) {
case 1: oled.print(F("КОЛ-ВО ИМПУЛЬСОВ")); break;
case 2: oled.print(F("КIЛ-ТЬ IМПУЛЬСIВ")); break;
case 3: oled.print(F("SENSOR IMPULSE")); break;
}
break;
case 6: // Подменю 7
switch (data.langInterface) {
case 1: oled.print(F("СОХРАНЯТЬ ОДОМЕТР")); break;
case 2: oled.print(F("ЗБЕРIГАТИ ОДОМЕТР")); break;
case 3: oled.print(F("AUTO UPDATE ODO")); break;
}
break;
case 7: // Подменю 8
switch (data.langInterface) {
case 1: oled.print(F("ОБЩИЙ ПРОБЕГ")); break;
case 2: oled.print(F("ЗАГАЛЬНИЙ ПРОБIГ")); break;
case 3: oled.print(F("TOTAL MILEAGE")); break;
}
break;
case 8: // Подменю 9
switch (data.langInterface) {
case 1: oled.print(F("СБРОС ОДОМЕТРА")); break;
case 2: oled.print(F("СКИДАННЯ ОДОМЕТРА")); break;
case 3: oled.print(F("RESET ODOMETER")); break;
}
break;
case 9: // Подменю 10
switch (data.langInterface) {
case 1: oled.print(F("ПРЕВЫШЕНИЕ СКОР-ТИ")); break;
case 2: oled.print(F("ПЕРЕВИЩЕННЯ ШВИДК-ТI")); break;
case 3: oled.print(F("SPEEDING")); break;
}
break;
case 10: // Подменю 11
switch (data.langInterface) {
case 1: oled.print(F("ДОПУСТ. ПРЕВЫШЕНИЕ")); break;
case 2: oled.print(F("ДОПУСТ ПЕРЕВИЩЕННЯ")); break;
case 3: oled.print(F("PERMISSIBLE EXCESS")); break;
}
break;
case 11: // Подменю 12
switch (data.langInterface) {
case 1: oled.print(F("КОРРЕКЦИЯ СКОРОСТИ")); break;
case 2: oled.print(F("КОРЕКЦIЯ ШВИДКОСТI")); break;
case 3: oled.print(F("SPEED CORRECTION")); break;
}
break;
}
break;
case 7: // Меню 8
switch(num2) {
case 0: // Подменю 1
switch (data.langInterface) {
case 1: oled.print(F("МЕЛОДИЯ")); break;
case 2: oled.print(F("МЕЛОДIЯ")); break;
case 3: oled.print(F("MELODY")); break;
}
break;
case 1: // Подменю 2
switch (data.langInterface) {
case 1:
case 2: oled.print(F("ЗВУК КНОПОК")); break;
case 3: oled.print(F("BUTTON SOUND")); break;
}
break;
case 2: // Подменю 3
switch (data.langInterface) {
case 1: oled.print(F("ЗВУК ПРЕДУПРЕЖД-ИЙ")); break;
case 2: oled.print(F("ЗВУК ПОПЕРЕДЖЕНЬ")); break;
case 3: oled.print(F("WARNING SOUND")); break;
}
break;
case 3: // Подменю 4
switch (data.langInterface) {
case 1: oled.print(F("ГРОМКОСТЬ")); break;
case 2: oled.print(F("ГУЧНIСТЬ")); break;
case 3: oled.print(F("VOLUME")); break;
}
break;
}
break;
case 8: // Меню 9
switch(num2) {
case 0: // Подменю 1
switch (data.langInterface) {
case 1: oled.print(F("МАСЛО, ФИЛЬТР")); break;
case 2: oled.print(F("ОЛИВА, ФIЛЬТР")); break;
case 3: oled.print(F("OIL, FILTER")); break;
}
break;
case 1: // Подменю 2
switch (data.langInterface) {
case 1: oled.print(F("ВОЗДУШНЫЙ ФИЛЬТР")); break;
case 2: oled.print(F("ПОВIТРЯНИЙ ФIЛЬТР")); break;
case 3: oled.print(F("AIR FILTER")); break;
}
break;
case 2: // Подменю 3
switch (data.langInterface) {
case 1: oled.print(F("ФИЛЬТРЫ LPG")); break;
case 2: oled.print(F("ФIЛЬТРИ LPG")); break;
case 3: oled.print(F("LPG FILTER")); break;
}
break;
case 3: // Подменю 4
switch (data.langInterface) {
case 1: oled.print(F("ТОРМОЗНАЯ СИСТЕМА")); break;
case 2: oled.print(F("ГАЛЬМIВНА СИСТЕМА")); break;
case 3: oled.print(F("BRAKE")); break;
}
break;
case 4: // Подменю 5
switch (data.langInterface) {
case 1: oled.print(F("ЗАЗОРЫ КЛАПАНОВ")); break;
case 2: oled.print(F("ЗАЗОРЫ КЛАПАНIВ")); break;
case 3: oled.print(F("VALVE")); break;
}
break;
}
break;
case 9: // Меню 10
switch(num2) {
case 0: // Подменю 1
switch (data.langInterface) {
case 1:
case 2: oled.print(F("ТИП РЕЛЕ")); break;
case 3: oled.print(F("RELAY TYPE")); break;
}
break;
case 1: // Подменю 2
switch (data.langInterface) {
case 1: oled.print(F("ДАТЧИК ТЕМПЕРАТУРЫ")); break;
case 2: oled.print(F("ДАТЧИК ТЕМПЕРАТУРИ")); break;
case 3: oled.print(F("TEMP SENSOR")); break;
}
break;
case 2: // Подменю 3
switch (data.langInterface) {
case 1: oled.print(F("ТЕМ-РА ВКЛ РЕЛЕ")); break;
case 2: oled.print(F("ТЕМ-РА УВIМК РЕЛЕ")); break;
case 3: oled.print(F("RELAY ON TEMP")); break;
}
break;
case 3: // Подменю 4
switch (data.langInterface) {
case 1: oled.print(F("ТЕМ-РА ВЫКЛ РЕЛЕ")); break;
case 2: oled.print(F("ТЕМ-РА ВИМК РЕЛЕ")); break;
case 3: oled.print(F("RELAY OFF TEMP")); break;
}
break;
}
break;
case 10: // Меню 11
switch(num2) {
case 0: // Подменю 1
switch (data.langInterface) {
case 1: oled.print(F("ВКЛ ПАРКТРОНИК")); break;
case 2: oled.print(F("УВIМК ПАРКТРОНIК")); break;
case 3: oled.print(F("SONAR USE")); break;
}
break;
case 1: // Подменю 2
switch (data.langInterface) {
case 1: oled.print(F("ДАТЧИК ТЕМПЕРАТУРЫ")); break;
case 2: oled.print(F("ДАТЧИК ТЕМПЕРАТУРИ")); break;
case 3: oled.print(F("TEMP SENSOR")); break;
}
break;
}
break;
case 11: // Меню 12
switch(num2) {
case 0: // Подменю 1
switch (data.langInterface) {
case 1: oled.print(F("СБРОС НАСТРОЕК")); break;
case 2: oled.print(F("СКИДАННЯ")); break;
case 3: oled.print(F("RESET ALL")); break;
}
break;
case 1: // Подменю 2
switch (data.langInterface) {
case 1: oled.print(F("ВЕРСИЯ ПО")); break;
case 2: oled.print(F("ВЕРСIЯ ПЗ")); break;
case 3: oled.print(F("SOFTWARE VERSION")); break;
}
break;
}
break;
}
oled.textMode(0);
oled.autoPrintln(1);
oled.setCursorXY(0, 12);
switch(num1) {
case 0: // Меню 1
switch(num2) {
case 0:
switch (data.langInterface) {
// 1 1 1 1 1 1 - это шаблон для корректного переноста слов на дисплее
case 1: oled.print(F("Выставите значение вольтажа на пустом газовом баллоне")); break;
case 2: oled.print(F("Виставте значення напруги на порожньомугазовому балонi")); break;
case 3: oled.print(F("Set the voltage valuewith an empty gas tank")); break;
}
break;
case 1:
switch (data.langInterface) {
case 1: oled.print(F("Выставите значение вольтажа на полном газовом баллоне")); break;
case 2: oled.print(F("Виставте значення напруги на повному газовому балонi")); break;
case 3: oled.print(F("Set the voltage valuewith a full gas tank")); break;
}
break;
case 2:
switch (data.langInterface) {
case 1: oled.print(F("Укажите полезный объем вашего газовогобаллона")); break;
case 2: oled.print(F("Вкажiть корисний об' м вашого газовогобалона")); oled.drawBitmap(18, 20, ukr_e, 5, 7); break;
case 3: oled.print(F("Enter the useful volume of your gas tank")); break;
}
break;
case 3:
switch (data.langInterface) {
case 1: oled.print(F("Укажите средний расход газа на 100 кмпути")); break;
case 2: oled.print(F("Вкажiть середню витрату газу на 100 км шляху")); break;
case 3: oled.print(F("Enter the average gasconsumption per 100 km")); break;
}
break;
case 4:
switch (data.langInterface) {
case 1: oled.print(F("Укажите ваш тип датчика уровня газа на баллоне (2 или 3 контакта)")); break;
case 2: oled.print(F("Вкажiть свiй тип датчика рiвня газу набалонi (2 або 3 контакти)")); break;
case 3: oled.print(F("Specify your type of gas level sensor on the tank (2 or 3 contacts)")); break;
}
break;
case 5:
switch (data.langInterface) {
case 1: oled.print(F("Выберите частоту опроса датчика уровнягаза (миллисекунды)")); break;
case 2: oled.print(F("Оберiть частоту запиту датчика рiвня газу (мiлiсекунди)")); break;
case 3: oled.print(F("Select the polling frequency of the gas level sensor (milliseconds)")); break;
}
break;
case 6:
switch (data.langInterface) {
case 1: oled.print(F("Настройка напряжения на пине 5V")); break;
case 2: oled.print(F("Налаштування напруги на пiнi 5В")); break;
case 3: oled.print(F("Setting the voltage on the 5V pin")); break;
}
break;
case 7:
switch (data.langInterface) {
case 1: oled.print(F("Выбор источника напряжения АКБ")); break;
case 2: oled.print(F("Вибiр джерела напругиАКБ")); break;
case 3: oled.print(F("Selection of battery voltage source")); break;
}
break;
case 8:
switch (data.langInterface) {
case 1: oled.print(F("При выключении зажигания сохранять значение литража до следующего запуска авто (только при наличии реле-таймера)")); break;
case 2: oled.print(F("При вимкненнi запалювання зберiгатизначення лiтража до наступного запуску (тiльки при наявностiреле-таймера)")); break;
case 3: oled.print(F("When the ignition is turned off, liters will be saved until the next start of thecar (only if there isa timer relay)")); break;
}
break;
case 9:
switch (data.langInterface) {
case 1: oled.print(F("Включите, если у вас есть подключение к сигнальному проводу электромагнитного клапана газового редуктора")); break;
case 2: oled.print(F("Увiмкнiть, якщо у вас пiдключення до сигнального дроту електромагнiтного клапана газового редуктора")); oled.drawBitmap(0, 20, ukr_e, 5, 7); break;
case 3: oled.print(F("Turn on if you have aconnection to the signal wire of the solenoid valve of thegas reducer")); break;
}
break;
case 10:
switch (data.langInterface) {
case 1: oled.print(F("Укажите, используетсяли в вашей схеме подключения реле задержки выключения (нужно для одометра и сохранения литража")); break;
case 2: oled.print(F("Вкажiть, чи у вашiйсхемi пiдключення реле затримки вимкнення (потрiбно для одометра та збереження лiтража")); oled.drawBitmap(72, 12, ukr_e, 5, 7); break;
case 3: oled.print(F("Does your wiring diagram use a delay relay (needed for odometer and saving liters)")); break;
}
break;
}
break;
case 1: // Меню 2
switch(num2) {
case 0:
switch (data.langInterface) {
case 1: oled.print(F("Показывать или нет приветствие при включении устройства")); break;
case 2: oled.print(F("Показувати чи нi привiтання пiд час увiмкнення пристрою")); break;
case 3: oled.print(F("Show welcome message when device is turnedon")); break;
}
break;
case 1:
switch (data.langInterface) {
case 1: oled.print(F("Показывать или нет логотип авто при включении устройства")); break;
case 2: oled.print(F("Показувати чи нi логотип авто пiд час увiмкнення пристрою")); break;
case 3: oled.print(F("Show car logo when device is turned on")); break;
}
break;
case 2:
switch (data.langInterface) {
case 1: oled.print(F("Показывать или нет ориентировочный остаток в километрах при текущем уровне газа в баллоне")); break;
case 2: oled.print(F("Показувати чи нi орi нтовний залишок вкiлометрах при поточному рiвнi газу в балонi")); oled.drawBitmap(18, 20, ukr_e, 5, 7); break;
case 3: oled.print(F("Show estimated remaining kilometers at current gas level in tank")); break;
}
break;
case 3:
switch (data.langInterface) {
case 1: oled.print(F("Показывать или нет напряжение в бортовойсети автомобиля (АКБ)")); break;
case 2: oled.print(F("Показувати чи нi напругу в бортовiй мережi автомобiля (АКБ)")); break;
case 3: oled.print(F("Show car battery voltage")); break;
}
break;
case 4:
switch (data.langInterface) {
case 1: oled.print(F("Показывать или нет значение температуры с основного датчика")); break;
case 2: oled.print(F("Показувати чи нi значення температури з основного датчика")); break;
case 3: oled.print(F("Show temperature value from main sensor")); break;
}
break;
case 5:
switch (data.langInterface) {
case 1: oled.print(F("Показывать или нет текущее время")); break;
case 2: oled.print(F("Показувати чи нi поточний час")); break;
case 3: oled.print(F("Show current time")); break;
}
break;
case 6:
switch (data.langInterface) {
case 1: oled.print(F("Показывать или нет текущую дату")); break;
case 2: oled.print(F("Показувати чи нi поточну дату")); break;
case 3: oled.print(F("Show current date")); break;
}
break;
case 7:
switch (data.langInterface) {
case 1: oled.print(F("Показывать или нет графический уровень газа в баллоне")); break;
case 2: oled.print(F("Показувати чи нi графiчний рiвень газув балонi")); break;
case 3: oled.print(F("Show graphic gas level in tank")); break;
}
break;
case 8:
switch (data.langInterface) {
case 1: oled.print(F("Ширина графического уровня газа в баллоне(только для скрина с вертикальным уровнем)")); break;
case 2: oled.print(F("Ширина графiчного рiвня газу в балонi (тiльки для скрiна з вертикальним рiвнем)")); break;
case 3: oled.print(F("Width of the graphic gas level in the tank(only for the screen with a vertical level)")); break;
}
break;
case 9:
switch (data.langInterface) {
case 1: oled.print(F("Показывать или нет верхнюю линию (горизонтальную)")); break;
case 2: oled.print(F("Показувати чи нi верхню лiнiю (горизонтальну)")); break;
case 3: oled.print(F("Show top line (horizontal)")); break;
}
break;
case 10:
switch (data.langInterface) {
case 1: oled.print(F("Показывать или нет нижнюю линию (горизонтальную)")); break;
case 2: oled.print(F("Показувати чи нi нижню лiнiю (горизонтальну)")); break;
case 3: oled.print(F("Show bottom line (horizontal)")); break;
}
break;
case 11:
switch (data.langInterface) {
case 1: oled.print(F("Отображать или нет на скрине #3 информацию (значения)в прямоугольниках")); break;
case 2: oled.print(F("Вiдображати чи нi на скрiнi #3 iнформацiю (значення) у прямокутниках")); break;
case 3: oled.print(F("Display values in rectangles on screen #3")); break;
}
break;
case 12:
switch (data.langInterface) {
case 1: oled.print(F("Выбрать тип прямоугольников: заливка или обводка")); break;
case 2: oled.print(F("Обрати тип прямокутникiв: заливання або обведення")); break;
case 3: oled.print(F("Select the type of rectangles: fill or stroke")); break;
}
break;
case 13:
switch (data.langInterface) {
case 1: oled.print(F("Выбрать, что отображать на первом мини-скрине (скрин с четырьмя параметрами)")); break;
case 2: oled.print(F("Обрати, що вiдображати на першому мiнi-скрiнi (скрiн з чотирма параметрами)")); break;
case 3: oled.print(F("Select what to display on the first mini-screen (screen with four parameters)")); break;
}
break;
case 14:
switch (data.langInterface) {
case 1: oled.print(F("Выбрать, что отображать на втором мини-скрине (скрин с четырьмя параметрами")); break;
case 2: oled.print(F("Обрати, що вiдображати на другому мiнi-скрiнi (скрiн з чотирма параметрами)")); break;
case 3: oled.print(F("Select what to display on the secondmini-screen (screen with four parameters)")); break;
}
break;
case 15:
switch (data.langInterface) {
case 1: oled.print(F("Выбрать, что отображать на третьеммини-скрине (скрин с четырьмя параметрами")); break;
case 2: oled.print(F("Обрати, що вiдображати на третьому мiнi-скрiнi (скрiн з чотирма параметрами)")); break;
case 3: oled.print(F("Select what to display on the third mini-screen (the screen with four parameters)")); break;
}
break;
case 16:
switch (data.langInterface) {
case 1: oled.print(F("Выбрать, что отображать на 4-ом мини-скрине (скрин с четырьмя параметрами")); break;
case 2: oled.print(F("Обрати, що вiдображати на 4-му мiнi-скрiнi (скрiн з чотирма параметрами)")); break;
case 3: oled.print(F("Select what to display on the fourthmini-screen (screen with four parameters)")); break;
}
break;
case 17:
switch (data.langInterface) {
case 1: oled.print(F("Выбрать язык интерфейса")); break;
case 2: oled.print(F("Обрати мову iнтерфейсу")); break;
case 3: oled.print(F("Select interface language")); break;
}
break;
}
break;
case 2: // Меню 3
switch(num2) {
case 0:
switch (data.langInterface) {
case 1: oled.print(F("Отображать или нет скрин 1")); break;
case 2: oled.print(F("Вiдображати чи нi скрiн 1")); break;
case 3: oled.print(F("Show screen 1")); break;
}
break;
case 1:
switch (data.langInterface) {
case 1: oled.print(F("Отображать или нет скрин 2")); break;
case 2: oled.print(F("Вiдображати чи нi скрiн 2")); break;
case 3: oled.print(F("Show screen 2")); break;
}
break;
case 2:
switch (data.langInterface) {
case 1: oled.print(F("Отображать или нет скрин 3")); break;
case 2: oled.print(F("Вiдображати чи нi скрiн 3")); break;
case 3: oled.print(F("Show screen 3")); break;
}
break;
case 3:
switch (data.langInterface) {
case 1: oled.print(F("Отображать или нет скрин 4")); break;
case 2: oled.print(F("Вiдображати чи нi скрiн 4")); break;
case 3: oled.print(F("Show screen 4")); break;
}
break;
case 4:
switch (data.langInterface) {
case 1: oled.print(F("Отображать или нет скрин 5")); break;
case 2: oled.print(F("Вiдображати чи нi скрiн 5")); break;
case 3: oled.print(F("Show screen 5")); break;
}
break;
case 5:
switch (data.langInterface) {
case 1: oled.print(F("Отображать или нет скрин 6")); break;
case 2: oled.print(F("Вiдображати чи нi скрiн 6")); break;
case 3: oled.print(F("Show screen 6")); break;
}
break;
case 6:
switch (data.langInterface) {
case 1: oled.print(F("Отображать или нет скрин 7")); break;
case 2: oled.print(F("Вiдображати чи нi скрiн 7")); break;
case 3: oled.print(F("Show screen 7")); break;
}
break;
case 7:
switch (data.langInterface) {
case 1: oled.print(F("Отображать или нет скрин 8")); break;
case 2: oled.print(F("Вiдображати чи нi скрiн 8")); break;
case 3: oled.print(F("Show screen 8")); break;
}
break;
case 8:
switch (data.langInterface) {
case 1: oled.print(F("Отображать или нет скрин 9")); break;
case 2: oled.print(F("Вiдображати чи нi скрiн 9")); break;
case 3: oled.print(F("Show screen 9")); break;
}
break;
case 9:
switch (data.langInterface) {
case 1: oled.print(F("Отображать или нет скрин 10")); break;
case 2: oled.print(F("Вiдображати чи нi скрiн 10")); break;
case 3: oled.print(F("Show screen 10")); break;
}
break;
case 10:
switch (data.langInterface) {
case 1: oled.print(F("Отображать или нет порядковый номер скрина")); break;
case 2: oled.print(F("Вiдображати чи нi порядковий номер скрiна")); break;
case 3: oled.print(F("Display screen number")); break;
}
break;
}
break;
case 3: // Меню 4
switch(num2) {
case 0:
switch (data.langInterface) {
case 1: oled.print(F("Включить авторегулировку яркости дисплея в зависимости от внешнего освещения")); break;
case 2: oled.print(F("Увiмкнути авторегулювання яскравостi дисплея залежно вiд зовнiшнього освiтлення")); break;
case 3: oled.print(F("Enable automatic display brightness adjustment")); break;
}
break;
case 1:
switch (data.langInterface) {
case 1: oled.print(F("Текущий уровень яркости дисплея (только если авторегулировка яркости выключена)")); break;
case 2: oled.print(F("Поточний рiвень яскравостi дисплея (тiльки якщо авторегулювання яскравостi вимкнено)")); break;
case 3: oled.print(F("Current display brightness level (only if auto brightness is off)")); break;
}
break;
case 2:
switch (data.langInterface) {
case 1: oled.print(F("Шаг увеличения или уменьшения яркости дисплея при нажатии кнопок UP или BACK наглавном экране")); break;
case 2: oled.print(F("Крок збiльшення або зменшення яскравостi дисплея при натисканнi кнопок UP або BACK на головномуекранi")); break;
case 3: oled.print(F("Increase or decrease the display brightness step when pressing the UP or BACK buttons on the main screen")); break;
}
break;
case 3:
switch (data.langInterface) {
case 1: oled.print(F("При авторегулировке яркость не будет опускаться ниже данного значения")); break;
case 2: oled.print(F("При авторегулюваннi яскравiсть не опускатиметься нижче за дане значення")); break;
case 3: oled.print(F("When auto-adjusting, the brightness will not drop below this value")); break;
}
break;
case 4:
switch (data.langInterface) {
case 1: oled.print(F("При авторегулировке яркость не будет подниматься выше данного значения")); break;
case 2: oled.print(F("При авторегулюваннi яскравiсть не буде пiднiматися вище за дане значення")); break;
case 3: oled.print(F("When auto-adjusting, the brightness will not rise above this value")); break;
}
break;
case 5:
switch (data.langInterface) {
case 1: oled.print(F("Плавность (скорость) работы авторегулировки яркости")); break;
case 2: oled.print(F("Плавнiсть (швидкiсть)роботи авторегулювання яскравостi")); break;
case 3: oled.print(F("Smoothness (speed) ofautomatic brightness control")); break;
}
break;
case 6:
switch (data.langInterface) {
case 1: oled.print(F("Сдвиг яркости при авторегулировке. Например если вам яркостимало, то её можно самому увеличить на несколько единиц")); break;
case 2: oled.print(F("Зсув яскравостi при авторегулюваннi (якщовам яскравостi мало, то можна самому збiльшити на кiлька одиниць)")); oled.drawBitmap(18, 36, ukr_i, 5, 7); oled.drawBitmap(24, 36, ukr_i, 5, 7); break;
case 3: oled.print(F("Brightness shift during auto djustment (if the brightness is low, itcan be increased by several units)")); break;
}
break;
case 7:
switch (data.langInterface) {
case 1: oled.print(F("Разрешить увеличиватьили уменьшать яркостьсверх лимитов на 10% при очень ярком или тусклом освещении")); break;
case 2: oled.print(F("Дозволити збiльшуватиабо зменшувати яскравiсть понад лiмiти на 10% при дуже яскравому або тьмяному освiтленнi")); break;
case 3: oled.print(F("Allow brightness to increase or decrease beyond limits by 10% in very bright or dimlighting conditions")); break;
}
break;
case 8:
switch (data.langInterface) {
case 1: oled.print(F("Максимальное значениеLUX в салоне вашего авто. Замерять при ярком солнце")); break;
case 2: oled.print(F("Максимальне значення LUX у салонi вашого авто. Замiряти при яскравому сонцi")); break;
case 3: oled.print(F("Maximum LUX value in your car's interior. Measure in bright sunlight")); break;
}
break;
case 9:
switch (data.langInterface) {
case 1: oled.print(F("Показывать значения LUX с датчика освещенности на главном экране")); break;
case 2: oled.print(F("Показувати значення LUX iз датчика освiтленостi на головному екранi")); break;
case 3: oled.print(F("Show LUX values from light sensor on main screen")); break;
}
break;
}
break;
case 4: // Меню 5
switch(num2) {
case 0:
switch (data.langInterface) {
case 1: oled.print(F("Текущее время - часы (в 24-часовом формате)")); break;
case 2: oled.print(F("Поточний час - години(у 24-годинному форматi)")); break;
case 3: oled.print(F("Current time - hours")); break;
}
break;
case 1:
switch (data.langInterface) {
case 1: oled.print(F("Текущее время - минуты")); break;
case 2: oled.print(F("Поточний час - хвилини")); break;
case 3: oled.print(F("Current time - minutes")); break;
}
break;
case 2:
switch (data.langInterface) {
case 1: oled.print(F("Текущий год")); break;
case 2: oled.print(F("Поточний рiк")); break;
case 3: oled.print(F("Current year")); break;
}
break;
case 3:
switch (data.langInterface) {
case 1: oled.print(F("Текущий месяц")); break;
case 2: oled.print(F("Поточний мiсяць")); break;
case 3: oled.print(F("Current month")); break;
}
break;
case 4:
switch (data.langInterface) {
case 1: oled.print(F("Текущий день месяца")); break;
case 2: oled.print(F("Поточний день мiсяця")); break;
case 3: oled.print(F("Current day of the month")); break;
}
break;
case 5:
switch (data.langInterface) {
case 1: oled.print(F("Записать в память выставленные в предыдущих пунктах значения времени и даты")); break;
case 2: oled.print(F("Записати в пам'ять виставленi в попереднiх пунктах значення часу та дати")); break;
case 3: oled.print(F("Write the time and date values set in the previous points into memory")); break;
}
break;
case 6:
switch (data.langInterface) {
case 1: oled.print(F("Часовой пояс для модуля GPS (от -12 до 12)")); break;
case 2: oled.print(F("Часовий пояс для модуля GPS (вiд -12 до 12)")); break;
case 3: oled.print(F("Time zone for GPS module (from -12 to 12)")); break;
}
break;
case 7:
switch (data.langInterface) {
case 1: oled.print(F("Выбор источника даты и времени")); break;
case 2: oled.print(F("Вибiр джерела дати тачасу")); break;
case 3: oled.print(F("Selecting a date and time source")); break;
}
break;
case 8:
switch (data.langInterface) {
case 1: oled.print(F("Использовать или нет ручную коррекцию годаGPS")); break;
case 2: oled.print(F("Використовувати чи нiручну корекцiю року GPS")); break;
case 3: oled.print(F("Use manual GPS year correction")); break;
}
break;
}
break;
case 6: // Меню 7
switch(num2) {
case 0:
switch (data.langInterface) {
case 1: oled.print(F("Установить первый лимит скорости для спидометра")); break;
case 2: oled.print(F("Встановити перший лiмiт швидкостi для спiдометра")); break;
case 3: oled.print(F("Set the first speed limit for the speedometer")); break;
}
break;
case 1:
switch (data.langInterface) {
case 1: oled.print(F("Установить второй лимит скорости для спидометра")); break;
case 2: oled.print(F("Встановити другий лiмiт швидкостi для спiдометра")); break;
case 3: oled.print(F("Set a second speed limit for the speedometer")); break;
}
break;
case 2:
switch (data.langInterface) {
case 1: oled.print(F("Установить третий лимит скорости для спидометра")); break;
case 2: oled.print(F("Встановити третiй лiмiт швидкостi для спiдометра")); break;
case 3: oled.print(F("Set a third speed limit for the speedometer")); break;
}
break;
case 3:
switch (data.langInterface) {
case 1: oled.print(F("Частота обновления спидометра в миллисекундах")); break;
case 2: oled.print(F("Частота оновлення спiдометра в мiлiсекундах")); break;
case 3: oled.print(F("Speedometer refresh rate in milliseconds")); break;
}
break;
case 4:
switch (data.langInterface) {
case 1: oled.print(F("Подключен или нет датчик скорости авто к плате Arduino")); break;
case 2: oled.print(F("Пiдключено чи нi датчик швидкостi автодо плати Arduino")); break;
case 3: oled.print(F("Use car speed sensor")); break;
}
break;
case 5:
switch (data.langInterface) {
case 1: oled.print(F("Укажите количество импульсов вашего датчика скорости")); break;
case 2: oled.print(F("Вкажiть кiлькiсть iмпульсiв вашого датчика швидкостi")); break;
case 3: oled.print(F("Please enter the number of pulses fromyour speed sensor")); break;
}
break;
case 6:
switch (data.langInterface) {
case 1: oled.print(F("Включить автоматическую записьзначений одометра в память при выключении замка зажигания")); break;
case 2: oled.print(F("Увiмкнути автоматичний запис значень одометра у пам'ять при вимкненнiзамка запалювання")); break;
case 3: oled.print(F("Enable automatic recording of odometervalues into memory when the ignition switch is turned off")); break;
}
break;
case 7:
switch (data.langInterface) {
case 1: oled.print(F("Укажите здесь ваш общий пробег в километрах")); break;
case 2: oled.print(F("Вкажiть тут ваш загальний пробiг в кiлометрах")); break;
case 3: oled.print(F("Enter your total mileage in kilometershere")); break;
}
break;
case 8:
switch (data.langInterface) {
case 1: oled.print(F("Обнулить показания сбрасываемого одометра")); break;
case 2: oled.print(F("Обнулити показання одометра, який можна скидати")); break;
case 3: oled.print(F("Reset the resettable odometer")); break;
}
break;
case 9:
switch (data.langInterface) {
case 1: oled.print(F("Выберите тип предупреждения при превышении лимита скорости")); break;
case 2: oled.print(F("Оберiть тип попередження при перевищеннi лiмiту швидкостi")); break;
case 3: oled.print(F("Select the type of warning when exceeding the speed limit")); break;
}
break;
case 10:
switch (data.langInterface) {
case 1: oled.print(F("На сколько км/ч допускается превышение лимита скорости")); break;
case 2: oled.print(F("На скiльки км/год можна перевищити лiмiт швидкостi")); break;
case 3: oled.print(F("How many km/h is allowed to exceed thespeed limit")); break;
}
break;
case 11:
switch (data.langInterface) {
case 1: oled.print(F("Коррекция показаний спидометра от датчикаскорости (чем больше значение - тем меньшескорость)")); break;
case 2: oled.print(F("Корекцiя показань спiдометра вiд датчика швидкостi (чим бiльше значення – тим менша швидкiсть)")); break;
case 3: oled.print(F("Correction of speedometer readings from the speed sensor(the higher the value, the lower the speed)")); break;
}
break;
}
break;
case 7: // Меню 8
switch(num2) {
case 0:
switch (data.langInterface) {
case 1: oled.print(F("Выбрать мелодию включения устройства")); break;
case 2: oled.print(F("Обрати мелодiю увiмкнення пристрою")); break;
case 3: oled.print(F("Select the device power-on melody")); break;
}
break;
case 1:
switch (data.langInterface) {
case 1: oled.print(F("Играть или нет звуки при нажатии на кнопки")); break;
case 2: oled.print(F("Грати чи нi звуки принатисканнi на кнопки")); break;
case 3: oled.print(F("Play sounds when pressing buttons")); break;
}
break;
case 2:
switch (data.langInterface) {
case 1: oled.print(F("Играть или нет звуки различных предупреждений")); break;
case 2: oled.print(F("Грати чи нi звуки рiзних попереджень")); break;
case 3: oled.print(F("Play various warning sounds")); break;
}
break;
case 3:
switch (data.langInterface) {
case 1: oled.print(F("Громкость звуковых эффектов (кроме парктроника)")); break;
case 2: oled.print(F("Гучнiсть звукових ефектiв (крiм парктронiка)")); break;
case 3: oled.print(F("Sound effects volume (except parking sensors)")); break;
}
break;
}
break;
case 8: // Меню 9
switch(num2) {
case 0:
switch (data.langInterface) {
case 1: oled.print(F("Установите значение пробега, при котором нужно заменить масло и масляный фильтр")); break;
case 2: oled.print(F("Встановiть значення пробiгу, при якому потрiбно замiнити моторну оливу та масляний фiльтр")); break;
case 3: oled.print(F("Set the mileage valueat which the engine oil and oil filter should be replaced")); break;
}
break;
case 1:
switch (data.langInterface) {
case 1: oled.print(F("Установите значение пробега, при котором нужно заменить воздушный фильтр")); break;
case 2: oled.print(F("Встановiть значення пробiгу, при якому потрiбно замiнити повiтряний фiльтр")); break;
case 3: oled.print(F("Set the mileage valueat which the air filter needs to be replaced")); break;
}
break;
case 2:
switch (data.langInterface) {
case 1: oled.print(F("Установите значение пробега, при котором нужно заменить фильтры ГБО")); break;
case 2: oled.print(F("Встановiть значення пробiгу, при якому потрiбно замiнити фiльтри ГБО")); break;
case 3: oled.print(F("Set the mileage valueat which the LPG filters need to be replaced")); break;
}
break;
case 3:
switch (data.langInterface) {
case 1: oled.print(F("Установите значение пробега, при котором нужно заменить тормозную жидкость")); break;
case 2: oled.print(F("Встановiть значення пробiгу, при якому потрiбно замiнити гальмiвну рiдину")); break;
case 3: oled.print(F("Set the mileage valueat which the brake fluid needs to be replaced")); break;
}
break;
case 4:
switch (data.langInterface) {
case 1: oled.print(F("Установите значение пробега, при котором нужно сделать регулировку клапанов")); break;
case 2: oled.print(F("Встановiть значення пробiгу, при якому потрiбно виконати регулювання клапанiв")); break;
case 3: oled.print(F("Set the mileage valueat which valve adjustment should be made")); break;
}
break;
}
break;
case 9: // Меню 10
switch(num2) {
case 0:
switch (data.langInterface) {
case 1: oled.print(F("Выберите тип вашего реле: low level или high level")); break;
case 2: oled.print(F("Оберiть тип вашого реле: low level або high level")); break;
case 3: oled.print(F("Select your relay type: low level or high level")); break;
}
break;
case 1:
switch (data.langInterface) {
case 1: oled.print(F("Выберите датчик температуры, на основании значений которого будет срабатывать реле")); break;
case 2: oled.print(F("Оберiть датчик температури, на пiдставi значень якого спрацьовуватимереле")); break;
case 3: oled.print(F("Select the temperature sensor based on the readingsof which the relay will be triggered")); break;
}
break;
case 2:
switch (data.langInterface) {
case 1: oled.print(F("Температура включенияреле")); break;
case 2: oled.print(F("Температура увiмкнення реле")); break;
case 3: oled.print(F("Relay turn-on temperature")); break;
}
break;
case 3:
switch (data.langInterface) {
case 1: oled.print(F("Температура выключения реле")); break;
case 2: oled.print(F("Температура вимкненняреле")); break;
case 3: oled.print(F("Relay switch-off temperature")); break;
}
break;
}
break;
case 10: // Меню 11
switch(num2) {
case 0:
switch (data.langInterface) {
case 1: oled.print(F("Использовать или нет парктроник")); break;
case 2: oled.print(F("Використовувати чи нiпарктронiк")); break;
case 3: oled.print(F("Use parking sensors")); break;
}
break;
case 1:
switch (data.langInterface) {
case 1: oled.print(F("Выберите датчик температуры для болееточных показаний парктроника (датчик наружный)")); break;
case 2: oled.print(F("Оберiть датчик температури для бiльшточних показань парктронiка (зовнiшнiй датчик)")); break;
case 3: oled.print(F("Select a temperature sensor for more accurate parking sensor readings (external sensor)")); break;
}
break;
}
break;
case 11: // Меню 12
switch(num2) {
case 0:
switch (data.langInterface) {
case 1: oled.print(F("Сброс всех настроек на те, которые вы прописали при установке скетча")); break;
case 2: oled.print(F("Скидання всiх налаштувань на тi, якi ви прописали пiд час встановлення скетчу")); break;
case 3: oled.print(F("Reset all settings tothose you specified when installing the sketch")); break;
}
break;
case 1:
switch (data.langInterface) {
case 1: oled.print(F("Посмотреть версию программного обеспечения")); break;
case 2: oled.print(F("Переглянути версiю програмного забезпечення")); break;
case 3: oled.print(F("View software version")); break;
}
break;
}
break;
}
oled.autoPrintln(0);
oled.update();
}
void setNameParam (uint8_t num1, uint8_t num2) { // Функция для отображения меню с настройкой имени
oled.clear();
oled.setScale(1);
oled.rect(0, 0, 127, 8, OLED_FILL);
oled.textMode(1);
oled.setCursorXY(116, 1); // Положение указателя номера выбранного пункта меню
oled.print(pointerP3 + 1); // Указатель номера выбранного пункта меню
oled.setCursorXY(START_MENU_HEADER, 1); // Шапка
switch(num2) {
case 0: // Подменю 1
switch (data.langInterface) {
case 1: oled.print(F("ВАШЕ ИМЯ")); break;
case 2: oled.print(F("ВАШЕ IМ`Я")); break;
case 3: oled.print(F("YOUR NAME")); break;
}
break;
case 1: // Подменю 2
switch (data.langInterface) {
case 1: oled.print(F("ДАТЧИК ТЕМПЕР-РЫ 1")); break;
case 2: oled.print(F("ДАТЧИК ТЕМПЕР-РИ 1")); break;
case 3: oled.print(F("TEMP SENSOR 1")); break;
}
break;
case 2: // Подменю 3
switch (data.langInterface) {
case 1: oled.print(F("ДАТЧИК ТЕМПЕР-РЫ 2")); break;
case 2: oled.print(F("ДАТЧИК ТЕМПЕР-РИ 2")); break;
case 3: oled.print(F("TEMP SENSOR 2")); break;
}
break;
case 3: // Подменю 4
switch (data.langInterface) {
case 1: oled.print(F("ДАТЧИК ТЕМПЕР-РЫ 3")); break;
case 2: oled.print(F("ДАТЧИК ТЕМПЕР-РИ 3")); break;
case 3: oled.print(F("TEMP SENSOR 3")); break;
}
break;
case 4: // Подменю 5
switch (data.langInterface) {
case 1: oled.print(F("ДАТЧИК ТЕМПЕР-РЫ 4")); break;
case 2: oled.print(F("ДАТЧИК ТЕМПЕР-РИ 4")); break;
case 3: oled.print(F("TEMP SENSOR 4")); break;
}
break;
case 5: // Подменю 6
switch (data.langInterface) {
case 1: oled.print(F("ДАТЧИК ТЕМПЕР-РЫ 5")); break;
case 2: oled.print(F("ДАТЧИК ТЕМПЕР-РИ 5")); break;
case 3: oled.print(F("TEMP SENSOR 5")); break;
}
break;
}
oled.textMode(0);
switch (num2) {
case 0: for (byte i = 0; i < ITEMSSYMBOLNAME; i++) oled.line (i * 6 + 2, 18, i * 6 + 6, 18); break;
case 1: for (byte i = 0; i < ITEMSSYMBOLTEMP1; i++) oled.line (i * 6 + 2, 18, i * 6 + 6, 18); break;
case 2: for (byte i = 0; i < ITEMSSYMBOLTEMP2; i++) oled.line (i * 6 + 2, 18, i * 6 + 6, 18); break;
case 3: for (byte i = 0; i < ITEMSSYMBOLTEMP3; i++) oled.line (i * 6 + 2, 18, i * 6 + 6, 18); break;
case 4: for (byte i = 0; i < ITEMSSYMBOLTEMP4; i++) oled.line (i * 6 + 2, 18, i * 6 + 6, 18); break;
case 5: for (byte i = 0; i < ITEMSSYMBOLTEMP5; i++) oled.line (i * 6 + 2, 18, i * 6 + 6, 18); break;
}
oled.setCursorXY(0, 47);
switch (data.langInterface) {
case 1: oled.print(F("Внутри без пробелов!")); break;
case 2: oled.print(F("Писати без пробiлiв!")); break;
case 3: oled.print(F("Inside without spaces")); break;
}
oled.setCursorXY(0, 56);
switch (data.langInterface) {
case 1: oled.print(F("Максимум 10 символов!")); break;
case 2: oled.print(F("Максимум 10 символiв!")); break;
case 3: oled.print(F("Maximum 10 characters")); break;
}
if (joy_R.click() or joy_R.holding()) { // Если нажали или удерживают кнопку R...
if (pointerP3 == getNameITEMS(num2) - 1) pointerP3 = 0;
else pointerP3 += 1;
}
if (joy_L.click() or joy_L.holding()) { // Если нажали или удерживают кнопку L...
if (pointerP3 == 0) pointerP3 = getNameITEMS(num2) - 1;
else pointerP3 -= 1;
}
if (joy_B.click() or joy_B.holding()) { // Если нажали или удерживают кнопку B...
switch (num2) {
case 0:
switch (pointerP3) {
case 0: if (data.myName1 >= symbols.length() - 1) data.myName1 = 0; else if (data.myName1 >= 72) data.myName1 += 2; else data.myName1 += 1; break;
case 1: if (data.myName2 >= symbols.length() - 1) data.myName2 = 0; else if (data.myName2 >= 72) data.myName2 += 2; else data.myName2 += 1; break;
case 2: if (data.myName3 >= symbols.length() - 1) data.myName3 = 0; else if (data.myName3 >= 72) data.myName3 += 2; else data.myName3 += 1; break;
case 3: if (data.myName4 >= symbols.length() - 1) data.myName4 = 0; else if (data.myName4 >= 72) data.myName4 += 2; else data.myName4 += 1; break;
case 4: if (data.myName5 >= symbols.length() - 1) data.myName5 = 0; else if (data.myName5 >= 72) data.myName5 += 2; else data.myName5 += 1; break;
case 5: if (data.myName6 >= symbols.length() - 1) data.myName6 = 0; else if (data.myName6 >= 72) data.myName6 += 2; else data.myName6 += 1; break;
case 6: if (data.myName7 >= symbols.length() - 1) data.myName7 = 0; else if (data.myName7 >= 72) data.myName7 += 2; else data.myName7 += 1; break;
case 7: if (data.myName8 >= symbols.length() - 1) data.myName8 = 0; else if (data.myName8 >= 72) data.myName8 += 2; else data.myName8 += 1; break;
case 8: if (data.myName9 >= symbols.length() - 1) data.myName9 = 0; else if (data.myName9 >= 72) data.myName9 += 2; else data.myName9 += 1; break;
case 9: if (data.myName10 >= symbols.length() - 1) data.myName10 = 0; else if (data.myName10 >= 72) data.myName10 += 2; else data.myName10 += 1; break;
}
break;
case 1:
switch (pointerP3) {
case 0: if (data.tempA1 >= symbols.length() - 1) data.tempA1 = 0; else if (data.tempA1 >= 72) data.tempA1 += 2; else data.tempA1 += 1; break;
case 1: if (data.tempA2 >= symbols.length() - 1) data.tempA2 = 0; else if (data.tempA2 >= 72) data.tempA2 += 2; else data.tempA2 += 1; break;
case 2: if (data.tempA3 >= symbols.length() - 1) data.tempA3 = 0; else if (data.tempA3 >= 72) data.tempA3 += 2; else data.tempA3 += 1; break;
case 3: if (data.tempA4 >= symbols.length() - 1) data.tempA4 = 0; else if (data.tempA4 >= 72) data.tempA4 += 2; else data.tempA4 += 1; break;
case 4: if (data.tempA5 >= symbols.length() - 1) data.tempA5 = 0; else if (data.tempA5 >= 72) data.tempA5 += 2; else data.tempA5 += 1; break;
case 5: if (data.tempA6 >= symbols.length() - 1) data.tempA6 = 0; else if (data.tempA6 >= 72) data.tempA6 += 2; else data.tempA6 += 1; break;
case 6: if (data.tempA7 >= symbols.length() - 1) data.tempA7 = 0; else if (data.tempA7 >= 72) data.tempA7 += 2; else data.tempA7 += 1; break;
case 7: if (data.tempA8 >= symbols.length() - 1) data.tempA8 = 0; else if (data.tempA8 >= 72) data.tempA8 += 2; else data.tempA8 += 1; break;
case 8: if (data.tempA9 >= symbols.length() - 1) data.tempA9 = 0; else if (data.tempA9 >= 72) data.tempA9 += 2; else data.tempA9 += 1; break;
case 9: if (data.tempA10 >= symbols.length() - 1) data.tempA10 = 0; else if (data.tempA10 >= 72) data.tempA10 += 2; else data.tempA10 += 1; break;
}
break;
case 2:
switch (pointerP3) {
case 0: if (data.tempB1 >= symbols.length() - 1) data.tempB1 = 0; else if (data.tempB1 >= 72) data.tempB1 += 2; else data.tempB1 += 1; break;
case 1: if (data.tempB2 >= symbols.length() - 1) data.tempB2 = 0; else if (data.tempB2 >= 72) data.tempB2 += 2; else data.tempB2 += 1; break;
case 2: if (data.tempB3 >= symbols.length() - 1) data.tempB3 = 0; else if (data.tempB3 >= 72) data.tempB3 += 2; else data.tempB3 += 1; break;
case 3: if (data.tempB4 >= symbols.length() - 1) data.tempB4 = 0; else if (data.tempB4 >= 72) data.tempB4 += 2; else data.tempB4 += 1; break;
case 4: if (data.tempB5 >= symbols.length() - 1) data.tempB5 = 0; else if (data.tempB5 >= 72) data.tempB5 += 2; else data.tempB5 += 1; break;
case 5: if (data.tempB6 >= symbols.length() - 1) data.tempB6 = 0; else if (data.tempB6 >= 72) data.tempB6 += 2; else data.tempB6 += 1; break;
case 6: if (data.tempB7 >= symbols.length() - 1) data.tempB7 = 0; else if (data.tempB7 >= 72) data.tempB7 += 2; else data.tempB7 += 1; break;
case 7: if (data.tempB8 >= symbols.length() - 1) data.tempB8 = 0; else if (data.tempB8 >= 72) data.tempB8 += 2; else data.tempB8 += 1; break;
case 8: if (data.tempB9 >= symbols.length() - 1) data.tempB9 = 0; else if (data.tempB9 >= 72) data.tempB9 += 2; else data.tempB9 += 1; break;
case 9: if (data.tempB10 >= symbols.length() - 1) data.tempB10 = 0; else if (data.tempB10 >= 72) data.tempB10 += 2; else data.tempB10 += 1; break;
}
break;
case 3:
switch (pointerP3) {
case 0: if (data.tempC1 >= symbols.length() - 1) data.tempC1 = 0; else if (data.tempC1 >= 72) data.tempC1 += 2; else data.tempC1 += 1; break;
case 1: if (data.tempC2 >= symbols.length() - 1) data.tempC2 = 0; else if (data.tempC2 >= 72) data.tempC2 += 2; else data.tempC2 += 1; break;
case 2: if (data.tempC3 >= symbols.length() - 1) data.tempC3 = 0; else if (data.tempC3 >= 72) data.tempC3 += 2; else data.tempC3 += 1; break;
case 3: if (data.tempC4 >= symbols.length() - 1) data.tempC4 = 0; else if (data.tempC4 >= 72) data.tempC4 += 2; else data.tempC4 += 1; break;
case 4: if (data.tempC5 >= symbols.length() - 1) data.tempC5 = 0; else if (data.tempC5 >= 72) data.tempC5 += 2; else data.tempC5 += 1; break;
case 5: if (data.tempC6 >= symbols.length() - 1) data.tempC6 = 0; else if (data.tempC6 >= 72) data.tempC6 += 2; else data.tempC6 += 1; break;
case 6: if (data.tempC7 >= symbols.length() - 1) data.tempC7 = 0; else if (data.tempC7 >= 72) data.tempC7 += 2; else data.tempC7 += 1; break;
case 7: if (data.tempC8 >= symbols.length() - 1) data.tempC8 = 0; else if (data.tempC8 >= 72) data.tempC8 += 2; else data.tempC8 += 1; break;
case 8: if (data.tempC9 >= symbols.length() - 1) data.tempC9 = 0; else if (data.tempC9 >= 72) data.tempC9 += 2; else data.tempC9 += 1; break;
case 9: if (data.tempC10 >= symbols.length() - 1) data.tempC10 = 0; else if (data.tempC10 >= 72) data.tempC10 += 2; else data.tempC10 += 1; break;
}
break;
case 4:
switch (pointerP3) {
case 0: if (data.tempD1 >= symbols.length() - 1) data.tempD1 = 0; else if (data.tempD1 >= 72) data.tempD1 += 2; else data.tempD1 += 1; break;
case 1: if (data.tempD2 >= symbols.length() - 1) data.tempD2 = 0; else if (data.tempD2 >= 72) data.tempD2 += 2; else data.tempD2 += 1; break;
case 2: if (data.tempD3 >= symbols.length() - 1) data.tempD3 = 0; else if (data.tempD3 >= 72) data.tempD3 += 2; else data.tempD3 += 1; break;
case 3: if (data.tempD4 >= symbols.length() - 1) data.tempD4 = 0; else if (data.tempD4 >= 72) data.tempD4 += 2; else data.tempD4 += 1; break;
case 4: if (data.tempD5 >= symbols.length() - 1) data.tempD5 = 0; else if (data.tempD5 >= 72) data.tempD5 += 2; else data.tempD5 += 1; break;
case 5: if (data.tempD6 >= symbols.length() - 1) data.tempD6 = 0; else if (data.tempD6 >= 72) data.tempD6 += 2; else data.tempD6 += 1; break;
case 6: if (data.tempD7 >= symbols.length() - 1) data.tempD7 = 0; else if (data.tempD7 >= 72) data.tempD7 += 2; else data.tempD7 += 1; break;
case 7: if (data.tempD8 >= symbols.length() - 1) data.tempD8 = 0; else if (data.tempD8 >= 72) data.tempD8 += 2; else data.tempD8 += 1; break;
case 8: if (data.tempD9 >= symbols.length() - 1) data.tempD9 = 0; else if (data.tempD9 >= 72) data.tempD9 += 2; else data.tempD9 += 1; break;
case 9: if (data.tempD10 >= symbols.length() - 1) data.tempD10 = 0; else if (data.tempD10 >= 72) data.tempD10 += 2; else data.tempD10 += 1; break;
}
break;
case 5:
switch (pointerP3) {
case 0: if (data.tempE1 >= symbols.length() - 1) data.tempE1 = 0; else if (data.tempE1 >= 72) data.tempE1 += 2; else data.tempE1 += 1; break;
case 1: if (data.tempE2 >= symbols.length() - 1) data.tempE2 = 0; else if (data.tempE2 >= 72) data.tempE2 += 2; else data.tempE2 += 1; break;
case 2: if (data.tempE3 >= symbols.length() - 1) data.tempE3 = 0; else if (data.tempE3 >= 72) data.tempE3 += 2; else data.tempE3 += 1; break;
case 3: if (data.tempE4 >= symbols.length() - 1) data.tempE4 = 0; else if (data.tempE4 >= 72) data.tempE4 += 2; else data.tempE4 += 1; break;
case 4: if (data.tempE5 >= symbols.length() - 1) data.tempE5 = 0; else if (data.tempE5 >= 72) data.tempE5 += 2; else data.tempE5 += 1; break;
case 5: if (data.tempE6 >= symbols.length() - 1) data.tempE6 = 0; else if (data.tempE6 >= 72) data.tempE6 += 2; else data.tempE6 += 1; break;
case 6: if (data.tempE7 >= symbols.length() - 1) data.tempE7 = 0; else if (data.tempE7 >= 72) data.tempE7 += 2; else data.tempE7 += 1; break;
case 7: if (data.tempE8 >= symbols.length() - 1) data.tempE8 = 0; else if (data.tempE8 >= 72) data.tempE8 += 2; else data.tempE8 += 1; break;
case 8: if (data.tempE9 >= symbols.length() - 1) data.tempE9 = 0; else if (data.tempE9 >= 72) data.tempE9 += 2; else data.tempE9 += 1; break;
case 9: if (data.tempE10 >= symbols.length() - 1) data.tempE10 = 0; else if (data.tempE10 >= 72) data.tempE10 += 2; else data.tempE10 += 1; break;
}
break;
}
}
if (joy_F.click() or joy_F.holding()) { // Если нажали или удерживают кнопку F...
switch (num2) {
case 0:
switch (pointerP3) {
case 0: if (data.myName1 == 0) data.myName1 = symbols.length() - 1; else if (data.myName1 <= 72) data.myName1 -= 1; else data.myName1 -= 2; break;
case 1: if (data.myName2 == 0) data.myName2 = symbols.length() - 1; else if (data.myName2 <= 72) data.myName2 -= 1; else data.myName2 -= 2; break;
case 2: if (data.myName3 == 0) data.myName3 = symbols.length() - 1; else if (data.myName3 <= 72) data.myName3 -= 1; else data.myName3 -= 2; break;
case 3: if (data.myName4 == 0) data.myName4 = symbols.length() - 1; else if (data.myName4 <= 72) data.myName4 -= 1; else data.myName4 -= 2; break;
case 4: if (data.myName5 == 0) data.myName5 = symbols.length() - 1; else if (data.myName5 <= 72) data.myName5 -= 1; else data.myName5 -= 2; break;
case 5: if (data.myName6 == 0) data.myName6 = symbols.length() - 1; else if (data.myName6 <= 72) data.myName6 -= 1; else data.myName6 -= 2; break;
case 6: if (data.myName7 == 0) data.myName7 = symbols.length() - 1; else if (data.myName7 <= 72) data.myName7 -= 1; else data.myName7 -= 2; break;
case 7: if (data.myName8 == 0) data.myName8 = symbols.length() - 1; else if (data.myName8 <= 72) data.myName8 -= 1; else data.myName8 -= 2; break;
case 8: if (data.myName9 == 0) data.myName9 = symbols.length() - 1; else if (data.myName9 <= 72) data.myName9 -= 1; else data.myName9 -= 2; break;
case 9: if (data.myName10 == 0) data.myName10 = symbols.length() - 1; else if (data.myName10 <= 72) data.myName10 -= 1; else data.myName10 -= 2; break;
}
break;
case 1:
switch (pointerP3) {
case 0: if (data.tempA1 == 0) data.tempA1 = symbols.length() - 1; else if (data.tempA1 <= 72) data.tempA1 -= 1; else data.tempA1 -= 2; break;
case 1: if (data.tempA2 == 0) data.tempA2 = symbols.length() - 1; else if (data.tempA2 <= 72) data.tempA2 -= 1; else data.tempA2 -= 2; break;
case 2: if (data.tempA3 == 0) data.tempA3 = symbols.length() - 1; else if (data.tempA3 <= 72) data.tempA3 -= 1; else data.tempA3 -= 2; break;
case 3: if (data.tempA4 == 0) data.tempA4 = symbols.length() - 1; else if (data.tempA4 <= 72) data.tempA4 -= 1; else data.tempA4 -= 2; break;
case 4: if (data.tempA5 == 0) data.tempA5 = symbols.length() - 1; else if (data.tempA5 <= 72) data.tempA5 -= 1; else data.tempA5 -= 2; break;
case 5: if (data.tempA6 == 0) data.tempA6 = symbols.length() - 1; else if (data.tempA6 <= 72) data.tempA6 -= 1; else data.tempA6 -= 2; break;
case 6: if (data.tempA7 == 0) data.tempA7 = symbols.length() - 1; else if (data.tempA7 <= 72) data.tempA7 -= 1; else data.tempA7 -= 2; break;
case 7: if (data.tempA8 == 0) data.tempA8 = symbols.length() - 1; else if (data.tempA8 <= 72) data.tempA8 -= 1; else data.tempA8 -= 2; break;
case 8: if (data.tempA9 == 0) data.tempA9 = symbols.length() - 1; else if (data.tempA9 <= 72) data.tempA9 -= 1; else data.tempA9 -= 2; break;
case 9: if (data.tempA10 == 0) data.tempA10 = symbols.length() - 1; else if (data.tempA10 <= 72) data.tempA10 -= 1; else data.tempA10 -= 2; break;
}
break;
case 2:
switch (pointerP3) {
case 0: if (data.tempB1 == 0) data.tempB1 = symbols.length() - 1; else if (data.tempB1 <= 72) data.tempB1 -= 1; else data.tempB1 -= 2; break;
case 1: if (data.tempB2 == 0) data.tempB2 = symbols.length() - 1; else if (data.tempB2 <= 72) data.tempB2 -= 1; else data.tempB2 -= 2; break;
case 2: if (data.tempB3 == 0) data.tempB3 = symbols.length() - 1; else if (data.tempB3 <= 72) data.tempB3 -= 1; else data.tempB3 -= 2; break;
case 3: if (data.tempB4 == 0) data.tempB4 = symbols.length() - 1; else if (data.tempB4 <= 72) data.tempB4 -= 1; else data.tempB4 -= 2; break;
case 4: if (data.tempB5 == 0) data.tempB5 = symbols.length() - 1; else if (data.tempB5 <= 72) data.tempB5 -= 1; else data.tempB5 -= 2; break;
case 5: if (data.tempB6 == 0) data.tempB6 = symbols.length() - 1; else if (data.tempB6 <= 72) data.tempB6 -= 1; else data.tempB6 -= 2; break;
case 6: if (data.tempB7 == 0) data.tempB7 = symbols.length() - 1; else if (data.tempB7 <= 72) data.tempB7 -= 1; else data.tempB7 -= 2; break;
case 7: if (data.tempB8 == 0) data.tempB8 = symbols.length() - 1; else if (data.tempB8 <= 72) data.tempB8 -= 1; else data.tempB8 -= 2; break;
case 8: if (data.tempB9 == 0) data.tempB9 = symbols.length() - 1; else if (data.tempB9 <= 72) data.tempB9 -= 1; else data.tempB9 -= 2; break;
case 9: if (data.tempB10 == 0) data.tempB10 = symbols.length() - 1; else if (data.tempB10 <= 72) data.tempB10 -= 1; else data.tempB10 -= 2; break;
}
break;
case 3:
switch (pointerP3) {
case 0: if (data.tempC1 == 0) data.tempC1 = symbols.length() - 1; else if (data.tempC1 <= 72) data.tempC1 -= 1; else data.tempC1 -= 2; break;
case 1: if (data.tempC2 == 0) data.tempC2 = symbols.length() - 1; else if (data.tempC2 <= 72) data.tempC2 -= 1; else data.tempC2 -= 2; break;
case 2: if (data.tempC3 == 0) data.tempC3 = symbols.length() - 1; else if (data.tempC3 <= 72) data.tempC3 -= 1; else data.tempC3 -= 2; break;
case 3: if (data.tempC4 == 0) data.tempC4 = symbols.length() - 1; else if (data.tempC4 <= 72) data.tempC4 -= 1; else data.tempC4 -= 2; break;
case 4: if (data.tempC5 == 0) data.tempC5 = symbols.length() - 1; else if (data.tempC5 <= 72) data.tempC5 -= 1; else data.tempC5 -= 2; break;
case 5: if (data.tempC6 == 0) data.tempC6 = symbols.length() - 1; else if (data.tempC6 <= 72) data.tempC6 -= 1; else data.tempC6 -= 2; break;
case 6: if (data.tempC7 == 0) data.tempC7 = symbols.length() - 1; else if (data.tempC7 <= 72) data.tempC7 -= 1; else data.tempC7 -= 2; break;
case 7: if (data.tempC8 == 0) data.tempC8 = symbols.length() - 1; else if (data.tempC8 <= 72) data.tempC8 -= 1; else data.tempC8 -= 2; break;
case 8: if (data.tempC9 == 0) data.tempC9 = symbols.length() - 1; else if (data.tempC9 <= 72) data.tempC9 -= 1; else data.tempC9 -= 2; break;
case 9: if (data.tempC10 == 0) data.tempC10 = symbols.length() - 1; else if (data.tempC10 <= 72) data.tempC10 -= 1; else data.tempC10 -= 2; break;
}
break;
case 4:
switch (pointerP3) {
case 0: if (data.tempD1 == 0) data.tempD1 = symbols.length() - 1; else if (data.tempD1 <= 72) data.tempD1 -= 1; else data.tempD1 -= 2; break;
case 1: if (data.tempD2 == 0) data.tempD2 = symbols.length() - 1; else if (data.tempD2 <= 72) data.tempD2 -= 1; else data.tempD2 -= 2; break;
case 2: if (data.tempD3 == 0) data.tempD3 = symbols.length() - 1; else if (data.tempD3 <= 72) data.tempD3 -= 1; else data.tempD3 -= 2; break;
case 3: if (data.tempD4 == 0) data.tempD4 = symbols.length() - 1; else if (data.tempD4 <= 72) data.tempD4 -= 1; else data.tempD4 -= 2; break;
case 4: if (data.tempD5 == 0) data.tempD5 = symbols.length() - 1; else if (data.tempD5 <= 72) data.tempD5 -= 1; else data.tempD5 -= 2; break;
case 5: if (data.tempD6 == 0) data.tempD6 = symbols.length() - 1; else if (data.tempD6 <= 72) data.tempD6 -= 1; else data.tempD6 -= 2; break;
case 6: if (data.tempD7 == 0) data.tempD7 = symbols.length() - 1; else if (data.tempD7 <= 72) data.tempD7 -= 1; else data.tempD7 -= 2; break;
case 7: if (data.tempD8 == 0) data.tempD8 = symbols.length() - 1; else if (data.tempD8 <= 72) data.tempD8 -= 1; else data.tempD8 -= 2; break;
case 8: if (data.tempD9 == 0) data.tempD9 = symbols.length() - 1; else if (data.tempD9 <= 72) data.tempD9 -= 1; else data.tempD9 -= 2; break;
case 9: if (data.tempD10 == 0) data.tempD10 = symbols.length() - 1; else if (data.tempD10 <= 72) data.tempD10 -= 1; else data.tempD10 -= 2; break;
}
break;
case 5:
switch (pointerP3) {
case 0: if (data.tempE1 == 0) data.tempE1 = symbols.length() - 1; else if (data.tempE1 <= 72) data.tempE1 -= 1; else data.tempE1 -= 2; break;
case 1: if (data.tempE2 == 0) data.tempE2 = symbols.length() - 1; else if (data.tempE2 <= 72) data.tempE2 -= 1; else data.tempE2 -= 2; break;
case 2: if (data.tempE3 == 0) data.tempE3 = symbols.length() - 1; else if (data.tempE3 <= 72) data.tempE3 -= 1; else data.tempE3 -= 2; break;
case 3: if (data.tempE4 == 0) data.tempE4 = symbols.length() - 1; else if (data.tempE4 <= 72) data.tempE4 -= 1; else data.tempE4 -= 2; break;
case 4: if (data.tempE5 == 0) data.tempE5 = symbols.length() - 1; else if (data.tempE5 <= 72) data.tempE5 -= 1; else data.tempE5 -= 2; break;
case 5: if (data.tempE6 == 0) data.tempE6 = symbols.length() - 1; else if (data.tempE6 <= 72) data.tempE6 -= 1; else data.tempE6 -= 2; break;
case 6: if (data.tempE7 == 0) data.tempE7 = symbols.length() - 1; else if (data.tempE7 <= 72) data.tempE7 -= 1; else data.tempE7 -= 2; break;
case 7: if (data.tempE8 == 0) data.tempE8 = symbols.length() - 1; else if (data.tempE8 <= 72) data.tempE8 -= 1; else data.tempE8 -= 2; break;
case 8: if (data.tempE9 == 0) data.tempE9 = symbols.length() - 1; else if (data.tempE9 <= 72) data.tempE9 -= 1; else data.tempE9 -= 2; break;
case 9: if (data.tempE10 == 0) data.tempE10 = symbols.length() - 1; else if (data.tempE10 <= 72) data.tempE10 -= 1; else data.tempE10 -= 2; break;
}
break;
}
}
switch(num2) { // Формируем свои названия
case 0:
oled.setCursorXY(2, 25); oled.print(symbols[data.myName1]);
oled.setCursorXY(8, 25); oled.print(symbols[data.myName2]);
oled.setCursorXY(14, 25); oled.print(symbols[data.myName3]);
oled.setCursorXY(20, 25); oled.print(symbols[data.myName4]);
oled.setCursorXY(26, 25); oled.print(symbols[data.myName5]);
oled.setCursorXY(32, 25); oled.print(symbols[data.myName6]);
oled.setCursorXY(38, 25); oled.print(symbols[data.myName7]);
oled.setCursorXY(44, 25); oled.print(symbols[data.myName8]);
oled.setCursorXY(50, 25); oled.print(symbols[data.myName9]);
oled.setCursorXY(56, 25); oled.print(symbols[data.myName10]);
break;
case 1:
oled.setCursorXY(2, 25); oled.print(symbols[data.tempA1]);
oled.setCursorXY(8, 25); oled.print(symbols[data.tempA2]);
oled.setCursorXY(14, 25); oled.print(symbols[data.tempA3]);
oled.setCursorXY(20, 25); oled.print(symbols[data.tempA4]);
oled.setCursorXY(26, 25); oled.print(symbols[data.tempA5]);
oled.setCursorXY(32, 25); oled.print(symbols[data.tempA6]);
oled.setCursorXY(38, 25); oled.print(symbols[data.tempA7]);
oled.setCursorXY(44, 25); oled.print(symbols[data.tempA8]);
oled.setCursorXY(50, 25); oled.print(symbols[data.tempA9]);
oled.setCursorXY(56, 25); oled.print(symbols[data.tempA10]);
break;
case 2:
oled.setCursorXY(2, 25); oled.print(symbols[data.tempB1]);
oled.setCursorXY(8, 25); oled.print(symbols[data.tempB2]);
oled.setCursorXY(14, 25); oled.print(symbols[data.tempB3]);
oled.setCursorXY(20, 25); oled.print(symbols[data.tempB4]);
oled.setCursorXY(26, 25); oled.print(symbols[data.tempB5]);
oled.setCursorXY(32, 25); oled.print(symbols[data.tempB6]);
oled.setCursorXY(38, 25); oled.print(symbols[data.tempB7]);
oled.setCursorXY(44, 25); oled.print(symbols[data.tempB8]);
oled.setCursorXY(50, 25); oled.print(symbols[data.tempB9]);
oled.setCursorXY(56, 25); oled.print(symbols[data.tempB10]);
break;
case 3:
oled.setCursorXY(2, 25); oled.print(symbols[data.tempC1]);
oled.setCursorXY(8, 25); oled.print(symbols[data.tempC2]);
oled.setCursorXY(14, 25); oled.print(symbols[data.tempC3]);
oled.setCursorXY(20, 25); oled.print(symbols[data.tempC4]);
oled.setCursorXY(26, 25); oled.print(symbols[data.tempC5]);
oled.setCursorXY(32, 25); oled.print(symbols[data.tempC6]);
oled.setCursorXY(38, 25); oled.print(symbols[data.tempC7]);
oled.setCursorXY(44, 25); oled.print(symbols[data.tempC8]);
oled.setCursorXY(50, 25); oled.print(symbols[data.tempC9]);
oled.setCursorXY(56, 25); oled.print(symbols[data.tempC10]);
break;
case 4:
oled.setCursorXY(2, 25); oled.print(symbols[data.tempD1]);
oled.setCursorXY(8, 25); oled.print(symbols[data.tempD2]);
oled.setCursorXY(14, 25); oled.print(symbols[data.tempD3]);
oled.setCursorXY(20, 25); oled.print(symbols[data.tempD4]);
oled.setCursorXY(26, 25); oled.print(symbols[data.tempD5]);
oled.setCursorXY(32, 25); oled.print(symbols[data.tempD6]);
oled.setCursorXY(38, 25); oled.print(symbols[data.tempD7]);
oled.setCursorXY(44, 25); oled.print(symbols[data.tempD8]);
oled.setCursorXY(50, 25); oled.print(symbols[data.tempD9]);
oled.setCursorXY(56, 25); oled.print(symbols[data.tempD10]);
break;
case 5:
oled.setCursorXY(2, 25); oled.print(symbols[data.tempE1]);
oled.setCursorXY(8, 25); oled.print(symbols[data.tempE2]);
oled.setCursorXY(14, 25); oled.print(symbols[data.tempE3]);
oled.setCursorXY(20, 25); oled.print(symbols[data.tempE4]);
oled.setCursorXY(26, 25); oled.print(symbols[data.tempE5]);
oled.setCursorXY(32, 25); oled.print(symbols[data.tempE6]);
oled.setCursorXY(38, 25); oled.print(symbols[data.tempE7]);
oled.setCursorXY(44, 25); oled.print(symbols[data.tempE8]);
oled.setCursorXY(50, 25); oled.print(symbols[data.tempE9]);
oled.setCursorXY(56, 25); oled.print(symbols[data.tempE10]);
break;
}
oled.rect(113, 18, 127, 28, OLED_FILL); // индикатор выбранного языка
oled.textMode(1);
oled.setCursorXY(115, 20); // Положение индикатора выбранного языка
switch(num2) {
case 0: oled.print(setLang(data.lang)); break; // Подменю 1
case 1: oled.print(setLang(data.langTemp1)); break; // Подменю 2
case 2: oled.print(setLang(data.langTemp2)); break; // Подменю 3
case 3: oled.print(setLang(data.langTemp3)); break; // Подменю 4
case 4: oled.print(setLang(data.langTemp4)); break; // Подменю 5
case 5: oled.print(setLang(data.langTemp5)); break; // Подменю 6
}
if (joy_M.hold()) { // Удержание кнопки M меняет язык
switch(num2) {
case 0: data.lang = !data.lang; break; // Подменю 1
case 1: data.langTemp1 = !data.langTemp1; break; // Подменю 2
case 2: data.langTemp2 = !data.langTemp2; break; // Подменю 3
case 3: data.langTemp3 = !data.langTemp3; break; // Подменю 4
case 4: data.langTemp4 = !data.langTemp4; break; // Подменю 5
case 5: data.langTemp5 = !data.langTemp5; break; // Подменю 6
}
}
if (joy_M.click()) deep = 2;
oled.textMode(0);
printPointerName(pointerP3);
oled.update();
}
void getManual (uint8_t num1, uint8_t num2) { // Функция для отображения меню с инструкциями
oled.clear();
oled.setScale(1);
if (num2 != 16) oled.rect(0, 0, 127, 8, OLED_FILL);
oled.textMode(1);
oled.setCursorXY(START_MENU_HEADER, 1); // Шапка
switch(num2) {
case 0: // Подменю 1
switch (data.langInterface) {
case 1:
case 2: oled.print(F("АКБ INA226")); break;
case 3: oled.print(F("BATTERY INA226")); break;
}
break;
case 1: // Подменю 2
switch (data.langInterface) {
case 1:
case 2: oled.print(F("АКБ ARDUINO")); break;
case 3: oled.print(F("BATTERY ARDUINO")); break;
}
break;
case 2: // Подменю 3
switch (data.langInterface) {
case 1: oled.print(F("ДАТЧИК СКОРОСТИ")); break;
case 2: oled.print(F("ДАТЧИК ШВИДКОСТI")); break;
case 3: oled.print(F("SPEED SENSOR")); break;
}
break;
case 3: // Подменю 4
switch (data.langInterface) {
case 1: oled.print(F("ДАТЧИК ТЕМПЕР-РЫ 1")); break;
case 2: oled.print(F("ДАТЧИК ТЕМПЕР-РИ 1")); break;
case 3: oled.print(F("TEMP SENSOR 1")); break;
}
break;
case 4: // Подменю 5
switch (data.langInterface) {
case 1: oled.print(F("ДАТЧИК ТЕМПЕР-РЫ 2")); break;
case 2: oled.print(F("ДАТЧИК ТЕМПЕР-РИ 2")); break;
case 3: oled.print(F("TEMP SENSOR 2")); break;
}
break;
case 5: // Подменю 6
switch (data.langInterface) {
case 1: oled.print(F("ДАТЧИК ТЕМПЕР-РЫ 3")); break;
case 2: oled.print(F("ДАТЧИК ТЕМПЕР-РИ 3")); break;
case 3: oled.print(F("TEMP SENSOR 3")); break;
}
break;
case 6: // Подменю 7
switch (data.langInterface) {
case 1: oled.print(F("ДАТЧИК ТЕМПЕР-РЫ 4")); break;
case 2: oled.print(F("ДАТЧИК ТЕМПЕР-РИ 4")); break;
case 3: oled.print(F("TEMP SENSOR 4")); break;
}
break;
case 7: // Подменю 8
switch (data.langInterface) {
case 1: oled.print(F("ДАТЧИК ТЕМПЕР-РЫ 5")); break;
case 2: oled.print(F("ДАТЧИК ТЕМПЕР-РИ 5")); break;
case 3: oled.print(F("TEMP SENSOR 5")); break;
}
break;
case 8: // Подменю 9
switch (data.langInterface) {
case 1: oled.print(F("ЗУММЕР")); break;
case 2: oled.print(F("ЗУМЕР")); break;
case 3: oled.print(F("BUZZER")); break;
}
break;
case 9: // Подменю 10
switch (data.langInterface) {
case 1:
case 2:
case 3: oled.print(F("GPS")); break;
}
break;
case 10: // Подменю 11
switch (data.langInterface) {
case 1: oled.print(F("ПАРКТРОНИК")); break;
case 2: oled.print(F("ПАРКТРОНIК")); break;
case 3: oled.print(F("PARKING SENSOR")); break;
}
break;
case 11: // Подменю 12
switch (data.langInterface) {
case 1:
case 2: oled.print(F("РЕЛЕ")); break;
case 3: oled.print(F("RELAY")); break;
}
break;
case 12: // Подменю 13
switch (data.langInterface) {
case 1: oled.print(F("СВЕТОДИОД RGB")); break;
case 2: oled.print(F("СВIТЛОДIОД RGB")); break;
case 3: oled.print(F("LED RGB")); break;
}
break;
case 13: // Подменю 14
switch (data.langInterface) {
case 1: oled.print(F("ДАТЧИК LPG 3 ПИНА")); break;
case 2: oled.print(F("ДАТЧИК LPG 3 ПIНА")); break;
case 3: oled.print(F("LPG SENSOR 3 PIN")); break;
}
break;
case 14: // Подменю 15
switch (data.langInterface) {
case 1: oled.print(F("ДАТЧИК LPG 2 ПИНА")); break;
case 2: oled.print(F("ДАТЧИК LPG 2 ПIНА")); break;
case 3: oled.print(F("LPG SENSOR 2 PIN")); break;
}
break;
case 15: // Подменю 16
switch (data.langInterface) {
case 1:
case 2: oled.print(F("КНОПКИ, ДЖОЙСТИК")); break;
case 3: oled.print(F("BUTTONS, JOYSTICK")); break;
}
break;
case 16: break; // Подменю 17
}
oled.textMode(0);
oled.autoPrintln(1);
oled.setCursorXY(0, 12);
switch(num2) {
case 0:
switch (data.langInterface) {
case 1:
case 2: oled.print(F("5V VCC GND GND D20 SDA D21 SCL АКБ+ VBS")); break;
case 3: oled.print(F("5V VCC GND GND D20 SDA D21 SCL BAT+ VBS")); break;
}
oled.line(15, 15, 97, 15);
oled.line(21, 23, 97, 23);
oled.line(21, 31, 97, 31);
oled.line(21, 39, 97, 39);
oled.line(27, 47, 97, 47);
break;
case 1:
switch (data.langInterface) {
case 1:
case 2: oled.print(F("GND АКБ- АКБ+ A0 ")); break;
case 3: oled.print(F("GND BAT- BAT+ A0 ")); break;
}
oled.line(21, 15, 91, 15);
oled.line(64, 39, 91, 39);
oled.rect(62, 19, 66, 24, OLED_STROKE);
oled.rect(62, 30, 66, 35, OLED_STROKE);
oled.line(64, 15, 64, 19);
oled.line(64, 24, 64, 30);
oled.line(64, 35, 64, 39);
oled.line(15, 46, 40, 46);
oled.line(40, 27, 40, 46);
oled.line(40, 27, 64, 27);
oled.setCursorXY(70, 18);
oled.print(F("R2"));
oled.setCursorXY(70, 29);
oled.print(F("R1"));
break;
case 2:
oled.print(F("GND -(GND) S D10 5V "));
oled.line(21, 15, 85, 15);
oled.line(38, 39, 109, 39);
oled.rect(36, 19, 40, 24, OLED_STROKE);
oled.rect(36, 30, 40, 35, OLED_STROKE);
oled.line(38, 15, 38, 19);
oled.line(38, 24, 38, 30);
oled.line(38, 35, 38, 39);
oled.line(21, 46, 26, 46);
oled.line(26, 27, 26, 46);
oled.line(26, 27, 38, 27);
oled.setCursorXY(44, 18);
oled.print(F("R6 4.7K"));
oled.setCursorXY(44, 29);
oled.print(F("R5 10K"));
oled.line(15, 54, 32, 54);
oled.line(32, 27, 32, 45);
oled.line(32, 50, 32, 54);
oled.rect(30, 45, 34, 50, OLED_STROKE);
oled.setCursorXY(38, 45);
oled.print(F("R7 4.7-10K"));
break;
case 3:
oled.print(F("GND black D5 yellow 5V red"));
oled.line(21, 15, 85, 15);
oled.line(15, 23, 79, 23);
oled.line(15, 47, 97, 47);
oled.line(40, 23, 40, 33);
oled.rect(38, 33, 42, 38, OLED_STROKE);
oled.line(40, 38, 40, 47);
oled.setCursorXY(46, 33);
oled.print(F("R8 4.7K"));
break;
case 4:
oled.print(F("GND black D6 yellow 5V red"));
oled.line(21, 15, 85, 15);
oled.line(15, 23, 79, 23);
oled.line(15, 47, 97, 47);
oled.line(40, 23, 40, 33);
oled.rect(38, 33, 42, 38, OLED_STROKE);
oled.line(40, 38, 40, 47);
oled.setCursorXY(46, 33);
oled.print(F("R9 4.7K"));
break;
case 5:
oled.print(F("GND black D7 yellow 5V red"));
oled.line(21, 15, 85, 15);
oled.line(15, 23, 79, 23);
oled.line(15, 47, 97, 47);
oled.line(40, 23, 40, 33);
oled.rect(38, 33, 42, 38, OLED_STROKE);
oled.line(40, 38, 40, 47);
oled.setCursorXY(46, 33);
oled.print(F("R10 4.7K"));
break;
case 6:
oled.print(F("GND black D24 yellow 5V red"));
oled.line(21, 15, 85, 15);
oled.line(21, 23, 79, 23);
oled.line(15, 47, 97, 47);
oled.line(40, 23, 40, 33);
oled.rect(38, 33, 42, 38, OLED_STROKE);
oled.line(40, 38, 40, 47);
oled.setCursorXY(46, 33);
oled.print(F("R11 4.7K"));
break;
case 7:
oled.print(F("GND black D25 yellow 5V red"));
oled.line(21, 15, 85, 15);
oled.line(21, 23, 79, 23);
oled.line(15, 47, 97, 47);
oled.line(40, 23, 40, 33);
oled.rect(38, 33, 42, 38, OLED_STROKE);
oled.line(40, 38, 40, 47);
oled.setCursorXY(46, 33);
oled.print(F("R12 4.7K"));
break;
case 8:
oled.print(F("D12 GND (-) D11 S"));
oled.line(21, 15, 73, 15);
oled.line(21, 23, 109, 23);
break;
case 9:
oled.print(F("GND GND (-) 3V3 VCC D14 RX D15 TX"));
oled.line(21, 15, 73, 15);
oled.line(21, 23, 97, 23);
oled.line(21, 31, 103, 31);
oled.line(21, 39, 103, 39);
break;
case 10:
oled.drawBitmap(0, 12, sonar_scheme, 128, 53);
break;
case 11:
switch (data.langInterface) {
case 1: oled.print(F("D30 IN GND GND VCC 5V (лучше использовать внешнее питание 5V вместо пина VCC)")); break;
case 2: oled.print(F("D30 IN GND GND VCC 5V (краще викорис-ти окреме живлення 5V замiсть пiна VCC)")); break;
case 3: oled.print(F("D30 IN GND GND VCC 5V (it is better to use an external 5V power supply)")); break;
}
oled.line(21, 15, 103, 15);
oled.line(21, 23, 97, 23);
oled.line(21, 31, 103, 31);
break;
case 12:
oled.print(F("GND GND (-) D45 R (red) D44 G (green) D46 B (blue)"));
oled.line(21, 15, 73, 15);
oled.line(21, 23, 73, 23);
oled.line(21, 31, 61, 31);
oled.line(21, 39, 67, 39);
break;
case 13:
oled.print(F("5V VCC GND GND D20 SDA D21 SCL LPG (out) VBS"));
oled.line(15, 15, 97, 15);
oled.line(21, 23, 97, 23);
oled.line(21, 31, 97, 31);
oled.line(21, 39, 97, 39);
oled.line(57, 47, 97, 47);
break;
case 14:
// 1 2 3 4 5 6 | - это шаблон для рисования схем
oled.print(F("5V LPG pin 1 A3 GND LPG pin 2"));
oled.line(15, 15, 61, 15);
oled.line(15, 23, 100, 23);
oled.line(100, 23, 100, 40);
oled.line(21, 47, 31, 47);
oled.line(31, 23, 31, 33);
oled.rect(29, 33, 33, 38, OLED_STROKE);
oled.line(31, 38, 31, 47);
oled.setCursorXY(37, 32);
oled.print(F("R13"));
break;
case 15:
oled.print(F("GND GND D49 F D51 B D48 L D2 R D50 M"));
oled.line(21, 15, 97, 15);
oled.line(21, 23, 109, 23);
oled.line(21, 31, 109, 31);
oled.line(21, 39, 109, 39);
oled.line(15, 47, 109, 47);
oled.line(21, 55, 109, 55);
break;
case 16:
oled.drawBitmap(0, 0, buttons, 128, 64);
break;
}
oled.autoPrintln(0);
if (joy_M.click() or joy_L.click()) deep = 2;
if (joy_F.click()) {
if (pointerP2 == 0) pointerP2 = ITEMS13 - 2;
else pointerP2 -= 1;
}
if (joy_B.click()) {
if (pointerP2 < ITEMS13 - 2) pointerP2 += 1;
else pointerP2 = 0;
}
oled.update();
}
void warningMsg() { // Предупреждение о замене расходников
oled.clear();
oled.drawBitmap(0, 0, background, 128, 64);
oled.drawBitmap(11, 17, oil, 30, 32, 1);
oled.setScale(1);
switch (data.langInterface) {
case 1:
oled.setCursorXY(60, 21);
oled.print(F("СМЕНИТЕ"));
oled.setCursorXY(51, 36);
oled.print(F("РАСХОДНИКИ"));
break;
case 2:
oled.setCursorXY(57, 19);
oled.print(F("ЗАМIНIТЬ"));
oled.setCursorXY(57, 29);
oled.print(F("ВИТРАТНI"));
oled.setCursorXY(54, 39);
oled.print(F("МАТЕРIАЛИ"));
break;
case 3:
oled.setCursorXY(60, 21);
oled.print(F("REPLACE"));
oled.setCursorXY(48, 36);
oled.print(F("CONSUMABLES"));
break;
}
oled.update();
static uint32_t timing11;
if (millis() - timing11 >= 150) {
timing11 = millis();
rgbFlag = !rgbFlag;
}
}
void printPointer(uint8_t pointer) { // Навигация по вертикальному меню
switch (pointer) {
case 6 ... 11: pointer -= 6; break;
case 12 ... 17: pointer -= 12; break;
case 18 ... 23: pointer -= 18; break;
case 24 ... 29: pointer -= 24; break;
case 30 ... 35: pointer -= 30; break;
case 36 ... 41: pointer -= 36; break;
case 42 ... 47: pointer -= 42; break;
}
oled.setCursorXY(0, pointer * 9 + 11);
oled.print(F(">"));
}
void printPointerName(uint8_t pointer) { // Навигация по горизонтальному меню
oled.setCursorXY(pointer * 6 + 2, 37);
oled.print(F("^"));
}
uint16_t firstAverageVoltage() { // Предварительное усреднение показаний с датчика уровня газа
// Это быстрый опрос датчика для более точного поиска среднего значения вольтажа
firstTotal = firstTotal - firstReadings[firstReadIndex]; // вычитаем последнее значение массива из суммы
if (data.h == 1) firstReadings[firstReadIndex] = ina.getVoltage() * 1000; // считываем значение с INA226
else firstReadings[firstReadIndex] = getVout() * 1000; //... или получаем напряжение с резистора
firstTotal = firstTotal + firstReadings[firstReadIndex]; // добавляем значение к сумме
firstReadIndex += 1; // переставляем индекс на следующую позицию
if (firstReadIndex >= firstNumReadings) firstReadIndex = 0; // проверяем если мы выскочили индексом за пределы массива (если да, то индекс на ноль)
uint16_t middle = firstTotal / firstNumReadings; // считаем среднее значение из n измерений
return middle;
}
float averageVoltage() { // Усреднение (уже второе) предварительных (усредненных) показаний с датчика уровня газа
// Это медленный опрос - для плавного изменения значений литража на дисплее
total = total - readings[readIndex]; // вычитаем последнее значение массива из суммы
readings[readIndex] = average; // получаем среднее значение напряжения из предварительного массива значений
total = total + readings[readIndex]; // добавляем значение к сумме
readIndex += 1; // переставляем индекс на следующую позицию
if (readIndex >= numReadings) readIndex = 0; // проверяем если мы выскочили индексом за пределы массива (если да, то индекс на ноль)
float middle = total / numReadings / 1000.0; // считаем среднее значение из n измерений
return middle;
}
float averageBatteryVoltage() { // Усреднение показаний вольтажа АКБ
totalBatt = totalBatt - readBatt[readIndexBatt]; // вычитаем последнее значение массива из суммы
if (data.battVoltSource) readBatt[readIndexBatt] = ina2.getVoltage() * 100; // считываем значение вольтажа в зависимости от источника
else readBatt[readIndexBatt] = getBattVoltage() * 100;
totalBatt = totalBatt + readBatt[readIndexBatt]; // добавляем значение к сумме
readIndexBatt += 1; // переставляем индекс на следующую позицию
if (readIndexBatt >= numReadBatt) readIndexBatt = 0; // проверяем если мы выскочили индексом за пределы массива (если да, то индекс на ноль)
float middle = totalBatt / numReadBatt / 100.0; // считаем среднее значение из n измерений
return middle;
}
float getVout() { // Перевод значений с двухконтактного датчика в вольтаж
float Vout = data.vref / 1024.0 * analogRead(sensorPin); // Вычисляем напряжение в средней точке делителя
return Vout;
}
float getBattVoltage() { // Получение вольтажа АКБ
float battVoltage = analogRead(batteryPin) * data.vref * ((R1 + R2) / R2) / 1024.0;
return battVoltage;
}
uint8_t middleLine (uint8_t lenght, uint8_t word) { // Поиск начальных координат для центровки имени на приветственнном экране
if (!data.lang) word /= 2;
uint8_t startNameX = (lenght - ((word * 10) + ((word - 1) * 2))) / 2;
return startNameX;
}
uint8_t middleLineTemp (uint8_t word, bool lang, uint8_t scr) { // Поиск начальных координат для центровки названий на мини-скринах
uint8_t startTemp;
uint8_t shiftTemp;
if (!lang) word /= 2;
if (scr == 1 or scr == 3) shiftTemp = 0;
else shiftTemp = 64;
startTemp = (63 - ((word * 5) + (word - 1))) / 2 + shiftTemp;
return startTemp;
}
void gasStationIcon(byte x, byte y) { // Иконка газовой колонки
oled.rect(x, y, x + 8, y + 6, OLED_STROKE);
oled.rect(x, y + 7, x + 8, y + 12, OLED_FILL);
oled.rect(x - 1, y + 13, x + 9, y + 14, OLED_FILL);
}
void gasStationIconMini(byte x, byte y) { // Мини иконка газовой колонки
oled.rect(x, y, x + 6, y + 4, OLED_STROKE);
oled.rect(x, y + 5, x + 6, y + 8, OLED_FILL);
oled.rect(x - 1, y + 9, x + 7, y + 10, OLED_FILL);
}
float getTempDS() { // Получение температуры с первого датчика
static float tempSensor;
if (!ds.isWaiting()) ds.requestTemp();
if (ds.ready()) {
if (ds.readTemp()) tempSensor = ds.getTemp();
else tempSensor = 0;
}
return tempSensor;
}
float getTempDS2() { // Получение температуры со второго датчика
static float tempSensor2;
if (!ds2.isWaiting()) ds2.requestTemp();
if (ds2.ready()) {
if (ds2.readTemp()) tempSensor2 = ds2.getTemp();
else tempSensor2 = 0;
}
return tempSensor2;
}
float getTempDS3() { // Получение температуры с третьего датчика
static float tempSensor3;
if (!ds3.isWaiting()) ds3.requestTemp();
if (ds3.ready()) {
if (ds3.readTemp()) tempSensor3 = ds3.getTemp();
else tempSensor3 = 0;
}
return tempSensor3;
}
float getTempDS4() { // Получение температуры с четвертого датчика
static float tempSensor4;
if (!ds4.isWaiting()) ds4.requestTemp();
if (ds4.ready()) {
if (ds4.readTemp()) tempSensor4 = ds4.getTemp();
else tempSensor4 = 0;
}
return tempSensor4;
}
float getTempDS5() { // Получение температуры с пятого датчика
static float tempSensor5;
if (!ds5.isWaiting()) ds5.requestTemp();
if (ds5.ready()) {
if (ds5.readTemp()) tempSensor5 = ds5.getTemp();
else tempSensor5 = 0;
}
return tempSensor5;
}
void whiteRectangle(byte a, byte b, byte x, byte y, bool t) { // Белые прямоугольники для одного из экранов
if (t == 1) oled.rect(a, b, x, y, OLED_FILL); // byte t - тип заливки (1 - заливка, 0 - обводка)
else oled.rect(a, b, x, y, OLED_STROKE);
}
void dotsIndicator(byte a, byte b, byte c) { // Точки для стрелочного индикатора
oled.circle(a, b, c, OLED_FILL);
}
void gasLevelRect (byte t, byte a, byte b, byte c, byte d, byte x, float z) { // Шаблон графического уровня газа
if (t == 1) { // byte t - тип уровня (1 - горизонтальный, 2 - вертикальный)
levelLenght = round((c - a - 1.0) * z / data.c); // byte a,b,c,d - координаты прямоугольника уровня газа
oled.rect(a, b, c, d, OLED_STROKE); // byte x - положение ЛЕВОЙ стороны вертикального уровня по оси X при минимальной ширине
} else { // float z - literInBalloonOled (текущее значение газа в литрах)
levelLenght = round((d - b - 1.0) * z / data.c);
oled.rect(x - data.q, b, c, d, OLED_STROKE);
}
if (levelLenght != 0) {
if (t == 1) oled.rect(a + 1, b + 1, levelLenght + a, d - 1, OLED_FILL);
else oled.rect(x - data.q + 1, d - levelLenght, c - 1, d - 1, OLED_FILL);
}
}
uint8_t getAutoBrightDisplay (float maxLux) { // Автояркоость
totalLux -= luxArray[readIndexLux]; // вычитаем последнее значение массива из суммы
luxArray[readIndexLux] = LightSensor.GetLightIntensity(); // считываем значение Lux
totalLux += luxArray[readIndexLux]; // добавляем значение к сумме
readIndexLux += 1; // переставляем индекс на следующую позицию
if (readIndexLux >= numLuxArray) readIndexLux = 0; // проверяем если мы выскочили индексом за пределы массива (если да, то индекс на ноль)
uint16_t luxAverage = totalLux / numLuxArray; // Среднее значение Lux из массива датчика освещенности
float brightPercent; // Яркость дисплея в процентах
uint8_t range = data.maxBright - data.minBright + 1; // Предел между установленными макс. и мин. яркостью
int8_t coeff = data.brightIntens * 5; // Коэффициент сдвига автояркости
if (luxAverage >= maxLux) brightPercent = 100; // Если значение Lux превышает установленный максимум, тогда яркость дисплея на 100%,
else brightPercent = luxAverage / maxLux * 100; // иначе рассчитать текущую яркость
float dispBrightAlternativeFloat = range * brightPercent / 100 + data.minBright - 1; // Значение текущей яркости дисплея без учета коэффициента (float)...
if (dispBrightAlternativeFloat + coeff >= data.maxBright) dispBrightAlternativeFloat = data.maxBright; // и с учетом коэффициента (c условием не выходить за рамки установленных допусков яркости)
else if (dispBrightAlternativeFloat + coeff <= data.minBright) dispBrightAlternativeFloat = data.minBright;
else dispBrightAlternativeFloat += coeff;
if (data.brightBoost and luxAverage > maxLux and dispBrightAlternativeFloat < 255) { // Условие для буста яркости +10% (при очень ярком освещении)
if (255 - dispBrightAlternativeFloat >= 25) dispBrightAlternativeFloat += 25.0;
else dispBrightAlternativeFloat = 255;
}
if (data.brightBoost and luxAverage == 0 and data.minBright > 1) { // Условие для (де)буста яркости -10% (при нулевом освещении)
if (data.minBright - 25 >= 1) dispBrightAlternativeFloat -= 25.0;
else dispBrightAlternativeFloat = 1;
}
uint8_t dispBrightAlternative = round(dispBrightAlternativeFloat); // Избавляемся от float и округляем
if (dispBrightAlternative <= 1) dispBrightAlternative = 1; // Ещё пара условий, чтобы не выйти за пределы границ яркости дисплея
if (dispBrightAlternative >= 255) dispBrightAlternative = 255;
return dispBrightAlternative;
}
void displayBrightLevel (byte t, byte a, byte b, byte c, byte d, uint8_t z) { // Шаблон графического уровня яркости дисплея
uint8_t brightLevelLenght; // byte t - тип уровня (1 - горизонтальный, 2 - вертикальный)
if (t == 1) brightLevelLenght = round((c - a - 1.0) * z / 255.0); // byte a,b,c,d - координаты прямоугольника уровня яркости
else brightLevelLenght = round((d - b - 1.0) * z / 255.0); // float z - data.f (текущая яркость дисплея)
oled.rect(a, b, c, d, OLED_STROKE);
if (brightLevelLenght != 0) {
if (t == 1) oled.rect(a + 1, b + 1, brightLevelLenght + a, d - 1, OLED_FILL);
else oled.rect(a + 1, d - brightLevelLenght, c - 1, d - 1, OLED_FILL);
}
}
String onOff (bool a) { // Для меню вкл/выкл
String select = F("");
if (a) {
switch (data.langInterface) {
case 1: select = F("вкл"); break;
case 2: select = F("увiмк"); break;
case 3: select = F("on"); break;
}
}
else {
switch (data.langInterface) {
case 1: select = F("выкл"); break;
case 2: select = F("вимк"); break;
case 3: select = F("off"); break;
}
}
return select;
}
String setLang (bool a) { // Для моих названий выбор языка
String select = F("");
if (a) select = F("EN");
else select = F("РУ");
return select;
}
String menuRectType (bool a) { // Для меню тип заливки прямоугольников
String select = F("");
if (a) {
switch (data.langInterface) {
case 1: select = F("заливка"); break;
case 2: select = F("заливання"); break;
case 3: select = F("fill"); break;
}
}
else {
switch (data.langInterface) {
case 1: select = F("обводка"); break;
case 2: select = F("обведення"); break;
case 3: select = F("stroke"); break;
}
}
return select;
}
String menuSensorType (bool a) { // Для меню тип датчика уровня газа
String select = F("");
if (a) {
switch (data.langInterface) {
case 1: select = F("3 пин"); break;
case 2: select = F("3 пiн"); break;
case 3: select = F("3 pin"); break;
}
}
else {
switch (data.langInterface) {
case 1: select = F("2 пин"); break;
case 2: select = F("2 пiн"); break;
case 3: select = F("2 pin"); break;
}
}
return select;
}
String menuDateSource (bool a) { // Для меню источник даты / времени
String select = F("");
if (a) select = F("DS3231");
else select = F("GPS NEO");
return select;
}
String menuBattVoltSource (bool a) { // Для меню источник напряжения АКБ
String select = F("");
if (a) select = F("INA226");
else select = F("Arduino");
return select;
}
String menuBrightSpeed (uint8_t a) { // Для меню скорость работы автояркости
String select = F("");
if (a == 1) {
switch (data.langInterface) {
case 1: select = F("медленный"); break;
case 2: select = F("повiльний"); break;
case 3: select = F("slow"); break;
}
}
if (a == 2) {
switch (data.langInterface) {
case 1: select = F("стандарт"); break;
case 2: select = F("стандарт"); break;
case 3: select = F("normal"); break;
}
}
if (a == 3) {
switch (data.langInterface) {
case 1: select = F("быстрый"); break;
case 2: select = F("швидкий"); break;
case 3: select = F("fast"); break;
}
}
return select;
}
String menuSpdLimitWarning (uint8_t a) { // Для меню тип предупреждения о превышении скорости
String select = F("");
if (a == 0) {
switch (data.langInterface) {
case 1: select = F("все выкл"); break;
case 2: select = F("все вимк"); break;
case 3: select = F("all off"); break;
}
}
if (a == 1) {
switch (data.langInterface) {
case 1: select = F("свет"); break;
case 2: select = F("свiтло"); break;
case 3: select = F("light"); break;
}
}
if (a == 2) {
switch (data.langInterface) {
case 1:
case 2: select = F("звук"); break;
case 3: select = F("sound"); break;
}
}
if (a == 3) {
switch (data.langInterface) {
case 1: select = F("все вкл"); break;
case 2: select = F("все увiмк"); break;
case 3: select = F("all on"); break;
}
}
return select;
}
String menuBrightSpeedNotification (uint8_t a) { // Для всплывающей подсказки скорость работы автояркости
String select = F("");
if (a == 1) {
switch (data.langInterface) {
case 1: select = F("МЕДЛЕННАЯ"); break;
case 2: select = F("ПОВIЛЬНА"); break;
case 3: select = F("SLOW"); break;
}
}
if (a == 2) {
switch (data.langInterface) {
case 1: select = F("СТАНДАРТНАЯ"); break;
case 2: select = F("СТАНДАРТНА"); break;
case 3: select = F("NORMAL"); break;
}
}
if (a == 3) {
switch (data.langInterface) {
case 1: select = F("БЫСТРАЯ"); break;
case 2: select = F("ШВИДКА"); break;
case 3: select = F("FAST"); break;
}
}
return select;
}
String menuBrightMode (bool a) { // Для всплывающей подсказки режим работы яркости (авто/ручной)
String select = F("");
if (a) {
switch (data.langInterface) {
case 1:
case 2: select = F("АВТО"); break;
case 3: select = F("AUTO"); break;
}
}
else {
switch (data.langInterface) {
case 1: select = F("РУЧНАЯ"); break;
case 2: select = F("РУЧНА "); break;
case 3: select = F("MANUAL"); break;
}
}
return select;
}
String menuResetOdometer (bool a) { // Для меню обнуление сбрасываемого одометра
String select = F("");
if (a) {
switch (data.langInterface) {
case 1: select = F("сбросить"); break;
case 2: select = F("зкинути"); break;
case 3: select = F("reset"); break;
}
}
else {
switch (data.langInterface) {
case 1: select = F("оставить"); break;
case 2: select = F("залишити"); break;
case 3: select = F("no reset"); break;
}
}
return select;
}
String menuSaveTimeDS (bool a) { // Для меню запись текущих даты/времени в память DS3231
String select = F("");
if (a) {
switch (data.langInterface) {
case 1: select = F("сохранить"); break;
case 2: select = F("зберегти"); break;
case 3: select = F("save"); break;
}
}
else {
switch (data.langInterface) {
case 1: select = F("пропустить"); break;
case 2: select = F("пропустити"); break;
case 3: select = F("skip"); break;
}
}
return select;
}
String menuRelayType (bool a) { // Для меню тип реле
String select = F("");
if (a) select = F("low");
else select = F("high");
return select;
}
String menuLang (uint8_t a) { // Для меню выбор языка
String select = F("");
if (a == 1) select = F("рус");
if (a == 2) select = F("укр");
if (a == 3) select = F("eng");
return select;
}
String menutempSensorForRelay (uint8_t num) { // Для меню выбор датчика температуры для реле
String select = F("");
switch (num) {
case 0:
switch (data.langInterface) {
case 1: select = F("выкл"); break;
case 2: select = F("вимк"); break;
case 3: select = F("off"); break;
}
break;
case 1: select = myTemp1; break;
case 2: select = myTemp2; break;
case 3: select = myTemp3; break;
case 4: select = myTemp4; break;
case 5: select = myTemp5; break;
}
return select;
}
String menuMiniScreenName (uint8_t num) { // Для меню названия мини-скринов
String select = F("");
switch (num) {
case 0:
switch (data.langInterface) {
case 1: select = F("выкл"); break;
case 2: select = F("вимк"); break;
case 3: select = F("off"); break;
}
break;
case 1:
switch (data.langInterface) {
case 1: select = F("время"); break;
case 2: select = F("час"); break;
case 3: select = F("time"); break;
}
break;
case 2:
switch (data.langInterface) {
case 1:
case 2: select = F("газ"); break;
case 3: select = F("gas"); break;
}
break;
case 3:
switch (data.langInterface) {
case 1:
case 2: select = F("км"); break;
case 3: select = F("km"); break;
}
break;
case 4: select = myTemp1; break;
case 5: select = myTemp2; break;
case 6: select = myTemp3; break;
case 7: select = myTemp4; break;
case 8: select = myTemp5; break;
case 9:
switch (data.langInterface) {
case 1: select = F("скорость"); break;
case 2: select = F("швидкiсть"); break;
case 3: select = F("speed"); break;
}
break;
case 10:
switch (data.langInterface) {
case 1:
case 2: select = F("акб"); break;
case 3: select = F("battery"); break;
}
break;
}
return select;
}
String menuMelodyStart (uint8_t num) { // Для меню названия мелодий
String select = F("");
switch (num) {
case 0:
switch (data.langInterface) {
case 1: select = F("выкл"); break;
case 2: select = F("вимк"); break;
case 3: select = F("off"); break;
}
break;
case 1:
switch (data.langInterface) {
case 1: select = F("мелодия 1"); break;
case 2: select = F("мелодiя 1"); break;
case 3: select = F("melody 1"); break;
}
break;
case 2:
switch (data.langInterface) {
case 1: select = F("мелодия 2"); break;
case 2: select = F("мелодiя 2"); break;
case 3: select = F("melody 2"); break;
}
break;
case 3:
switch (data.langInterface) {
case 1: select = F("мелодия 3"); break;
case 2: select = F("мелодiя 3"); break;
case 3: select = F("melody 3"); break;
}
break;
case 4:
switch (data.langInterface) {
case 1: select = F("мелодия 4"); break;
case 2: select = F("мелодiя 4"); break;
case 3: select = F("melody 4"); break;
}
break;
case 5:
switch (data.langInterface) {
case 1: select = F("мелодия 5"); break;
case 2: select = F("мелодiя 5"); break;
case 3: select = F("melody 5"); break;
}
break;
case 6:
switch (data.langInterface) {
case 1: select = F("мелодия 6"); break;
case 2: select = F("мелодiя 6"); break;
case 3: select = F("melody 6"); break;
}
break;
case 7:
switch (data.langInterface) {
case 1: select = F("мелодия 7"); break;
case 2: select = F("мелодiя 7"); break;
case 3: select = F("melody 7"); break;
}
break;
case 8:
switch (data.langInterface) {
case 1: select = F("мелодия 8"); break;
case 2: select = F("мелодiя 8"); break;
case 3: select = F("melody 8"); break;
}
break;
case 9:
switch (data.langInterface) {
case 1: select = F("мелодия 9"); break;
case 2: select = F("мелодiя 9"); break;
case 3: select = F("melody 9"); break;
}
break;
case 10:
switch (data.langInterface) {
case 1: select = F("мелодия 10"); break;
case 2: select = F("мелодiя 10"); break;
case 3: select = F("melody 10"); break;
}
break;
}
return select;
}
void getMiniScreen (uint8_t scr, uint8_t num) { // Все возможные варианты мини-скринов
Datime dt = rtc;
byte startx = 0;
byte starty = 0;
byte x = 0;
byte y = 0;
switch (num) {
case 1: x = 0; y = 0; break;
case 2: x = 64; y = 0; break;
case 3: x = 0; y = 32; break;
case 4: x = 64; y = 32; break;
}
oled.setScale(1);
switch (scr) {
case 0: break; // Пустой
case 1: // Дата / время
if (data.dateSource == 0) {
/*if (gps.day < 10) {oled.setCursorXY(startx + 4 + x, starty + 3 + y); oled.print(0); oled.setCursorXY(startx + 10 + x, starty + 3 + y);}
else oled.setCursorXY(startx + 4 + x, starty + 3 + y);
oled.print(gps.day);
oled.dot(startx + 17 + x, starty + 9 + y);
if (gps.month < 10) {oled.setCursorXY(startx + 20 + x, starty + 3 + y); oled.print(0); oled.setCursorXY(startx + 26 + x, starty + 3 + y);}
else oled.setCursorXY(startx + 20 + x, starty + 3 + y);
oled.print(gps.month);
oled.dot(startx + 33 + x, starty + 9 + y);
oled.setCursorXY(startx + 36 + x, starty + 3 + y);
if (data.yearCorrect) oled.print(data.t);
else oled.print(gps.Year);
oled.setScale(2);
if (gps.Hours < 10) {oled.setCursorXY(startx + 4 + x, starty + 14 + y); oled.print(0); oled.setCursorXY(startx + 16 + x, starty + 14 + y);}
else oled.setCursorXY(startx + 4 + x, starty + 14 + y);
oled.print(gps.Hours);
oled.circle(startx + 31 + x, starty + 17 + y, 1, OLED_FILL);
oled.circle(startx + 31 + x, starty + 24 + y, 1, OLED_FILL);
if (gps.minutes < 10) {oled.setCursorXY(startx + 37 + x, starty + 14 + y); oled.print(0); oled.setCursorXY(startx + 50 + x, starty + 14 + y);}
else oled.setCursorXY(startx + 37 + x, starty + 14 + y);
oled.print(gps.minutes);*/
} else {
if (dt.day < 10) {oled.setCursorXY(startx + 4 + x, starty + 3 + y); oled.print(0); oled.setCursorXY(startx + 10 + x, starty + 3 + y);}
else oled.setCursorXY(startx + 4 + x, starty + 3 + y);
oled.print(dt.day);
oled.dot(startx + 17 + x, starty + 9 + y);
if (dt.month < 10) {oled.setCursorXY(startx + 20 + x, starty + 3 + y); oled.print(0); oled.setCursorXY(startx + 26 + x, starty + 3 + y);}
else oled.setCursorXY(startx + 20 + x, starty + 3 + y);
oled.print(dt.month);
oled.dot(startx + 33 + x, starty + 9 + y);
oled.setCursorXY(startx + 36 + x, starty + 3 + y);
oled.print(dt.year);
oled.setScale(2);
if (dt.hour < 10) {oled.setCursorXY(startx + 4 + x, starty + 14 + y); oled.print(0); oled.setCursorXY(startx + 16 + x, starty + 14 + y);}
else oled.setCursorXY(startx + 4 + x, starty + 14 + y);
oled.print(dt.hour);
oled.circle(startx + 31 + x, starty + 17 + y, 1, OLED_FILL);
oled.circle(startx + 31 + x, starty + 24 + y, 1, OLED_FILL);
if (dt.minute < 10) {oled.setCursorXY(startx + 37 + x, starty + 14 + y); oled.print(0); oled.setCursorXY(startx + 50 + x, starty + 14 + y);}
else oled.setCursorXY(startx + 37 + x, starty + 14 + y);
oled.print(dt.minute);
}
break;
case 2: // Литраж
oled.setCursorXY(middleLineTemp(3, 1, num), starty + 2 + y);
switch (data.langInterface) {
case 1:
case 2: oled.print(F("Газ")); break;
case 3: oled.print(F("GAS")); break;
}
oled.setScale(2);
if (literInBalloonOled < 10) oled.setCursorXY(startx + 14 + x, starty + 13 + y);
else oled.setCursorXY(startx + 8 + x, starty + 13 + y);
oled.print(literInBalloonOled, 1);
iconBlink();
if (flagIcon) gasStationIconMini(startx + 53 + x, starty + 2 + y);
break;
case 3: // Километраж
oled.setCursorXY(startx + 26 + x, starty + 2 + y);
oled.print(F("KM"));
oled.setScale(2);
if (kilometer >= 1000) oled.setCursorXY(startx + 8 + x, starty + 13 + y);
else if (kilometer >= 100 and kilometer < 1000) oled.setCursorXY(startx + 14 + x, starty + 13 + y);
else if (kilometer < 10) oled.setCursorXY(startx + 26 + x, starty + 13 + y);
else oled.setCursorXY(startx + 20 + x, starty + 13 + y);
oled.print(kilometer);
break;
case 4: // Температура датчика 1
oled.setCursorXY(middleLineTemp(myTemp1.length(), data.langTemp1, num), starty + 2 + y);
oled.print(myTemp1);
oled.setScale(2);
if (getTempDS() >= 100 or getTempDS() <= -10) oled.setCursorXY(startx + 2 + x, starty + 13 + y);
else if (getTempDS() >= 0 and getTempDS() < 10) oled.setCursorXY(startx + 14 + x, starty + 13 + y);
else oled.setCursorXY(startx + 8 + x, starty + 13 + y);
oled.print(getTempDS(), 1);
break;
case 5: // Температура датчика 2
oled.setCursorXY(middleLineTemp(myTemp2.length(), data.langTemp2, num), starty + 2 + y);
oled.print(myTemp2);
oled.setScale(2);
if (getTempDS2() >= 100 or getTempDS2() <= -10) oled.setCursorXY(startx + 2 + x, starty + 13 + y);
else if (getTempDS2() >= 0 and getTempDS2() < 10) oled.setCursorXY(startx + 14 + x, starty + 13 + y);
else oled.setCursorXY(startx + 8 + x, starty + 13 + y);
oled.print(getTempDS2(), 1);
break;
case 6: // Температура датчика 3
oled.setCursorXY(middleLineTemp(myTemp3.length(), data.langTemp3, num), starty + 2 + y);
oled.print(myTemp3);
oled.setScale(2);
if (getTempDS3() >= 100 or getTempDS3() <= -10) oled.setCursorXY(startx + 2 + x, starty + 13 + y);
else if (getTempDS3() >= 0 and getTempDS3() < 10) oled.setCursorXY(startx + 14 + x, starty + 13 + y);
else oled.setCursorXY(startx + 8 + x, starty + 13 + y);
oled.print(getTempDS3(), 1);
break;
case 7: // Температура датчика 4
oled.setCursorXY(middleLineTemp(myTemp4.length(), data.langTemp4, num), starty + 2 + y);
oled.print(myTemp4);
oled.setScale(2);
if (getTempDS4() >= 100 or getTempDS4() <= -10) oled.setCursorXY(startx + 2 + x, starty + 13 + y);
else if (getTempDS4() >= 0 and getTempDS4() < 10) oled.setCursorXY(startx + 14 + x, starty + 13 + y);
else oled.setCursorXY(startx + 8 + x, starty + 13 + y);
oled.print(getTempDS4(), 1);
break;
case 8: // Температура датчика 5
oled.setCursorXY(middleLineTemp(myTemp5.length(), data.langTemp5, num), starty + 2 + y);
oled.print(myTemp5);
oled.setScale(2);
if (getTempDS5() >= 100 or getTempDS5() <= -10) oled.setCursorXY(startx + 2 + x, starty + 13 + y);
else if (getTempDS5() >= 0 and getTempDS5() < 10) oled.setCursorXY(startx + 14 + x, starty + 13 + y);
else oled.setCursorXY(startx + 8 + x, starty + 13 + y);
oled.print(getTempDS5(), 1);
break;
case 9: // Скорость
if (data.miniScrSpdMode) {
switch (data.langInterface) {
case 1: oled.setCursorXY(middleLineTemp(8, 1, num), starty + 2 + y); oled.print(F("Скорость")); break;
case 2: oled.setCursorXY(middleLineTemp(9, 1, num), starty + 2 + y); oled.print(F("Швидкiсть")); break;
case 3: oled.setCursorXY(middleLineTemp(5, 1, num), starty + 2 + y); oled.print(F("Speed")); break;
}
} else {
oled.setCursorXY(middleLineTemp(9, 1, num), starty + 2 + y);
switch (data.langInterface) {
case 1: oled.print(F("Скор. GPS")); break;
case 2: oled.print(F("Швидк GPS")); break;
case 3: oled.print(F("Speed GPS")); break;
}
}
oled.setScale(2);
switch (data.miniScrSpdMode) {
/*case 0:
if (gps.speed > speedLimitArr[data.spdLimArrCount] + data.rightOfEntrance) {
oled.rect(startx + x, starty + y, startx + 63 + x, starty + 31 + y);
if (data.speedLimitWarning == 1 or data.speedLimitWarning == 3) {
red = 255; green = 0; blue = 0;
rgbFlag = true;
}
if (data.speedLimitWarning == 2 or data.speedLimitWarning == 3) toneAC(600, data.volumeSound, 250, true);
oled.textMode(1);
} else if (gps.speed > speedLimitArr[data.spdLimArrCount] and gps.speed <= speedLimitArr[data.spdLimArrCount] + data.rightOfEntrance) {
oled.rect(startx + x, starty + y, startx + 63 + x, starty + 31 + y);
if (data.speedLimitWarning == 1 or data.speedLimitWarning == 3) {
red = 255; green = 18; blue = 0;
rgbFlag = true;
}
oled.textMode(1);
} else rgbFlag = false;
if (gps.speed >= 100) oled.setCursorXY(startx + 14 + x, starty + 13 + y);
else if (gps.speed < 10) oled.setCursorXY(startx + 26 + x, starty + 13 + y);
else oled.setCursorXY(startx + 20 + x, starty + 13 + y);
break;*/
case 1:
if (tacho.getRPM() / sensorPulseCoef > speedLimitArr[data.spdLimArrCount] + data.rightOfEntrance) {
oled.rect(startx + x, starty + y, startx + 63 + x, starty + 31 + y);
if (data.speedLimitWarning == 1 or data.speedLimitWarning == 3) {
red = 255; green = 0; blue = 0;
rgbFlag = true;
}
if (data.speedLimitWarning == 2 or data.speedLimitWarning == 3) toneAC(600, data.volumeSound, 250, true);
oled.textMode(1);
} else if (tacho.getRPM() / sensorPulseCoef > speedLimitArr[data.spdLimArrCount] and tacho.getRPM() / sensorPulseCoef <= speedLimitArr[data.spdLimArrCount] + data.rightOfEntrance) {
oled.rect(startx + x, starty + y, startx + 63 + x, starty + 31 + y);
if (data.speedLimitWarning == 1 or data.speedLimitWarning == 3) {
red = 255; green = 18; blue = 0;
rgbFlag = true;
}
oled.textMode(1);
} else rgbFlag = false;
if (tacho.getRPM() / sensorPulseCoef >= 100) oled.setCursorXY(startx + 14 + x, starty + 13 + y);
else if (tacho.getRPM() / sensorPulseCoef < 10) oled.setCursorXY(startx + 26 + x, starty + 13 + y);
else oled.setCursorXY(startx + 20 + x, starty + 13 + y);
break;
}
if (data.miniScrSpdMode) {
static uint32_t timerSpeedSensor;
if (millis() - timerSpeedSensor > 100) {
timerSpeedSensor = millis();
oled.print(tacho.getRPM() / sensorPulseCoef);
}
} else //oled.print(gps.speed);
oled.textMode(0);
break;
case 10: // АКБ
static uint32_t timing4_2;
oled.setCursorXY(middleLineTemp(7, 1, num), starty + 2 + y); // автовыравнивание названия по центру мини-скрина
switch (data.langInterface) {
case 1:
case 2: oled.print(F(" АКБ ")); break;
case 3: oled.print(F("Battery")); break;
}
oled.setScale(2);
oled.setCursorXY(startx + 8 + x, starty + 13 + y);
if (millis() - timing4_2 >= 100) { // задержка опроса
timing4_2 = millis();
oled.print(averageBatteryVoltage(), 1);
}
break;
}
}
void iconBlink() { // Мигание иконки газовой колонки
static uint32_t timing3;
if (literInBalloonOled <= 2) flagIcon = true;
else if (literInBalloonOled > 2 && literInBalloonOled < 5) {
if (millis() - timing3 >= 1500) {
timing3 = millis();
flagIcon = !flagIcon;
}
}
else flagIcon = false;
}
uint8_t getITEMS (uint8_t numb) { // Определяем выбранный пункт подменю
switch (numb) {
case 0: return ITEMS1; break;
case 1: return ITEMS2; break;
case 2: return ITEMS3; break;
case 3: return ITEMS4; break;
case 4: return ITEMS5; break;
case 5: return ITEMS6; break;
case 6: return ITEMS7; break;
case 7: return ITEMS8; break;
case 8: return ITEMS9; break;
case 9: return ITEMS10; break;
case 10: return ITEMS11; break;
case 11: return ITEMS12; break;
case 12: return ITEMS13; break;
}
}
uint8_t getNameITEMS (uint8_t numb) { // Определяем выбранный символ для редактирования
switch (numb) {
case 0: return ITEMSSYMBOLNAME; break;
case 1: return ITEMSSYMBOLTEMP1; break;
case 2: return ITEMSSYMBOLTEMP2; break;
case 3: return ITEMSSYMBOLTEMP3; break;
case 4: return ITEMSSYMBOLTEMP4; break;
case 5: return ITEMSSYMBOLTEMP5; break;
}
}
void getNameTemp1() { // Формируем имя датчика температуры №1
myTemp1.remove(0);
myTemp1.reserve(20);
myTemp1 += symbols[data.tempA1];
myTemp1 += symbols[data.tempA2];
myTemp1 += symbols[data.tempA3];
myTemp1 += symbols[data.tempA4];
myTemp1 += symbols[data.tempA5];
myTemp1 += symbols[data.tempA6];
myTemp1 += symbols[data.tempA7];
myTemp1 += symbols[data.tempA8];
myTemp1 += symbols[data.tempA9];
myTemp1 += symbols[data.tempA10];
myTemp1.remove(myTemp1.indexOf(" "));
}
void getNameTemp2() { // Формируем имя датчика температуры №2
myTemp2.remove(0);
myTemp2.reserve(20);
myTemp2 += symbols[data.tempB1];
myTemp2 += symbols[data.tempB2];
myTemp2 += symbols[data.tempB3];
myTemp2 += symbols[data.tempB4];
myTemp2 += symbols[data.tempB5];
myTemp2 += symbols[data.tempB6];
myTemp2 += symbols[data.tempB7];
myTemp2 += symbols[data.tempB8];
myTemp2 += symbols[data.tempB9];
myTemp2 += symbols[data.tempB10];
myTemp2.remove(myTemp2.indexOf(" "));
}
void getNameTemp3() { // Формируем имя датчика температуры №3
myTemp3.remove(0);
myTemp3.reserve(20);
myTemp3 += symbols[data.tempC1];
myTemp3 += symbols[data.tempC2];
myTemp3 += symbols[data.tempC3];
myTemp3 += symbols[data.tempC4];
myTemp3 += symbols[data.tempC5];
myTemp3 += symbols[data.tempC6];
myTemp3 += symbols[data.tempC7];
myTemp3 += symbols[data.tempC8];
myTemp3 += symbols[data.tempC9];
myTemp3 += symbols[data.tempC10];
myTemp3.remove(myTemp3.indexOf(" "));
}
void getNameTemp4() { // Формируем имя датчика температуры №4
myTemp4.remove(0);
myTemp4.reserve(20);
myTemp4 += symbols[data.tempD1];
myTemp4 += symbols[data.tempD2];
myTemp4 += symbols[data.tempD3];
myTemp4 += symbols[data.tempD4];
myTemp4 += symbols[data.tempD5];
myTemp4 += symbols[data.tempD6];
myTemp4 += symbols[data.tempD7];
myTemp4 += symbols[data.tempD8];
myTemp4 += symbols[data.tempD9];
myTemp4 += symbols[data.tempD10];
myTemp4.remove(myTemp4.indexOf(" "));
}
void getNameTemp5() { // Формируем имя датчика температуры №5
myTemp5.remove(0);
myTemp5.reserve(20);
myTemp5 += symbols[data.tempE1];
myTemp5 += symbols[data.tempE2];
myTemp5 += symbols[data.tempE3];
myTemp5 += symbols[data.tempE4];
myTemp5 += symbols[data.tempE5];
myTemp5 += symbols[data.tempE6];
myTemp5 += symbols[data.tempE7];
myTemp5 += symbols[data.tempE8];
myTemp5 += symbols[data.tempE9];
myTemp5 += symbols[data.tempE10];
myTemp5.remove(myTemp5.indexOf(" "));
}
void melodyOn(uint8_t num) { // Мелодии включения
switch (num) {
case 0: break;
case 1:
toneAC(523, data.volumeSound, 200);
toneAC(659, data.volumeSound, 200);
toneAC(784, data.volumeSound, 200);
toneAC(1047, data.volumeSound, 500);
soundDelay = 600;
break;
case 2:
toneAC(1175, data.volumeSound, 200);
toneAC(1109, data.volumeSound, 200);
toneAC(1175, data.volumeSound, 200);
toneAC(1109, data.volumeSound, 200);
toneAC(1175, data.volumeSound, 200);
toneAC(880, data.volumeSound, 200);
toneAC(1047, data.volumeSound, 200);
toneAC(932, data.volumeSound, 200);
toneAC(784, data.volumeSound, 500);
soundDelay = 1500;
break;
case 3:
toneAC(659, data.volumeSound, 100);
toneAC(587, data.volumeSound, 100);
toneAC(370, data.volumeSound, 200);
toneAC(415, data.volumeSound, 200);
toneAC(554, data.volumeSound, 100);
toneAC(494, data.volumeSound, 100);
toneAC(294, data.volumeSound, 200);
toneAC(330, data.volumeSound, 200);
toneAC(494, data.volumeSound, 100);
toneAC(440, data.volumeSound, 100);
toneAC(277, data.volumeSound, 200);
toneAC(330, data.volumeSound, 200);
toneAC(440, data.volumeSound, 400);
soundDelay = 1500;
break;
case 4:
toneAC(523, data.volumeSound, 100);
toneAC(466, data.volumeSound, 100);
toneAC(392, data.volumeSound, 200);
toneAC(523, data.volumeSound, 200);
toneAC(349, data.volumeSound, 200);
toneAC(523, data.volumeSound, 200);
toneAC(466, data.volumeSound, 200);
toneAC(523, data.volumeSound, 200);
toneAC(349, data.volumeSound, 400);
delay(400);
toneAC(392, data.volumeSound, 400);
toneAC(392, data.volumeSound, 200);
toneAC(466, data.volumeSound, 200);
toneAC(523, data.volumeSound, 200);
soundDelay = 1500;
break;
case 5:
toneAC(659, data.volumeSound, 200);
toneAC(659, data.volumeSound, 200);
toneAC(659, data.volumeSound, 400);
toneAC(659, data.volumeSound, 200);
toneAC(659, data.volumeSound, 200);
toneAC(659, data.volumeSound, 400);
toneAC(659, data.volumeSound, 200);
toneAC(784, data.volumeSound, 200);
toneAC(523, data.volumeSound, 300);
toneAC(587, data.volumeSound, 100);
toneAC(659, data.volumeSound, 600);
soundDelay = 1500;
break;
case 6:
toneAC(880, data.volumeSound, 200);
toneAC(1175, data.volumeSound, 100);
toneAC(880, data.volumeSound, 100);
toneAC(698, data.volumeSound, 200);
toneAC(880, data.volumeSound, 100);
toneAC(698, data.volumeSound, 100);
toneAC(587, data.volumeSound, 200);
toneAC(698, data.volumeSound, 100);
toneAC(587, data.volumeSound, 100);
toneAC(440, data.volumeSound, 200);
soundDelay = 1200;
break;
case 7:
toneAC(523, data.volumeSound, 150);
toneAC(587, data.volumeSound, 150);
toneAC(622, data.volumeSound, 150);
toneAC(523, data.volumeSound, 150);
toneAC(587, data.volumeSound, 150);
toneAC(622, data.volumeSound, 150);
toneAC(622, data.volumeSound, 150);
toneAC(698, data.volumeSound, 150);
toneAC(784, data.volumeSound, 150);
toneAC(622, data.volumeSound, 150);
toneAC(698, data.volumeSound, 150);
toneAC(784, data.volumeSound, 150);
toneAC(698, data.volumeSound, 150);
toneAC(784, data.volumeSound, 150);
toneAC(831, data.volumeSound, 150);
toneAC(698, data.volumeSound, 150);
toneAC(784, data.volumeSound, 150);
toneAC(831, data.volumeSound, 150);
toneAC(831, data.volumeSound, 150);
toneAC(932, data.volumeSound, 150);
toneAC(1047, data.volumeSound, 150);
toneAC(831, data.volumeSound, 150);
toneAC(932, data.volumeSound, 150);
toneAC(1047, data.volumeSound, 150);
toneAC(1047, data.volumeSound, 450);
toneAC(1047, data.volumeSound, 150);
toneAC(1047, data.volumeSound, 150);
toneAC(1047, data.volumeSound, 150);
toneAC(1047, data.volumeSound, 150);
soundDelay = 1500;
break;
case 8:
toneAC(880, data.volumeSound, 150);
toneAC(784, data.volumeSound, 150);
toneAC(880, data.volumeSound, 1200);
toneAC(784, data.volumeSound, 150);
toneAC(698, data.volumeSound, 150);
toneAC(659, data.volumeSound, 150);
toneAC(587, data.volumeSound, 150);
toneAC(554, data.volumeSound, 300);
toneAC(587, data.volumeSound, 600);
soundDelay = 1500;
break;
case 9:
toneAC(784, data.volumeSound, 450);
toneAC(587, data.volumeSound, 150);
toneAC(784, data.volumeSound, 450);
toneAC(587, data.volumeSound, 150);
toneAC(784, data.volumeSound, 150);
toneAC(587, data.volumeSound, 150);
toneAC(784, data.volumeSound, 150);
toneAC(988, data.volumeSound, 150);
toneAC(1175, data.volumeSound, 450);
soundDelay = 1500;
break;
case 10:
toneAC(277, data.volumeSound, 125);
toneAC(554, data.volumeSound, 125);
toneAC(1109, data.volumeSound, 125);
toneAC(277, data.volumeSound, 125);
toneAC(554, data.volumeSound, 125);
toneAC(1109, data.volumeSound, 125);
toneAC(277, data.volumeSound, 125);
toneAC(554, data.volumeSound, 125);
toneAC(1109, data.volumeSound, 125);
soundDelay = 1000;
break;
}
}
void relaySwitch(uint8_t sensNum) { // Включение и отключение реле вентилятора
float temp;
switch (sensNum) {
case 1: temp = getTempDS(); break;
case 2: temp = getTempDS2(); break;
case 3: temp = getTempDS3(); break;
case 4: temp = getTempDS4(); break;
case 5: temp = getTempDS5(); break;
}
if (temp >= data.relayTempOn) { // при достижении нужной температуры включается реле
if (data.relayType) digitalWrite(RELAY_PIN, LOW);
else digitalWrite(RELAY_PIN, HIGH);
relayFlag = true;
}
if (relayFlag and temp <= data.relayTempOff) { // реле отключается только при снижении температуры ниже значения data.relayTempOff
if (data.relayType) digitalWrite(RELAY_PIN, HIGH);
else digitalWrite(RELAY_PIN, LOW);
relayFlag = false;
}
}
void getSonar(uint8_t sensNum) { // Парктроник
if (digitalRead(SONAR_PIN) == 0) deep = 0;
static uint32_t timing10;
float temp;
switch (sensNum) { // Выбор датчика температуры для коррекции показаний
case 1: temp = getTempDS(); break;
case 2: temp = getTempDS2(); break;
case 3: temp = getTempDS3(); break;
case 4: temp = getTempDS4(); break;
case 5: temp = getTempDS5(); break;
}
oled.clear();
int dist;
if (sensNum == 0) dist = sonar.ping_cm(); // Если не используем датчик температуры для коррекции значений сонара, то сразу вычисляем расстояние до препятствия
else { // иначе...
uint32_t us = sonar.ping(); // получаем значение в мс...
dist = us * (temp * 6 / 10 + 330) / 20000ul; // и вычисляем расстояние с учетом текущей температуры
}
sonarFilter += (dist - sonarFilter) * 0.2; // фильтрация показаний сонара
uint8_t sonarPercent = 0.263 * (sonarFilter - 20); // Расчеты положения иконки авто
uint8_t distPercent = (0.94 * sonarPercent) + 7;
oled.setScale(1);
oled.setCursorXY(21, 0);
switch (data.langInterface) {
case 1: oled.print(F("ДО ПРЕПЯТСТВИЯ")); break;
case 2: oled.print(F(" ДО ПЕРЕШКОДИ ")); break;
case 3: oled.print(F(" DISTANCE ")); break;
}
oled.setCursorXY(110, 34);
oled.print(F("СМ"));
oled.line(0, 45, 127, 45);
oled.rect(0, 49, 5, 63, OLED_FILL);
oled.drawBitmap(distPercent, 49, car, 29, 15); // Иконка авто
oled.setScale(4);
if (sonarFilter < 100) oled.setCursorXY(41, 13);
else oled.setCursorXY(29, 13);
oled.print(sonarFilter, 0); // Расстояние до препятствия
if(sonarFilter < 20) { // Частота писка в зависимости от расстояния до препятствия
red = 0;
green = 0;
blue = 0;
rgbFlag = false;
}
if(sonarFilter >= 20 and sonarFilter < 40) {
toneAC(600, 1, 250, true);
red = 255;
green = 0;
blue = 0;
rgbFlag = true;
}
if(sonarFilter >= 40 and sonarFilter < 70) {
red = 255;
green = 18;
blue = 0;
if (millis() - timing10 >= 100) {
timing10 = millis();
toneAC(600, 1, 100, true);
rgbFlag = !rgbFlag;
}
}
if(sonarFilter >= 70 and sonarFilter < 100) {
red = 255;
green = 40;
blue = 0;
if (millis() - timing10 >= 200) {
timing10 = millis();
toneAC(600, 1, 200, true);
rgbFlag = !rgbFlag;
}
}
if(sonarFilter >= 100 and sonarFilter < 150) {
red = 0;
green = 255;
blue = 0;
if (millis() - timing10 >= 400) {
timing10 = millis();
toneAC(600, 1, 400, true);
rgbFlag = !rgbFlag;
}
}
if(sonarFilter >= 150) {
rgbFlag = false;
red = 0;
green = 0;
blue = 0;
}
oled.update();
}
void color (uint8_t red, uint8_t green, uint8_t blue) { // Создание цвета для RGB-светодиода
analogWrite(RED_PIN, red);
analogWrite(GREEN_PIN, green);
analogWrite(BLUE_PIN, blue);
}
void getAcceleration() { // ЗАМЕР РАЗГОНА
static uint32_t startTime; // Время начала замера
static uint32_t finishTime; // Время окончания замера
static float timeAcceleration; // Время разгона
static bool flagAcceleration = false; // Флаг
static uint32_t counter1 = 0; // Счетчик для начала замера
static uint32_t counter2 = 0; // Счетчик для окончания замера
static uint8_t maxSpeed = 0; // Макс скорость за всё время замера
static uint8_t speedLimit = 100; // До какой скорости считаем время разгона
static uint16_t curImpulseCount = counterSpeedSensor; // Текущее значение насчитанных импульсов с датчика скорости
if (joy_F.click() or joy_F.holding()) speedLimit += 1; // Кнопкой F увеличиваем скорость
if (joy_B.click() or joy_B.holding()) speedLimit -= 1; // Кнопкой B уменьшаем скорость
if (joy_M.click()) { // Кнопкой M обнуляем предыдущие показания разгона и снова запоминаем текущее кол-во насчитанных импульсов с датчика скорости
counter1 = 0;
counter2 = 0;
curImpulseCount = counterSpeedSensor;
maxSpeed = 0;
startTime = 0;
finishTime = 0;
}
oled.clear();
if (tacho.getRPM() / sensorPulseCoef > maxSpeed) maxSpeed = tacho.getRPM() / sensorPulseCoef; // Постоянно заносим в переменную maxSpeed макс достигнутую скорость за время разгона
if (curImpulseCount != counterSpeedSensor) counter1 += 1; // ЗАПУСК СЕКУНДОМЕРА ПО ПЕРВОМУ ИМПУЛЬСУ ДАТЧИКА СКОРОСТИ
if (counter1 == 1) {
startTime = millis(); // когда импульс получен, заносим в переменную start время начала разгона...
flagAcceleration = true; // и поднимаем флаг
}
if (maxSpeed >= speedLimit and tacho.getRPM() / sensorPulseCoef >= speedLimit) { // если макс. скорость больше или равна лимиту скорости (т.е. достигли лимита) и текущая скорость больше или равна лимиту скорости (т.е. скорость пока ещё равна или больше лимита скорости),
counter2 += 1; // то активируем счетчик2...
if (counter2 == 1) { //
finishTime = millis(); // заносим в переменную finish время окончания разгона...
flagAcceleration = false; // и опускаем флаг
}
}
if (flagAcceleration) { // пока флаг поднят - пишем на экране слово "замер"
oled.setCursorXY(31, 30); // остальные показания убираем с экрана для уменьшения погрешности измерения
oled.setScale(1);
switch (data.langInterface) {
case 1: oled.print(F(" замер ")); break;
case 2: oled.print(F(" замiр ")); break;
case 3: oled.print(F("measurement")); break;
}
}
if (!flagAcceleration) { // когда флаг опущен
timeAcceleration = (finishTime - startTime) / 1000.0; // Вычисляем время разгона
oled.line(0, 25, 127, 25); // и пишем на экране различную инфо
oled.line(0, 53, 127, 53);
oled.setScale(1);
oled.setCursorXY(0, 28);
switch (data.langInterface) {
case 1: oled.print(F("ВРЕМЯ")); break;
case 2: oled.print(F("ЧАС")); break;
case 3: oled.print(F("ACCELER")); break;
}
oled.setCursorXY(0, 36);
switch (data.langInterface) {
case 1: oled.print(F("РАЗГОНА")); break;
case 2: oled.print(F("РОЗГОНУ")); break;
case 3: oled.print(F("TIME")); break;
}
oled.setCursorXY(0, 44);
oled.print(F("0 -"));
oled.setCursorXY(24, 44);
oled.print(speedLimit);
oled.setScale(2);
oled.line(45, 26, 45, 52);
oled.setCursorXY(50, 33);
oled.print(timeAcceleration, 1);
oled.setScale(1);
oled.setCursorXY(110, 41);
switch (data.langInterface) {
case 1:
case 2: oled.print(F("СЕК")); break;
case 3: oled.print(F("SEC")); break;
}
oled.setScale(1);
oled.rect(77, 0, 127, 10, OLED_FILL);
oled.textMode(1);
oled.setCursorXY(79, 2);
oled.print(speedLimit);
oled.setCursorXY(103, 2);
switch (data.langInterface) {
case 1: oled.print(F("КМ/Ч")); break;
case 2: oled.print(F("КМ/Г")); break;
case 3: oled.print(F("KM/H")); break;
}
oled.textMode(0);
oled.drawBitmap(0, 56, accelerationBtn, 128, 8); // обозначение кнопок
}
oled.setCursorXY(0, 0);
oled.setScale(3);
static uint32_t timerSpeedSensor;
if (millis() - timerSpeedSensor > 100) {
timerSpeedSensor = millis();
oled.print(tacho.getRPM() / sensorPulseCoef); // текущая скорость отображается всегда
}
oled.update();
}
void createRectForClock(uint8_t x, uint8_t y, uint8_t n) { // функция, которая создает сегменты для часов на скрине 10
uint8_t shift;
if (n == 2 or n == 3) shift = 6;
else shift = 0;
oled.rect(n * 32 + shift + (x * 9), 0 + (y * 10), n * 32 + shift + 7 + (x * 9), 0 + 8 + (y * 10), OLED_FILL);
}
void zeroForClock(uint8_t rank) { // 0 для часов на скрине 10
createRectForClock(0, 0, rank);
createRectForClock(1, 0, rank);
createRectForClock(2, 0, rank);
createRectForClock(0, 1, rank);
createRectForClock(2, 1, rank);
createRectForClock(0, 2, rank);
createRectForClock(2, 2, rank);
createRectForClock(0, 3, rank);
createRectForClock(2, 3, rank);
createRectForClock(0, 4, rank);
createRectForClock(1, 4, rank);
createRectForClock(2, 4, rank);
}
void oneForClock(uint8_t rank) { // 1 для часов на скрине 10
createRectForClock(0, 0, rank);
createRectForClock(1, 0, rank);
createRectForClock(1, 1, rank);
createRectForClock(1, 2, rank);
createRectForClock(1, 3, rank);
createRectForClock(0, 4, rank);
createRectForClock(1, 4, rank);
createRectForClock(2, 4, rank);
}
void twoForClock(uint8_t rank) { // 2 для часов на скрине 10
createRectForClock(0, 0, rank);
createRectForClock(1, 0, rank);
createRectForClock(2, 0, rank);
createRectForClock(2, 1, rank);
createRectForClock(0, 2, rank);
createRectForClock(1, 2, rank);
createRectForClock(2, 2, rank);
createRectForClock(0, 3, rank);
createRectForClock(0, 4, rank);
createRectForClock(1, 4, rank);
createRectForClock(2, 4, rank);
}
void threeForClock(uint8_t rank) { // 3 для часов на скрине 10
createRectForClock(0, 0, rank);
createRectForClock(1, 0, rank);
createRectForClock(2, 0, rank);
createRectForClock(2, 1, rank);
createRectForClock(0, 2, rank);
createRectForClock(1, 2, rank);
createRectForClock(2, 2, rank);
createRectForClock(2, 3, rank);
createRectForClock(0, 4, rank);
createRectForClock(1, 4, rank);
createRectForClock(2, 4, rank);
}
void fourForClock(uint8_t rank) { // 4 для часов на скрине 10
createRectForClock(0, 0, rank);
createRectForClock(2, 0, rank);
createRectForClock(0, 1, rank);
createRectForClock(2, 1, rank);
createRectForClock(0, 2, rank);
createRectForClock(1, 2, rank);
createRectForClock(2, 2, rank);
createRectForClock(2, 3, rank);
createRectForClock(2, 4, rank);
}
void fiveForClock(uint8_t rank) { // 5 для часов на скрине 10
createRectForClock(0, 0, rank);
createRectForClock(1, 0, rank);
createRectForClock(2, 0, rank);
createRectForClock(0, 1, rank);
createRectForClock(0, 2, rank);
createRectForClock(1, 2, rank);
createRectForClock(2, 2, rank);
createRectForClock(2, 3, rank);
createRectForClock(0, 4, rank);
createRectForClock(1, 4, rank);
createRectForClock(2, 4, rank);
}
void sixForClock(uint8_t rank) { // 6 для часов на скрине 10
createRectForClock(0, 0, rank);
createRectForClock(1, 0, rank);
createRectForClock(2, 0, rank);
createRectForClock(0, 1, rank);
createRectForClock(0, 2, rank);
createRectForClock(1, 2, rank);
createRectForClock(2, 2, rank);
createRectForClock(0, 3, rank);
createRectForClock(2, 3, rank);
createRectForClock(0, 4, rank);
createRectForClock(1, 4, rank);
createRectForClock(2, 4, rank);
}
void sevenForClock(uint8_t rank) { // 7 для часов на скрине 10
createRectForClock(0, 0, rank);
createRectForClock(1, 0, rank);
createRectForClock(2, 0, rank);
createRectForClock(2, 1, rank);
createRectForClock(2, 2, rank);
createRectForClock(2, 3, rank);
createRectForClock(2, 4, rank);
}
void eightForClock(uint8_t rank) { // 8 для часов на скрине 10
createRectForClock(0, 0, rank);
createRectForClock(1, 0, rank);
createRectForClock(2, 0, rank);
createRectForClock(0, 1, rank);
createRectForClock(2, 1, rank);
createRectForClock(0, 2, rank);
createRectForClock(1, 2, rank);
createRectForClock(2, 2, rank);
createRectForClock(0, 3, rank);
createRectForClock(2, 3, rank);
createRectForClock(0, 4, rank);
createRectForClock(1, 4, rank);
createRectForClock(2, 4, rank);
}
void nineForClock(uint8_t rank) { // 9 для часов на скрине 10
createRectForClock(0, 0, rank);
createRectForClock(1, 0, rank);
createRectForClock(2, 0, rank);
createRectForClock(0, 1, rank);
createRectForClock(2, 1, rank);
createRectForClock(0, 2, rank);
createRectForClock(1, 2, rank);
createRectForClock(2, 2, rank);
createRectForClock(2, 3, rank);
createRectForClock(0, 4, rank);
createRectForClock(1, 4, rank);
createRectForClock(2, 4, rank);
}
void stopwatch() { // СЕКУНДОМЕР И ТАЙМЕР
static uint32_t startTime; // Время начала замера секундомера кнопкой ОК
static uint32_t stopTime; // Время окончания замера секундомера кнопкой ОК
static uint32_t startTimer; // Время начала замера таймера кнопкой UP (удержание)
static uint32_t stopTimer; // Время окончания замера таймера кнопкой UP (удержание)
static uint32_t time = 0; // Время секундомера, отображаемое на дисплее крупными цифрами
static uint32_t timeMemory = 0; // Время секундомера запоминаемое (необходимо если используем паузы)
static uint32_t timeLap = 0; // Время круга для цикличного секундомера
static uint32_t timeLastLap = 0; // Общее время последнего круга без учета пауз для цикличного секундомера (если круг ещё не зафиксирован)
static uint32_t pauseTimeStart = 0; // Время начала паузы
static uint32_t pauseTimeFinish = 0; // Время окончания паузы
static uint32_t pauseTime = 0; // Общее время паузы
static bool flagStopwatch = false; // Флаг работы секундомера
static bool flagTimer = false; // Флаг работы таймера
static bool flagBell = false; // Флаг отображения колокольчика
static bool flagBellBlink = false; // Флаг мигания колокольчика
static bool flagPressDown = false; // Флаг нажатия на кнопку DOWN
static uint32_t timer = 0; // Время таймера
const uint8_t numArr = 5; // Размер массива цикличного секундомера
static uint32_t timeArr[numArr]; // Сам массив цикличного секундомера
static int8_t readIndex = 4; // Индекс последнего значения цикличного секундомера в массиве
static uint32_t total = 0; // Сумма всех значений массива
static int16_t counterArr; // Счетчик активной ячейки массива цикличного секундомера
static uint8_t counterTimer = 0; // Счетчик выбранного разряда таймера
uint32_t cykleTimeMs; // Миллисекунды для цикличного секундомера
uint32_t lapTimeMs; // Миллисекунды для времени круга
if (joy_M.click()) { // нажатие кнопки ОК запускает/останавливает секундомер
flagStopwatch = !flagStopwatch; // меняем значение флага
if (flagStopwatch) { // если флаг поднят...
startTime = millis(); // запоминаем время запуска секундомера
if (pauseTimeStart == 0) timeLap = millis(); // при первом нажатии запоминаем время millis заодно и для цикличного секундомера
else { // если в памяти есть время начала паузы и оно не равно 0...
pauseTimeFinish = millis(); // запоминаем время окончания паузы
pauseTime += (pauseTimeFinish - pauseTimeStart); // вычисляем длительность всех пауз
}
}
else { // если флаг опущен...
stopTime = millis(); // запоминаем время остановки секундомера
timeMemory += stopTime - startTime; // общее время работы секундомера до сброса постоянно запоминаем в отдельную переменную
timeLastLap = millis() - timeLap; // тут запомнили время последнего круга до нажатия на паузу
pauseTimeStart = millis(); // запоминаем время начала текущей паузы
}
}
if (joy_B.click() and flagStopwatch) { // нажатие кнопки DOWN запоминает время круга и выводит его на дисплей
total -= timeArr[readIndex]; // вычитаем последнее значение из массива цикличного секундомера
timeArr[readIndex] = millis() - timeLap - pauseTime; // заносим новое значение в массив...
timeLap = millis(); // запоминаем время начала последнего круга
counterArr = readIndex; // счетчику присваиваем значение текущего элемента массива
total += timeArr[readIndex]; // прибавляем новое значение к массиву
readIndex -= 1; // переставляем индекс массива
if (readIndex < 0) readIndex = 4; // проверка, если перескочили индекс, то начинаем с начала (по кругу)
pauseTime = 0; // обнуляем время всех пауз
flagPressDown = true; // поднимаем флаг, если было хоть одно нажатие кнопки
}
if (joy_M.hold() or joy_B.hold()) { // Удержанием кнопки ОК или B сбрасываем все значения на стандартные
startTime = 0;
stopTime = 0;
time = 0;
timeMemory = 0;
timeLap = 0;
timeLastLap = 0;
pauseTimeStart = 0;
pauseTimeFinish = 0;
pauseTime = 0;
flagStopwatch = false;
readIndex = 4;
total = 0;
flagPressDown = false;
lapTimeMs = 0;
cykleTimeMs = 0;
for (int i = 0; i < 6; i++) {
timeArr[i] = 0;
}
startTimer = 0;
stopTimer = 0;
flagTimer = false;
timer = 0;
counterTimer = 0;
flagBellBlink = false;
flagBell = false;
rgbFlag = false;
}
if (joy_F.click() and !flagTimer and flagBell) { // Кнопкой Up (только по окончании таймера) отключаем колокольчик и RGB-светодиод
rgbFlag = false;
flagBellBlink = false;
flagBell = false;
} else if (joy_F.click() and !flagTimer) { // либо (если колокольчик не был активен) выбираем разряд таймера для настройки
if (counterTimer == 2) counterTimer = 0;
else counterTimer++;
}
switch (counterTimer) {
case 0: // секунды
if (joy_R.click() or joy_R.holding()) timer += 1000; // Кнопкой Right увеличиваем значение таймера
if (joy_L.click() or joy_L.holding()) timer -= 1000; // Кнопкой Left уменьшаем значение таймера
break;
case 1: // минуты
if (joy_R.click() or joy_R.holding()) timer += 60000; // Кнопкой Right увеличиваем значение таймера
if (joy_L.click() or joy_L.holding()) timer -= 60000; // Кнопкой Left уменьшаем значение таймера
break;
case 2: // часы
if (joy_R.click() or joy_R.holding()) timer += 3600000; // Кнопкой Right увеличиваем значение таймера
if (joy_L.click() or joy_L.holding()) timer -= 3600000; // Кнопкой Left уменьшаем значение таймера
break;
}
if (joy_R.click() or joy_R.holding() or joy_L.click() or joy_L.holding()) { // также если нажали одну из этих кнопок, то...
rgbFlag = false; // отключаем колокольчик и RGB-светодиод, если они были активны
flagBellBlink = false;
flagBell = false;
}
if (timer > 35999000 or timer < 0) timer = 0; // условие, чтобы таймер не перескочил больше 10 часов или меньше 0
if (joy_F.hold()) { // Удержанием кнопки Up запускаем обратный отсчет (таймер)
flagTimer = !flagTimer;
if (flagTimer) {
startTimer = millis();
stopTimer = millis() + timer;
flagBell = true; // активируем колокольчик, чтобы по окончании таймера он начал мигать
} else { // Повторное нажатие кнопки обнуляет и сбрасывает таймер...
startTimer = 0;
stopTimer = 0;
timer = 0;
rgbFlag = false;
flagBellBlink = false; // а также отключается колокольчик
flagBell = false;
}
}
oled.clear(); // очищаем дисплей
static uint32_t upd;
if (millis() - upd > 100) { // обновляем инфо на дисплее каждые 100мс
upd = millis();
if (flagStopwatch) time = (millis() - startTime + timeMemory); // пока флаг поднят, постоянно обновляем общее время секундомера
else time = timeMemory; // когда флаг опущен, время секундомера ставится на паузу и не обновляется
oled.setScale(2); // и рисуем основной секундомер на дисплее
oled.setCursorXY(0, 0);
oled.print(getHours(time));
oled.setCursorXY(18, 0);
if (getMinutes(time) < 10) {
oled.print(0);
oled.setCursorXY(30, 0);
}
oled.print(getMinutes(time));
oled.setCursorXY(48, 0);
if (getSeconds(time) < 10) {
oled.print(0);
oled.setCursorXY(60, 0);
}
oled.print(getSeconds(time));
oled.setCursorXY(78, 0);
oled.print(getMilliseconds(time));
oled.setScale(1);
for (int i = 0; i < 3; i++) {
oled.setCursorXY(i * 30 + 12, 3);
oled.print(F(":"));
}
oled.setScale(1);
for (int8_t i = 0; i < 5; i++) {
oled.setCursorXY(0, i * 9 + 20);
if (counterArr + i > 4) cykleTimeMs = timeArr[counterArr + i - 5]; // запоминаем значения цикличного секундомера
else cykleTimeMs = timeArr[counterArr + i];
oled.setCursorXY(0, i * 9 + 20); // и рисуем цикличный секундомер на дисплее
oled.print(getHours(cykleTimeMs));
oled.setCursorXY(11, i * 9 + 20);
if (getMinutes(cykleTimeMs) < 10) {
oled.print(0);
oled.setCursorXY(17, i * 9 + 20);
}
oled.print(getMinutes(cykleTimeMs));
oled.setCursorXY(28, i * 9 + 20);
if (getSeconds(cykleTimeMs) < 10) {
oled.print(0);
oled.setCursorXY(34, i * 9 + 20);
}
oled.print(getSeconds(cykleTimeMs));
oled.setCursorXY(45, i * 9 + 20);
oled.print(getMilliseconds(cykleTimeMs));
for (int n = 0; n < 3; n++) {
oled.setCursorXY(n * 17 + 6, i * 9 + 20);
oled.print(F("."));
}
}
if (flagPressDown and !flagStopwatch) lapTimeMs = timeLastLap - pauseTime; // запоминаем значение времени круга
else if (flagPressDown) lapTimeMs = millis() - timeLap - pauseTime;
oled.setCursorXY(63, 30); // и рисуем секундомер последнего круга на дисплее
oled.print(getHours(lapTimeMs));
oled.setCursorXY(74, 30);
if (getMinutes(lapTimeMs) < 10) {
oled.print(0);
oled.setCursorXY(80, 30);
}
oled.print(getMinutes(lapTimeMs));
oled.setCursorXY(91, 30);
if (getSeconds(lapTimeMs) < 10) {
oled.print(0);
oled.setCursorXY(97, 30);
}
oled.print(getSeconds(lapTimeMs));
oled.setCursorXY(108, 30);
oled.print(getMilliseconds(lapTimeMs));
for (int n = 0; n < 3; n++) {
oled.setCursorXY(n * 17 + 69, 30);
oled.print(F("."));
}
oled.setCursorXY(63, 20); // надпись "ВРЕМЯ КРУГА"
switch (data.langInterface) {
case 1: oled.print(F("ВРЕМЯ КРУГА")); break;
case 2: oled.print(F("ЧАС КОЛА")); break;
case 3: oled.print(F("LAP TIME")); break;
}
oled.line(0, 17, 127, 17); // линии
oled.line(58, 18, 58, 63);
oled.line(59, 41, 127, 41);
if (timer <= 0) { // Когда таймер дошел до нуля - останавливаем его и обнуляем все переменные
flagTimer = false;
startTimer = 0;
stopTimer = 0;
timer = 0;
}
if (flagTimer) timer = stopTimer - millis(); // Пока поднят флаг - идет отсчет таймера
if (!flagTimer and counterTimer == 2) { // и рисуем таймер на дисплее
oled.textMode(1);
oled.rect(62, 55, 68, 63, OLED_FILL);
}
oled.setCursorXY(63, 56);
oled.print(getHours(timer));
oled.textMode(0);
if (!flagTimer and counterTimer == 1) {
oled.textMode(1);
oled.rect(73, 55, 85, 63, OLED_FILL);
}
oled.setCursorXY(74, 56);
if (getMinutes(timer) < 10) {
oled.print(0);
oled.setCursorXY(80, 56);
}
oled.print(getMinutes(timer));
oled.textMode(0);
if (!flagTimer and counterTimer == 0) {
oled.textMode(1);
oled.rect(90, 55, 102, 63, OLED_FILL);
}
oled.setCursorXY(91, 56);
if (getSeconds(timer) < 10) {
oled.print(0);
oled.setCursorXY(97, 56);
}
oled.print(getSeconds(timer));
oled.textMode(0);
oled.setCursorXY(108, 56);
oled.print(getMilliseconds(timer));
for (int n = 0; n < 3; n++) {
oled.setCursorXY(n * 17 + 69, 56);
oled.print(F("."));
}
oled.setCursorXY(63, 46); // надпись на дисплее "таймер"
switch (data.langInterface) {
case 1:
case 2: oled.print(F("ТАЙМЕР")); break;
case 3: oled.print(F("TIMER")); break;
}
if (flagBell and timer == 0) { // если таймер дошел до нуля...
static uint32_t bellBlink;
if (millis() - bellBlink >= 1000) {
bellBlink = millis();
flagBellBlink = !flagBellBlink; // начинаем мигать колькольчиком раз в секунду...
if (flagBellBlink) {red = 255; green = 0; blue = 0; // если есть RGB-светодиод, то мигаем им тоже...
toneAC(784, data.volumeSound, 150); // если есть зуммер, то он будет постоянно издавать звук
toneAC(784, data.volumeSound, 150);
toneAC(784, data.volumeSound, 150);
}
else {red = 255; green = 20; blue = 0;}
rgbFlag = true;
}
}
if (flagBellBlink) { // сам колокольчик
oled.drawBitmap(120, 46, bell, 7, 10); // иконка колокольчика (почему-то здесь в симуляторе работает некорректно)
}
if (pauseTimeStart != 0 and !flagStopwatch) { // отображаем на дисплее символ паузы, если она активна
oled.roundRect(106, 0, 127, 14, OLED_STROKE);
oled.rect(113, 3, 115, 11, OLED_FILL);
oled.rect(118, 3, 120, 11, OLED_FILL);
}
}
oled.update(); // обновить дисплей
}
uint16_t getMilliseconds(uint32_t ms) { // получить миллисекунды
uint16_t milliseconds = (ms % 1000) / 100;
return milliseconds;
}
uint16_t getSeconds(uint32_t ms) { // получить секунды
uint16_t seconds = (ms / 1000LL) % 60;
return seconds;
}
uint16_t getMinutes(uint32_t ms) { // получить минуты
uint16_t minutes = (ms / (1000LL * 60)) % 60;
return minutes;
}
uint16_t getHours(uint32_t ms) { // получить часы
uint16_t hours = ms / (1000LL * 60 * 60);
return hours;
}