Ладно по экспериментирую потом с портами, вот такая структура получается, дальше пока не могу писать, тк нет полной обвязки от ардуино.

Осторожно много букф

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,12025}; // напряжение [отключение, включение, перегрев, по температуре окр. воздуха]

//SVITCH GEAR====================================================================================================

// Константы
#define UP_GEAR 300 // Делитель напряжения GEAR_SWITCH__ANALOG_PIN
#define DOWN_GEAR 550 // Делитель напряжения GEAR_SWITCH__ANALOG_PIN

// Глобальные переменные
int GEAR_CURENT;

//
int gearneital;
int ug;
boolean flag_gearH falseflag_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 70timer_go;

//RFID=======================================================================================================

// Константы 

MFRC522 mfrc522(SS_PINRST_PIN); // Create MFRC522 instance.

// Глобальные переменные
unsigned long KEY1 2910087621;
unsigned long KEY2 4124219933;
unsigned long uidDecuidDecTemp;  // Для отображения номера карточки в десятичном формате.
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[] = 
{
B11111111B11111111
B11111111B11111111,
B11111111B11111111,
B11111111B11111111,
B11111111B11111111};

// Константы 
#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] = {12000600030001000};

//_______________________________________________________________________________________________________________


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_SWITCHCAPVCC0x3C); 
 
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(1005000) == 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 == KEY2KEY_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 0mfrc522.uid.sizei++) 
  {
    
uidDecTemp mfrc522.uid.uidByte[i];
    
uidDec uidDec*256+uidDecTemp;  
  }  
  return 
uidDec;
}


int _DispleyAddMenu(int funint str){ // номер функции, строка функции
      
charmyStrings[]={"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(002WHITE0);
      
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(0202WHITE0);
       
stringVar.toCharArray(charBufVar50);
       
display.println(charBufVar);
       
__dis(0423WHITE1);
       
display.println(iii); 
       break; 
// --- >
      
   
case M_OPTION_FAN// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
      
__dis(002WHITE0);
      
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(0202WHITE0);
       
stringVar.toCharArray(charBufVar50);
       
display.println(charBufVar);
       
__dis(0423WHITE1);
       
display.println(iii); 
       break; 
// --- >

  
case M_FAN// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
      
__dis(002WHITE0);
      
display.println(fun String(">Fan"));
          switch (
str)
          {
          case 
SUB_STATUS:
              
__dis(0202WHITE0);
              
display.println("Status");
              
__dis(0423WHITE0);
             if (
flag_FAN_CYRENT == 1display.println("ON");
             else 
display.println("OFF");
              break; 
// --- >
          
          
case SUB_AKTIV:
              
__dis(0202WHITE0);
               
display.println("Activation");
              
__dis(0423WHITE1);
              
display.println("---"); 
              break; 
// --- >
               
          
case SUB_CORECT_OUT:
              
__dis(0202WHITE0);
               
display.println("Out tem +-");
              
__dis(0423WHITE1);
              
display.println(OUT_TEMP_CORECTION String("c")); 
              break; 
// --- >
              
          
case SUB_CORECT_ENGIN:
              
__dis(0202WHITE0);
               
display.println("Eng tem +-");
              
__dis(0423WHITE1);
              
display.println(OUT_TEMP_CORECTION String("c")); 
              break; 
// --- >              
          
}   
 
      break; 
// --- >MAIN_MENU_TAIM

   
case MAIN_MENU_TAIM// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>      
      
__dis(002WHITE0);
      
display.println("Time");
       
__dis(0202WHITE0);
       
display.println(ch_time);
       break; 
// --- >


   
case MAIN_MENU_MAIN// Главный экран
      
__dis(008WHITE0); // Номер передачи
      
if (GEAR_CURENT == 0display.println("N");
      
display.println(GEAR_CURENT);
   
      
__dis(5002WHITE0); // Температура за бортом
      
display.printlnString(OUT_TEMP_CURENTDEC));

      for (
int f=0frandom(065); f+=5) {
        
display.drawBitmap(128 W_PRBAR64 logo16_glcd_bmpW_PRBAR4WHITE);
      }

      
display.drawLine(128 LINE64,128 LINE 0WHITE); // линия
      
break; // --- >
      
    
case MAIN_MENU_KEY// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
     
__dis(004WHITE0);
    
display.println("NOKEY");
     
__dis(0401WHITE0);
    
display.println("Honda Varadero");
     
__dis(0501WHITE0);
    
display.println("computer v15.02.15");    
    break; 
// --- > 
  
}
   
display.display(); 
}
          

int __dis(int pos_sint posint sizint colorint flag){ // 1 позиция с лева, 2 с верху, 3 размер шрифта, 4 цвет 
  
display.setTextSize(siz);
  
display.setCursor(pos_s,pos);
 
display.setTextColor(color);
  if (
flag == 1)display.setTextColor(BLACKWHITE); //Инверсия
}


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(0x441);  
  
present ds.reset();
  
ds.select(addr);    
  
ds.write(0xBE);

  for ( 
09i++) data[i] = ds.read();

  
int16_t raw = (data[1] << 8) | data[0];
  if (
type_s){raw raw << 3;if (data[7] == 0x10raw = (raw 0xFFF0) + 12 data[6];}
  
OUT_TEMP_CURENT = (float)raw 16.0;
}  

int _Timer(int lint 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_PINHIGH); // Выключено
      
RELAY_CURENT digitalRead(FAN_RELAY__DIGITAL_PIN);
      break;
 
    case 
HIGH_COLING_FAN// 100C 
      
digitalWrite(FAN_RELAY__DIGITAL_PINLOW); // Включено
      
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 == && gear == DOWN_GEAR) {_Gear_Set(0,DOWN_GEAR);gear 0;} // Передам в функцию ноль, геркон отключен
  
if (anread == && 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 abcint gear1)// Счётчик скоростей в переменной GEAR_CURENT / напряжение ацп, up или down.
{
  
abcgear1;

  if (
g) {flag_gearL true;}
  if (
== && flag_gearL == true) {flag_gearH true;}
  if (
flag_gearH == true && flag_gearL == true)
  {
    
flag_gearH false
    
flag_gearL false
    if (
== UP_GEAR && GEAR_CURENT 5GEAR_CURENT++; //Ограничиваем наивысшую пердачу на 5
    
if (== DOWN_GEAR && GEAR_CURENT 1GEAR_CURENT--;//Ограничиваем низшую пердачу на 1
   
}