Немного продвинулся с этим энкодером. Получилось реализовать вращение влево/вправо, одиночное и длинное нажатие, а также 8 направлений вертикальной оси. Всё подключено через Ардуину и успешно управляет iCarDS.
Пока не могу только разобраться, как сделать функцию нажатия кнопки с поворотом энкодера. Может кто подскажет?
И ещё, как сделать обратную связь на этом энкодере? Там стоит обычный электродвигатель и из него выходит только 2 провода. Как именно подавать на него импульсы, чтобы он не крутился, а просто замирал на месте и создавал небольшое сопротивление кручению, но при этом энкодер можно было бы поворачивать? Тоесть, энкодер будет проворачиваться ступеньками.
Пока использую такой код:

PHP код:
#define encoder0PinC 3 
#define ledPin 13 // цифровой выход светодиода
#define debounce 100 // ms время антидребезга при нажатии и отпускании кнопки
#define holdTime 500 // ms время удержания: как долго ждать срабатывания днинного нажатия

// Контакты джойстика
#define joy0PinA 22
#define joy0PinB 23
#define joy0PinC 24
#define joy0PinD 25
#define joy0PinE 26
#define joy0PinF 27
#define joy0PinG 28
#define joy0PinH 29

// Переменные кнопки
byte bytes[4];
int buttonVal 0// значение, считанное с кнопки
int buttonLast 0// буферное значение предыдущего состояния кнопки
long btnDnTime// время, сколько кнопка была нажата
long btnUpTime// время отпускания кнопки
boolean ignoreUp false// игнорировать отпускание кнопки, 
                          //потому что сработало длительное нажатие

// Переменные энкодера
int encoder0PinA 2;
int encoder0PinB 4;
int encoder0Pos 0;
int encoder0PinALast LOW;
int n LOW;

// Светодиод
boolean ledVal false// состояние LED
//=================================================

void setup() 
{
 
// входы энкодера
  
pinMode(encoder0PinAINPUT);
  
digitalWrite(encoder0PinAHIGH );
  
pinMode(encoder0PinBINPUT);
  
digitalWrite(encoder0PinBHIGH );
  
 
// вход кнопки энкодера
 
pinMode(encoder0PinCINPUT);
 
digitalWrite(encoder0PinCHIGH );
  
 
// входы джойстика
 
pinMode(joy0PinAINPUT);
  
digitalWrite(joy0PinAHIGH );
  
pinMode(joy0PinBINPUT);
  
digitalWrite(joy0PinBHIGH );
  
pinMode(joy0PinCINPUT);
  
digitalWrite(joy0PinCHIGH );
  
pinMode(joy0PinDINPUT);
  
digitalWrite(joy0PinDHIGH );
  
pinMode(joy0PinEINPUT);
  
digitalWrite(joy0PinEHIGH );
  
pinMode(joy0PinFINPUT);
  
digitalWrite(joy0PinFHIGH );
  
pinMode(joy0PinGINPUT);
  
digitalWrite(joy0PinGHIGH );
  
pinMode(joy0PinHINPUT);
  
digitalWrite(joy0PinHHIGH );

 
// выход светодиода
 
pinMode(ledPinOUTPUT);
 
digitalWrite(ledPinledVal);
 
 
Serial.begin(115200);
 }
//=================================================

void loop()
{
// Энкодер
   
digitalRead(encoder0PinA);
   if ((
encoder0PinALast == LOW) && (== HIGH)) {
     if (
digitalRead(encoder0PinB) == LOW) {
      
bytes[0] = 0xEE;           
      
bytes[1] = 0
      
bytes[2] = encoder0PinA;
      
bytes[3] = 1;  
      
Serial.writebytes,4);  // EE000201
     
} else {
      
bytes[0] = 0xEE;           
      
bytes[1] = 0
      
bytes[2] = encoder0PinB;
      
bytes[3] = 1;  
      
Serial.writebytes,4);  // EE000401
     
}
   } 
   
encoder0PinALast n;
// \\ Энкодер  

 
buttonVal digitalRead(encoder0PinC); // прочитать состояние кнопки

 // Проверить нажатие кнопки и записать длительность нажатия
 
if (buttonVal == LOW && buttonLast == HIGH && (millis() - btnUpTime) > long(debounce))
 {
 
btnDnTime millis();
 }

 
// Проверить, отпущена ли кнопка и записать длительность отжатия
 
if (buttonVal == HIGH && buttonLast == LOW && (millis() - btnDnTime) > long(debounce))
 {
   if (
ignoreUp == false) {
     
ledVal = !ledVal;
     
digitalWrite(ledPinledVal);
     
delay(200);
     
digitalWrite(13,LOW);//выключаем
     
bytes[0] = 0xEEbytes[1] = 0bytes[2] = encoder0PinCbytes[3] = 1;  
     
Serial.writebytes,4); // EE000301
   
}
   else { 
ignoreUp false;
     
btnUpTime millis();
   }
 }

 
// Проверить, нажата ли кнопка дольше времени удержания
 
if (buttonVal == LOW && buttonLast == LOW && (millis() - btnDnTime) > long(holdTime))
 {
    
ledVal = !ledVal;
    
digitalWrite(ledPinledVal);
    
delay(200);
    
digitalWrite(13,LOW);//выключаем
    
bytes[0] = 0xEEbytes[1] = 0bytes[2] = encoder0PinCbytes[3] = 2;  
    
Serial.writebytes,4); // EE000302
    
ignoreUp true;
    
btnDnTime millis();
 }
 
buttonLast buttonVal;
 

// Джойстик //
//////////////
  
if (digitalRead(joy0PinA)==LOW) {//влево
     
digitalWrite(ledPin,HIGH);//включаем светодиод 
     
delay(200);
     
digitalWrite(ledPin,LOW);//выключаем
     
bytes[0] = 0xEEbytes[1] = 0bytes[2] = joy0PinAbytes[3] = 0;  
     
Serial.writebytes,4);  // EE001900
  
}
  if (
digitalRead(joy0PinB)==LOW) {
     
digitalWrite(ledPin,HIGH);//включаем светодиод 
     
delay(200);
     
digitalWrite(ledPin,LOW);//выключаем
     
bytes[0] = 0xEEbytes[1] = 0bytes[2] = joy0PinBbytes[3] = 0;  
     
Serial.writebytes,4);  // EE001800
  
}
  if (
digitalRead(joy0PinC)==LOW) {
     
digitalWrite(ledPin,HIGH);//включаем светодиод 
     
delay(200);
     
digitalWrite(ledPin,LOW);//выключаем
     
bytes[0] = 0xEEbytes[1] = 0bytes[2] = joy0PinCbytes[3] = 0;  
     
Serial.writebytes,4);  // EE001700
  
}
  if (
digitalRead(joy0PinD)==LOW) {//
     
digitalWrite(ledPin,HIGH);//включаем светодиод 
     
delay(200);
     
digitalWrite(ledPin,LOW);//выключаем
     
bytes[0] = 0xEEbytes[1] = 0bytes[2] = joy0PinDbytes[3] = 0;  
     
Serial.writebytes,4);  // EE001600
  
}
  if (
digitalRead(joy0PinE)==LOW) {//
     
digitalWrite(ledPin,HIGH);//включаем светодиод 
     
delay(200);
     
digitalWrite(ledPin,LOW);//выключаем
     
bytes[0] = 0xEEbytes[1] = 0bytes[2] = joy0PinEbytes[3] = 0;  
     
Serial.writebytes,4);  // EE001C00
  
}
  if (
digitalRead(joy0PinF)==LOW) {//отмена
     
digitalWrite(ledPin,HIGH);//включаем светодиод 
     
delay(200);
     
digitalWrite(ledPin,LOW);//выключаем
     
bytes[0] = 0xEEbytes[1] = 0bytes[2] = joy0PinFbytes[3] = 0;  
     
Serial.writebytes,4);  // EE001B00
  
}
  if (
digitalRead(joy0PinG)==LOW) {//
     
digitalWrite(ledPin,HIGH);//включаем светодиод 
     
delay(200);
     
digitalWrite(ledPin,LOW);//выключаем
     
bytes[0] = 0xEEbytes[1] = 0bytes[2] = joy0PinGbytes[3] = 0;  
     
Serial.writebytes,4);  // EE001A00
  
}
  if (
digitalRead(joy0PinH)==LOW) {//вправо
     
digitalWrite(ledPin,HIGH);//включаем светодиод 
     
delay(200);
     
digitalWrite(ledPin,LOW);//выключаем
     
bytes[0] = 0xEEbytes[1] = 0bytes[2] = joy0PinHbytes[3] = 0;  
     
Serial.writebytes,4);  // EE001D00
  
}