Цитата:
Сообщение от 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(KeyEncPin, INPUT_PULLUP); // кнопка энкодера - при нажатии PLAY/PAUSE либо ENTER/ESCAPE
attachInterrupt(digitalPinToInterrupt(KeyEncPin), KeyEncPress, FALLING);
pinMode(EncAcPin, INPUT_PULLUP); // канал-А энкодера - для отслеживания вращения
attachInterrupt(digitalPinToInterrupt(EncAcPin), EncoderMove, FALLING);
pinMode(EncBcPin, INPUT_PULLUP); // канал-В энкодера - для определения направления вращения
pinMode(LedPin, OUTPUT);
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;
}
}
...
}