Легко!

PHP код:
/*
  Семь кнопок: 
  Вкл/Выкл питания нагрузки
  Режим 1 (короткое нажатие)
  Режим 1 (длинное нажатие)
  Режим 2 (короткое нажатие)
  Режим 2 (длинное нажатие)
  Громкость +
  Громкость -
 
 Питание на нагрузку подается либо при начальной инициализации системы, 
 либо программно (для вкл/выкл нагрузки без снятия питания со всей системы)
 По включению питания формируется импульс сброса самотестирования нагрузки. 
 Громкость выставляется в предустановленный уровень.
 
 The circuit:
 * Оптрон Режима 1  attached from pin 9 to ground 
 * Оптрон Режима 2  attached from pin 11 to ground
 * Оптрон Вкл/Выкл  attached from pin 7 to ground
 * Оптрон "Громкость"  attached from pin 10 to ground
 * pin 8 attached to pin 11   
 * pin 7 attached to pin 12
  
  ******************
 modified 22.01.2010
  */

// constants won't change. They're used here to 
// set pin numbers:
const int buttonPin1 12;     // Вход с питания
const int buttonPin2 8;      // Вход с формирователя сброса
const int buttonPin7 6;      // Включение/выключение питания
const int ledPin4 =  9;        // Управление 1 режимом
const int ledPin5 =  11;       // Управление 2 режимом/Ипульс сброса теста
const int ledPin2 =  7;        // Включение нагрузки
const int redPin   10;       // Управление громкостью
int val;


// variables will change:
int buttonState 0;         // variable for reading the pushbutton status
int redLEDValue   50;      // Предустановленный уровень громкости

void setup() {
  
Serial.begin(115200);              //установка порта 
  // initialize the LED pin as an output:
  
pinMode(ledPin2OUTPUT);
  
pinMode(ledPin4OUTPUT); 
  
pinMode(ledPin5OUTPUT);
  
pinMode(redPinOUTPUT);   // sets the pins as output
    // initialize the pushbutton pin as an input:
  
pinMode(buttonPin1INPUT);
  
pinMode(buttonPin2INPUT);
  
pinMode(buttonPin7INPUT);
  
analogWrite(redPinredLEDValue);

    
// turn LED on:    
    
digitalWrite(ledPin2HIGH); // Первое включение системы
   
  // read the state of the pushbutton value:
  
buttonState digitalRead(buttonPin1);

            
// Если питание подано, формируется импульс сброса с задержкой 2 сек:
  
if (buttonState == HIGH) {     
    
// turn LED on: 
   
delay(2000);                  // пауза на сброс теста for a 2 second (подбирается вручную)
    
digitalWrite(ledPin5HIGH); // Импульс сброса 1 сек 
   
delay(1000);  
  } 
  else {
  }
}

void loop() {
            
// Если нагрузка уже инициалирована, переход в рабочую программу
  
while (digitalRead(buttonPin1) == HIGH) {
     
work(); 
   }
             
// Если нагрузка не инициалирована, переход в инициализацию
  
while (digitalRead(buttonPin1) == LOW) {
     
initial(); 
   }
}
void initial(){   
  
delay(1000);                  // пауза на включение
   // Выбор режима Вкл/Выкл:
  
if (Serial.available())          //если есть принятый символ, 
  
{
    
val Serial.read();            //  то читаем его и сохраняем в val  
   
  
buttonState digitalRead(buttonPin7);
  
  if (
val == 'd') {     
    
// turn LED on:    
    
digitalWrite(ledPin2HIGH); // Включение питания
     

  else {
      }
  
// read the state of the pushbutton value:
  
buttonState digitalRead(buttonPin1);

          
// Если питание подано, формируется импульс сброса с задержкой 2 сек:
  
if (buttonState == HIGH) {     
    
// turn LED on: 
   
delay(2000);                  // пауза на сброс теста for a 2 second (подбирается вручную)
    
digitalWrite(ledPin5HIGH); // Импульс сброса 1 сек 
   
delay(1000);  
  } 
  else {
  }

         
// Если импульс сброса сформирован, переход к рабочему циклу
   
while (digitalRead(buttonPin2) == HIGH) {
     
work(); 
   }
}
}

void work(){
  
digitalWrite(ledPin5LOW); // Снятие импульса сброса
           
           // Выбор режима 1 короткое/длинное нажатие:
  
  
if (Serial.available())          //если есть принятый символ, 
  
{
    
val Serial.read();            //  то читаем его и сохраняем в val 
  
  
  
if (val == '1') {     
    
// turn LED on:    
    
digitalWrite(ledPin4HIGH); 
   
delay(1000);                  // Короткое нажатие (Реж.1)
  
digitalWrite(ledPin4LOW);    // set the LED off 
  

  else {
    
// turn LED off:
    
digitalWrite(ledPin4LOW); 
  }
  
  if (
val == '3') {     
    
// turn LED on:    
    
digitalWrite(ledPin4HIGH); 
   
delay(3000);                  // Длинное нажатие (Реж.1)
  
digitalWrite(ledPin4LOW);    // set the LED off 
  

  else {
    
// turn LED off:
    
digitalWrite(ledPin4LOW); 
  }
            
// Выбор режима 2 короткое/длинное нажатие:
  
  
if (val == '5') {     
    
// turn LED on:    
    
digitalWrite(ledPin5HIGH); 
   
delay(1000);                  // Короткое нажатие (Реж.2)
  
digitalWrite(ledPin5LOW);    // set the LED off 
  

  else {
    
// turn LED off:
    
digitalWrite(ledPin5LOW); 
}

  if (
val == '7') {     
    
// turn LED on:    
    
digitalWrite(ledPin5HIGH); 
   
delay(3000);                  // Длинное нажатие (Реж.2)
  
digitalWrite(ledPin5LOW);    // set the LED off 
  

  else {
    
// turn LED off:
    
digitalWrite(ledPin5LOW); 
  }
  
  if (
val == 'b' && redLEDValue 1){ // Уменьшение громкости

redLEDValue -= 1// Red down
}

  if (
val == '9' && redLEDValue 255 ) {  // Увеличение громкости

redLEDValue += 1// Red up
}

// analogWrite() expects 2 parameters, the object/pin and a value between 0 (off) and 255 (full on)
analogWrite(redPin,   redLEDValue);   // Write current values to LED pins
delay(50); 
  
  
          
// Включение/выключение питания:
  
  
if (val == 'd') {     
    
// turn LED on:    
    
digitalWrite(ledPin2LOW); 
   
delay(1000);                  // 
  
digitalWrite(ledPin2LOW);    // set the LED off 
  

  else {
  }
  }

РД изначально управлялся двумя кнопками (длинное и короткое нажатие на каждой), ну и регулировка громкости, совмещенная с вкл/выкл. Из-за того, что планируется скрытая установка, все управление пришлось выносить на тач, плюс сволочной режим самотестирования по включению... Теперь все это обойдено

Работа связки оттестирована на макете (РД заменен пока на имитатор его узлов) - вроде все пашет, как и хотелось бы.