ESP8266 Arduino и вращающийся энкодер

Я пытаюсь использовать скетч ниже для работы с моим WeMos D1 mini (платформа ESP8266 Arduino) вместе с вращающимся энкодером KY-040 или MJKDZ, и он не работает по какой-то причине, но тот же скетч отлично работает на Arduino Uno (с разным назначением выводов - 2, 3, 4).

Может ли кто-нибудь объяснить мне, в чем проблема с эскизом?

const int PinA = 14; // Используется для генерации прерываний с использованием сигнала CLK
const int PinB = 12; // Используется для чтения сигнала DT
const int PinSW = 13; // Используется для кнопочного переключателя


int lCnt = 0; // Отслеживаем последнее вращающееся значение
volatile int vPos = 0; // Обновляется ISR (Процедура обработки прерываний)

void isr_event ()  {
  static unsigned long lIsrTmr = 0; // Время последнего прерывания
  unsigned long IsrTmr = millis(); // Время прерывания

  // Если прерывания приходят быстрее 5 мс, считаем, что это дребезг, и игнорируем
  if (IsrTmr - lIsrTmr > 5) {
    if (digitalRead(PinB) == LOW)
    {
      vPos++ ; // Может быть +5 или +10
    }
    else {
      vPos-- ; // Может быть -5 или -10
    }

    // Ограничить значение от 0 до +100
    vPos = min(10, max(0, vPos));

    // Отслеживайте, когда мы были здесь в последний раз (не чаще, чем каждые 5 мс)
    lIsrTmr = IsrTmr;
  }
}

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

  // Вращающиеся импульсы — это ВХОДЫ
  pinMode(PinA, INPUT);
  pinMode(PinB, INPUT);

  pinMode(PinSW, INPUT_PULLUP); // Переключатель плавающий, поэтому используем встроенный PULLUP, чтобы нам не нужен был резистор

  attachInterrupt(digitalPinToInterrupt(PinA), isr_event, LOW); // Присоединяем процедуру для обслуживания прерываний

  Serial.println(F("Starting..."));  // Готово к работе!
}

void loop()
{

  // Кто-то нажимает поворотный переключатель?
  if ((!digitalRead(PinSW))) {
    vPos = 0;
    while (!digitalRead(PinSW))
      delay(10);
  }

  // Если текущее положение поворотного переключателя изменилось, то обновить все
  if (vPos != lCnt) {
    // Записываем в последовательный монитор значение и направление
    Serial.println(vPos);
    // Отслеживайте это новое значение
    lCnt = vPos ;
  }
}

, 👍0


1 ответ


1

ESP8266 не знает, что такое прерывание "LOW". Вам придется изменить свой код, чтобы использовать только прерывания FALLING, RISING или CHANGE.

,