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 ;
}
}
@beic, 👍0
Обсуждение1 ответ
ESP8266 не знает, что такое прерывание "LOW". Вам придется изменить свой код, чтобы использовать только прерывания FALLING, RISING или CHANGE.
Перепробовал все из них, FALLING дает мне лучший результат, также я сделал pinMode(PinA, INPUT); и удалил digitalPinToInterrupt(), и сделал PinB attachInterrupt, но вывод странный, есть дубликаты и перепутанные счетчики. [ссылка](https://s8.postimg.cc/6j9vs34hx/ser_output.png), @beic
возможно, ваш debounce не является - [возможно, этот код может помочь](https://github.com/LennartHennigs/ESPRotary/blob/master/src/ESPRotary.cpp), @Jaromanda X
@JaromandaX попробовал это сделать, но это работает очень плохо, пропускает и путает числа., @beic
- От Uno до Mega, и где ошибка необъявленного прерывания?
- Отсутствуют импульсы ATTiny88 - возможно
- AT-команда не отвечает на последовательный монитор
- Отправка данных Arduino в MySQL с помощью phpMyAdmin и XAMPP на Windows10
- Arduino выводит значения мусора на serial monitor с ESP8266
- ошибка: espcomm_upload_mem failed при загрузке скетча
- фатальная ошибка ESP8266WiFi.h: Такого файла или каталога нет
- Как подключить Wi-Fi Shield ESP-12E-ESP8266-UART-WIFI-Wireless-Shield к Arduino
Определите значение слова «не работает»... Эта фраза может означать что угодно: от «нервного движения» до «всё взорвалось и сожгло мне брови»., @Majenko
@Majenko Нет, не взорвался, просто нет вывода на последовательный монитор., @beic
Даже начального сообщения «Запуск» нет?, @Majenko
Да, я получаю сообщение «Запуск...», @beic
Чтобы быть уверенным на 100%, я перекомпилировал для Arduino Uno, как мы говорим, и протестировал с обоими типами вращающегося энкодера (KY-040 и MJKDZ), и это работает так, как и ожидалось. Но, как я уже сказал, это не выводит ничего, кроме "Starting..." на платформе ESP8266. @Majenko, @beic