Доброго дня.
Вопрос Гайверу на гитхабе задал, но пока нет ответа.
Решил попросить помощи здесь-раньше помогали.
Не утверждаю, что проблема в самой библиотеке.
Хочу понять где причина и как исправить.
Итак:
Arduino IDE 1.8.19
ESP-Wroom-32
ядро 2.0.11
EncButton 3.5.10 или 3.5.0
Энкодер подключён GPI36(SP)-DT, GPI39(SN)-CLK, обработка в прерывании.
Примеры из библиотеки работают.
В моём скетче иногда нет правильной обработки вращения энкодера.
Должно бы работать так : читаем дату из Ds3231, присваиваем переменной setday текущее значение числа, поворотом энкодера изменяем её значение и выводим на экран. В сторону уменьшения работает как и должно. Увеличение не происходит,а выводится считанное из часов значение.
Всё приводить не вижу смысла, приведу только проблемный участок:
if ( menu2 == true){ //Если 2 слой меню активно:
if (eb.right() and setday < 31){ // Если поворот по ЧС и число меньше 31
setday ++; // увеличим число на 1
printday(); // Выводим число на экран
}
if (eb.left() and setday > 1){ // Если поворот против ЧС и число больше 1
setday --; // уменьшим число на 1
printday(); // Выводим число на экран
}
}
В скетче есть ещё аналогичный фрагмент выбора пункта меню, так там всё работает в обе стороны:
if (menu == true) { //Если меню активно:
if (eb.right() and ypointer != 3) { // Если поворот по ЧС и указатель не на 3 строке
nopointer(); // Убираем курсор на предыдущей строке
ypointer ++; // Увеличим указатель на 1
pointer(); // Рисуем курсор на указанном пункте
}
if (eb.left()and ypointer != 0) { // Если поворот против ЧС и указатель не на 1 строке
nopointer(); // Убираем курсор на предыдущей строке
ypointer --; // Уменьшим указатель на 1
pointer(); // Рисуем курсор на указанном пункте
}
//......... / / здесь ещё строки
}
Почему так?
Иногда всё же если докрутить до 1 и вращать в сторону увеличения , то увеличивается до 2.
Но очень редко.
Опыта в программировании имеется немного, не обращайте внимания на нерациональность.
Просто интересно, почему декремент работает, а инкремент не работает в том же самом месте.
Спасибо.
Приветствую! Я в отъезде сейчас, смогу помочь только как вернусь...
Добрый день, удалось разобраться или еще актуально?
@aveal Доброго дня.
Нет, не получается.
Пробовал через детекцию вращения енкодера eb.turn()
с последующим анализом направления - eb.dir()
Результат аналогичен : уменьшение чётко отрабатывает, а в сторону увеличения -не меняется.
Задача- простое меню настроек, в том числе установка даты, времени. Но не в отдельной функции, а в главном цикле.
@aveal Доброго дня. Можно конечно.
Постарался сопроводить комментариями.
Строго не судите. И там ещё не всё дописано- затык на установке даты.
Даже запись её обратно в часы отсутствует.
Плюс шрифты.
Добрый день, предлагаю локализовать проблему точнее, например, здесь вместо printday() (или перед) сделать вывод setday в консоль:
if ( menu2 == true and ypointer == 0) { if (eb.right() and setday != 31) setday ++; if (eb.left() and setday != 1) setday --; printday(); }
То есть можно начать с того, чтобы убедиться работает ли вообще eb.right(), или может уже здесь проблема. Либо можно энкодер отдельно вообще проверить от всего остального, так и так надо выяснить, в каком конкретно месте начинается сбой.
@aveal Спасибо.
Насчёт самого энкодера-100% работает в обе стороны.
По первому уровню меню курсор ходит туда-сюда.
Выбор пункта( "Дата", "Время" и т.д.)тоже без проблем.
В консоль выведу, только ещё нужно вставить задержку.
По результату отпишу.
@user_esp отлично, буду ждать, тогда по результатам продолжим разбираться.
Здравствуйте, прошу прощения, что пропал.
Касаемо проблемы- в этом участке кода нет регистрации поворота вправо:
// Обработка энкодера в настройке даты
if ( menu2 == true and ypointer == 0){
if (eb.right() and setday != 31) setday ++; // Если поворот по ЧС и число меньше 31 увеличим число на 1
if (eb.left() and setday != 1) setday --; // Если поворот против ЧС и число больше 1 уменьшим число на 1
if (eb.turn()) Serial.print(eb.dir()); // Выводим направление вращения в консоль
Serial.println(setday); // Выводим число в консоль
printday(); // Выводим число на экран
}
Соответственно нет и вывода направления в консоль.Переменную выводит без увеличения
Влево- всё чётко, и в консоль выводит уменьшенное значение переменной и направление вращения.
Повышение версии библиотеки не решило проблему.
Автор, кстати, ответил аналогично.
Доброго дня.
Не понятно почему? - влево работает при тех же условиях.
Пробовал по-разному, в этой библиотеке есть варианты.
Результат тот же.
Переделаю на другую библиотеку для энкодера, или вообще перейду на кнопки.
А можете текущий вариант скетча скинуть? Освежу в памяти )
Вариант тот, что и в сообщении 18.06.2024.
Изменений нет, только вывод в консоль добавил 2 строки (пост 05.11.24).
@user_esp При этом в меню eb.right() работает нормально? И при настройке даты уменьшение через eb.left() тоже работает нормально?