Показать сообщение отдельно
Старый 12.01.2019, 16:01   #835
Alex15BV
Пользователь
 
Регистрация: 01.11.2017
Возраст: 50
Город: Лобня
Регион: 50, 90, 150
Машина: BMW 530D Touring
Сообщений: 96
Alex15BV is a jewel in the roughAlex15BV is a jewel in the roughAlex15BV is a jewel in the rough
По умолчанию

Цитата:
Сообщение от fishdimka Посмотреть сообщение
задача:
-при повороте энкодера по часовой стрелке срабатывала кнопка "стрелка вправо" KEY_RIGHT_ARROW
-при повороте против часовой "стрелка влево" KEY_LEFT_ARROW
-при нажатии энкодера Enter "KEY_RETURN"
Я в Ардуино чайник, но сделал себе - и работает, как часики: и переключение режимов работы, и длительбность нажатия)
Сделал на прерываниях (здесь кусок, касающийся только энкодера):
PHP код:
#include <Mouse.h>
#include <Keyboard.h>
#include <Tablet.h>

#define KeyEncPin 2     // кнопка энкодера
#define EncAcPin 3      // энкодер - канал А
#define EncBcPin 5      // энкодер - канал В

volatile boolean RightMove false;   // направления вращения энкодера
volatile boolean LeftMove false;    
volatile boolean EncPress false;    // нажатия кнопки энкодера

// ----- обработчики прерываний -------

void EncoderMove() {                     // вращение энкодера
  
if (digitalRead(EncBcPin) == HIGH) {
    
RightMove true;
  }
  else {
    
LeftMove true;
  }
}

void KeyEncPress() {        // кнопка энкодера
  
EncPress true;
}

void setup() {
  
pinMode(KeyEncPinINPUT_PULLUP);                                           // кнопка энкодера - при нажатии PLAY/PAUSE либо ENTER/ESCAPE
  
attachInterrupt(digitalPinToInterrupt(KeyEncPin), KeyEncPressFALLING);
  
pinMode(EncAcPinINPUT_PULLUP);                                            // канал-А энкодера - для отслеживания вращения
  
attachInterrupt(digitalPinToInterrupt(EncAcPin), EncoderMoveFALLING);
  
pinMode(EncBcPinINPUT_PULLUP);                                            // канал-В энкодера - для определения направления вращения
  
pinMode(LedPinOUTPUT);

  
Serial.begin(9600);                 // инициализация интерфейсов
  
Keyboard.begin();
  
Mouse.begin();
  
delay(500);
}

void loop() {
  if (
RightMove == true) {             // обработка вращения энкодера: если вращаем вправо - увеличить громкость/стрелка вверх
    
if (MediaMode == true) {
      
Tablet.vol_up();
      
Tablet.clear();
    }
    else {
      
Keyboard.press(KEY_UP_ARROW);
      
delay(10);
      
Keyboard.release(KEY_UP_ARROW);
    }
    
RightMove false;
  }

  if (
LeftMove == true) {               // если вращаем влево - уменьшаем громкость/стрелка вниз
    
if (MediaMode == true) {
      
Tablet.vol_down();
      
Tablet.clear();
    }
    else {
      
Keyboard.press(KEY_DOWN_ARROW);
      
delay(10);
      
Keyboard.release(KEY_DOWN_ARROW);
    }
    
LeftMove false;
  }

  if (
EncPress == true) {                       // обнаружили факт нажатия кнопки энкодера - определяем длительность нажатия и запоминаем кнопку
    
delay(20);
    while (
digitalRead(KeyEncPin) == LOW) {     // пока не отпустим -
      
TimePress millis() - EventStart;        // считаем время нажатия
      
delay(10);
    }
    
KeyNumber 1;                              // сохраняем номер нажатой кнопки для обработчика
    
EncPress false;                           // сбрасываем флаг нажатия
    
NeedWork 1;                               // взводим флаг необходимости обработки нажатия
    
if (TimePress <= 400) {                     // сохраняем длительность нажатия
      
ShortKey 1;
    }
    else {
      
ShortKey 0;
    }
  }
...


Последний раз редактировалось Alex15BV; 14.01.2019 в 18:03.
Alex15BV вне форума   Ответить с цитированием