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

Дядя Вова

Старый
НАШ ЧЕЛОВЕК
Регистрация
02.01.2020
Сообщения
1 531
Реакции
1 942
Баллы
188
Возраст
58
Адрес
Россия
Веб-сайт
nitckulibin.ru
Город
Саратов
Имя
Владимир
Отчество
Владимирович
Станок
cnc3018
Плата
3,2А
Прошивка
1,1F
Прошу уважаемых заседателей не судить строго и не закидывать меня камнями. Я человек старенький, неравен час и как бы не пришлось собираться мне на венки!
Мой вопрос скорее к тем, кто с Ардуиной на "ТЫ", а не к тем как я со словарем.
Есть такой вот скетч (заимствованный) и я хотел бы с ним разобраться. Комменты к нему начал писать сам и в них наверняка есть ошибки.
jwkWOT2Qcyw.jpg

С 4-ю по 10-ю строку я понял, это для того чтоб надпись появилась в верхней строке двухстрочного индикатора. А то что ниже, это прием данных с входов (А,В) и вывод значений на нижнюю строку. Последние 3-и строки, это коррекция значения количества импульсов с энкодера на отображаемое значение. Т.е. в строчке 22 меняется значение, на пример: m = schetchik/132.00; (количество импульсов на измеряемый диапазон равный одному метру типа. Хотя привязка к метру относительная и взята с датчика со своими геометрическими размерами и своим количеством импульсов на один полный оборот.
Хотелось также разобраться: -Есть ли возможность указать на дисплее большее количество цифр как до запятой, так и после. (0000000,000000)?
Хочу также перенести Данные с входов (А, В) в верхнюю строку индикатора.
Хочу добавить входа (А1, В1) с которых вывести значения на вторую строку. Для ввода данных со второго энкодера.
Во вложении текст скетча.
Видео проекта


C++:
#include <Wire.h>                       // библиотека экрана
#include <LiquidCrystal_I2C.h>          // то же
LiquidCrystal_I2C lcd(0x27, 16, 2);     // определение типа экрана
int schetchik = 0;                      // можно убрать
unsigned char enc_prev=0;               // можно убрать
float m = 0.00;                         // можно убрать
void setup(){                           // можно убрать
lcd.begin();                            // можно убрать
lcd.setCursor(0, 0);                    // можно убрать
lcd.print("jelektro linejka");          // можно убрать
pinMode(11, INPUT);                     // вход А
pinMode(12, INPUT);}                    // вход В
void loop()  {
int enc_A = digitalRead(11); // считывание с входов
int enc_B = digitalRead(12); // считывание с входов
if((!enc_A) && (enc_prev)){
if(enc_B) {
if(schetchik + 1 ) schetchik += 1;}
else {
if(schetchik - 1 >= 0) schetchik -= 1;}}   
enc_prev = enc_A;
m = schetchik/0.00; //перевод кода в метры или см.
lcd.setCursor(10, 1); //перевод кода в метры или см.
lcd.print(m);}
 

Вложения

  • sketh.txt
    1.1 KB · Просмотры: 7
Прошу уважаемых заседателей не судить строго и не закидывать меня камнями. Я человек старенький, неравен час и как бы не пришлось собираться мне на венки!
Мой вопрос скорее к тем, кто с Ардуиной на "ТЫ", а не к тем как я со словарем.
Есть такой вот скетч (заимствованный) и я хотел бы с ним разобраться. Комменты к нему начал писать сам и в них наверняка есть ошибки.
jwkWOT2Qcyw.jpg

С 4-ю по 10-ю строку я понял, это для того чтоб надпись появилась в верхней строке двухстрочного индикатора. А то что ниже, это прием данных с входов (А,В) и вывод значений на нижнюю строку. Последние 3-и строки, это коррекция значения количества импульсов с энкодера на отображаемое значение. Т.е. в строчке 22 меняется значение, на пример: m = schetchik/132.00; (количество импульсов на измеряемый диапазон равный одному метру типа. Хотя привязка к метру относительная и взята с датчика со своими геометрическими размерами и своим количеством импульсов на один полный оборот.
Хотелось также разобраться: -Есть ли возможность указать на дисплее большее количество цифр как до запятой, так и после. (0000000,000000)?
Хочу также перенести Данные с входов (А, В) в верхнюю строку индикатора.
Хочу добавить входа (А1, В1) с которых вывести значения на вторую строку. Для ввода данных со второго энкодера.
Во вложении текст скетча.
Видео проекта


C++:
#include <Wire.h>                       // библиотека экрана
#include <LiquidCrystal_I2C.h>          // то же
LiquidCrystal_I2C lcd(0x27, 16, 2);     // определение типа экрана
int schetchik = 0;                      // можно убрать
unsigned char enc_prev=0;               // можно убрать
float m = 0.00;                         // можно убрать
void setup(){                           // можно убрать
lcd.begin();                            // можно убрать
lcd.setCursor(0, 0);                    // можно убрать
lcd.print("jelektro linejka");          // можно убрать
pinMode(11, INPUT);                     // вход А
pinMode(12, INPUT);}                    // вход В
void loop()  {
int enc_A = digitalRead(11); // считывание с входов
int enc_B = digitalRead(12); // считывание с входов
if((!enc_A) && (enc_prev)){
if(enc_B) {
if(schetchik + 1 ) schetchik += 1;}
else {
if(schetchik - 1 >= 0) schetchik -= 1;}}  
enc_prev = enc_A;
m = schetchik/0.00; //перевод кода в метры или см.
lcd.setCursor(10, 1); //перевод кода в метры или см.
lcd.print(m);}

Куда будет установлен курсор, от туда и начнётся вывод
lcd.setCursor(0, 0);
переменная типа int не подразумевает дробь
 
Я
В строках 4, 14 и 15, где есть этот операнд дроби нет. Может я что пропустил со слепу?
Я за дробь принял вопрос "Есть ли возможность указать на дисплее большее количество цифр как до запятой, так и после. (0000000,000000)?"
 
Дядя Вова, не кокетничай, судя по фото, тебе и 60-ти не исполнилось :) .
Этой фотке уже лет 6 и там я побритый. 57 уже! Пальцы уже не разгибаются и давление 100/200 уже как норма.
 
Если 10 поменять на другое число то сместится вывод.
lcd.setCursor(10, 1); //перевод кода в метры или см.
Но там всего 16 знакомест в строке. Можно поставить другой экран, где больше символов в строке.
 
  • Последнее редактирование:
Последнее редактирование:
Если 10 поменять на другое число то сместится вывод.
lcd.setCursor(10, 1); //перевод кода в метры или см.
Но там всего 16 знакомест в строке. Можно поставить другой экран, где больше символов в строке.
16 мне кажется более чем достаточно. Не понятно как определяется система измерения: метры, сантиметры. Пусть как у автора видео, энкодер при прохождении дистанции в 1 метр выдает значение 132, а если при этой же дистанции энкодер выдаст значение 1132 или 2264? Откуда автор решил, что 1 метр величина постоянная и калибровка должна вестись именно на таком отрезке?
Где тут собака зарыта?

Про "lcd.setCursor(10, 1)" я так и понял, что это 10-й столбец строки 2.
При корректировке автор меняет значения в строке "m = schetchik/0.00;" т.е. m = schetchik/132,00;
Как изменится отображаемое значение в индикаторе если m = schetchik/1132.00; ?
Зависит ли количество чисел после запятой именно от этой строки
float m = 0.00; Может ее можно отразить как float m = 0.00000;
2 знака после запятой всё же является приближением до сотых. Я так понял при попытке выяснить, что float m = 0.00; это операция связана с плавающей запятой.
 
  • Последнее редактирование:
Последнее редактирование:
16 мне кажется более чем достаточно. Не понятно как определяется система измерения: метры, сантиметры. Пусть как у автора видео, энкодер при прохождении дистанции в 1 метр выдает значение 132, а если при этой же дистанции энкодер выдаст значение 1132 или 2264? Откуда автор решил, что 1 метр величина постоянная и калибровка должна вестись именно на таком отрезке?
Где тут собака зарыта?

Про "lcd.setCursor(10, 1)" я так и понял, что это 10-й столбец строки 2.
При корректировке автор меняет значения в строке "m = schetchik/0.00;" т.е. m = schetchik/132,00;
Как изменится отображаемое значение в индикаторе если m = schetchik/1132.00; ?
Зависит ли количество чисел после запятой именно от этой строки
float m = 0.00; Может ее можно отразить как float m = 0.00000;
2 знака после запятой всё же является приближением до сотых. Я так понял при попытке выяснить, что float m = 0.00; это операция связана с плавающей запятой.
Всё просто, в переменной schetchik хранится число пройденных шагов, его делят на число полученное при калибровке. Т.е. на число шагов соответствующих одному метру.
Соответственно пол метра = 66/132
 
Зависит ли количество чисел после запятой именно от этой строки float m = 0.00;
Нет. Если нужно вывести с нужным количеством знаков, используйте доп. аргумент
C++:
lcd.print(m, 3); //три знака после запятой
 
Друзья!!! Как то 3х знаков после запятой вполне хватало в метрической системе машиностроения.
Да были датчики 0.0001мм.
Однако, надо смотреть на исполнительные устройства.
 
  • Последнее редактирование:
Последнее редактирование:
Друзья!!! Как то 3х знаков после запятой вполне хватало в метрической системе машиностроения.
Да были датчики 0.0001мм.
Однако, надо смотреть на исполнительные устройства.
Оно может и хватало, когда усё делалось +- поллитра. Я не ставлю задачу конкретно 6 или 12 знаков, я хочу разобраться в каждой строчке до точки и не следовать принципу "Потамушта так надо!". Не всё я смог найти через "Гугл всё знает!".
Нанку и дисплей я через Я-маркет заказал, уже завтра к вечеру доставят.
А с исполнительным устройством, так его еще пока нет, есть энкодер из наборов Ардуино, который на переменный резистор похож. И вряд ли это можно назвать исполнительным устройством, так как сие не исполняет просто по определению. Скорее устройство для считывания. Они могут быть самыми разными.
Упомянутый энкодер чисто для эксперимента, в реале поставлю диск с щелями и оптику. Если Вы про это имели в виду, а не ради спортивного любопытства?
Ваши сообщения автоматически объединены:

Всё просто, в переменной schetchik хранится число пройденных шагов, его делят на число полученное при калибровке. Т.е. на число шагов соответствующих одному метру.
Соответственно пол метра = 66/132
Прости конечно! А метр это условно? А если взять сантиметр или дюйм? Нужно ли где то поменять букву или поставить множитель или делитель? Просто метр, как величина эталонная, должен же был от куда то взяться.
Я к примеру измеряю отрезок в 1 дюйм и в процессе измерения произведено 132 шага. Соответственно половина дюйма 66 шагов. 33, это 1/4 дюйма. А вместо сантиметров на дисплее у нас отражаются дюймовочки (шутка)
Если перевести на механику, как аналогию, то на лимб наносятся значения перемещения гайки ходового винта. Не больше и не меньше.
 
Оно может и хватало, когда усё делалось +- поллитра. Я не ставлю задачу конкретно 6 или 12 знаков, я хочу разобраться в каждой строчке до точки и не следовать принципу "Потамушта так надо!". Не всё я смог найти через "Гугл всё знает!".
Нанку и дисплей я через Я-маркет заказал, уже завтра к вечеру доставят.
А с исполнительным устройством, так его еще пока нет, есть энкодер из наборов Ардуино, который на переменный резистор похож. И вряд ли это можно назвать исполнительным устройством, так как сие не исполняет просто по определению. Скорее устройство для считывания. Они могут быть самыми разными.
Упомянутый энкодер чисто для эксперимента, в реале поставлю диск с щелями и оптику. Если Вы про это имели в виду, а не ради спортивного любопытства?
Ваши сообщения автоматически объединены:


Прости конечно! А метр это условно? А если взять сантиметр или дюйм? Нужно ли где то поменять букву или поставить множитель или делитель? Просто метр, как величина эталонная, должен же был от куда то взяться.
Я к примеру измеряю отрезок в 1 дюйм и в процессе измерения произведено 132 шага. Соответственно половина дюйма 66 шагов. 33, это 1/4 дюйма. А вместо сантиметров на дисплее у нас отражаются дюймовочки (шутка)
Если перевести на механику, как аналогию, то на лимб наносятся значения перемещения гайки ходового винта. Не больше и не меньше.
Человек в видосе прокатил энкодер на расстояние 1 метр и получил значение 132 с энкодера.
Если прокатить энкодер на расстояние в 1 дюйм и получить число с энкодера сколько раз он сработал. То соответственно расстояние в дюймах рассчитывается так: (число с энкодера измеренное)/(число с энкодера пройденное за один дюйм)
 
Теперь осталось добавить еще один датчик и с него вывести данные на верхнюю строку.
Понимаю, что это копирование и вставка и боюсь что сие действие не совсем правильное. Тороплюсь однако.
Со строки 11 ранее выложенного листинга:
C++:
pinMode(11, INPUT);                     // вход А

pinMode(12, INPUT);}                    // вход В

pinMode(9, INPUT);                     // вход С

pinMode(10, INPUT);}                    // вход D

void loop()  {

int enc_A = digitalRead(11); // считывание с входов

int enc_B = digitalRead(12); // считывание с входов

if((!enc_A) && (enc_prev)){

if(enc_B) {

if(schetchik + 1 ) schetchik += 1;}

else {

if(schetchik - 1 >= 0) schetchik -= 1;}} 

enc_prev = enc_A;

m = schetchik/0.00; //перевод кода в метры или см.

lcd.setCursor(10, 1); //перевод кода в метры или см.

lcd.print(m);}

int enc_С = digitalRead(9); // считывание с входов

int enc_D = digitalRead(10); // считывание с входов

if((!enc_С) && (enc_prev)){

if(enc_D) {

if(schetchik + 1 ) schetchik += 1;}

else {

if(schetchik - 1 >= 0) schetchik -= 1;}}   

enc_prev = enc_C;

m = schetchik/0.00; //перевод кода в метры или см.

lcd.setCursor(10, 0); //перевод кода в метры или см.

lcd.print(m);}
 
Теперь осталось добавить еще один датчик и с него вывести данные на верхнюю строку.
Понимаю, что это копирование и вставка и боюсь что сие действие не совсем правильное. Тороплюсь однако.
Со строки 11 ранее выложенного листинга:
C++:
pinMode(11, INPUT);                     // вход А

pinMode(12, INPUT);}                    // вход В

pinMode(9, INPUT);                     // вход С

pinMode(10, INPUT);}                    // вход D

void loop()  {

int enc_A = digitalRead(11); // считывание с входов

int enc_B = digitalRead(12); // считывание с входов

if((!enc_A) && (enc_prev)){

if(enc_B) {

if(schetchik + 1 ) schetchik += 1;}

else {

if(schetchik - 1 >= 0) schetchik -= 1;}}

enc_prev = enc_A;

m = schetchik/0.00; //перевод кода в метры или см.

lcd.setCursor(10, 1); //перевод кода в метры или см.

lcd.print(m);}

int enc_С = digitalRead(9); // считывание с входов

int enc_D = digitalRead(10); // считывание с входов

if((!enc_С) && (enc_prev)){

if(enc_D) {

if(schetchik + 1 ) schetchik += 1;}

else {

if(schetchik - 1 >= 0) schetchik -= 1;}}  

enc_prev = enc_C;

m = schetchik/0.00; //перевод кода в метры или см.

lcd.setCursor(10, 0); //перевод кода в метры или см.

lcd.print(m);}
Для второго датчика использовать переменную schetchik2 например.
И присваивать её не переменной m а m2
 
Сверху Снизу
Обнаружен блокировщик рекламы AdBlock

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

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

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

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