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

  • Последнее редактирование:
Последнее редактирование:
на инт бегин установка зависла
Надо открыть директорию, где лежат библиотеки
(Путь - C:\Users\Администратор\Documents\Arduino\libraries\LiquidCrystal_I2C), там д. быть папка examples (примеры). Открыть в блокноте любой скетч и посмотреть, как инициализируется и объявляется дисплей для конкретной библиотеки.
Ваши сообщения автоматически объединены:

Я в #92 писал, что может быть разница в объявлении и инициализации.
 
заменил на инит
1687855170248.png
exit status 1
Ошибка компиляции для платы Arduino Nano.
 
Да что за беда-то...
Предлагаю:
Или приложите сюда в архиве используемую вами библу.
Или я приложу свою и вы ею замените свою.
 
Да что за беда-то...
Предлагаю:
Или приложите сюда в архиве используемую вами библу.
Или я приложу свою и вы ею замените свою.
Я все библиотеки которые ставил ранее убрал и установил которое было в этом обсуждении Энкодер с выводом на ЛСД 1602 | Page 6 | ФОРУМ О СТАНКАХ CNC 3018
 
и установил которое было в этом обсуждении
Ага, поставил, тоже не компилится.
Заработало после добавления #include <Wire.h> в файл LiquidCrystal_I2C.cpp

Bilderman 2023.06.27 12-26-04.pngBilderman 2023.06.27 12-28-18.png

КМК, лучше удалить и заменить проверенной.
 

Вложения

  • LiquidCrystal_I2C.zip
    9.5 KB · Просмотры: 4
подключил плату УНО. Результат тот же
 
ура! заработало!
1687859304386.png
поставил только Вашу библиотеку.
Ваш код сильно отличается от того с чего я начал.
В каких строчках можно будет менять цену деления, вернее подгонять под реальный метраж?
строки 30 и 31?
Теперь будем меня ть на оптический энкодер от логитековского мыша
 
В каких строчках можно будет менять цену деления, вернее подгонять под реальный метраж?
C++:
//коэффициент делителя импульсов
const float multiplier = 1.0f;
вывод, если раскомментировать в
C++:
void printValue(uint8_t col, uint8_t row, int value) {
  lcd.setCursor(col, row);
  lcd.print(F("           "));
  lcd.setCursor(col, row);
  //выводим целое значение
  lcd.print(value);
  //или дробное, поделенное на коэффициент
  //float fvalue = (float)value / multiplier;
  //lcd.print(fvalue, 3);
}
 
C++:
lcd.print(F("           "));  //целое значение или дробное
Правильно понял?
Однако мы в этом случае меняем для 2-х энкодеров сразу
 
Правильно понял?
Нет.
Вот подробно прокомменитировано -

C++:
//вывод значения в заданное место. col - колонка, row - строка
void printValue(uint8_t col, uint8_t row, int value) {
  //устанавливаем курсор в позицию, куда выводим
  lcd.setCursor(col, row);
  //"чистим" пробелами предыдущее значение.
  lcd.print(F("           "));
//вновь устанавливаем курсор в позицию, куда выводим
  lcd.setCursor(col, row);
  //делим на коэффициент
  float fvalue = (float)value / multiplier;
  //выводим с точностью 3 знака после запятой
  lcd.print(fvalue, 3);
}

Однако мы в этом случае меняем для 2-х энкодеров сразу
Нет. Это функция для разных энкодеров выводит в разные места разные значения.
Тут
C++:
//вывод значений на дисплей
void lcdUpdate() {
  printValue(8, 0, Count_1);// выводит в 0 строку с 8 позиции первый счётчик
  printValue(8, 1, Count_2);// выводит в 1 строку с 8 позиции второй счётчик
}

Единственно, что тут делитель один на оба энкодера, возможно понадобится использовать два разных делителя. Не?
 
пока по размыслю. через пару часиков вернусь
Ваши сообщения автоматически объединены:

Единственно, что тут делитель один на оба энкодера, возможно понадобится использовать два разных делителя. Не?
именно! разных
 
ОК. Тогда заменить
C++:
//коэффициент делителя импульсов
const float multiplier = 1.0f;
на
C++:
//коэффициенты делителя импульсов
const float multiplier_1 = 1.0f;
const float multiplier_2 = 1.0f;
и всю функцию
C++:
void printValue(uint8_t col, uint8_t row, int value)
заменить на
C++:
void printValue(uint8_t col, uint8_t row, int value, float divider) {
  lcd.setCursor(col, row);
  lcd.print(F("           "));
  lcd.setCursor(col, row);
  float fvalue = (float)value / divider;
  lcd.print(fvalue, 3);
}
ну и это
C++:
//вывод значений на дисплей
void lcdUpdate() {
  printValue(8, 0, Count_1);
  printValue(8, 1, Count_2);
}
заменить на это
C++:
//вывод значений на дисплей
void lcdUpdate() {
  printValue(8, 0, Count_1, multiplier_1);
  printValue(8, 1, Count_2, multiplier_2);
}
 
в первом (Х) поставил делитель = 2

1687865995459.png
Пока жду железки попробую поиграться с готовой программулиной
 
  • Последнее редактирование:
Последнее редактирование:
в первом (Х) поставил делитель = 2
Подозреваю, эта первичная формула изначально неверная
float fvalue = (float)value / divider
Надо делитель коэффициент определять как шаг винта / кол-во импульсов энкодера на оборот
и на это значение умножать кол-во импульсов, которое насчитали от энкодера.
Тогда получим на дисплее величину перемещения в мм.

ЗЫ. Туплю. Можно и делить :)
 
Сверху Снизу
Обнаружен блокировщик рекламы AdBlock

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

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

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

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