ЦПК ДИСПЛЕЙ ПАРАМЕТРІВ ДЛЯ ПОВЕРПАКУ CATERPILLAR

Доброго дня, дорогі друзі! Сьогодні я хотів би поділитися з вами своїм останнім проектом – монітором CAN J1939 для суднової силової установки на базі двигуна Caterpillar 3512B, встановленої в 40-футовому контейнері. Монітор встановлений в машинному відділенні, довжина кабелю до силового блоку 60 метрів. Я також створив і підключив другий пристрій, який дозволяє здійснювати дистанційний незалежний контроль рівня палива в баку, який встановлений в тому ж контейнері, біля двигуна CAT.

Нажаль, у мене немає часу на пояснення всього процесу розробки. Якщо у вас є питання або ви не розумієте деякі частини коду, ви можете спитати мене за електронною поштою.

План робіт, відео, фотографії та вихідний код нижче.

ЕТАПИ РОБОТИ:

  1. Визначення можливості підключення до шини для передачі робочих параметрів D/G датчиків (RS-232, RS-485, CAN, Інше).
  2. Замовляю обладнання, якого не вистачає.
  3. Встановлення необхідного обладнання, підключення до шини передачі даних.
  4. Зчитування системних кодів для аналізу необхідних параметрів.
  5. Написання програми для модуля моніторингу та управління.
  6. Підключення готового пристрою (F/D) “на місці”, тестування.
  7. Прокладання сигнального кабелю в машинне відділення.
  8. Підключення F/D в машинному відділенні.
  9. Перевірка роботи F/D “на відстані”, усунення можливих неполадок і електричних перешкод.
  10. Встановлення дисплея в центральну панель управління.
  11. Остання перевірка.
  12. Передача обладнання.

Список необхідного обладнання:
Дисплей TFT 3.5′ 480×320 px.
Плати керування на мікроконтролерах ATmega2560 та ATmega328P (Arduino)
Перетворювач інтерфейсу CAN/SPI
Екранований кабель
Адаптер живлення для плати управління 12V / 0.5A – 1 шт.

У вихідному коді можуть бути помилки та недоліки. Не судіть строго! Робота триває.

КОРОТКЕ ВІДЕО

ПРОГРАМНИЙ КОД ПРИСТРОЮ КОНТРОЛЯ РОБОЧИХ ПАРАМЕТРІВ

//////////////////////////////////////////////////////////////
///////////////  Caterpillar Can-Bus Monitor   ///////////////
///////////////         Protocol: J1939        ///////////////
///////////////  Engine Model: GEN-SET 3512B   ///////////////
///////////////    Oleksandr Cheban-Lianka     ///////////////
///////////////      www.chebanlianka.com      ///////////////
///////////////   oleksandr@chebanlianka.com   ///////////////
//////////////////////////////////////////////////////////////

#include <SPI.h>
#include <MCUFRIEND_kbv.h>
#include "Adafruit_GFX.h"
#include <mcp2515.h>
#include <can.h>
#include <lib.h>
#define LCD_RD A0
#define LCD_WR A1
#define LCD_CD A2
#define LCD_CS A3
#define LCD_RESET A4
#define BME_CS 10
#define BME_MOSI 11
#define BME_MISO 12
#define BME_SCK 13

// Назначаем цвета

#define BLACK 0x0000
#define NAVY 0x000F
#define DARKGREEN 0x03E0
#define DARKCYAN 0x03EF
#define MAROON 0x7800
#define PURPLE 0x780F
#define OLIVE 0x7BE0
#define LIGHTGREY 0xC618
#define DARKGREY 0x7BEF
#define GREEN 0x07E0
#define CYAN 0x07FF
#define RED 0xF800
#define MAGENTA 0xF81F
#define YELLOW 0xFFE0
#define WHITE 0xFFFF
#define ORANGE 0xFD20
#define GREENYELLOW 0xAFE5
#define PINK 0xF81F
#define BGRD 0x686400
//#define BLUE 0x001F
#define BLUE 0x0000FF
#define DBLUE 0x006F
#define GREY 0xC618
#define DGREY 0x7BEF

// Устанавливаем модули

MCUFRIEND_kbv tft;
MCP2515 mcp2515(10);

// Устанавливаем глобальные переменные

boolean buzzerEnabled = false; // Для Бузера
boolean resetButton = true;

boolean singleNodataSwitch = true;

boolean commonInAlarm = false;
boolean commonInNormal = false;
boolean commonStatus = true;

boolean leakageInAlarm = false;
boolean leakageInNormal = false;
boolean leakageStatus = true;

boolean ventInAlarm = false;
boolean ventInNormal = false;
boolean ventStatus = true;

boolean folowInAlarm = false;
boolean folowInNormal = false;
boolean folowStatus = true;

boolean fohighInAlarm = false;
boolean fohighInNormal = false;
boolean fohighStatus = true;

int canid;
int data[8];

uint32_t pgnID = 0;
uint32_t nodataDelayTimer;
//uint32_t delayTimer500;
//uint32_t delayTimer1000;

const int SPI_CS_PIN = 10;
const int INT_PIN = 2;

struct can_frame canMsg;

static const uint8_t logoblack[] PROGMEM = {
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x01, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xf0, 0x00, 0x01, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xf0, 0x00, 0x03, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xf8, 0x00, 0x03, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0xfc, 0x00, 0x07, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0xfc, 0x00, 0x07, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0xfe, 0x00, 0x0f, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xff, 0x00, 0x1f, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0xff, 0x80, 0x1f, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xff, 0x80, 0x3f, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0xff, 0xc0, 0x3f, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xff, 0xe0, 0x7f, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x01, 0x80, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x03, 0xe0, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x0f, 0xe0, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x3f, 0xf8, 0x00, 0x00,
  0x00, 0x00, 0x10, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0xff, 0xf8, 0x00, 0x00,
  0x00, 0x00, 0x3c, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x83, 0xff, 0xfc, 0x00, 0x00,
  0x00, 0x00, 0x7f, 0x80, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, 0x00, 0x00,
  0x00, 0x00, 0xff, 0xe0, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00,
  0x00, 0x01, 0xff, 0xf8, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00,
  0x00, 0x01, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00,
  0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00,
  0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00,
  0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x2b, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00,
  0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00,
  0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00,
  0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00,
  0x00, 0x1f, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xfe, 0x00, 0x00,
  0x00, 0x0f, 0xff, 0xff, 0xff, 0xf8, 0x40, 0x01, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xfc, 0x00, 0x00,
  0x00, 0x07, 0xff, 0xff, 0xff, 0xe0, 0xf1, 0xe3, 0xc7, 0x87, 0x87, 0xff, 0xff, 0xfc, 0x00, 0x00,
  0x00, 0x03, 0xff, 0xff, 0xff, 0xc0, 0xe1, 0xe3, 0xc3, 0xc7, 0x83, 0xff, 0xff, 0xf8, 0x00, 0x00,
  0x00, 0x03, 0xff, 0xff, 0xff, 0x81, 0xf1, 0xe3, 0xc7, 0x87, 0x81, 0xff, 0xff, 0xf8, 0x00, 0x00,
  0x00, 0x01, 0xff, 0xff, 0xfe, 0x00, 0xe1, 0xe3, 0xc3, 0x87, 0x80, 0x7f, 0xff, 0xf0, 0x00, 0x00,
  0x00, 0x00, 0xff, 0xff, 0xfc, 0x00, 0xf1, 0xe3, 0xc7, 0x87, 0x80, 0x3f, 0xff, 0xe0, 0x00, 0x00,
  0x00, 0x00, 0x7f, 0xff, 0xf8, 0x00, 0xe1, 0xe3, 0xc3, 0x87, 0x80, 0x1f, 0xff, 0xf0, 0x00, 0x00,
  0x00, 0x00, 0x7f, 0xff, 0xf0, 0x01, 0xe1, 0xc3, 0x87, 0xc7, 0x80, 0x0f, 0xff, 0xf0, 0x00, 0x00,
  0x00, 0x00, 0x3f, 0xff, 0xf0, 0x00, 0xa0, 0xa0, 0x82, 0x81, 0x00, 0x0f, 0xff, 0xf8, 0x00, 0x00,
  0x00, 0x00, 0x1f, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xf8, 0x00, 0x00,
  0x00, 0x00, 0x3f, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xfc, 0x00, 0x00,
  0x00, 0x00, 0x3f, 0xff, 0x80, 0x0a, 0xad, 0xaa, 0xaa, 0xaa, 0xa0, 0x01, 0xff, 0xff, 0xd4, 0x00,
  0x00, 0x00, 0x3f, 0xff, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x01, 0xff, 0xff, 0xff, 0xf8,
  0x00, 0x00, 0x7f, 0xff, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0xff, 0xff, 0xff, 0xf8,
  0x00, 0x00, 0x7f, 0xfe, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x7f, 0xff, 0xff, 0xfc,
  0x00, 0x00, 0x7f, 0xfe, 0x00, 0x1d, 0x24, 0x49, 0x29, 0x24, 0xf8, 0x10, 0x7f, 0xff, 0xff, 0xfc,
  0x00, 0x01, 0xff, 0xfc, 0xff, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x78, 0xff, 0x3f, 0xff, 0xff, 0xfc,
  0x00, 0x1f, 0xff, 0xfc, 0xff, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x78, 0xfe, 0x3f, 0xff, 0xff, 0xfc,
  0x05, 0xff, 0xff, 0xf8, 0xff, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x79, 0xff, 0x1f, 0xff, 0xff, 0xfe,
  0x3f, 0xff, 0xff, 0xf8, 0xfd, 0x3c, 0x00, 0x00, 0x00, 0x40, 0x78, 0x54, 0x1f, 0xff, 0xff, 0xfe,
  0x7f, 0xff, 0xff, 0xf8, 0x00, 0x1e, 0x00, 0x00, 0x01, 0xf0, 0x78, 0x00, 0x0f, 0xff, 0xff, 0xfe,
  0x7f, 0xff, 0xff, 0xf0, 0x00, 0x3c, 0x00, 0x00, 0x03, 0xf0, 0x78, 0x00, 0x0f, 0xff, 0xff, 0xfe,
  0x7f, 0xff, 0xff, 0xf0, 0x00, 0x1c, 0x00, 0x00, 0x03, 0xf8, 0x78, 0x00, 0x0f, 0xff, 0xff, 0xfe,
  0x7f, 0xff, 0xff, 0xf0, 0xaa, 0x3c, 0x00, 0x00, 0x07, 0xf8, 0x78, 0xb6, 0x0f, 0xff, 0xff, 0xff,
  0x7f, 0xff, 0xff, 0xe0, 0xff, 0x3c, 0x00, 0x00, 0x03, 0xf8, 0x78, 0xff, 0x07, 0xff, 0xff, 0xff,
  0x7f, 0xff, 0xff, 0xe0, 0xff, 0x1c, 0x00, 0x00, 0x01, 0xf0, 0x78, 0xfe, 0x07, 0xff, 0xff, 0xff,
  0xff, 0xff, 0xff, 0xe0, 0xff, 0x3e, 0x00, 0x00, 0x00, 0xc0, 0x78, 0xff, 0x07, 0xff, 0xff, 0xfe,
  0xff, 0xff, 0xff, 0xe0, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x07, 0xff, 0xff, 0xf8,
  0xff, 0xff, 0xff, 0xe0, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x07, 0xff, 0xff, 0xe0,
  0xff, 0xff, 0xff, 0xc0, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x07, 0xff, 0xff, 0x80,
  0xff, 0xff, 0xff, 0xe0, 0xb5, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x78, 0x48, 0x03, 0xff, 0xfc, 0x00,
  0xff, 0xff, 0xff, 0xc0, 0xff, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x78, 0xff, 0x07, 0xff, 0xf4, 0x00,
  0xff, 0xff, 0xff, 0xe0, 0xff, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x78, 0xfe, 0x03, 0xff, 0xe0, 0x00,
  0x1f, 0xff, 0xff, 0xc0, 0xfe, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x70, 0xff, 0x07, 0xff, 0xe0, 0x00,
  0x07, 0xff, 0xff, 0xe0, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x78, 0xaa, 0x03, 0xff, 0xe0, 0x00,
  0x00, 0xff, 0xff, 0xe0, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x07, 0xff, 0xc0, 0x00,
  0x00, 0x1f, 0xff, 0xc0, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x03, 0xff, 0xe0, 0x00,
  0x00, 0x07, 0xff, 0xe0, 0x24, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x07, 0xff, 0xc0, 0x00,
  0x00, 0x03, 0xff, 0xe0, 0xff, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x78, 0xff, 0x07, 0xff, 0xe0, 0x00,
  0x00, 0x03, 0xff, 0xe0, 0xff, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x78, 0xfe, 0x07, 0xff, 0xe0, 0x00,
  0x00, 0x03, 0xff, 0xe0, 0xff, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x78, 0xff, 0x07, 0xff, 0xf0, 0x00,
  0x00, 0x01, 0xff, 0xf0, 0xaa, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x78, 0xfa, 0x07, 0xff, 0xfc, 0x00,
  0x00, 0x03, 0xff, 0xf0, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x68, 0x00, 0x0f, 0xff, 0xfe, 0x00,
  0x00, 0x01, 0xff, 0xf0, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x0f, 0xff, 0xff, 0x80,
  0x00, 0x01, 0xff, 0xf0, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x0f, 0xff, 0xff, 0x80,
  0x00, 0x01, 0xff, 0xf8, 0xaa, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x78, 0xf6, 0x1f, 0xff, 0xff, 0xe0,
  0x00, 0x01, 0xff, 0xf8, 0xff, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x78, 0xff, 0x1f, 0xff, 0xff, 0xf8,
  0x00, 0x03, 0xff, 0xf8, 0xff, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x78, 0xfe, 0x1f, 0xff, 0xff, 0xfc,
  0x00, 0x07, 0xff, 0xfc, 0xff, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x78, 0xfe, 0x3f, 0xff, 0xff, 0xfc,
  0x00, 0x1f, 0xff, 0xfe, 0x00, 0x1c, 0x40, 0x00, 0x00, 0x00, 0x78, 0x00, 0x3f, 0xff, 0xff, 0xfc,
  0x00, 0x1f, 0xff, 0xfe, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x7f, 0xff, 0xff, 0xfc,
  0x00, 0x7f, 0xff, 0xfe, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x7f, 0xff, 0xff, 0xf8,
  0x00, 0xff, 0xff, 0xff, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x00, 0xff, 0xff, 0xff, 0xf8,
  0x01, 0xff, 0xff, 0xff, 0x80, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x01, 0xff, 0xff, 0xff, 0xf8,
  0x03, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xf0,
  0x07, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0xf0,
  0x07, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xe0,
  0x07, 0xff, 0xff, 0xff, 0xf0, 0x00, 0xe1, 0xe1, 0xc3, 0x87, 0x00, 0x07, 0xff, 0xff, 0xff, 0xe0,
  0x03, 0xff, 0xff, 0xff, 0xf8, 0x01, 0xe1, 0xc3, 0xc3, 0x87, 0x80, 0x1f, 0xff, 0xff, 0xff, 0xe0,
  0x03, 0xff, 0xff, 0xff, 0xfc, 0x00, 0xe1, 0xe1, 0xc7, 0x87, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xc0,
  0x01, 0xff, 0xff, 0xff, 0xfc, 0x01, 0xe1, 0xe3, 0xc3, 0x87, 0x80, 0x7f, 0xff, 0xe0, 0x0b, 0xc0,
  0x01, 0xff, 0xff, 0xff, 0xff, 0x01, 0xe1, 0xc1, 0xc7, 0x87, 0x80, 0xff, 0xff, 0xc0, 0x00, 0x00,
  0x00, 0xff, 0xff, 0xff, 0xff, 0x80, 0xe1, 0xe3, 0xc3, 0xc7, 0x01, 0xff, 0xff, 0x80, 0x00, 0x00,
  0x00, 0xff, 0xff, 0xff, 0xff, 0xe1, 0xe1, 0xe1, 0xc7, 0x87, 0x83, 0xff, 0xff, 0x00, 0x00, 0x00,
  0x00, 0x7f, 0xff, 0xff, 0xff, 0xf0, 0xe0, 0xa3, 0xc3, 0x87, 0x0f, 0xff, 0xff, 0x00, 0x00, 0x00,
  0x00, 0x7f, 0xf0, 0x3f, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xfe, 0x00, 0x00, 0x00,
  0x00, 0x3e, 0x80, 0x1f, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xfe, 0x00, 0x00, 0x00,
  0x00, 0x10, 0x00, 0x1f, 0xff, 0xff, 0x80, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x07, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0xfa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, 0xff, 0xff, 0xf0, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x7f, 0xff, 0xe0, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x0f, 0xff, 0xff, 0x1f, 0xff, 0xff, 0xfe, 0x00, 0x7f, 0xff, 0x80, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x0f, 0xff, 0xfe, 0x01, 0xff, 0xff, 0xfc, 0x00, 0x1f, 0xff, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x0f, 0xff, 0xfc, 0x00, 0x3f, 0xff, 0xfc, 0x00, 0x0f, 0xfe, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x1f, 0xff, 0xf8, 0x00, 0x3f, 0xff, 0xf8, 0x00, 0x03, 0xf8, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x0f, 0xff, 0xf0, 0x00, 0x3f, 0xff, 0xfc, 0x00, 0x01, 0xf0, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x03, 0xff, 0xe0, 0x00, 0x1f, 0xff, 0xf8, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x01, 0xff, 0xc0, 0x00, 0x1f, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x7f, 0x80, 0x00, 0x1f, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x0f, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x0f, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xfa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};

////////////////////////////////////////////////////////////////////////////
////////////////////////////PROGRAM SETUP///////////////////////////////////
////////////////////////////////////////////////////////////////////////////

void setup() {

  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////ALARM SYSTEM SETUP BEGIN////////////////////////////
  ////////////////////////////////////////////////////////////////////////////

  pinMode(34, OUTPUT); // Buzzer Output
  pinMode(22, INPUT_PULLUP); // Buzzer OFF Button
  pinMode(24, INPUT_PULLUP); // Common Alarm Input
  pinMode(26, INPUT_PULLUP); // Leakage Alarm Input
  pinMode(28, INPUT_PULLUP); // Vent Alarm Input
  pinMode(30, INPUT_PULLUP); // F.O. Level Low Input
  pinMode(32, INPUT_PULLUP); // F.O. Level High Input

  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////ALARM SYSTEM SETUP END//////////////////////////////
  ////////////////////////////////////////////////////////////////////////////

  Serial.begin(115200);
  while (!Serial);
  SPI.begin();

  // Устанавливаем настройки CAN модуля
  mcp2515.reset();
  mcp2515.setBitrate(CAN_250KBPS, MCP_16MHZ);

  mcp2515.setConfigMode();

  mcp2515.setFilterMask(MCP2515::MASK0, true, 0x00FF0000); // Если после нули, принимает данные от всего, кроме того что ниже! Если FF, принимает только указанные ниже ID.
  mcp2515.setFilter(MCP2515::RXF0, true, 0x00FE0000);
  mcp2515.setFilter(MCP2515::RXF1, true, 0x00FE0000);

  mcp2515.setFilterMask(MCP2515::MASK1, true, 0x00FFFF00); // Если после нули, принимает данные от всего, кроме того что ниже! Если FF, принимает только указанные ниже ID.
  mcp2515.setFilter(MCP2515::RXF2, true, 0x00F00300); // Load At Current Speed
  mcp2515.setFilter(MCP2515::RXF3, true, 0x00F00400); // L.O. Pressure, F.O. Pressure
  mcp2515.setFilter(MCP2515::RXF4, true, 0x00FE0000);
  mcp2515.setFilter(MCP2515::RXF5, true, 0x00FE0000);

  mcp2515.setNormalMode();

  // Получаем и печатаем в монитор порта информацию о дисплее
  Serial.println();
  uint16_t ID = tft.readID();
  Serial.print("TFT DISPLAY ID = 0x");
  Serial.println(ID, HEX);
  Serial.print("DISPLAY Height = ");
  Serial.println(tft.height());
  Serial.print("DISPLAY Width = ");
  Serial.println(tft.width());

  // Печатаем заголовок CAN-шины
  Serial.println("------CAN-BUS Read OK!------");
  Serial.println("Can ID ----- DLC  ----- DATA");

  ////////////////////////////////////////////////////////////////////////////
  //////////////////////////////Hello Message/////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////

  tft.begin(ID);
  tft.setRotation(1); //Поворачиваем экран 0 = 0°, 1 = 90°, 2 = 180°, 3 = 270°
  tft.fillScreen(BLACK);

  tft.drawBitmap(180, 10, logoblack, 128, 128, 0xFFFF);

  tft.setTextColor(WHITE);
  tft.setTextSize(3);
  tft.setCursor(60, 155);
  tft.print("www.chebanlianka.com");

  tft.setTextColor(WHITE);
  tft.setTextSize(1);
  tft.setCursor(53, 190);
  tft.print("///////////////////////////////////////////////////////////////");
  tft.setCursor(53, 200);
  tft.print("///////////////   Caterpillar Can-Bus Monitor   ///////////////");
  tft.setCursor(53, 210);
  tft.print("///////////////          Protocol: J1939        ///////////////");
  tft.setCursor(53, 220);
  tft.print("///////////////  Engine Model: GEN-SET 3512B    ///////////////");
  tft.setCursor(53, 230);
  tft.print("/////////////// Author: Oleksandr Cheban-Lianka ///////////////");
  tft.setCursor(53, 240);
  tft.print("///////////////    oleksandr@chebanlianka.com   ///////////////");
  tft.setCursor(53, 250);
  tft.print("///////////////////////////////////////////////////////////////");

  tft.setCursor(160, 275);
  tft.setTextColor(WHITE);
  tft.setTextSize(3);
  tft.print("loading...");

  tft.setTextColor(WHITE);
  tft.setTextSize(1);
  tft.setCursor(350, 311);
  ////////////////////////////////////////////////////////////////////////////
  tft.print("fw version 2021.09.27");////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  delay (10000);

  ////////////////////////////////////////////////////////////////////////////
  ///////////////////////////////Start Screen/////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////

  tft.begin(ID);
  tft.setRotation(1); //Поворачиваем экран 0 = 0°, 1 = 90°, 2 = 180°, 3 = 270°
  tft.setTextSize(2);
  tft.setTextColor(WHITE, BLACK);
  tft.invertDisplay(false);
  tft.setCursor(0, 0);
  tft.fillScreen(BGRD);

}

////////////////////////////////////////////////////////////////////////////
//////////////////////////////START LOOP////////////////////////////////////
////////////////////////////////////////////////////////////////////////////

void loop() {

  if (mcp2515.readMessage(&canMsg) == MCP2515::ERROR_OK)
  {
    nodataDelayTimer = millis();   //Сбрасываем таймер при наличии сигнала
    Serial.print(canMsg.can_id, HEX); // Печатаем в порт CAN ID
    Serial.print(" ");
    unsigned long pngID = canMsg.can_id;

    // Reduce ID To 4 digits (HEX xxxx)

    pngID = pngID << 8;
    pngID = pngID >> 16;
    pgnID = pngID;
    Serial.print(pngID, HEX);
    Serial.print(" ");
    int dataLen = canMsg.can_dlc;

    // print DLC

    Serial.print(dataLen, HEX);
    Serial.print(" ");

    for (int i = 0; i < canMsg.can_dlc; i++)
    {

      // print the data

      data[i] = canMsg.data[i];
      Serial.print(data[i], HEX);
      Serial.print(" ");
    }
    Serial.println();
  }

  ////////////////////////////////////////////////////////////////////////////
  ///////////////////////SWITCH TO NODATA SCREEN//////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
 
    if (millis() - nodataDelayTimer >= 5000) {  //Если счётчик таймера больше пяти секунд, переключаем на nodataScreen
      nodataScreen();
      singleNodataSwitch = true;       //Переключтель одиночной итерации
      commonStatus = true;             //Переключаем состояние алармов чтобы после появления сигнала заново их опросить (нужно, если аларм в сработке а CAN-сигнала нет)
      leakageStatus = true;            //Переключаем состояние алармов чтобы после появления сигнала заново их опросить (нужно, если аларм в сработке а CAN-сигнала нет)
      ventStatus = true;               //Переключаем состояние алармов чтобы после появления сигнала заново их опросить (нужно, если аларм в сработке а CAN-сигнала нет)
      folowStatus = true;              //Переключаем состояние алармов чтобы после появления сигнала заново их опросить (нужно, если аларм в сработке а CAN-сигнала нет)
      fohighStatus = true;             //Переключаем состояние алармов чтобы после появления сигнала заново их опросить (нужно, если аларм в сработке а CAN-сигнала нет)
    }
 
  if (millis() - nodataDelayTimer < 5000 && singleNodataSwitch == true) {   //Если счётчик таймера меньше пяти секунд, переключаем на dataScreen
    dataScreen();
    singleNodataSwitch = false;      //Переключаем "одиночный цикл" при наличии сигнала
      }

if (millis() - nodataDelayTimer < 5000) {  //Проверяем состояние алармов
    alarmLoop();
      }

//void alarmLoop() {

  ////////////////////////////////////////////////////////////////////////////
  //////////////////////////MAIN PROGRAM CODE/////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////

  //////////////////////////////////
  ////////Temp Sensor Code//////////
  //////////////////////////////////

  if (pgnID == 0xfeee) {
    int coolt = data[0];
    float cooltemp = ((-40) + coolt);
    tft.setCursor(20, 33);
    tft.setTextColor(WHITE, DBLUE);
    tft.setTextSize(4);

    if (cooltemp > 100) cooltemp = 0;
    if (cooltemp < -10) {
      tft.print("");
      tft.print(String(cooltemp, 0));
    }
    else if (cooltemp < 0) {
      tft.print(" ");
      tft.print(String(cooltemp, 0));
    }
    else if (cooltemp < 10) {
      tft.print(" ");
      tft.print(String(cooltemp, 0));
    }
    else if (cooltemp > 10) {
      tft.print(" ");
      tft.print(String(cooltemp, 0));
    }
    else {
      tft.print("");
      tft.print(String(cooltemp, 0));
    }
  }

  //////////////////////////////////
  ////////Engine Speed Code/////////
  //////////////////////////////////

  if (pgnID == 0xf004) {

    //millis() - delayTimer500 >=500 &&
    //delayTimer500 = millis();   //Сбрасываем таймер

    unsigned int r1 = data[3];
    unsigned int r2 = data[4];
    float rpm = ((r1) + (r2 * 256)) * 0.125;
    tft.setTextColor(WHITE, DBLUE);
    tft.setTextSize(4);
    tft.setCursor(160, 33);

    if (rpm > 10000) rpm = 0;
    if (rpm > 6000) rpm = 0;
    
    if (rpm < 10) {
      tft.print(" ");
      tft.print(String(rpm, 0));
      tft.print(" ");
    }
    else if (rpm < 100) {
      tft.print("  ");
      tft.print(String(rpm, 0));
    }
    else if (rpm < 1000) {
      tft.print(" ");
      tft.print(String(rpm, 0));
    }
    else {
      tft.print("");
      tft.print(String(rpm, 0));
    }
  }

  //////////////////////////////////
  /////Fuel, Oil Pressure Code//////
  //////////////////////////////////

  if (pgnID == 0xfeef) {

    unsigned int foilp = data[0];
    unsigned int loilp = data[3];
    float loilpressure = (loilp * 4);
    float foilpressure = (foilp * 4);
    tft.setTextColor(WHITE, DBLUE);
    tft.setTextSize(4);
    tft.setCursor(365, 33);

    if (loilpressure > 999) loilpressure = 0;
    if (loilpressure < 10) {
      tft.print("");
      tft.print(String(loilpressure, 0));
      tft.print(" ");
    }
    else if (loilpressure < 100) {
      tft.print("");
      tft.print(String(loilpressure, 0));
    }
    else {
      tft.print("");
      tft.print(String(loilpressure, 0));
    }

    tft.setCursor(365, 112);

    if (foilpressure > 999) foilpressure = 0;
    if (foilpressure < 10) {
      tft.print("");
      tft.print(String(foilpressure, 0));
      tft.print(" ");
    }
    else if (foilpressure < 100) {
      tft.print("");
      tft.print(String(foilpressure, 0));
    }
    else {
      tft.print("");
      tft.print(String(foilpressure, 0));
    }
  }

  //////////////////////////////////
  //////Boost Pressure Code/////////
  //////////////////////////////////

  if (pgnID == 0xfef6) {
    unsigned int bstp = data[1];
    float boostpressure = (bstp * 2);
    tft.setTextColor(WHITE, DBLUE);
    tft.setCursor(15, 112);
    tft.setTextSize(4);

    if (boostpressure > 999) boostpressure = 0;
    if (boostpressure < 10) {
      tft.print(" ");
      tft.print(String(boostpressure, 0));
      tft.print(" ");
    }
    else if (boostpressure < 100) {
      tft.print("  ");
      tft.print(String(boostpressure, 0));
    }
    else {
      tft.print(" ");
      tft.print(String(boostpressure, 0));
    }
  }

  //////////////////////////////////
  ////// Engine Power Code /////////
  //////////////////////////////////

  if (pgnID == 0xf003) {

    //millis() - delayTimer1000 >=1000 &&
    //delayTimer1000 = millis();   //Сбрасываем таймер
    unsigned int p1 = data[2];
    float rpower = ((p1 * 0.01)*1125);
    tft.setTextColor(WHITE, DBLUE);
    tft.setTextSize(4);
    tft.setCursor(160, 112);
    if (rpower > 9999) rpower = 0;
    if (rpower < 10) {
      tft.print(" ");
      tft.print(String(rpower, 0));
      tft.print("  ");
    }
    else if (rpower < 100) {
      tft.print("  ");
      tft.print(String(rpower, 0));
      tft.print(" ");
    }
    else if (rpower < 1000) {
      tft.print(" ");
      tft.print(String(rpower, 0));
      tft.print(" ");
    }
    else {
      tft.print(" ");
      tft.print(String(rpower, 0));
    }
  }

  //////////////////////////////////
  //////////Battery Code////////////
  //////////////////////////////////

  if (pgnID == 0xfef7) {
    unsigned int b1 = data[4];
    unsigned int b2 = data[5];
    float battery = ((b1) + (b2 * 256)) * 0.05;
    tft.setTextColor(WHITE, DBLUE);
    tft.setTextSize(4);
    tft.setCursor(18, 193);

    if (battery > 40) battery = 0;
    if (battery < 10) {
      tft.print(" ");
      tft.print(String(battery, 1));
    }
    else if (battery < 1) {
      tft.print("  ");
      tft.print(String(battery, 1));
    }
    else {
      tft.print("");
      tft.print(String(battery, 1));
    }
  }

  //////////////////////////////////
  //////Engine Hours Code/////////
  //////////////////////////////////

  if (pgnID == 0xfee5) {
    unsigned int h1 = data[0];
    unsigned int h2 = data[1];
    unsigned int h3 = data[2];
    unsigned int h4 = data[3];
    float hours = (((h1) + (h2 * 256) + (h3) + (h4))) * 0.05;
    tft.setTextColor(WHITE, DBLUE);
    tft.setTextSize(4);
    tft.setCursor(155, 193);

    if (hours > 99999) hours = 0;
    if (hours < 10) {
      tft.print("  ");
      tft.print(String(hours, 2));
      tft.print(" ");
    }
    else if (hours < 100) {
      tft.print("  ");
      tft.print(String(hours, 2));
    }
    else if (hours < 1000) {
      tft.print(" ");
      tft.print(String(hours, 2));
    }
    else {
      tft.print("");
      tft.print(String(hours, 2));
    }
  }

  //////////////////////////////////
  //////////Fuel Rate Code//////////
  //////////////////////////////////

  if (pgnID == 0xfef2) {
    unsigned int f1 = data[0];
    unsigned int f2 = data[1];
    float flow = ((f1) + (f2 * 256)) * 0.05;
    tft.setTextColor(WHITE, DBLUE);
    tft.setTextSize(3);
    tft.setCursor(350, 196);

    if (flow > 999) flow = 0;
    if (flow < 10) {
      tft.print("  ");
      tft.print(String(flow, 1));
    }
    else if (flow < 100) {
      tft.print(" ");
      tft.print(String(flow, 1));
    }
    else {
      tft.print("");
      tft.print(String(flow, 1));
    }

  }

}
////////////////////////////////////////////////////////////////////////////
///////////////////////////////END LOOP/////////////////////////////////////
////////////////////////////////////////////////////////////////////////////

/////////////////////////////////////////////////////////////////////////////
//////////////////////// ALARM SYSTEM LOOP BEGIN ////////////////////////////
/////////////////////////////////////////////////////////////////////////////

void alarmLoop() {

  ///////////////////// Common Alarm Begin ///////////////////////////
  commonInAlarm = digitalRead(24);
  if (commonInAlarm == false && commonStatus == true) {
    tft.fillRect(10, 260, 110, 40, RED);
    tft.setCursor(31, 265);
    tft.setTextColor(WHITE);  tft.setTextSize(2);
    tft.print("COMMON");
    tft.setCursor(38, 282);
    tft.setTextColor(WHITE);  tft.setTextSize(2);
    tft.print("ALARM");
    if (buzzerEnabled == false) buzzerEnabled = true;
  }
  if (commonInAlarm == false)  commonStatus = false;

  commonInNormal = digitalRead(24);
  if (commonInNormal == true && commonStatus == false) {
    tft.fillRect(10, 260, 110, 40, BLACK);
    tft.setCursor(31, 265);
    tft.setTextColor(WHITE);  tft.setTextSize(2);
    tft.print("COMMON");
    tft.setCursor(38, 282);
    tft.setTextColor(WHITE);  tft.setTextSize(2);
    tft.print("ALARM");
  }
  if (commonInNormal == true)  commonStatus = true;
  ///////////////////// Common Alarm End ///////////////////////////

  ///////////////////// Leakage Alarm Begin ////////////////////////
  leakageInAlarm = digitalRead(26);
  if (leakageInAlarm == false && leakageStatus == true) {
    tft.fillRect(130, 260, 110, 40, RED);
    tft.setCursor(144, 265);
    tft.setTextColor(WHITE);  tft.setTextSize(2);
    tft.print("LEAKAGE");
    tft.setCursor(157, 282);
    tft.setTextColor(WHITE);  tft.setTextSize(2);
    tft.print("ALARM");
    if (buzzerEnabled == false) buzzerEnabled = true;
  }
  if (leakageInAlarm == false)  leakageStatus = false;

  leakageInNormal = digitalRead(26);
  if (leakageInNormal == true && leakageStatus == false) {
    tft.fillRect(130, 260, 110, 40, BLACK);
    tft.setCursor(144, 265);
    tft.setTextColor(WHITE);  tft.setTextSize(2);
    tft.print("LEAKAGE");
    tft.setCursor(157, 282);
    tft.setTextColor(WHITE);  tft.setTextSize(2);
    tft.print("ALARM");
  }
  if (leakageInNormal == true)  leakageStatus = true;
  ///////////////////// Leakage Alarm End ////////////////////////

  //////////////// Ventilator Alarm Begin ////////////////////////
  ventInAlarm = digitalRead(28);
  if (ventInAlarm == false && ventStatus == true) {
    tft.fillRect(250, 260, 110, 40, RED);
    tft.setCursor(284, 265);
    tft.setTextColor(WHITE);  tft.setTextSize(2);
    tft.print("VENT");
    tft.setCursor(277, 282);
    tft.setTextColor(WHITE);  tft.setTextSize(2);
    tft.print("ALARM");
    if (buzzerEnabled == false) buzzerEnabled = true;
  }
  if (ventInAlarm == false)  ventStatus = false;

  ventInNormal = digitalRead(28);
  if (ventInNormal == true && ventStatus == false) {
    tft.fillRect(250, 260, 110, 40, BLACK);
    tft.setCursor(284, 265);
    tft.setTextColor(WHITE);  tft.setTextSize(2);
    tft.print("VENT");
    tft.setCursor(277, 282);
    tft.setTextColor(WHITE);  tft.setTextSize(2);
    tft.print("ALARM");
  }
  if (ventInNormal == true)  ventStatus = true;
  //////////////// Ventilator Alarm End ////////////////////////

  ///////////// F.O. Level Low Alarm Begin /////////////////////
  folowInAlarm = digitalRead(30);
  if (folowInAlarm == false && folowStatus == true) {
    tft.fillRect(370, 260, 45, 40, RED);
    tft.setCursor(382, 262);
    tft.setTextColor(WHITE);  tft.setTextSize(1);
    tft.print("FUEL");
    tft.setCursor(379, 276);
    tft.setTextColor(WHITE);  tft.setTextSize(1);
    tft.print("LEVEL");
    tft.setCursor(384, 290);
    tft.setTextColor(WHITE);  tft.setTextSize(1);
    tft.print("LOW");
    if (buzzerEnabled == false) buzzerEnabled = true;
  }
  if (folowInAlarm == false)  folowStatus = false;

  folowInNormal = digitalRead(30);
  if (folowInNormal == true && folowStatus == false) {
    tft.fillRect(370, 260, 45, 40, BLACK);
    tft.setCursor(382, 262);
    tft.setTextColor(WHITE);  tft.setTextSize(1);
    tft.print("FUEL");
    tft.setCursor(379, 276);
    tft.setTextColor(WHITE);  tft.setTextSize(1);
    tft.print("LEVEL");
    tft.setCursor(384, 290);
    tft.setTextColor(WHITE);  tft.setTextSize(1);
    tft.print("LOW");
  }
  if (folowInNormal == true)  folowStatus = true;
  ///////////// F.O. Level Low Alarm End ////////////////////////

  ///////////// F.O. Level High Alarm Begin /////////////////////
  fohighInAlarm = digitalRead(32);
  if (fohighInAlarm == false && fohighStatus == true) {
    tft.fillRect(425, 260, 45, 40, RED);
    tft.setCursor(437, 262);
    tft.setTextColor(WHITE);  tft.setTextSize(1);
    tft.print("FUEL");
    tft.setCursor(433, 276);
    tft.setTextColor(WHITE);  tft.setTextSize(1);
    tft.print("LEVEL");
    tft.setCursor(436, 290);
    tft.setTextColor(WHITE);  tft.setTextSize(1);
    tft.print("HIGH");
    if (buzzerEnabled == false) buzzerEnabled = true;
  }
  if (fohighInAlarm == false)  fohighStatus = false;

  fohighInNormal = digitalRead(32);
  if (fohighInNormal == true && fohighStatus == false) {
    tft.fillRect(425, 260, 45, 40, BLACK);
    tft.setCursor(437, 262);
    tft.setTextColor(WHITE);  tft.setTextSize(1);
    tft.print("FUEL");
    tft.setCursor(433, 276);
    tft.setTextColor(WHITE);  tft.setTextSize(1);
    tft.print("LEVEL");
    tft.setCursor(436, 290);
    tft.setTextColor(WHITE);  tft.setTextSize(1);
    tft.print("HIGH");
  }
  if (fohighInNormal == true)  fohighStatus = true;
  ////////////////// F.O. Level High Alarm End ////////////////////////////

  ////////////////// Buzzer Reset Button Begin ////////////////////////////
  resetButton = digitalRead(22);
  if (buzzerEnabled == true) {
    digitalWrite(34, HIGH);
  }
  if (buzzerEnabled == true && resetButton == false) buzzerEnabled = false;
  if (buzzerEnabled == false) {
    digitalWrite(34, LOW);
  }
  //////////////////// Buzzer Reset Button End ////////////////////////////
}
///////////////////////////////////////////////////////////////////////////
//////////////////////////ALARM SYSTEM LOOP END////////////////////////////
///////////////////////////////////////////////////////////////////////////


////////////////////////////////////////////////////////////////////////////
///////////////////////////NODATA SCREEN BEGIN//////////////////////////////
////////////////////////////////////////////////////////////////////////////
void nodataScreen() {

  tft.fillScreen(BGRD);
 // fohighStatus == true;
  //Order 1
  tft.fillRect(0, 0, 480, 10, RED);
  tft.setCursor(61, 1);
  tft.setTextColor(WHITE);  tft.setTextSize(1);
  tft.print("DIESEL GENERATOR ZEPPELIN CONTAINER GEN-SET 3512B DITA MONITOR");

  //Order 2
  tft.fillRect(0, 310, 480, 10, RED);
  tft.setCursor(182, 311);
  tft.setTextColor(WHITE);  tft.setTextSize(1);
  tft.print("www.chebanlianka.com");

  //Order 3
  tft.drawRect(13, 18, 124, 74, BLACK); // x, y, ширина, высота, цвет
  tft.drawRect(143, 18, 194, 74, BLACK); // x, y, ширина, высота, цвет
  tft.drawRect(343, 18, 124, 74, BLACK); // x, y, ширина, высота, цвет
  tft.drawRect(13, 98, 124, 74, BLACK); // x, y, ширина, высота, цвет
  tft.drawRect(143, 98, 194, 74, BLACK); // x, y, ширина, высота, цвет
  tft.drawRect(343, 98, 124, 74, BLACK); // x, y, ширина, высота, цвет
  tft.drawRect(13, 178, 124, 74, BLACK); // x, y, ширина, высота, цвет
  tft.drawRect(143, 178, 194, 74, BLACK); // x, y, ширина, высота, цвет
  tft.drawRect(343, 178, 124, 74, BLACK); // x, y, ширина, высота, цвет
  tft.drawRect(8, 258, 114, 44, BLACK); // x, y, ширина, высота, цвет
  tft.drawRect(128, 258, 114, 44, BLACK); // x, y, ширина, высота, цвет
  tft.drawRect(248, 258, 114, 44, BLACK); // x, y, ширина, высота, цвет
  tft.drawRect(368, 258, 49, 44, BLACK); // x, y, ширина, высота, цвет
  tft.drawRect(423, 258, 49, 44, BLACK); // x, y, ширина, высота, цвет

  //Order 5
  tft.fillRect(15, 20, 120, 50, DBLUE);
  tft.fillRect(145, 20, 190, 50, DBLUE);
  tft.fillRect(345, 20, 120, 50, DBLUE);
  tft.fillRect(15, 100, 120, 50, DBLUE);
  tft.fillRect(145, 100, 190, 50, DBLUE);
  tft.fillRect(345, 100, 120, 50, DBLUE);
  tft.fillRect(15, 180, 120, 50, DBLUE);
  tft.fillRect(145, 180, 190, 50, DBLUE);
  tft.fillRect(345, 180, 120, 50, DBLUE);

  //Order 6
  tft.fillRect(15, 70, 120, 20, DGREY);
  tft.fillRect(145, 70, 190, 20, DGREY);
  tft.fillRect(345, 70, 120, 20, DGREY);
  tft.fillRect(15, 150, 120, 20, DGREY);
  tft.fillRect(145, 150, 190, 20, DGREY);
  tft.fillRect(345, 150, 120, 20, DGREY);
  tft.fillRect(15, 230, 120, 20, DGREY);
  tft.fillRect(145, 230, 190, 20, DGREY);
  tft.fillRect(345, 230, 120, 20, DGREY);

  //Order 4
  for (uint16_t a = 0; a < 2; a++)
  {
    tft.drawFastHLine(15, 70 + a, 120, BLACK);
    tft.drawFastHLine(145, 70 + a, 190, BLACK);
    tft.drawFastHLine(345, 70 + a, 120, BLACK);
    tft.drawFastHLine(15, 150 + a, 120, BLACK);
    tft.drawFastHLine(145, 150 + a, 190, BLACK);
    tft.drawFastHLine(345, 150 + a, 120, BLACK);
    tft.drawFastHLine(15, 230 + a, 120, BLACK);
    tft.drawFastHLine(145, 230 + a, 190, BLACK);
    tft.drawFastHLine(345, 230 + a, 120, BLACK);
  }

  ////////////////////////////////////////////////////////////////////////////
  //////////////////////////////Sensors Name//////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////

  ///////////////////////////////////////////
  tft.setCursor(112, 33);
  tft.setTextColor(WHITE);  tft.setTextSize(4);
  tft.print("C");
  tft.setCursor(34, 74);
  tft.setTextColor(WHITE);  tft.setTextSize(2);
  tft.print("COOLANT");
  //////////////////////////////////////////
  tft.setCursor(260, 33);
  tft.setTextColor(WHITE);  tft.setTextSize(4);
  tft.print("rpm");
  tft.setCursor(170, 74);
  tft.setTextColor(WHITE);  tft.setTextSize(2);
  tft.print("ENGINE SPEED");
  ////////////////////////////////////////////
  tft.setCursor(445, 23);
  tft.setTextColor(WHITE);  tft.setTextSize(2);
  tft.print("k");
  tft.setCursor(445, 40);
  tft.setTextColor(WHITE);  tft.setTextSize(2);
  tft.print("P");
  tft.setCursor(445, 52);
  tft.setTextColor(WHITE);  tft.setTextSize(2);
  tft.print("a");
  tft.setCursor(352, 74);
  tft.setTextColor(WHITE);  tft.setTextSize(2);
  tft.print("OIL PRESS");
  ///////////////////////////////////////
  tft.setCursor(115, 103);
  tft.setTextColor(WHITE);  tft.setTextSize(2);
  tft.print("k");
  tft.setCursor(115, 120);
  tft.setTextColor(WHITE);  tft.setTextSize(2);
  tft.print("P");
  tft.setCursor(115, 132);
  tft.setTextColor(WHITE);  tft.setTextSize(2);
  tft.print("a");
  tft.setCursor(24, 154);
  tft.setTextColor(WHITE);  tft.setTextSize(2);
  tft.print("BOOST PR.");
  ////////////////////////////////////////
  //tft.setCursor(280, 112);
  //tft.setTextColor(WHITE);  tft.setTextSize(4);
  //tft.print("kW");
  tft.setCursor(171, 154);
  tft.setTextColor(WHITE);  tft.setTextSize(2);
  tft.print("ENGINE POWER");
  //////////////////////////////////
  tft.setCursor(445, 103);
  tft.setTextColor(WHITE);  tft.setTextSize(2);
  tft.print("k");
  tft.setCursor(445, 120);
  tft.setTextColor(WHITE);  tft.setTextSize(2);
  tft.print("P");
  tft.setCursor(445, 132);
  tft.setTextColor(WHITE);  tft.setTextSize(2);
  tft.print("a");
  tft.setCursor(346, 154);
  tft.setTextColor(WHITE);  tft.setTextSize(2);
  tft.print("FUEL PRESS");
  ////////////////////////////////////
  tft.setCursor(112, 193);
  tft.setTextColor(WHITE);  tft.setTextSize(4);
  tft.print("V");
  tft.setCursor(34, 234);
  tft.setTextColor(WHITE);  tft.setTextSize(2);
  tft.print("BATTERY");
  ///////////////////////////////////
  tft.setCursor(173, 234);
  tft.setTextColor(WHITE);  tft.setTextSize(2);
  tft.print("ENGINE HOURS");
  ////////////////////////////////////
  tft.setCursor(445, 182);
  tft.setTextColor(WHITE);  tft.setTextSize(2);
  tft.print("L");
  tft.setCursor(445, 197);
  tft.setTextColor(WHITE);  tft.setTextSize(2);
  tft.print("P");
  tft.setCursor(445, 213);
  tft.setTextColor(WHITE);  tft.setTextSize(2);
  tft.print("H");
  tft.setCursor(353, 234);
  tft.setTextColor(WHITE);  tft.setTextSize(2);
  tft.print("FUEL RATE");

  ////////////////////////////////////////////////////////////////////////////
  //////////////////////////////ZERO NUMBERS//////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////

  ///////////Temp/////////////
  tft.setCursor(57, 33);
  tft.setTextColor(WHITE);
  tft.setTextSize(4);
  tft.print(0);
  ////////Engine Speed/////////
  tft.setTextColor(WHITE);
  tft.setTextSize(4);
  tft.setCursor(200, 33);
  tft.println(0);
  ////////Oil Pressure/////////
  tft.setTextColor(WHITE);
  tft.setCursor(385, 33);
  tft.setTextSize(4);
  tft.print(0);
  //////Boost Pressure/////////
  tft.setTextColor(WHITE);
  tft.setCursor(57, 112);
  tft.setTextSize(4);
  tft.print(0);
  //////Engine Power/////////
  tft.setTextColor(WHITE);
  tft.setTextSize(2);
  tft.setCursor(152, 200);
  tft.print("DG SWITCHED OFF");
  ///////Fuel Pressure/////////
  tft.setTextColor(WHITE);
  tft.setCursor(385, 112);
  tft.setTextSize(4);
  tft.print(0);
  //////////Battery////////////
  tft.setTextColor(WHITE);
  tft.setTextSize(4);
  tft.setCursor(57, 193);
  tft.println(0);
  //////////Fuel Rate///////////
  tft.setTextColor(WHITE);
  tft.setTextSize(3);
  tft.setCursor(390, 196);
  tft.println(0);

  ///////////////////// Common Alarm Begin ///////////////////////////
  tft.fillRect(10, 260, 110, 40, RED);
  tft.setCursor(31, 265);
  tft.setTextColor(WHITE);  tft.setTextSize(2);
  tft.print("COMMON");
  tft.setCursor(38, 282);
  tft.setTextColor(WHITE);  tft.setTextSize(2);
  tft.print("ALARM");
  ///////////////////// Common Alarm End ///////////////////////////

  ///////////////////// Leakage Alarm Begin ////////////////////////
  tft.fillRect(130, 260, 110, 40, RED);
  tft.setCursor(144, 265);
  tft.setTextColor(WHITE);  tft.setTextSize(2);
  tft.print("LEAKAGE");
  tft.setCursor(157, 282);
  tft.setTextColor(WHITE);  tft.setTextSize(2);
  tft.print("ALARM");
  ///////////////////// Leakage Alarm End ////////////////////////

  //////////////// Ventilator Alarm Begin ////////////////////////
  tft.fillRect(250, 260, 110, 40, RED);
  tft.setCursor(284, 265);
  tft.setTextColor(WHITE);  tft.setTextSize(2);
  tft.print("VENT");
  tft.setCursor(277, 282);
  tft.setTextColor(WHITE);  tft.setTextSize(2);
  tft.print("ALARM");
  //////////////// Ventilator Alarm End ////////////////////////

  ///////////// F.O. Level Low Alarm Begin /////////////////////
  tft.fillRect(370, 260, 45, 40, RED);
  tft.setCursor(382, 262);
  tft.setTextColor(WHITE);  tft.setTextSize(1);
  tft.print("FUEL");
  tft.setCursor(379, 276);
  tft.setTextColor(WHITE);  tft.setTextSize(1);
  tft.print("LEVEL");
  tft.setCursor(384, 290);
  tft.setTextColor(WHITE);  tft.setTextSize(1);
  tft.print("LOW");
  ///////////// F.O. Level Low Alarm End ////////////////////////

  ///////////// F.O. Level High Alarm Begin /////////////////////
  tft.fillRect(425, 260, 45, 40, RED);
  tft.setCursor(437, 262);
  tft.setTextColor(WHITE);  tft.setTextSize(1);
  tft.print("FUEL");
  tft.setCursor(433, 276);
  tft.setTextColor(WHITE);  tft.setTextSize(1);
  tft.print("LEVEL");
  tft.setCursor(436, 290);
  tft.setTextColor(WHITE);  tft.setTextSize(1);
  tft.print("HIGH");
  ////////////////// F.O. Level High Alarm End ////////////////////////////

  while (!mcp2515.readMessage(&canMsg) == MCP2515::ERROR_OK) {
    tft.setCursor(160, 112);
    tft.setTextSize(4);
    tft.print("No Data");
    tft.setTextColor(GREENYELLOW, DBLUE);
    delay(100);
    tft.setCursor(160, 112);
    tft.setTextSize(4);
    tft.print("No Data");
    tft.setTextColor(MAGENTA, DBLUE);
    delay(100);
  }
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////NODATA SCREEN END///////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
}

////////////////////////////////////////////////////////////////////////////
/////////////////////////// DATA SCREEN BEGIN //////////////////////////////
////////////////////////////////////////////////////////////////////////////

void dataScreen() {

  tft.fillScreen(BGRD);
//  fohighStatus == true;

  //Order 1
  tft.fillRect(0, 0, 480, 10, RED);
  tft.setCursor(61, 1);
  tft.setTextColor(WHITE);  tft.setTextSize(1);
  tft.print("DIESEL GENERATOR ZEPPELIN CONTAINER GEN-SET 3512B DITA MONITOR");
  //Order 2
  tft.fillRect(0, 310, 480, 10, RED);
  tft.setCursor(182, 311);
  tft.setTextColor(WHITE);  tft.setTextSize(1);
  tft.print("www.chebanlianka.com");
  //Order 3
  tft.drawRect(13, 18, 124, 74, BLACK); // x, y, ширина, высота, цвет
  tft.drawRect(143, 18, 194, 74, BLACK); // x, y, ширина, высота, цвет
  tft.drawRect(343, 18, 124, 74, BLACK); // x, y, ширина, высота, цвет
  tft.drawRect(13, 98, 124, 74, BLACK); // x, y, ширина, высота, цвет
  tft.drawRect(143, 98, 194, 74, BLACK); // x, y, ширина, высота, цвет
  tft.drawRect(343, 98, 124, 74, BLACK); // x, y, ширина, высота, цвет
  tft.drawRect(13, 178, 124, 74, BLACK); // x, y, ширина, высота, цвет
  tft.drawRect(143, 178, 194, 74, BLACK); // x, y, ширина, высота, цвет
  tft.drawRect(343, 178, 124, 74, BLACK); // x, y, ширина, высота, цвет
  tft.drawRect(8, 258, 114, 44, BLACK); // x, y, ширина, высота, цвет
  tft.drawRect(128, 258, 114, 44, BLACK); // x, y, ширина, высота, цвет
  tft.drawRect(248, 258, 114, 44, BLACK); // x, y, ширина, высота, цвет
  tft.drawRect(368, 258, 49, 44, BLACK); // x, y, ширина, высота, цвет
  tft.drawRect(423, 258, 49, 44, BLACK); // x, y, ширина, высота, цвет
  //Order 5
  tft.fillRect(15, 20, 120, 50, DBLUE);
  tft.fillRect(145, 20, 190, 50, DBLUE);
  tft.fillRect(345, 20, 120, 50, DBLUE);
  tft.fillRect(15, 100, 120, 50, DBLUE);
  tft.fillRect(145, 100, 190, 50, DBLUE);
  tft.fillRect(345, 100, 120, 50, DBLUE);
  tft.fillRect(15, 180, 120, 50, DBLUE);
  tft.fillRect(145, 180, 190, 50, DBLUE);
  tft.fillRect(345, 180, 120, 50, DBLUE);
  //Order 6
  tft.fillRect(15, 70, 120, 20, DGREY);
  tft.fillRect(145, 70, 190, 20, DGREY);
  tft.fillRect(345, 70, 120, 20, DGREY);
  tft.fillRect(15, 150, 120, 20, DGREY);
  tft.fillRect(145, 150, 190, 20, DGREY);
  tft.fillRect(345, 150, 120, 20, DGREY);
  tft.fillRect(15, 230, 120, 20, DGREY);
  tft.fillRect(145, 230, 190, 20, DGREY);
  tft.fillRect(345, 230, 120, 20, DGREY);
  //Order 4
  for (uint16_t a = 0; a < 2; a++) {
    tft.drawFastHLine(15, 70 + a, 120, BLACK);
    tft.drawFastHLine(145, 70 + a, 190, BLACK);
    tft.drawFastHLine(345, 70 + a, 120, BLACK);
    tft.drawFastHLine(15, 150 + a, 120, BLACK);
    tft.drawFastHLine(145, 150 + a, 190, BLACK);
    tft.drawFastHLine(345, 150 + a, 120, BLACK);
    tft.drawFastHLine(15, 230 + a, 120, BLACK);
    tft.drawFastHLine(145, 230 + a, 190, BLACK);
    tft.drawFastHLine(345, 230 + a, 120, BLACK);
  }

  ////////////////////////////////////////////////////////////////////////////
  //////////////////////////////Sensors Name//////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////

  ///////////////////////////////////////////
  tft.setCursor(95, 33);
  tft.setTextColor(WHITE);  tft.setTextSize(4);
  tft.print("C");
  tft.setCursor(34, 74);
  tft.setTextColor(WHITE);  tft.setTextSize(2);
  tft.print("COOLANT");
  //////////////////////////////////////////
  tft.setCursor(260, 33);
  tft.setTextColor(WHITE);  tft.setTextSize(4);
  tft.print("rpm");
  tft.setCursor(170, 74);
  tft.setTextColor(WHITE);  tft.setTextSize(2);
  tft.print("ENGINE SPEED");
  ////////////////////////////////////////////
  tft.setCursor(445, 23);
  tft.setTextColor(WHITE);  tft.setTextSize(2);
  tft.print("k");
  tft.setCursor(445, 40);
  tft.setTextColor(WHITE);  tft.setTextSize(2);
  tft.print("P");
  tft.setCursor(445, 52);
  tft.setTextColor(WHITE);  tft.setTextSize(2);
  tft.print("a");
  tft.setCursor(352, 74);
  tft.setTextColor(WHITE);  tft.setTextSize(2);
  tft.print("OIL PRESS");
  ///////////////////////////////////////
  tft.setCursor(115, 103);
  tft.setTextColor(WHITE);  tft.setTextSize(2);
  tft.print("k");
  tft.setCursor(115, 120);
  tft.setTextColor(WHITE);  tft.setTextSize(2);
  tft.print("P");
  tft.setCursor(115, 132);
  tft.setTextColor(WHITE);  tft.setTextSize(2);
  tft.print("a");
  tft.setCursor(24, 154);
  tft.setTextColor(WHITE);  tft.setTextSize(2);
  tft.print("BOOST PR.");
  ////////////////////////////////////////
  tft.setCursor(280, 112);
  tft.setTextColor(WHITE);  tft.setTextSize(4);
  tft.print("kW");
  tft.setCursor(171, 154);
  tft.setTextColor(WHITE);  tft.setTextSize(2);
  tft.print("ENGINE POWER");
  //////////////////////////////////
  tft.setCursor(445, 103);
  tft.setTextColor(WHITE);  tft.setTextSize(2);
  tft.print("k");
  tft.setCursor(445, 120);
  tft.setTextColor(WHITE);  tft.setTextSize(2);
  tft.print("P");
  tft.setCursor(445, 132);
  tft.setTextColor(WHITE);  tft.setTextSize(2);
  tft.print("a");
  tft.setCursor(346, 154);
  tft.setTextColor(WHITE);  tft.setTextSize(2);
  tft.print("FUEL PRESS");
  ////////////////////////////////////
  tft.setCursor(113, 193);
  tft.setTextColor(WHITE);  tft.setTextSize(4);
  tft.print("V");

  tft.setCursor(34, 234);
  tft.setTextColor(WHITE);  tft.setTextSize(2);
  tft.print("BATTERY");
  ///////////////////////////////////
  tft.setCursor(173, 234);
  tft.setTextColor(WHITE);  tft.setTextSize(2);
  tft.print("ENGINE HOURS");
  ////////////////////////////////////
  tft.setCursor(445, 182);
  tft.setTextColor(WHITE);  tft.setTextSize(2);
  tft.print("L");
  tft.setCursor(445, 197);
  tft.setTextColor(WHITE);  tft.setTextSize(2);
  tft.print("P");
  tft.setCursor(445, 213);
  tft.setTextColor(WHITE);  tft.setTextSize(2);
  tft.print("H");

  tft.setCursor(353, 234);
  tft.setTextColor(WHITE);  tft.setTextSize(2);
  tft.print("FUEL RATE");
  
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////ALARMSCREENS BEGIN//////////////////////////////
  ////////////////////////////////////////////////////////////////////////////

  ///////////////////// Common Alarm Begin ///////////////////////////
  tft.fillRect(10, 260, 110, 40, BLACK);
  tft.setCursor(31, 265);
  tft.setTextColor(WHITE);  tft.setTextSize(2);
  tft.print("COMMON");
  tft.setCursor(38, 282);
  tft.setTextColor(WHITE);  tft.setTextSize(2);
  tft.print("ALARM");
  ///////////////////// Common Alarm End ///////////////////////////
  ///////////////////// Leakage Alarm Begin ////////////////////////
  tft.fillRect(130, 260, 110, 40, BLACK);
  tft.setCursor(144, 265);
  tft.setTextColor(WHITE);  tft.setTextSize(2);
  tft.print("LEAKAGE");
  tft.setCursor(157, 282);
  tft.setTextColor(WHITE);  tft.setTextSize(2);
  tft.print("ALARM");
  ///////////////////// Leakage Alarm End ////////////////////////
  //////////////// Ventilator Alarm Begin ////////////////////////
  tft.fillRect(250, 260, 110, 40, BLACK);
  tft.setCursor(284, 265);
  tft.setTextColor(WHITE);  tft.setTextSize(2);
  tft.print("VENT");
  tft.setCursor(277, 282);
  tft.setTextColor(WHITE);  tft.setTextSize(2);
  tft.print("ALARM");
  //////////////// Ventilator Alarm End ////////////////////////
  ///////////// F.O. Level Low Alarm Begin /////////////////////
  tft.fillRect(370, 260, 45, 40, BLACK);
  tft.setCursor(382, 262);
  tft.setTextColor(WHITE);  tft.setTextSize(1);
  tft.print("FUEL");
  tft.setCursor(379, 276);
  tft.setTextColor(WHITE);  tft.setTextSize(1);
  tft.print("LEVEL");
  tft.setCursor(384, 290);
  tft.setTextColor(WHITE);  tft.setTextSize(1);
  tft.print("LOW");
  ///////////// F.O. Level Low Alarm End ////////////////////////
  ///////////// F.O. Level High Alarm Begin /////////////////////
  tft.fillRect(425, 260, 45, 40, BLACK);
  tft.setCursor(437, 262);
  tft.setTextColor(WHITE);  tft.setTextSize(1);
  tft.print("FUEL");
  tft.setCursor(433, 276);
  tft.setTextColor(WHITE);  tft.setTextSize(1);
  tft.print("LEVEL");
  tft.setCursor(436, 290);
  tft.setTextColor(WHITE);  tft.setTextSize(1);
  tft.print("HIGH");
  ////////////////// F.O. Level High Alarm End ////////////////////////////

  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////ALARMSCREENS END//////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
}
  ////////////////////////////////////////////////////////////////////////////
  //////////////////////////// DATA SCREEN END ///////////////////////////////
  ////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////////
/////////////////////////////PROGRAM END////////////////////////////////////
////////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////
///////////////  Caterpillar Can-Bus Monitor   ///////////////
///////////////         Protocol: J1939        ///////////////
///////////////  Engine Model: GEN-SET 3512B   ///////////////
///////////////    Oleksandr Cheban-Lianka     ///////////////
///////////////      www.chebanlianka.com      ///////////////
///////////////   oleksandr@chebanlianka.com   ///////////////
//////////////////////////////////////////////////////////////


КОД ПРИСТРОЮ КОНТРОЛЮ РІВНЯ ПАЛИВА В РЕЗЕРВУАРІ

boolean buzzerEnabled = true;

void setup() {
   pinMode(A2, OUTPUT); // Buzzer Output
   digitalWrite(A2, LOW);
   pinMode(A3, OUTPUT); // Red Led - F.O. Level High
   digitalWrite(A3, LOW);
   pinMode(A4, OUTPUT); // Green Led - Power
   digitalWrite(A4, HIGH);
   pinMode(A5, OUTPUT); // Yellow Led F.O. Level Low
   digitalWrite(A5, LOW);
   pinMode(A0, INPUT_PULLUP); // F.O. Level Low Input
   pinMode(A1, INPUT_PULLUP); // F.O. Level High Input
   pinMode(11, INPUT_PULLUP); // Buzzer OFF Button
}

void loop() { 
      
// Reading input status

  boolean folow = digitalRead(A0);
  boolean fohigh = digitalRead(A1);
  boolean resetbutton = digitalRead(11);
   
  if (resetbutton && folow && fohigh && !buzzerEnabled) {buzzerEnabled = !buzzerEnabled;}    
        
  if (!resetbutton && (!folow or !fohigh)) {buzzerEnabled = !buzzerEnabled;}

//Alarm F.O. Level LOW
        digitalRead(A0);
      if (!folow) { 
        digitalWrite(A5, HIGH); 
      if (buzzerEnabled) {digitalWrite(A2, HIGH);} //Buzzer Alarm F.O. Level LOW
        delay (1000);
        digitalWrite(A5, LOW);
      if (buzzerEnabled) {digitalWrite(A2, LOW);} //Buzzer Alarm F.O. Level LOW
        delay (1000);
      }
       else {
        digitalWrite(A5, LOW);
        digitalWrite(A2, LOW); 
      }

//LED Alarm F.O. Level High
        digitalRead(A1);
       if (!fohigh) { 
        digitalWrite(A3, HIGH); 
       if (buzzerEnabled) {digitalWrite(A2, HIGH);} //Buzzer Alarm F.O. Level High
        delay (1000);
        digitalWrite(A3, LOW);
       if (buzzerEnabled) {digitalWrite(A2, LOW);} //Buzzer Alarm F.O. Level High
        delay (1000);
      }
       else {
        digitalWrite(A3, LOW); 
        digitalWrite(A2, LOW);
      }
}

Leave a Reply