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 ответ
▲ 1
ESP8266 не знает, что такое прерывание "LOW". Вам придется изменить свой код, чтобы использовать только прерывания FALLING, RISING или CHANGE.
,
@Majenko
Смотрите также:
- От 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