Объединил в один скетч для arduino: ИК-Пульт, Управление рулевыми кнопками, Энкодер, Авто регулировка яркости, Активатор камеры ЗХ, Задержка включения камеры ЗХ , измерение напряжения, измерение уровня топлива.
Не нужные функции можно закоментировать в главном цикле loop
Улучшеный скетч от  echo
Внимание
Программа работает на прямую с драйвером USB-Моста FT232
аналоги arduino с другими преобразователями com to usb работать не будут
	PHP код:
	
//http://compcar.ru  
#include <IRremote.h> 
byte bytes[13];    // 0-3 байт   энкодер, рулевые кнопки, ИК приемник, веб камера 
                  //   4 байт   датчик света
                  //   5 байт   датчик напряжения
                  //   6 байт   датчик топлива
                  //   7-12 зарезервированы                  
 
int LIGHT_SENS = 0 ;   // Вход датчика освещености
int VOLT_SENS = 1 ;    // Вход датчика напряжения
int FUEL_SENS = 2 ;    // Вход датчика уровня топлива
int JOYSTIK_PIN = 5 ;  // Вход для рулевых Кнопок
int NC2_SENS = 4 ;    // Вход датчика
int NC1_SENS = 5 ;    // Вход датчика 
int NC3_SENS = 6 ;    // Вход датчика
int NC4_SENS = 7 ;    // Вход датчика
 
 
int RECV_PIN = 11;     //вход ИК приемника 
int back_cam = 6; //Вход активации камера заднего вида
int temperature = 5; //Вход датчика температуры
int encoder0PinA = 2 ; //Вывод А энкодера
int encoder0PinB = 3 ; //Вывод В энкодера
int encoder_botton = 4; //Вход кнопки энкодера
 
unsigned long res_dt, ir_dt, old_ir, time;
byte temp, cam_status;
IRrecv irrecv(RECV_PIN); 
decode_results results;
 
//******************************************
void setup()     
{ 
  pinMode(encoder0PinA, INPUT); 
  digitalWrite(encoder0PinA, HIGH);     // подключить подтягивающий резистор
  pinMode(encoder0PinB, INPUT); 
  digitalWrite(encoder0PinB, HIGH);    // подключить подтягивающий резистор
  pinMode(encoder_botton, INPUT); 
  digitalWrite(encoder_botton, HIGH);    // подключить подтягивающий резистор
   pinMode(back_cam, INPUT); 
  digitalWrite(back_cam, HIGH);    // подключить подтягивающий резистор
 
  attachInterrupt(0, doEncoderA, FALLING);  // настроить прерывание interrupt 0 на pin 2
  attachInterrupt(1, doEncoderB, FALLING);  // настроить прерывание interrupt 0 на pin 3  
Serial.begin(115200); // настроить скорость com порт   
irrecv.enableIRIn(); // включить приемник 
}  
//******************************************
void loop()  
{  
IR_resiver();
joystik();
cam();
  if ((millis()-time)>1000 && results.value ==0) //запуск процедур по таймеру
   {    
     time = millis();
      autolight();
      fuel();
      voltmetr();
   } 
}
//*******************ИК приемник***********************
void IR_resiver()
{ 
   if ((millis()-time)>1000 ) 
   {   
     time = millis();  
     results.value=0;
   }
 
  if (irrecv.decode(&results))  
  { 
    if (results.value > 0 && results.value < 0xFFFFFFFF) 
    { 
      ir_dt = results.value; 
      bytes[0] = ir_dt & 0xFF;          // преобразовать в 4-байта  
      bytes[1] = (ir_dt & 0xFF00) >> 8;  
      bytes[2] = (ir_dt & 0xFF0000) >> 16; 
      bytes[3] = (ir_dt & 0xFF000000) >> 24; 
      Serial.write( bytes,13); // отправить прочитаное значение компьютеру 
 
      if (old_ir == ir_dt){delay(300);} // Пауза после нажатия и удержания(перед повторами)
      else {delay(500);}
      old_ir = ir_dt;
    } 
           if (results.value == 0xFFFFFFFF )
            {
             delay(130); //пауза между повторами
             Serial.write( bytes,13);
            } 
       irrecv.resume(); 
  } 
}
//****************резистивные кнопки**************************
void joystik()
{  
  res_dt = analogRead(JOYSTIK_PIN); // прочитать данные АЦП 
  if( res_dt < 1023 && results.value == 0)
  {
    delay(50); // пауза для проверки дребезга
    if(res_dt == analogRead(JOYSTIK_PIN))   //если нет дребезга
      {
        bytes[0] = res_dt & 255;          // преобразовать в 2-байта 
        bytes[1] = (res_dt & 768) >> 8; 
        bytes[2] = 0;
        bytes[3] = 0;
        Serial.write( bytes,13); // отправить прочитаное значение компьютеру     
        delay(250); // Пауза между нажатиями
      }  
  }    
} 
//******************Датчик освещения************************
void autolight()
{
byte light;  
byte sens = analogRead(LIGHT_SENS)/4;  
 
if ((sens > 0) && (sens<30)) {light = 2;}   
if ((sens > 30) && (sens<60)) {light = 60;}   
if ((sens > 60) && (sens<90)) {light = 90;} 
if ((sens > 90) && (sens<120)) {light = 120;} 
if ((sens > 120) && (sens<150)) {light = 150;}   
if ((sens > 150) && (sens<190)) {light = 190;}   
if (sens > 190)  {light = 255;}   
   if(light != bytes[4]) // если были изменения
     { 
      clear_buf();   
      bytes[4] = light;
      Serial.write( bytes,13);
     }      
} 
//*******************Измерение Напряжения***********************
void voltmetr()
{
    temp = analogRead(VOLT_SENS)/4;
      if(temp !=  bytes[5])
      {
        clear_buf();
        bytes[5]=temp; 
         Serial.write( bytes,13);
      }
}
//*******************Датчик топлива***********************
void fuel()
{
      temp = analogRead(FUEL_SENS)/4;
      if(temp !=  bytes[6])
      {
        clear_buf();
        bytes[6]=temp;
         Serial.write( bytes,13);
      }
}
//*******************Активация веб камеры по сигналу ЗХ***********************
void cam()
{
  temp=digitalRead(back_cam);
   if(temp==HIGH && cam_status==0)
   {
        clear_buf();
        cam_status=255;
        bytes[1]=8;
        Serial.write( bytes,13); 
   } 
       if(temp==LOW && cam_status==255)
         {
          clear_buf();
          cam_status=0; 
          bytes[1]= 9;
          Serial.write( bytes,13);
         }
}
//*******************Активация веб камеры по сигналу ЗХ***********************
void clear_buf()
{
      bytes[0] = 0;
      bytes[1] = 0;
      bytes[2] = 0; 
      bytes[3] = 0;
}
//*******************обработка прерывания***********************
void doEncoderA()
{
cli();
  if(digitalRead(encoder0PinB)==HIGH){bytes[1]=24;}else{bytes[1]=15;} 
      bytes[0] = 0;
      bytes[2] = 0; 
      bytes[3] = 0;
  Serial.write( bytes,13);
sei(); 
}  
//*******************обработка прерывания***********************
void doEncoderB()
{
cli();
    if(digitalRead(encoder0PinA)==HIGH){bytes[1]=15;}else{bytes[1]=24;}
      bytes[0] = 0;
      bytes[2] = 0; 
      bytes[3] = 0;
    Serial.write( bytes,13);
sei();    
} 
 Схема 
