LCD 1602 I2C мигание курсором

AFV

✩✩✩✩✩✩✩
17 Дек 2023
7
0
Доброе время суток. Делаю часы в связке Nano+Lcd1602 I2C + DS3231 + Энкодер.
Схема работы. При нажатие на энкодер происходит выбор меню и например часы, нажали минуты и вращением меняем числа.
Проблема в то, что не могу выделить пункт пробовал lcd.cursor() , lcd.blink(), но получаю только далёкое мерцание. А нет чёткого отображения. Помогите плиз.
ссылка на GitHub c проектом.
 

Bruzzer

★★★✩✩✩✩
23 Май 2020
501
149
но получаю только далёкое мерцание.
Романтично, но не понятно.
Вас не устраивает (или не работает на вашем экране) стандартный режим моргания курсора?
C++:
void setup() {
  lcd.begin();
  lcd.clear();
  lcd.blink();
  lcd.setCursor(0, 0);
  lcd.print("ABCDE");
  lcd.setCursor(2, 0);
  while(1);
}
 

AFV

✩✩✩✩✩✩✩
17 Дек 2023
7
0
Романтично, но не понятно.
Не мигает. Но мирцание должно появляться не всегда. А только после нажатия кнопки на энкодере.
Каждое нажатие это новый пункт настройки часов.
логика такая:
1-е нажатие часы, 2-е минуты, 3-е день, 4-е месяц, 5-е год. И при шагание по пунктам нечего не происходит(
Не могу понять как придумать что бы работало.
 

Bruzzer

★★★✩✩✩✩
23 Май 2020
501
149
Если у вас не мигает при выполнении кода приведенного мной, значит у вас что то не так на уровне железа или библиотеки.
(Должна мигать буква "С")
Дополнение - и вы не объяснили, что такое "далекое мерцание".
 

Bruzzer

★★★✩✩✩✩
23 Май 2020
501
149
@AFV,
В вашем нынешнем коде нет lcd.blink();
Я вас третий раз не понимаю.
Так что дам общие рекомендации.
  • Проверить устраивает ли вас в принципе мигание курсором заменив свой текущий setup на приведенный мной (или аналогичный ваш который просто мигает курсором). Может у вас контрастность не оптимально выставлена или еще что.
  • Если мигание курсором в тестовом скетче устраивает, но в рабочем скетче, при включении lcd.blink(); в нужных местах, вы не видите мигающий курсор, убедитесь, что курсор не вышел из области видимости. Выполните lcd.setCursor Другой версии у меня нет.
 

Bruzzer

★★★✩✩✩✩
23 Май 2020
501
149
@AFV,
Посмотрел ваш код повнимательнее. (Кстати это вы писали или взяли готовый?)
По моему понял вас, и в чем дело.
При работе функции void change_the_numbers, курсор постоянно меняет свою позицию, т.к. функция вызывается очень часто и при каждом вызове происходит вывод на экран. Соответственно курсор и мигает в разных местах.
Как вариант, сделайте обновление экрана только при изменении данных
Например (может не красиво, но с минимальным изменением вашего кода).
Было
C++:
  // изменение знаяения
  if(enc.right()) dt[pos] += 1;
  if(enc.left()) dt[pos] -= 1;
Изменить
C++:
  // изменение знаяения
  int tmp = dt[pos];
  if(enc.right()) dt[pos] += 1;
  if(enc.left()) dt[pos] -= 1;
  if (tmp == dt[pos]) return;
И кажется у вас maloc мало памяти выделяет, т.к. sprintf добавляет конечный /0.
И зачем maloc а не локальная переменная, тоже не понял.
 

AFV

✩✩✩✩✩✩✩
17 Дек 2023
7
0
И зачем maloc а не локальная переменная, тоже не понял.
Тогда получается наложение данных на экране, а при free всё хорошо.

@AFV,
Посмотрел ваш код повнимательнее. (Кстати это вы писали или взяли готовый?)
Писал сам. Готовые не смотрел, решил сам написать, читая документацию, так интереснее ))