Top.Mail.Ru
Библиотека EncButto...
 
Уведомления
Очистить все

Библиотека EncButton от Гайвера.

(@user_esp)
Level 2

Доброго дня.

Вопрос Гайверу на гитхабе задал, но пока нет ответа.

Решил попросить помощи здесь-раньше помогали.

Не утверждаю, что проблема в самой библиотеке.

Хочу понять где причина и как исправить.

Итак:

      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.

Но очень редко.

Опыта в программировании имеется немного, не обращайте внимания на нерациональность.

Просто интересно, почему декремент работает, а инкремент не работает в том же самом месте.

Спасибо.

Цитата
Создатель темы Размещено : 05.06.2024 12:40
Aveal
(@aveal)
Top level Admin

Приветствую! Я в отъезде сейчас, смогу помочь только как вернусь... 

ОтветитьЦитата
Размещено : 05.06.2024 21:15
Aveal
(@aveal)
Top level Admin

Добрый день, удалось разобраться или еще актуально?

ОтветитьЦитата
Размещено : 13.06.2024 10:44
(@user_esp)
Level 2

@aveal Доброго дня.

Нет, не получается.

Пробовал через детекцию вращения енкодера eb.turn()

с последующим анализом направления - eb.dir()

Результат аналогичен : уменьшение чётко отрабатывает, а в сторону увеличения -не меняется.

Задача- простое меню настроек, в том числе установка даты, времени. Но не в отдельной функции, а в главном цикле.

ОтветитьЦитата
Создатель темы Размещено : 13.06.2024 11:26
Aveal
(@aveal)
Top level Admin

@user_esp А можете скинуть файлами код? Так бы удобнее было.

ОтветитьЦитата
Размещено : 13.06.2024 11:32
(@user_esp)
Level 2

@aveal Доброго дня. Можно конечно.

Постарался сопроводить комментариями.

Строго не судите. И там ещё не всё дописано- затык на установке даты.

Даже запись её обратно в часы отсутствует.

 

Плюс шрифты.

ОтветитьЦитата
Создатель темы Размещено : 18.06.2024 10:39
Aveal
(@aveal)
Top level Admin

Добрый день, предлагаю локализовать проблему точнее, например, здесь вместо 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(), или может уже здесь проблема. Либо можно энкодер отдельно вообще проверить от всего остального, так и так надо выяснить, в каком конкретно месте начинается сбой.

ОтветитьЦитата
Размещено : 20.06.2024 10:11
(@user_esp)
Level 2

@aveal Спасибо.

Насчёт самого энкодера-100% работает в обе стороны.

По первому уровню меню курсор ходит туда-сюда.

Выбор пункта( "Дата", "Время" и т.д.)тоже без проблем.

В консоль выведу, только ещё нужно вставить задержку.

По результату отпишу.

 

 

ОтветитьЦитата
Создатель темы Размещено : 20.06.2024 13:44
Aveal
(@aveal)
Top level Admin

@user_esp отлично, буду ждать, тогда по результатам продолжим разбираться.

ОтветитьЦитата
Размещено : 20.06.2024 13:48
Поделиться: