КУЛИБИН ПОМОГИТЕ Энкодер с выводом на ЛСД 1602

chat GPT - вот что выдал
И даже "гопота" не заметила, что переменная для хранения предыдущего значения enc_prev
для обоих энкодеров одна и та же :)

ЗЫ. Что бы движок форума не портил смайлами код, его лучше вставлять через тэг </>, тогда
форматирование и скобки сохранятся.
 
Дядя OlegK проверьте своим научным взглядом...:) Дойдем до истины...

C++:
#include <Wire.h>
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27, 16, 2);
int schetchik = 0;
int schetchik2 = 0;

void setup() {
//По дефолту все пины конфигурируются как входы, и
//при наличии внешних резисторов подтяжки всё, что ниже, можно не указывать
  pinMode(11, INPUT);
  pinMode(12, INPUT);
  pinMode(9, INPUT);
  pinMode(10, INPUT);
  pinMode(7, INPUT);
  pinMode(8, INPUT);
}

void loop() {
  bool enc_A = digitalRead(11);
  bool enc_B = digitalRead(12);
  bool enc_C = digitalRead(9);
  bool enc_D = digitalRead(10);

  // Для первого энкодера
  static bool enc_prev = enc_A;  // Сохраняем текущее состояние энкодера A
  if ( (!enc_A) && (enc_prev) ) {
    if (enc_B) {
      if (schetchik + 1)
        schetchik += 1;
    } else {
      if (schetchik - 1 >= 0)
        schetchik -= 1;
    }
  }
  enc_prev = enc_A;  // Обновляем сохраненное состояние энкодера A

  float m = schetchik / 1.00;
  lcd.setCursor(10, 1);
  lcd.print(m);

  // Для второго энкодера
  static bool enc_prev2 = enc_C;  // Сохраняем текущее состояние энкодера C
  if ( (!enc_C) && (enc_prev2) ) {
    if (enc_D) {
      if (schetchik2 + 1)
        schetchik2 += 1;
    } else {
      if (schetchik2 - 1 >= 0)
        schetchik2 -= 1;
    }
  }
  enc_prev2 = enc_C;  // Обновляем сохраненное состояние энкодера C

  float m2 = schetchik2 / 1.00;
  lcd.setCursor(10, 0);
  lcd.print(m2);

  if (!digitalRead(7)) {
    schetchik = 0;  // Сброс счетчика schetchik при активации пина 7
  }

  if (!digitalRead(8)) {
    schetchik2 = 0;  // Сброс счетчика schetchik2 при активации пина 8
  }
}

Проверил. Для пущей "научности" стОит избавиться от ардуиновских диджиталРид и увеличить периодичность вывода на дисплей - нафига так часто выводить на него счётчик?
production.jpg
 
Таким образом, enc_prev сохраняет текущее состояние энкодера A в конце каждого цикла loop(), чтобы использовать его в следующем цикле для определения изменения состояния.
И что она там сохраняет, если чуть ниже она всё равно примет другое значение? :)
C++:
enc_prev = enc_A;
...
enc_prev = enc_C;
 
В перерывах между домашними делами и огородом сваял стенд для тестирования программы (почти).
Осталось поставить емкости на кнопки обнуления.
1687026022335.png
 
  • Последнее редактирование:
Последнее редактирование:
Всё бы ничего, да в ИДЕ сообщение о:" Ошибка компиляции для платы Arduino Nano."
И по ходу что то с библиотеками. Потому как загрузка скечей от других проектов вполне себе. И после того как в скече на линейку убрал строку со ссылкой на библиотеку, компиляция тоже началась.
Проц -MEGA 168РА

Заменил библиотеку на ту, что в гитхабе
вот что вышло:
1687169666229.png
 
  • Последнее редактирование:
Последнее редактирование:
убрал строку,
Убрал строку, так как она кроме информации о авторстве ни чего не несёт

1687177583098.png
Ваши сообщения автоматически объединены:

В первом случае понадобился файл библиотеки Wire.h, а во втором случае библиотеки объединены
1687179697190.png
 
убрал строку,
Убрал строку, так как она кроме информации о авторстве ни чего не несёт
Достаточно закомментировать. Комментарии в компиляции не участвуют.

В первом случае понадобился файл библиотеки Wire.h, а во втором случае библиотеки объединены
В каком месте это показано, упоминаются обе, Wire.h служит не только для LicquidCristall_I2C. h, но и для ряда других библиотек, использующих последовательный протокол.
 
html-теги в файлах на гитхабе. Правда в зипархиве в файле библиотеки этих тегов нет. Я уже с 10-к библиотек, liquidcristal и wire и в разных сочетаниях.
С радиоуправляемой машинкой меньше проблем было
 

Вложения

  • 1687189877318.png
    1687189877318.png
    7.3 KB · Просмотры: 7
В каком месте это показано, упоминаются обе, Wire.h
1687189941666.png
Ваши сообщения автоматически объединены:

Не нужно копировать код со страницы, нужно скачать архив: зелёная кнопка "Code", там в меню "download ZIP"
уже обратил внимание
 
С гита
 

Вложения

  • LiquidCrystal_I2C-master.zip
    334.1 KB · Просмотры: 3
Установилась. только ни цифирь, ни подсветки. пока одни ???????????
Попробую исходный скеч
1687194068036.png
 
Втавь строки перед 10той
lcd.init(16.2)
lcd.display()
Будет тебе и индикация и подсветка
 
Втавь строки перед 10той
lcd.init(16.2)
lcd.display()
Поправочка.
Не lcd.init, а lcd.begin();
И не перед 10 строкой, а в тело void Setup()
И туда же, для включения подсветки - lcd.backlight();
 
Сверху Снизу
Обнаружен блокировщик рекламы AdBlock

МЫ ДОГАДЫВАЕМСЯ, ЧТО РЕКЛАМА ВАС РАЗДРАЖАЕТ!

Конечно, Ваше программное обеспечение для блокировки рекламы отлично справляется с блокировкой рекламы на нашем сайте, но оно также блокирует полезные функции. Мы стараемся для Вас и не обязываем Вас донатить и скидывать денег на наши кошельки, чтобы пользоваться форумом, но реклама это единственное, что позволяет поддерживать проект и развивать его.

Спасибо за Ваше понимание!

Я отключил свой AdBlock    Нет, я не буду ничего отключать