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

  • Последнее редактирование:
Последнее редактирование:
Что касается оптических энкодеров/измерительных линеек.
В старые времена, когда (шарик был ещё маленький) микро электроника только начинала развиваться, на стеклянных дисках или на стеклянных линейках наносили 2 ряда рисок сдвинутых на 90гр один под/над другим. Считывающие устройства стояли абсолютно вертикально без всяких сдвигов один под/над другим.
С развитием в микро электронике появилась возможность использовать только один ряд рисок и расположить считывающие устройства по горизонтали вдоль рисок смещая их на 90гр.

Как Дядя Вова нарисовал.

fp0g3-gif.47090


Считывающие устройства разнесены по горизонтали на 90гр.
Поставив дополнительные пары считывающих устройств сдвинутые на какой то угол относительно пары А и В
получаем удвоение импульсов. А можно и больше считывающих пар устройств поставить. Вопросы в технологии микро электроники.
Вот как то так.
 
Эх старый, я старый! мог сразу дисплей взять м с модулем i2C, а теперь только в следующий вторник. Буду пробовать смотреть через монитор программы ардуино.
 
  • Последнее редактирование:
Последнее редактирование:
Вроде нарисовал черновичок. До обвязки энкодера пока еще руки не дошли. Ездил полоть и клубнику собирать. Родня разболелаь и рвусь на несколько маленьких Вовочек.
Примерный листинг. Можете отругать за ошибки.
C++:
#include <Wire.h>                       // библиотека экрана
#include <LiquidCrystal_I2C.h>          // то же
LiquidCrystal_I2C lcd(0x27, 16, 2);     // определение типа экрана
int schetchik = 0;
int schetchik2 = 0;                      // можно убрать
unsigned char enc_prev=0;               // можно убрать
float m = 0.00;                         // можно убрать
float m2 = 0.00;                        // можно убрать
void setup(){                           // можно убрать

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/1.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(schetchik2 + 1 ) schetchik2 += 1;}
else {
if(schetchik2 - 1 >= 0) schetchik2 -= 1;}}
enc_prev = enc_C;
m2 = schetchik2/1.00; //перевод кода в метры или см.
lcd.setCursor(10, 0); //перевод кода в метры или см.
lcd.print(m2);}

И вопрос! какие команды поставить для сброса счетчиков? Аргумент ниже правильно использован?
C++:
schetchik = millis(); // сброс счетчика


Правильно написано?

C++:
pinMode(7, INPUT);                     // Сброс 1
pinMode(8, INPUT);}                    // Сброс 2
int enc_E = digitalRead(7); // считывание с входов
schetchik = millis(); // сброс счетчика

int enc_F = digitalRead(8); // считывание с входов
schetchik2 = millis(); // сброс счетчика
 
Вроде нарисовал черновичок. До обвязки энкодера пока еще руки не дошли. Ездил полоть и клубнику собирать. Родня разболелаь и рвусь на несколько маленьких Вовочек.
Примерный листинг. Можете отругать за ошибки.
C++:
#include <Wire.h>                       // библиотека экрана
#include <LiquidCrystal_I2C.h>          // то же
LiquidCrystal_I2C lcd(0x27, 16, 2);     // определение типа экрана
int schetchik = 0;
int schetchik2 = 0;                      // можно убрать
unsigned char enc_prev=0;               // можно убрать
float m = 0.00;                         // можно убрать
float m2 = 0.00;                        // можно убрать
void setup(){                           // можно убрать

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/1.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(schetchik2 + 1 ) schetchik2 += 1;}
else {
if(schetchik2 - 1 >= 0) schetchik2 -= 1;}}
enc_prev = enc_C;
m2 = schetchik2/1.00; //перевод кода в метры или см.
lcd.setCursor(10, 0); //перевод кода в метры или см.
lcd.print(m2);}

И вопрос! какие команды поставить для сброса счетчиков? Аргумент ниже правильно использован?
C++:
schetchik = millis(); // сброс счетчика
Правда я не привязал это к пинам идущим на кнопки сброса к примеру 7; 8.
Для сброса счётчиков чем не устраивает?
int schetchik = 0;
int schetchik2 = 0;
 
Для сброса счётчиков чем не устраивает?
int schetchik = 0;
int schetchik2 = 0;
Я тут дописал в предыдущем сообщении. Эти команды лучше ставить в конце листинга или произвольно?
С учетом предложенного Вами
int enc_E = digitalRead(7); // считывание с входов
schetchik = 0; // сброс счетчика
 
Я тут дописал в предыдущем сообщении. Эти команды лучше ставить в конце листинга или произвольно?
С учетом предложенного Вами
int enc_E = digitalRead(7); // считывание с входов
schetchik = 0; // сброс счетчика
Сброс счётчиков для чего делается?
Если он нужен то сброс можно сделать отдельной кнопкой.
 

ошибок нет, проверил, все русские слова написаны правильно. 5+

оффтоп
У меня браузер подчеркивает. А вот с ангельским у меня неуд, немецкий учил. Из всех команд на ангельском только импут в языке для ардуино чаще встречается, я ее по бейсику помню.
Ваши сообщения автоматически объединены:

Сброс счётчиков для чего делается?
Если он нужен то сброс можно сделать отдельной кнопкой.
Именно так, отдельной кнопкой, по кнопке на каждый
 
У меня браузер подчеркивает. А вот с ангельским у меня неуд, немецкий учил. Из всех команд на ангельском только импут в языке для ардуино чаще встречается, я ее по бейсику помню.
Ваши сообщения автоматически объединены:


Именно так, отдельной кнопкой, по кнопке на каждый
Ну тогда на одну кнопку schetchik = 0;
на вторую schetchik2 = 0;
 
int enc_E = digitalRead(7); // считывание с кнопки обнулить "Х"
schetchik = 0; // сброс счетчика
int enc_E = digitalRead(8); // считывание с кнопки обнулить "У"
schetchik2 = 0; // сброс счетчика
 
не-не-не, два момента: во-первых, 7 и 8 входы это ноги энкодера, а не кнопок. во-вторых, надо проверить считанное значение, и только потом сбрасывать счётчик, если условие нажатия кнопки выполняется (enc_E будет 1, если вход подтягивается к питанию, либо 0, если опускается на землю)

PS: со входами поторопился
 
не-не-не, два момента: во-первых, 7 и 8 входы это ноги энкодера, а не кнопок. во-вторых, надо проверить считанное значение, и только потом сбрасывать счётчик, если условие нажатия кнопки выполняется (enc_E будет 1, если вход подтягивается к питанию, либо 0, если опускается на землю)

PS: со входами поторопился
номера выводов взяты условно и на данный момент не критично. Ни кто сбрасывать счетчики не станет до того как!
 
pinMode(7, INPUT); // Сброс 1
int enc_E = digitalRead(7); // считывание с входов
schetchik = millis(); // сброс счетчика
в setup()
C++:
// кнопка к пину 7 и земле, вход 7 с внутренней подтяжкой к +
pinMode(7, INPUT_PULLUP);

Опрос кнопки в loop()
C++:
 // обнуляем, если кнопка нажата и счётчик больше 0
if (!digitalRead(7) && schetchik > 0) schetchik = 0;
 
Чего-то тоже полазил, но разбираться лень... Залил Дядя Вова вопрос chat GPT - вот что выдал... Вроде правильно, когда проверял по синтаксису,но лучше еще раз перепроверить, ведь ГоПоТа она такая, для ленивых, но проверять все равно надо:sneaky:.

Для сброса счетчиков schetchik и schetchik2 вам необходимо изменить их значения на 0, а не на millis(). Функция millis() возвращает текущее время в миллисекундах, и использование ее значения для сброса счетчиков не имеет смысла в данном контексте. Вместо этого вы можете установить значения счетчиков равными 0 напрямую:

cpp

schetchik = 0; // Сброс счетчика schetchik
schetchik2 = 0; // Сброс счетчика schetchik2

Также, в вашем коде есть несколько других проблем. Ниже приведен исправленный код с объяснениями изменений:

cpp

#include <Wire.h>
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27, 16, 2);
int schetchik = 0;
int schetchik2 = 0;
unsigned char enc_prev = 0;
float m = 0.00;
float m2 = 0.00;

void setup() {
pinMode(11, INPUT);
pinMode(12, INPUT);
pinMode(9, INPUT);
pinMode(10, INPUT);
pinMode(7, INPUT); // Добавлено объявление пина для сброса schetchik
pinMode(8, INPUT); // Добавлено объявление пина для сброса schetchik2
}

void loop() {
int enc_A = digitalRead(11);
int enc_B = digitalRead(12);
int enc_C = digitalRead(9); // Исправлено на enc_C
int enc_D = digitalRead(10);

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 / 1.00;
lcd.setCursor(10, 1);
lcd.print(m);

if ( (!enc_C) && (enc_prev) ) {
if (enc_D) {
if (schetchik2 + 1) schetchik2 += 1;
} else {
if (schetchik2 - 1 >= 0) schetchik2 -= 1;
}
}
enc_prev = enc_C;
m2 = schetchik2 / 1.00;
lcd.setCursor(10, 0);
lcd.print(m2);

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

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

Некоторые изменения, которые были внесены:

  1. Добавлено объявление пинов 7 и 8 для сброса счетчиков.
  2. Исправлено объявление enc_C для правильного считывания значения.
  3. Добавлены условия для проверки активации пинов 7 и 8, и в случае активации счетчики schetchik и schetchik2 устанавливаются в 0 для сброса.
 
Сверху Снизу
Обнаружен блокировщик рекламы AdBlock

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

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

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

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