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

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

Страница 1 / 2
(@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
(@user_esp)
Level 2

Здравствуйте, прошу прощения, что пропал.

Касаемо проблемы- в этом участке кода нет регистрации поворота вправо:

// Обработка энкодера в настройке даты
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(); // Выводим число на экран
}

Соответственно нет и вывода направления в консоль.Переменную выводит без увеличения

Влево- всё чётко, и в консоль выводит уменьшенное значение переменной и направление вращения.

Повышение версии библиотеки не решило проблему.

Автор, кстати, ответил аналогично.

 

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

@user_esp Добрый день! Видимо eb.right() всегда 0 (false).

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

Доброго дня.

Не понятно почему? - влево работает при тех же условиях.

Пробовал по-разному, в этой библиотеке есть варианты.

Результат тот же.

Переделаю на другую библиотеку для энкодера, или вообще перейду на кнопки.

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

А можете текущий вариант скетча скинуть? Освежу в памяти )

ОтветитьЦитата
Размещено : 06.11.2024 13:24
(@user_esp)
Level 2

Вариант тот, что и в сообщении 18.06.2024.

Изменений нет, только вывод в консоль добавил 2 строки (пост 05.11.24).

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

@user_esp При этом в меню eb.right() работает нормально? И при настройке даты уменьшение через eb.left() тоже работает нормально?

ОтветитьЦитата
Размещено : 06.11.2024 14:37
Страница 1 / 2
Поделиться: