PHP код:
	
#include <MFRC522.h>
#include <OneWire.h>
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h> 
#include <Adafruit_SSD1306.h> 
#include "RTClib.h"
#include <TimerOne.h> 
#include <EEPROM.h>
#define INTERRUPT__INT 0                       // 0 Внешнее прерывание
//#define Spare                                // 1
#define TEMP_DS18B20__DIGITAL_PIN 2            // 2 Цифровой датчик температуры
//#define Scl                                  // 3
#define GEAR_NEITRAL__DIGITAL_PIN 10           // 4 Минус при включении нейтрали
#define FAN_CONTROL_RUN__DIGITAL_PIN 5         // 5 Минус при включении вентилятора
#define FUELPOMP_CONTROL_RUN__DIGITAL_PIN 6    // 6 Минус при включении насоса
//#define Spare                                // 7
//#define Spare                                // 8
#define RST_PIN 9                              // 9 RFID
#define SS_PIN 10                              // 10 RFID
#define FUELPOMP_RELAY__DIGITAL_PIN 11         // 11 Включение реле топливного насоса
#define FAN_RELAY__DIGITAL_PIN 12              // 12 Включение реле вентилятора охлаждения
#define LED_ERROR__DIGITAL_PIN 13              // 13 Светодиод неисправности
#define FUEL_LEVEL__ANALOG_PIN 0               // 0 Датчик уровня топлива
#define TEMP_RESISTOR__ANALOG_PIN 1            // 1 Датчик температуры охлаждающей жидкости
//#define Spare                                // 2
//#define Spare                                // 3
#define GEAR_SWITCH__ANALOG_PIN 4              // 4 Номер передачи
#define IGN_ON__ANALOG_PIN 5                   // 5 Плюс при включении зажигания
//FAN ==========================================================================================================
// Глобальные переменные
int RELAY_CURENT; // Текущее состояние реле
int TEMP_CURENT_ANALOG; // Показания с АЦП 
byte flag_FAN_CYRENT = 0;
// Константы 
#define   LOW_COLING_FAN 2
#define  HIGH_COLING_FAN 3
#define ERROR_COLING_FAN 4
//_Timer()
int Timer = LOW;
unsigned long currentTime;
unsigned long loopTime;
int TEMP_ARRAY_FAN[4] = {88,110,120, 25}; // напряжение [отключение, включение, перегрев, по температуре окр. воздуха]
//SVITCH GEAR====================================================================================================
// Константы
#define UP_GEAR 300 // Делитель напряжения GEAR_SWITCH__ANALOG_PIN
#define DOWN_GEAR 550 // Делитель напряжения GEAR_SWITCH__ANALOG_PIN
// Глобальные переменные
int GEAR_CURENT;
//
int gear, neital;
int u, g;
boolean flag_gearH = false, flag_gearL = false;
//OUT_TEMP=======================================================================================================
OneWire  ds(TEMP_DS18B20__DIGITAL_PIN);
// Глобальные переменные
int OUT_TEMP_CORECTION = 10; // 0 - 20
int OUT_TEMP_CURENT =+ (OUT_TEMP_CORECTION - 10);
//DS1307 RTC =======================================================================================================
RTC_DS1307 RTC;
char ch_time[11]; 
int time_one = 70, timer_go;
//RFID=======================================================================================================
// Константы 
MFRC522 mfrc522(SS_PIN, RST_PIN); // Create MFRC522 instance.
// Глобальные переменные
unsigned long KEY1 = 2910087621;
unsigned long KEY2 = 4124219933;
unsigned long uidDec, uidDecTemp;  // Для отображения номера карточки в десятичном формате.
int KEY_OK;
//OLED Display=======================================================================================================
Adafruit_SSD1306 display(4); //OLED_RESET
#define LINE 20 // отступ линии от левого края
#define W_PRBAR 15 // ширина элемента прогресс бара
static const unsigned char PROGMEM logo16_glcd_bmp[] = 
{B11111111, B11111111, 
B11111111, B11111111,
B11111111, B11111111,
B11111111, B11111111,
B11111111, B11111111};
// Константы 
#define M_SERVIS 1
  #define SUB_TO2 10
  #define SUB_TO3 11
  #define SUB_OIL 12
  #define SUB_CHAIN 13
  
#define M_OPTION_FAN 2
  #define SUB_ERROR 21
  #define SUB_SET_TEMP 22
  #define SUB_T_OUT 23
  #define SUB_FAN_OFF 24
  
#define M_FAN 3
  #define SUB_STATUS 30
  #define SUB_AKTIV 31
  #define SUB_CORECT_OUT 32 
  #define SUB_CORECT_ENGIN 33
  
#define M_SPEED 4
  #define SUB_CORECT 40
  #define SUB_SPEED 41
#define M_ERROR1 5
#define M_RROR2 6
#define MAIN_MENU_MAIN 111
#define MAIN_MENU_ERROR 222
#define MAIN_MENU_TAIM 333
#define MAIN_MENU_KEY 444
int servis_Limit[4] = {12000, 6000, 3000, 1000};
//_______________________________________________________________________________________________________________
void setup()
{
  //Serial.begin(9600); 
/*  
  pinMode(FAN_RELAY__DIGITAL_PIN, OUTPUT);
  pinMode(GEAR_NEITRAL__DIGITAL_PIN, INPUT);  
  digitalWrite(GEAR_NEITRAL__DIGITAL_PIN, HIGH);
attachInterrupt(INTERRUPT__INT, blnk, FALLING);            // 0 Внешнее прерывание
pinMode(GEAR_NEITRAL__DIGITAL_PIN, INPUT);                 // 4 Минус при включении нейтрали
  digitalWrite(GEAR_NEITRAL__DIGITAL_PIN, HIGH);
pinMode(FAN_CONTROL_RUN__DIGITAL_PIN, INPUT);              // 5 Минус при включении вентилятора
  digitalWrite(FAN_CONTROL_RUN__DIGITAL_PIN, HIGH);
pinMode(FUELPOMP_CONTROL_RUN__DIGITAL_PIN, INPUT);         // 6 Минус при включении насоса
  digitalWrite(FUELPOMP_CONTROL_RUN__DIGITAL_PIN, HIGH);
pinMode(FUELPOMP_RELAY__DIGITAL_PIN, OUTPUT);              // 11 Включение реле топливного насоса
pinMode(FAN_RELAY__DIGITAL_PIN, OUTPUT);                   // 12 Включение реле вентилятора охлаждения
pinMode(LED_ERROR__DIGITAL_PIN, OUTPUT);                   // 13 Светодиод неисправности
*/
 Wire.begin();
 display.begin(SSD1306_SWITCHCAPVCC, 0x3C); 
 display.setTextColor(WHITE); 
 SPI.begin();   
 mfrc522.PCD_Init(); // Init MFRC522 card  
 RTC.begin(); 
 display.clearDisplay();
 _DispleyAddMenu(MAIN_MENU_KEY,0); // Надпись на дисплее "KEY ?"
 display.display();
}
 
void loop()
{
  if (_Timer(100, 5000) == 10) // Считываем температуру каждые 5 сек
  {
    TEMP_CURENT_ANALOG = analogRead(TEMP_RESISTOR__ANALOG_PIN); // Температуру двигателя
    _Out_Temp();  // Температуру наружного воздуха
  }
  _TempMonitoring(TEMP_CURENT_ANALOG);
  _Gear_Switch_Neutral();
  DateTime now = RTC.now();// Определяем время
  if (time_one == 70)  time_one = now.second() - 2;
  if (now.second() > time_one){timer_go = now.second() - time_one;}
  else {timer_go ++;}
  sprintf (ch_time,"%02i:%02i:%02i",now.hour(),now.minute(), timer_go);
  if (KEY_OK == 0){
    unsigned long tk = _ReadKeyRFID();
    if (tk == KEY1 || tk == KEY2) KEY_OK = 1;
    display.clearDisplay();
  }
  if (KEY_OK == 1){
  _DispleyAddMenu(MAIN_MENU_MAIN,0);
  
    display.display();
    display.clearDisplay();
    delay(1000);
  }
  
}
//________________________________________________________________________________________________________________
//FUNC ***********************************************************************************************************
unsigned long _ReadKeyRFID(){
 if ( !mfrc522.PICC_IsNewCardPresent() || !mfrc522.PICC_ReadCardSerial()) return 0;
  for (byte i = 0; i < mfrc522.uid.size; i++) 
  {
    uidDecTemp = mfrc522.uid.uidByte[i];
    uidDec = uidDec*256+uidDecTemp;  
  }  
  return uidDec;
}
int _DispleyAddMenu(int fun, int str){ // номер функции, строка функции
      char* myStrings[]={"TO2", "TO3", "Oil","Chain", "Err Temp", "Temp On", "t out>30", "Temp Off"};
      char charBufVar[50];
      String stringVar;
      int iii;
      
  switch (fun) 
  {
   case M_SERVIS: // >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
      __dis(0, 0, 2, WHITE, 0);
      display.println(fun + String(">Servis"));
      if (str == SUB_TO2){ iii = servis_Limit[0]; stringVar = myStrings[0];}
      if (str == SUB_TO3){ iii = servis_Limit[1]; stringVar = myStrings[1];}
      if (str == SUB_OIL){ iii = servis_Limit[2]; stringVar = myStrings[2];}
      if (str == SUB_CHAIN){ iii = servis_Limit[3]; stringVar = myStrings[3];}
       __dis(0, 20, 2, WHITE, 0);
       stringVar.toCharArray(charBufVar, 50);
       display.println(charBufVar);
       __dis(0, 42, 3, WHITE, 1);
       display.println(iii); 
       break; // --- >
      
   case M_OPTION_FAN: // >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
      __dis(0, 0, 2, WHITE, 0);
      display.println(fun + String(">Opt Fan"));
      if (str == SUB_ERROR){ iii = TEMP_ARRAY_FAN[2]; stringVar = myStrings[4];}
      if (str == SUB_SET_TEMP){ iii = TEMP_ARRAY_FAN[1]; stringVar = myStrings[5];}
      if (str == SUB_T_OUT){ iii = TEMP_ARRAY_FAN[3]; stringVar = myStrings[6];}
      if (str == SUB_FAN_OFF){ iii = TEMP_ARRAY_FAN[0]; stringVar = myStrings[7];}
       __dis(0, 20, 2, WHITE, 0);
       stringVar.toCharArray(charBufVar, 50);
       display.println(charBufVar);
       __dis(0, 42, 3, WHITE, 1);
       display.println(iii); 
       break; // --- >
  case M_FAN: // >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
      __dis(0, 0, 2, WHITE, 0);
      display.println(fun + String(">Fan"));
          switch (str)
          {
          case SUB_STATUS:
              __dis(0, 20, 2, WHITE, 0);
              display.println("Status");
              __dis(0, 42, 3, WHITE, 0);
             if (flag_FAN_CYRENT == 1) display.println("ON");
             else display.println("OFF");
              break; // --- >
          
          case SUB_AKTIV:
              __dis(0, 20, 2, WHITE, 0);
               display.println("Activation");
              __dis(0, 42, 3, WHITE, 1);
              display.println("---"); 
              break; // --- >
               
          case SUB_CORECT_OUT:
              __dis(0, 20, 2, WHITE, 0);
               display.println("Out tem +-");
              __dis(0, 42, 3, WHITE, 1);
              display.println(OUT_TEMP_CORECTION + String("c")); 
              break; // --- >
              
          case SUB_CORECT_ENGIN:
              __dis(0, 20, 2, WHITE, 0);
               display.println("Eng tem +-");
              __dis(0, 42, 3, WHITE, 1);
              display.println(OUT_TEMP_CORECTION + String("c")); 
              break; // --- >              
          }   
 
      break; // --- >MAIN_MENU_TAIM
   case MAIN_MENU_TAIM: // >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>      
      __dis(0, 0, 2, WHITE, 0);
      display.println("Time");
       __dis(0, 20, 2, WHITE, 0);
       display.println(ch_time);
       break; // --- >
   case MAIN_MENU_MAIN: // Главный экран
      __dis(0, 0, 8, WHITE, 0); // Номер передачи
      if (GEAR_CURENT == 0) display.println("N");
      display.println(GEAR_CURENT);
   
      __dis(50, 0, 2, WHITE, 0); // Температура за бортом
      display.println( String(OUT_TEMP_CURENT, DEC));
      for (int f=0; f< random(0, 65); f+=5) {
        display.drawBitmap(128 - W_PRBAR, 64 - f , logo16_glcd_bmp, W_PRBAR, 4, WHITE);
      }
      display.drawLine(128 - LINE, 64,128 - LINE , 0, WHITE); // линия
      break; // --- >
      
    case MAIN_MENU_KEY: // >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
     __dis(0, 0, 4, WHITE, 0);
    display.println("NOKEY");
     __dis(0, 40, 1, WHITE, 0);
    display.println("Honda Varadero");
     __dis(0, 50, 1, WHITE, 0);
    display.println("computer v15.02.15");    
    break; // --- > 
  }
   display.display(); 
}
          
int __dis(int pos_s, int pos, int siz, int color, int flag){ // 1 позиция с лева, 2 с верху, 3 размер шрифта, 4 цвет 
  display.setTextSize(siz);
  display.setCursor(pos_s,pos);
 display.setTextColor(color);
  if (flag == 1)display.setTextColor(BLACK, WHITE); //Инверсия
}
int _Out_Temp() // Температура наружного воздуха
{
  byte i,present = 0,type_s,data[12],addr[8];
  float celsius;
  if ( !ds.search(addr)) ds.reset_search();
  ds.reset();
  ds.select(addr);
  ds.write(0x44, 1);  
  present = ds.reset();
  ds.select(addr);    
  ds.write(0xBE);
  for ( i = 0; i < 9; i++) data[i] = ds.read();
  int16_t raw = (data[1] << 8) | data[0];
  if (type_s){raw = raw << 3;if (data[7] == 0x10) raw = (raw & 0xFFF0) + 12 - data[6];}
  OUT_TEMP_CURENT = (float)raw / 16.0;
}  
int _Timer(int l, int h) // Возвращет 5 после времени 'l' и 10 после времени 'h'
  {
  currentTime = millis();                      
  if(currentTime >= (loopTime + l) && (Timer != HIGH)){loopTime = currentTime;Timer = HIGH;return 5;}
  if(currentTime >= (loopTime + h) && (Timer = HIGH)){loopTime = currentTime;Timer = LOW;return 10;}
}
int _TempMonitoring(int adc) // Считываем ацп указанного вывода, включаем или выключаем реле.
{
  if (adc > 150 ){_RelayColingFan(ERROR_COLING_FAN);return ERROR_COLING_FAN;} // Перегрев
  if (adc > 130){_RelayColingFan(HIGH_COLING_FAN);return HIGH_COLING_FAN;}    // Включаем
  if (adc <  80){_RelayColingFan(LOW_COLING_FAN);return LOW_COLING_FAN;}      // Выключаем
}
int _RelayColingFan(int atr) // Включение реле согласно принятому значению температуры
{
  switch (atr)
  {
    case LOW_COLING_FAN: // 80C
      digitalWrite(FAN_RELAY__DIGITAL_PIN, HIGH); // Выключено
      RELAY_CURENT = digitalRead(FAN_RELAY__DIGITAL_PIN);
      break;
 
    case HIGH_COLING_FAN: // 100C 
      digitalWrite(FAN_RELAY__DIGITAL_PIN, LOW); // Включено
      RELAY_CURENT = digitalRead(FAN_RELAY__DIGITAL_PIN);
      break; 
    
    case ERROR_COLING_FAN: // Перегрев
      break;
    
    default: //
    //
    break;
  }
}
int _Gear_Switch_Neutral()
{
  int anread = analogRead(GEAR_SWITCH__ANALOG_PIN);
  if (anread > DOWN_GEAR) {_Gear_Set(anread,DOWN_GEAR);gear = DOWN_GEAR;} // Если напряжение на делителе "равно" константе (замкнут геркон DOWN) то передаём в функцию напряжение и константу
    else if (anread > UP_GEAR) {_Gear_Set(anread,UP_GEAR);gear = UP_GEAR;} // Замкнут геркон UP
  if (anread == 0 && gear == DOWN_GEAR) {_Gear_Set(0,DOWN_GEAR);gear = 0;} // Передам в функцию ноль, геркон отключен
  if (anread == 0 && gear == UP_GEAR) {_Gear_Set(0,UP_GEAR);gear = 0;} //
  
  //if ( digitalRead(GEAR_NEITRAL__DIGITAL_PIN)== LOW ) {lcd.setCursor(0, 0); lcd.print("Neitral        "); GEAR_CURENT = 1;} //Если нейтраль то номер передачи равен одному
}
int _Gear_Set(int abc, int gear1)// Счётчик скоростей в переменной GEAR_CURENT / напряжение ацп, up или down.
{
  u = abc, g = gear1;
  if (u > g) {flag_gearL = true;}
  if (u == 0 && flag_gearL == true) {flag_gearH = true;}
  if (flag_gearH == true && flag_gearL == true)
  {
    flag_gearH = false; 
    flag_gearL = false; 
    if (g == UP_GEAR && GEAR_CURENT < 5) GEAR_CURENT++; //Ограничиваем наивысшую пердачу на 5
    if (g == DOWN_GEAR && GEAR_CURENT > 1) GEAR_CURENT--;//Ограничиваем низшую пердачу на 1
   }
}