Библиотека Encoder + Bounce2

Я работаю над дедупликацией вращающегося энкодера с ключами, используя найденную здесь библиотеку Bounce2 ( https://github.com /thomasfredericks /Bounce2 ).

Я считаю, что проблема кроется в моем коде, поскольку в плане схемы не так много. Кодер подключается к моему arduino следующим образом

  • 5V: подключен к выходу 5v на arduino
  • GND: подключен к GND
  • SW: подключен к контакту A1
  • DT: подключен к контакту 3
  • CLK: подключен к контакту 2

Я пытаюсь вызвать ISR из ввода CLK. Когда ISR вызывается, он должен увеличивать или уменьшать значение в зависимости от направления, в которое был повернут кодировщик. Этот кодер привязан к ISR, потому что он будет использоваться для ввода пользователем, и я бы хотел, чтобы он оставался отзывчивым во всем эскизе.

Раньше я использовал millis () для отладки кодировщика, но мне все еще не удалось получить более одного ввода от кодировщика. Я надеялся, что эта библиотека разрешит эту проблему.

Токовый выход кода, который я включил, никогда не увеличивает /уменьшает начальное значение независимо от того, в каком направлении поворачивается кодер. Короче говоря, он всегда выводит 0.

Если кто-то может объяснить, что я делаю неправильно, это было бы замечательно! Тогда, может быть, но, может быть, я могу перестать биться головой о мой стол. : Р

Спасибо, Кевин

#include <Bounce2.h>

#define sw A1
#define LED_PIN 9
#define clk 2
#define dt 3

int ledState = LOW;
int onOff = LOW;

volatile int virtualPosition = 0;
int lastCount = 0;


// Initiate bounce objects
Bounce debouncerSW = Bounce();
Bounce debouncerROT = Bounce();

void setup() {
  Serial.begin(115200);

  pinMode(sw, INPUT_PULLUP);
  pinMode(clk, INPUT);
  pinMode(dt, INPUT);
  pinMode(LED_PIN, OUTPUT);

  // set up button instace
  debouncerSW.attach(sw);
  debouncerSW.interval(100);

  // set up rotary encoder instance
  debouncerROT.attach(clk);
  debouncerROT.interval(10);

  // setup the LED
  digitalWrite(LED_PIN, ledState);

  // attach ISR
  attachInterrupt(digitalPinToInterrupt(clk), isr, LOW);

  Serial.println("Start"); // just to let me know sketch has finished setup
}

void loop() {

  debouncerSW.update();

  if ( debouncerSW.fell() ) {
    ledState = !ledState;
    onOff = !onOff;
    digitalWrite(LED_PIN, ledState);

    //read-outs
    Serial.print("onOff = ");
    Serial.println(onOff);
  }
  virtualPosition = lastCount;

  //read-outs
  Serial.print ("lastCount = ");
  Serial.println (lastCount);

  delay(1000); // for readability / simulates delay time for rest of main sketch
} // end main loop

void isr ()  {

  // Update the Bounce instance :
  debouncerROT.update();

  if (debouncerROT.fell()) {
    if (digitalRead(dt) == LOW)
    {
      virtualPosition -- ; // Could be -5 or -10
    }
    else {
      virtualPosition ++ ; // Could be +5 or +10
    }

    // Restrict value from 0 to 100
    virtualPosition = min(100, max(0, virtualPosition));
  }
} // end ISR
3 голоса | спросил kevinconnectable 12 MonEurope/Moscow2016-12-12T22:09:52+03:00Europe/Moscow12bEurope/MoscowMon, 12 Dec 2016 22:09:52 +0300 2016, 22:09:52

1 ответ


0

Библиотека ClickEncoder отлично работает с поворотным кодировщиком Keyes: https://github.com/0xPIT/encoder . Кнопка сообщает о нескольких состояниях: Clicked, DoubleClicked, Held и Released. Он использует аналоговые контакты A1, A0, A2. Вам также понадобится библиотека TimerOne: https://code.google.com/архив /р /Arduino-timerone /загрузки .

У моих поворотных кодеров с ключами есть 3 опорных резистора на нижней стороне печатной платы. R1 не имеет ничего, R2 и R3 имеют резистор 10 кОм, спаянный на месте. Не уверен, что это имеет значение.

ответил VE7JRO 21 AM00000020000005731 2017, 02:13:57

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132