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

Тоже интересно стало поковырять :)
Вот такие "грибы-опята" нашёл в тумбочке.
Энкодеры подключены к пинам А0-А4, используется аппаратное прерывание порта.
Кнопки энкодеров задействованы для обнуления счётчиков, подключены к пинам D4 и D5.
Дисплей по I2C - обновление 4 раза в сек, вывод в сериал - по факту изменения счётчиков.
Нормально, вроде, работает - оба энкодера крутили одновременно (пришлось жену заюзать) и максимально быстро - пропусков нет.
IMG_20230620_223352.jpg

C++:
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27, 20, 4);

// 14 пин - контакт A энкодер 1
// 15 пин - контакт C энкодер 1
// 16 пин - контакт A энкодер 2
// 17 пин - контакт C энкодер 2
// контакты В обоих энкодеров - на общий провод
// 4 пин - кнопка энкодера 2
// 5 пин - кнопка энкодера 1

#define DA0_Read (PINC & B00000001)      //A0 || 14
#define DA1_Read ((PINC & B00000010)>>1) //A1 || 15
#define DA2_Read ((PINC & B00000100)>>2) //A2 || 16
#define DA3_Read ((PINC & B00001000)>>3) //A3 || 17
#define DA4_Read ((PINC & B00010000)>>4) //A4 || 18
#define DA5_Read ((PINC & B00100000)>>5) //A5 || 19

#define DD4_Read ((PIND & B00010000)>>4)
#define DD5_Read ((PIND & B00100000)>>5)

uint8_t pinA1 = 0;            // состояние контакта A
uint8_t pinC1 = 0;            // состояние контакта C
bool blockA1 = false;         // блокировка прерывания на контакте A
bool blockC1 = false;         // блокировка прерывания на контакте C
uint8_t encoder_1 = 0;        // Результат энкодера 1

uint8_t pinA2 = 0;             // состояние контакта A
uint8_t pinC2 = 0;             // состояние контакта C
bool blockA2 = false;       // блокировка прерывания на контакте A
bool blockC2 = false;       // блокировка прерывания на контакте C
uint8_t encoder_2 = 0;         // Результат энкодера 2

volatile uint8_t oldPINC = 0xFF;

bool need_print_1 = true;
bool need_print_2 = true;
int Count_1 = 0;
int Count_2 = 0;


void setup() {
  // Прерывание по изменению состояния для A0,A1,A2,A3
  PCMSK1 |= (1 << PCINT8) | (1 << PCINT9) | (1 << PCINT10) | (1 << PCINT11);
  //разрешить прерывание
  PCICR |= (1 << PCIE1);

  Serial.begin(115200);
  lcd.begin();
  lcd.backlight();
  lcd.setCursor(0, 0);
  lcd.print("Enc 1 = ");
  lcd.setCursor(0, 1);
  lcd.print("Enc 2 = ");
}

void loop() {
  if (need_print_1) {
    Serial.print("E1 = ");
    Serial.println(Count_1);
    need_print_1 = !need_print_1;
  }

  if (need_print_2) {
    Serial.print("E2 = ");
    Serial.println(Count_2);
    need_print_2 = !need_print_2;
  }

  if (!DD5_Read) Count_1 = 0;
  if (!DD4_Read) Count_2 = 0;

  static uint32_t prevMillis = 0;
  if (millis() - prevMillis > 250) {
    lcdUpdate();
    prevMillis = millis();
  }
}

void lcdUpdate() {
  lcd.setCursor(8, 0);
  lcd.print("           ");
  lcd.setCursor(8, 0);
  lcd.print(Count_1);

  lcd.setCursor(8, 1);
  lcd.print("           ");
  lcd.setCursor(8, 1);
  lcd.print(Count_2);
}

// Обработчик запросов прерывания от пинов A0..A3
ISR (PCINT1_vect) {
  uint8_t changedbits = PINC ^ oldPINC;
  oldPINC = PINC;
  if (changedbits & (1 << PC0)) pinA_change_1(); // контакт A энкодер 1
  if (changedbits & (1 << PC1)) pinC_change_1(); // контакт C энкодер 1
  if (changedbits & (1 << PC2)) pinA_change_2(); // контакт A энкодер 2
  if (changedbits & (1 << PC3)) pinC_change_2(); // контакт C энкодер 2
}

// Интерпретируем результат энкодера 2
void get_encoder_1 () {
  encoder_1 = encoder_1 & B00001111;
  if (encoder_1 == B1011) {
    Count_1++;  // по часовой
    need_print_1 = true;
  }
  if (encoder_1 == B0111) {
    Count_1--;  // против часовой
    need_print_1 = true;
  }
}

// Изменилось состояние контакта А энкодера 1
void pinA_change_1 () {
  if (blockA1) return;
  pinA1 = !DA0_Read;
  pinC1 = !DA1_Read;
  encoder_1 <<= 1;
  bitWrite(encoder_1, 0, pinA1);
  encoder_1  <<= 1;
  bitWrite(encoder_1, 0, pinC1);
  get_encoder_1();
  blockA1 = !(!pinA1 && !pinC1);
  blockC1 = false;
}

// Изменилось состояние контакта C энкодера 1
void pinC_change_1 () {
  if (blockC1) return;
  pinA1 = !DA0_Read;
  pinC1 = !DA1_Read;
  encoder_1  <<= 1;
  bitWrite(encoder_1, 0, pinA1);
  encoder_1  <<= 1;
  bitWrite(encoder_1, 0, pinC1);
  get_encoder_1();
  blockC1 = !(!pinA1 && !pinC1);
  blockA1 = false;
}

// Интерпретируем результат энкодера 2
void get_encoder_2 () {
  encoder_2 = encoder_2 & B00001111;
  if (encoder_2 == B1011) {
    Count_2 ++;
    need_print_2 = true;
  }
  if (encoder_2 == B0111) {
    Count_2 --;
    need_print_2 = true;
  }
}

// Изменилось состояние контакта А энкодера 2
void pinA_change_2 () {
  if (blockA2) return;
  pinA2 = !DA2_Read;
  pinC2 = !DA3_Read;
  encoder_2  <<= 1;
  bitWrite(encoder_2, 0, pinA2);
  encoder_2  <<= 1;
  bitWrite(encoder_2, 0, pinC2);
  get_encoder_2();
  blockA2 = !(!pinA2 && !pinC2);
  blockC2 = false;
}

// Изменилось состояние контакта C энкодера 2
void pinC_change_2 () {
  if (blockC2) return;
  pinA2 = !DA2_Read;
  pinC2 = !DA3_Read;
  encoder_2 <<= 1;
  bitWrite(encoder_2, 0, pinA2);
  encoder_2 <<= 1;
  bitWrite(encoder_2, 0, pinC2);
  get_encoder_2();
  blockC2 = !(!pinA2 && !pinC2);
  blockA2 = false;
}
 

Вложения

  • enc_test_2.zip
    1.6 KB · Просмотры: 3
Вариант с библой GyverEncoder от AlexGyver-а
C++:
#include <LiquidCrystal_I2C.h>
#include "GyverEncoder.h"
Encoder enc1(14, 15, 5);
Encoder enc2(16, 17, 4);
LiquidCrystal_I2C lcd(0x27, 20, 4);

// 14 пин - контакт A энкодер 1
// 15 пин - контакт C энкодер 1
// 16 пин - контакт A энкодер 2
// 17 пин - контакт C энкодер 2
// контакты В обоих энкодеров - на общий провод
// 4 пин - кнопка энкодера 2
// 5 пин - кнопка энкодера 1

bool need_print_1 = true;
bool need_print_2 = true;
int Count_1 = 0;
int Count_2 = 0;

uint8_t enc1A;
uint8_t enc1B;
uint8_t enc2A;
uint8_t enc2B;

void setup() {
  enc1.setType(TYPE2);
  enc2.setType(TYPE2);
  Serial.begin(115200);
  lcd.begin();
  lcd.backlight();
  lcd.setCursor(0, 0);
  lcd.print("Enc 1 = ");
  lcd.setCursor(0, 1);
  lcd.print("Enc 2 = ");
}

void loop() {
    enc1.tick();
    enc2.tick();

    if (enc1.isLeft()) {
      Count_1--;
      need_print_1 = true;
    }
    if (enc1.isRight()) {
      Count_1++;
      need_print_1 = true;
    }
    if (enc2.isLeft()) {
      Count_2--;
      need_print_2 = true;
    }
    if (enc2.isRight()) {
      Count_2++;
      need_print_2 = true;
    }
 
  if (need_print_1) {
    Serial.print("E1 = ");
    Serial.println(Count_1);
    need_print_1 = !need_print_1;
  }

  if (need_print_2) {
    Serial.print("E2 = ");
    Serial.println(Count_2);
    need_print_2 = !need_print_2;
  }

  if (enc1.isPress()) Count_1 = 0;
  if (enc2.isPress()) Count_2 = 0;

  static uint32_t prevMillis = 0;
  if (millis() - prevMillis > 250) {
    lcdUpdate();
    prevMillis = millis();
  }
}

void lcdUpdate() {
  lcd.setCursor(8, 0);
  lcd.print("           ");
  lcd.setCursor(8, 0);
  lcd.print(Count_1);

  lcd.setCursor(8, 1);
  lcd.print("           ");
  lcd.setCursor(8, 1);
  lcd.print(Count_2);
}
 

Вложения

  • enc_test.zip
    928 байт · Просмотры: 4
Ну и попробовал изначальный код опроса из этой темы с некоторыми модификациями.
C++:
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 20, 4);

// 14 пин - контакт A энкодер 1
// 15 пин - контакт C энкодер 1
// 16 пин - контакт A энкодер 2
// 17 пин - контакт C энкодер 2
// контакты В обоих энкодеров - на общий провод
// 4 пин - кнопка энкодера 2
// 5 пин - кнопка энкодера 1

#define DA0_Read (PINC & B00000001)      //A0 || 14
#define DA1_Read ((PINC & B00000010)>>1) //A1 || 15
#define DA2_Read ((PINC & B00000100)>>2) //A2 || 16
#define DA3_Read ((PINC & B00001000)>>3) //A3 || 17
#define DD4_Read ((PIND & B00010000)>>4)
#define DD5_Read ((PIND & B00100000)>>5)


bool need_print_1 = true;
bool need_print_2 = true;
int Count_1 = 0;
int Count_2 = 0;
float m_1 = 0.0f;
float m_2 = 0.0f;
float multiplier = 1.0f;

void setup() {
  Serial.begin(115200);
  lcd.begin();
  lcd.backlight();
  lcd.setCursor(0, 0);
  lcd.print("Enc 1 = ");
  lcd.setCursor(0, 1);
  lcd.print("Enc 2 = ");
}

void loop() {
  doEncoder_1();
  doEncoder_2();
  if (need_print_1) {
    Serial.print("E1 = ");
    Serial.println(Count_1);
    need_print_1 = !need_print_1;
  }

  if (need_print_2) {
    Serial.print("E2 = ");
    Serial.println(Count_2);
    need_print_2 = !need_print_2;
  }

  static uint32_t prevMillis = 0;
  if (millis() - prevMillis > 250) {
    lcdUpdate();
    prevMillis = millis();
  }
}

void doEncoder_1() {
  static uint8_t enc_prev_1 = 0;
  bool enc_A = DA0_Read;
  bool enc_B = DA1_Read;
 
  if ( (!enc_A) && (enc_prev_1) ) {
    if (enc_B) {
      Count_1 ++;
    } else {
      Count_1 --;
    }
    need_print_1 = true;
  }
  enc_prev_1 = enc_A;
  if (!DD5_Read) Count_1 = 0;
}

void doEncoder_2() {
  static uint8_t enc_prev_2 = 0;
  bool enc_A = DA2_Read;
  bool enc_B = DA3_Read;

  if ( (!enc_A) && (enc_prev_2) ) {
    if (enc_B) {
      Count_2++;
    } else {
      Count_2--;
    }
    need_print_2 = true;
  }
  enc_prev_2 = enc_A;
  if (!DD4_Read) Count_2 = 0;
}

void lcdUpdate() {
  lcd.setCursor(8, 0);
  lcd.print("           ");
  lcd.setCursor(8, 0);
  lcd.print(Count_1);
  //m_1 = (float)Count_1 / multiplier;
  //lcd.print(m_1, 3);

  lcd.setCursor(8, 1);
  lcd.print("           ");
  lcd.setCursor(8, 1);
  lcd.print(Count_2);
  //m_2 = (float)Count_2 / multiplier;
  //lcd.print(m_2, 3);
}
 

Вложения

  • enc_test_3.zip
    1.1 KB · Просмотры: 5
Ещё чуть модифицированный код из #112 с опросом через прерывание порта, но менее замудрёный, чем в #110 и без сторонних библиотек, как в #111. Прерывание "дёргается" по изменению состояния одного из выводов энкодера и, по сути, можно на один порт повесить до 8 энкодеров.
Так же, в скетче добавил комментов, что должно упростить понимание, что и зачем.
C++:
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27, 20, 4);

//Подключение энкодеров
// 14 пин - контакт A энкодер 1
// 15 пин - контакт C энкодер 1
// 16 пин - контакт A энкодер 2
// 17 пин - контакт C энкодер 2
// контакты В обоих энкодеров - на общий провод
// 4 пин - кнопка энкодера 2
// 5 пин - кнопка энкодера 1

//замена ардуиновской digitalRead
#define DA0_Read (PINC & B00000001)      //A0 || 14
#define DA1_Read ((PINC & B00000010)>>1) //A1 || 15
#define DA2_Read ((PINC & B00000100)>>2) //A2 || 16
#define DA3_Read ((PINC & B00001000)>>3) //A3 || 17
#define DD4_Read ((PIND & B00010000)>>4) //D4
#define DD5_Read ((PIND & B00100000)>>5) //D5

//флаги, разрешающие вывод в сериал-порт
//если вывод не нужен - убираем
bool need_print_1 = true;
bool need_print_2 = true;

//счётчики импульсов энкодеров
int Count_1 = 0;
int Count_2 = 0;

//коэффициент делителя импульсов
const float multiplier = 1.0f;

void setup() {
  //инициализируем сериал-порт, если вывод не нужен - убираем
  Serial.begin(115200);
 
  //инициализируем дисплей
  lcd.begin();
  lcd.backlight();

  //печатаем неизменяемые поля дисплея
  lcdSet();
 
  // Прерывание по изменению состояния A0,A2
  PCMSK1 |= (1 << PCINT8) | (1 << PCINT10);
  PCICR |= (1 << PCIE1);
}


void loop() {
  //опрос кнопок
  readButtons();
 
  //вывод в сериал-порт, если вывод не нужен - убираем
  print2serial();
 
  //обновление дисплея каждые 250 мсек
  static uint32_t prevMillis = 0;
  if (millis() - prevMillis > 250) {
    lcdUpdate();
    prevMillis = millis();
  }
}

//обработчик энкодера 1
void doEncoder_1() {
  static uint8_t enc_prev_1 = 1;
  bool enc_A = DA0_Read;
  bool enc_B = DA1_Read;
  if ( (!enc_A) && (enc_prev_1) ) {
    (enc_B) ? (Count_1++) : (Count_1--);
    need_print_1 = true;
  }
  enc_prev_1 = enc_A;
}

//обработчик энкодера 2
void doEncoder_2() {
  static uint8_t enc_prev_2 = 1;
  bool enc_A = DA2_Read;
  bool enc_B = DA3_Read;
  if ( (!enc_A) && (enc_prev_2) ) {
    (enc_B) ? (Count_2++) : (Count_2--);
    need_print_2 = true;
  }
  enc_prev_2 = enc_A;
}

//печатаем неизменяемые поля дисплея
void lcdSet() {
  lcd.setCursor(0, 0);
  lcd.print(F("Enc 1 = "));
  lcd.setCursor(0, 1);
  lcd.print(F("Enc 2 = "));
}

//вывод значений на дисплей
void lcdUpdate() {
  printValue(8, 0, Count_1);
  printValue(8, 1, Count_2);
}

//печать значения в указанную колонку-строку
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);
}

//прерывание порта С
ISR (PCINT1_vect) {
  doEncoder_1();
  doEncoder_2();
}

//Читаем кнопки обнуления. Нажатием считаем низкий уровень
void readButtons() {
  if (!DD5_Read) Count_1 = 0;
  if (!DD4_Read) Count_2 = 0;
}

//вывод в сериал-порт, если вывод не нужен - убираем
void print2serial() {
  if (need_print_1) {
    Serial.print("E1 = ");
    Serial.println(Count_1);
    need_print_1 = !need_print_1;
  }

  if (need_print_2) {
    Serial.print("E2 = ");
    Serial.println(Count_2);
    need_print_2 = !need_print_2;
  }
}
 

Вложения

  • enc_test_4.zip
    1.3 KB · Просмотры: 3
их тогда нужно будет переключать
Переключать не надо. На один порт с общим прерыванием вешаем выводы A энкодеров, на другой порт - выводы С энкодеров. В прерывание порта размещаем обработчики для них.
Но это теория, конечно, для попробовать у меня столько энкодеров нет.
 
  • Последнее редактирование:
Последнее редактирование:
Я немного не вгоняю!
У нас 2 порта прерываний, если конечно любой другой порт не программируется на прием прерываний.
1-jpg.47510

Для приема с 8 датчиков нужно либо делать выборку, либо сигнал с датчика одновременно приходит как на входной порт, так и порт прерывания. На пример через элемент "8ИЛИ".
Выборку делать сигналами с по крайней мере 3х выходов или же тактового сигнала и опять же через логику "2И "
По поводу энкодеров 8 штук, тут надо что бы дисплей был на 8 строк, либо была прокрутка "Вверх -Вниз", либо под каждый энкодер запрограммировать их позиции на дисплее.
Конечно в природе есть контроллеры на 9 осей, но в нашем случае с 3018 это будет излишне!

По скечу:
// 14 пин - контакт A энкодер 1
// 15 пин - контакт C энкодер 1
// 16 пин - контакт A энкодер 2
// 17 пин - контакт C энкодер 2
Используем входа А0 - А3?
 
У нас 2 порта прерываний
сразу уточним по терминологии: порт - это группа из 8 пинов (байт), пин - это отдельный вывод контроллера (бит). Портов - три: PB, PD, PC и у каждого есть возможность назначить для отдельных пинов прерывание на изменение уровня. У порта PD имеется возможность назначить двум пинам D2 и D3 "самостоятельные" прерывания INT0 и INT1 с отработкой по лог. 0, 1 или изменению уровня. Тут, конечно не очень удобно, в том плане, что не все пины каждого порта могут использованы, т.к. у PB два пина использованы для подключения кварца, у PD - пара использованы под вход UART, а у PC - под резет и одного, вроде, вообще не выведено.
Итого - можно подключить часть выводов А энкодеров к пинам 8-13 порта PB (5 штук) и включить прерывание PCINT0, оставшиеся 3 штуки - к пинам A0-A2 порта PC (PCINT1).
Под выводы С энкодеров задействуем пины 2-7 порта PD и ещё один - пин А3 (PC) и пин RX (PD).
Последнее - неудобно, т.к. придётся отключать от него вывод энкодера для заливки программы, или ограничиться только 7 энкодерами.
Ну и A4, A5 - дисплей и всё, пины закончились...
Для освобождения пинов или увеличения количества энкодеров придётся применять расширение портов с помошью спец. микросхем - MCP23017, MCP2308, PCA9555 и.т.п и подключать их к шине I2C.

А что, на самом деле нужно 8 энкодеров подключать?

либо под каждый энкодер запрограммировать их позиции на дисплее.
С дисплеями 1604 или 2004 вполне прокатит до 8 штук. Больше - с прокруткой или переключением экранов.

Используем входа А0 - А3?
Да. Как аналоговые, они в ардуиновской терминологии А0...А3, а как цифровые - 14...17.
 
А что, на самом деле нужно 8 энкодеров подключать?
Упаси боже!
в нашем случае с 3018 это будет излишне!
В моём случае только 2 энкодера.
В других темах я писал, что в своем горизонтально - фрезерном, плоскошлифовальном, расточном станочке отказался от приводов. Оси будут "Ручными".
Ходовые винты будут приводиться в движение через редуктор, а тот в свою очередь штурвальчиком. На вал соединяющий штурвальчик с редуктором закреплю колесико от логитековстой мышки, соответственно будет стоять оптическое трио из светодиода и сдвоенного оптотранзистора. Механика на подходе.
1687518183150.png
Для 3-й оси даже штурвалчик не нужен. Она будет приводиться рукояткой.
А посему у меня освободилось три ШД.
Дело в том, что с электронным управлением велик риск перелететь в координатах.
 
  • Последнее редактирование:
Последнее редактирование:
В моём случае только 2 энкодера.
Тогда вполне достаточно скетча из #113 или сделать аналогично, но на пинах с прерываниями INT0, INT1, как имеющих наивысший приоритет после Reset-а.
С прерываниями на пинах 2 и 3
C++:
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27, 20, 4);

//Подключение энкодеров
// 2 пин - контакт A энкодер 1
// 4 пин - контакт C энкодер 1

// 3 пин - контакт A энкодер 2
// 5 пин - контакт C энкодер 2

// 6 пин - кнопка энкодера 1
// 7 пин - кнопка энкодера 2
// контакты В обоих энкодеров - на общий провод

//замена ардуиновской digitalRead
#define D2_Read ((PIND & B00000100)>>2)
#define D3_Read ((PIND & B00001000)>>3)
#define D4_Read ((PIND & B00010000)>>4)
#define D5_Read ((PIND & B00100000)>>5)
#define D6_Read ((PIND & B01000000)>>6)
#define D7_Read ((PIND & B10000000)>>7)

//флаги, разрешающие вывод в сериал-порт
//если вывод не нужен - убираем
bool need_print_1 = true;
bool need_print_2 = true;

//счётчики импульсов энкодеров
int Count_1 = 0;
int Count_2 = 0;

//коэффициент делителя импульсов
const float multiplier = 10.0f;

void setup() {
  //инициализируем сериал-порт, если вывод не нужен - убираем
  Serial.begin(115200);
 
  //инициализируем дисплей
  lcd.begin();
  lcd.backlight();

  //печатаем неизменяемые поля дисплея
  lcdSet();
 
  // Прерывание по изменению состояния D2,D3
  attachInterrupt(0, doEncoder_1,CHANGE);
  attachInterrupt(1, doEncoder_2,CHANGE);
}


void loop() {
  //опрос кнопок
  readButtons();
 
  //вывод в сериал-порт, если вывод не нужен - убираем
  print2serial();
 
  //обновление дисплея каждые 250 мсек
  static uint32_t prevMillis = 0;
  if (millis() - prevMillis > 250) {
    lcdUpdate();
    prevMillis = millis();
  }
}

//обработчик энкодера 1
void doEncoder_1() {
  static uint8_t enc_prev_1 = 1;
  bool enc_A = D2_Read;
  bool enc_B = D4_Read;
  if ( (!enc_A) && (enc_prev_1) ) {
    (enc_B) ? (Count_1++) : (Count_1--);
    need_print_1 = true; //если вывод в сериал не нужен - убираем
  }
  enc_prev_1 = enc_A;
}

//обработчик энкодера 2
void doEncoder_2() {
  static uint8_t enc_prev_2 = 1;
  bool enc_A = D3_Read;
  bool enc_B = D5_Read;
  if ( (!enc_A) && (enc_prev_2) ) {
    (enc_B) ? (Count_2++) : (Count_2--);
    need_print_2 = true; //если вывод в сериал не нужен - убираем
  }
  enc_prev_2 = enc_A;
}

//печатаем неизменяемые поля дисплея
void lcdSet() {
  lcd.setCursor(0, 0);
  lcd.print(F("Enc 1 = "));
  lcd.setCursor(0, 1);
  lcd.print(F("Enc 2 = "));
}

//вывод значений на дисплей
void lcdUpdate() {
  printValue(8, 0, Count_1);
  printValue(8, 1, Count_2);
}

//печать значения в указанную колонку-строку
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);
}

//Читаем кнопки обнуления. Нажатием считаем низкий уровень
void readButtons() {
  if (!D6_Read) Count_1 = 0;
  if (!D7_Read) Count_2 = 0;
}

//вывод в сериал-порт, если вывод не нужен - убираем
void print2serial() {
  if (need_print_1) {
    Serial.print("E1 = ");
    Serial.println(Count_1);
    need_print_1 = !need_print_1;
  }

  if (need_print_2) {
    Serial.print("E2 = ");
    Serial.println(Count_2);
    need_print_2 = !need_print_2;
  }
}
 

Вложения

  • enc_test_5.zip
    1.6 KB · Просмотры: 3
добрый день! включил дисплей к контроллеру и начал ставить скетч. на инт бегин установка зависла
1687851523059.png
Ваши сообщения автоматически объединены:

Arduino: 1.8.19 (Windows 7), Плата:"Arduino Nano, ATmega168"

C:\Program Files\Arduino\arduino-builder -dump-prefs -logger=machine -hardware C:\Program Files\Arduino\hardware -hardware C:\Users\Администратор\AppData\Local\Arduino15\packages -tools C:\Program Files\Arduino\tools-builder -tools C:\Program Files\Arduino\hardware\tools\avr -tools C:\Users\Администратор\AppData\Local\Arduino15\packages -built-in-libraries C:\Program Files\Arduino\libraries -libraries C:\Users\Администратор\Documents\Arduino\libraries -fqbn=arduino:avr:nano:cpu=atmega168 -vid-pid=1A86_7523 -ide-version=10819 -build-path C:\Users\836D~1\AppData\Local\Temp\arduino_build_768818 -warnings=more -build-cache C:\Users\836D~1\AppData\Local\Temp\arduino_cache_273181 -prefs=build.warn_data_percentage=75 -prefs=runtime.tools.avr-gcc.path=C:\Users\Администратор\AppData\Local\Arduino15\packages\arduino\tools\avr-gcc\7.3.0-atmel3.6.1-arduino7 -prefs=runtime.tools.avr-gcc-7.3.0-atmel3.6.1-arduino7.path=C:\Users\Администратор\AppData\Local\Arduino15\packages\arduino\tools\avr-gcc\7.3.0-atmel3.6.1-arduino7 -prefs=runtime.tools.avrdude.path=C:\Users\Администратор\AppData\Local\Arduino15\packages\arduino\tools\avrdude\6.3.0-arduino17 -prefs=runtime.tools.avrdude-6.3.0-arduino17.path=C:\Users\Администратор\AppData\Local\Arduino15\packages\arduino\tools\avrdude\6.3.0-arduino17 -prefs=runtime.tools.arduinoOTA.path=C:\Users\Администратор\AppData\Local\Arduino15\packages\arduino\tools\arduinoOTA\1.3.0 -prefs=runtime.tools.arduinoOTA-1.3.0.path=C:\Users\Администратор\AppData\Local\Arduino15\packages\arduino\tools\arduinoOTA\1.3.0 -verbose E:\hobbi\sketchi\enc_test_4\enc_test_4\enc_test_4.ino

C:\Program Files\Arduino\arduino-builder -compile -logger=machine -hardware C:\Program Files\Arduino\hardware -hardware C:\Users\Администратор\AppData\Local\Arduino15\packages -tools C:\Program Files\Arduino\tools-builder -tools C:\Program Files\Arduino\hardware\tools\avr -tools C:\Users\Администратор\AppData\Local\Arduino15\packages -built-in-libraries C:\Program Files\Arduino\libraries -libraries C:\Users\Администратор\Documents\Arduino\libraries -fqbn=arduino:avr:nano:cpu=atmega168 -vid-pid=1A86_7523 -ide-version=10819 -build-path C:\Users\836D~1\AppData\Local\Temp\arduino_build_768818 -warnings=more -build-cache C:\Users\836D~1\AppData\Local\Temp\arduino_cache_273181 -prefs=build.warn_data_percentage=75 -prefs=runtime.tools.avr-gcc.path=C:\Users\Администратор\AppData\Local\Arduino15\packages\arduino\tools\avr-gcc\7.3.0-atmel3.6.1-arduino7 -prefs=runtime.tools.avr-gcc-7.3.0-atmel3.6.1-arduino7.path=C:\Users\Администратор\AppData\Local\Arduino15\packages\arduino\tools\avr-gcc\7.3.0-atmel3.6.1-arduino7 -prefs=runtime.tools.avrdude.path=C:\Users\Администратор\AppData\Local\Arduino15\packages\arduino\tools\avrdude\6.3.0-arduino17 -prefs=runtime.tools.avrdude-6.3.0-arduino17.path=C:\Users\Администратор\AppData\Local\Arduino15\packages\arduino\tools\avrdude\6.3.0-arduino17 -prefs=runtime.tools.arduinoOTA.path=C:\Users\Администратор\AppData\Local\Arduino15\packages\arduino\tools\arduinoOTA\1.3.0 -prefs=runtime.tools.arduinoOTA-1.3.0.path=C:\Users\Администратор\AppData\Local\Arduino15\packages\arduino\tools\arduinoOTA\1.3.0 -verbose E:\hobbi\sketchi\enc_test_4\enc_test_4\enc_test_4.ino

Using board 'nano' from platform in folder: C:\Users\Администратор\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.6

Using core 'arduino' from platform in folder: C:\Users\Администратор\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.6

Detecting libraries used...

"C:\\Users\\Администратор\\AppData\\Local\\Arduino15\\packages\\arduino\\tools\\avr-gcc\\7.3.0-atmel3.6.1-arduino7/bin/avr-g++" -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -Wno-error=narrowing -flto -w -x c++ -E -CC -mmcu=atmega168 -DF_CPU=16000000L -DARDUINO=10819 -DARDUINO_AVR_NANO -DARDUINO_ARCH_AVR "-IC:\\Users\\Администратор\\AppData\\Local\\Arduino15\\packages\\arduino\\hardware\\avr\\1.8.6\\cores\\arduino" "-IC:\\Users\\Администратор\\AppData\\Local\\Arduino15\\packages\\arduino\\hardware\\avr\\1.8.6\\variants\\eightanaloginputs" "C:\\Users\\836D~1\\AppData\\Local\\Temp\\arduino_build_768818\\sketch\\enc_test_4.ino.cpp" -o nul

Alternatives for Wire.h: [Wire]

ResolveLibrary(Wire.h)

-> candidates: [Wire]

"C:\\Users\\Администратор\\AppData\\Local\\Arduino15\\packages\\arduino\\tools\\avr-gcc\\7.3.0-atmel3.6.1-arduino7/bin/avr-g++" -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -Wno-error=narrowing -flto -w -x c++ -E -CC -mmcu=atmega168 -DF_CPU=16000000L -DARDUINO=10819 -DARDUINO_AVR_NANO -DARDUINO_ARCH_AVR "-IC:\\Users\\Администратор\\AppData\\Local\\Arduino15\\packages\\arduino\\hardware\\avr\\1.8.6\\cores\\arduino" "-IC:\\Users\\Администратор\\AppData\\Local\\Arduino15\\packages\\arduino\\hardware\\avr\\1.8.6\\variants\\eightanaloginputs" "-IC:\\Users\\Администратор\\AppData\\Local\\Arduino15\\packages\\arduino\\hardware\\avr\\1.8.6\\libraries\\Wire" "C:\\Users\\836D~1\\AppData\\Local\\Temp\\arduino_build_768818\\sketch\\enc_test_4.ino.cpp" -o nul

Alternatives for LiquidCrystal_I2C.h: [LiquidCrystal_I2C@1.1.2 LiquidCrystal_I2C-master@2.6.1]

ResolveLibrary(LiquidCrystal_I2C.h)

-> candidates: [LiquidCrystal_I2C@1.1.2 LiquidCrystal_I2C-master@2.6.1]

"C:\\Users\\Администратор\\AppData\\Local\\Arduino15\\packages\\arduino\\tools\\avr-gcc\\7.3.0-atmel3.6.1-arduino7/bin/avr-g++" -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -Wno-error=narrowing -flto -w -x c++ -E -CC -mmcu=atmega168 -DF_CPU=16000000L -DARDUINO=10819 -DARDUINO_AVR_NANO -DARDUINO_ARCH_AVR "-IC:\\Users\\Администратор\\AppData\\Local\\Arduino15\\packages\\arduino\\hardware\\avr\\1.8.6\\cores\\arduino" "-IC:\\Users\\Администратор\\AppData\\Local\\Arduino15\\packages\\arduino\\hardware\\avr\\1.8.6\\variants\\eightanaloginputs" "-IC:\\Users\\Администратор\\AppData\\Local\\Arduino15\\packages\\arduino\\hardware\\avr\\1.8.6\\libraries\\Wire" "-IC:\\Users\\Администратор\\Documents\\Arduino\\libraries\\LiquidCrystal_I2C" "C:\\Users\\836D~1\\AppData\\Local\\Temp\\arduino_build_768818\\sketch\\enc_test_4.ino.cpp" -o nul

"C:\\Users\\Администратор\\AppData\\Local\\Arduino15\\packages\\arduino\\tools\\avr-gcc\\7.3.0-atmel3.6.1-arduino7/bin/avr-g++" -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -Wno-error=narrowing -flto -w -x c++ -E -CC -mmcu=atmega168 -DF_CPU=16000000L -DARDUINO=10819 -DARDUINO_AVR_NANO -DARDUINO_ARCH_AVR "-IC:\\Users\\Администратор\\AppData\\Local\\Arduino15\\packages\\arduino\\hardware\\avr\\1.8.6\\cores\\arduino" "-IC:\\Users\\Администратор\\AppData\\Local\\Arduino15\\packages\\arduino\\hardware\\avr\\1.8.6\\variants\\eightanaloginputs" "-IC:\\Users\\Администратор\\AppData\\Local\\Arduino15\\packages\\arduino\\hardware\\avr\\1.8.6\\libraries\\Wire" "-IC:\\Users\\Администратор\\Documents\\Arduino\\libraries\\LiquidCrystal_I2C" "-IC:\\Users\\Администратор\\AppData\\Local\\Arduino15\\packages\\arduino\\hardware\\avr\\1.8.6\\libraries\\Wire\\utility" "C:\\Users\\Администратор\\AppData\\Local\\Arduino15\\packages\\arduino\\hardware\\avr\\1.8.6\\libraries\\Wire\\Wire.cpp" -o nul

"C:\\Users\\Администратор\\AppData\\Local\\Arduino15\\packages\\arduino\\tools\\avr-gcc\\7.3.0-atmel3.6.1-arduino7/bin/avr-g++" -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -Wno-error=narrowing -flto -w -x c++ -E -CC -mmcu=atmega168 -DF_CPU=16000000L -DARDUINO=10819 -DARDUINO_AVR_NANO -DARDUINO_ARCH_AVR "-IC:\\Users\\Администратор\\AppData\\Local\\Arduino15\\packages\\arduino\\hardware\\avr\\1.8.6\\cores\\arduino" "-IC:\\Users\\Администратор\\AppData\\Local\\Arduino15\\packages\\arduino\\hardware\\avr\\1.8.6\\variants\\eightanaloginputs" "-IC:\\Users\\Администратор\\AppData\\Local\\Arduino15\\packages\\arduino\\hardware\\avr\\1.8.6\\libraries\\Wire" "-IC:\\Users\\Администратор\\Documents\\Arduino\\libraries\\LiquidCrystal_I2C" "-IC:\\Users\\Администратор\\AppData\\Local\\Arduino15\\packages\\arduino\\hardware\\avr\\1.8.6\\libraries\\Wire\\utility" "C:\\Users\\Администратор\\AppData\\Local\\Arduino15\\packages\\arduino\\hardware\\avr\\1.8.6\\libraries\\Wire\\utility\\twi.c" -o nul

"C:\\Users\\Администратор\\AppData\\Local\\Arduino15\\packages\\arduino\\tools\\avr-gcc\\7.3.0-atmel3.6.1-arduino7/bin/avr-g++" -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -Wno-error=narrowing -flto -w -x c++ -E -CC -mmcu=atmega168 -DF_CPU=16000000L -DARDUINO=10819 -DARDUINO_AVR_NANO -DARDUINO_ARCH_AVR "-IC:\\Users\\Администратор\\AppData\\Local\\Arduino15\\packages\\arduino\\hardware\\avr\\1.8.6\\cores\\arduino" "-IC:\\Users\\Администратор\\AppData\\Local\\Arduino15\\packages\\arduino\\hardware\\avr\\1.8.6\\variants\\eightanaloginputs" "-IC:\\Users\\Администратор\\AppData\\Local\\Arduino15\\packages\\arduino\\hardware\\avr\\1.8.6\\libraries\\Wire" "-IC:\\Users\\Администратор\\Documents\\Arduino\\libraries\\LiquidCrystal_I2C" "C:\\Users\\Администратор\\Documents\\Arduino\\libraries\\LiquidCrystal_I2C\\LiquidCrystal_I2C.cpp" -o nul

Generating function prototypes...

"C:\\Users\\Администратор\\AppData\\Local\\Arduino15\\packages\\arduino\\tools\\avr-gcc\\7.3.0-atmel3.6.1-arduino7/bin/avr-g++" -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -Wno-error=narrowing -flto -w -x c++ -E -CC -mmcu=atmega168 -DF_CPU=16000000L -DARDUINO=10819 -DARDUINO_AVR_NANO -DARDUINO_ARCH_AVR "-IC:\\Users\\Администратор\\AppData\\Local\\Arduino15\\packages\\arduino\\hardware\\avr\\1.8.6\\cores\\arduino" "-IC:\\Users\\Администратор\\AppData\\Local\\Arduino15\\packages\\arduino\\hardware\\avr\\1.8.6\\variants\\eightanaloginputs" "-IC:\\Users\\Администратор\\AppData\\Local\\Arduino15\\packages\\arduino\\hardware\\avr\\1.8.6\\libraries\\Wire" "-IC:\\Users\\Администратор\\Documents\\Arduino\\libraries\\LiquidCrystal_I2C" "C:\\Users\\836D~1\\AppData\\Local\\Temp\\arduino_build_768818\\sketch\\enc_test_4.ino.cpp" -o "C:\\Users\\836D~1\\AppData\\Local\\Temp\\arduino_build_768818\\preproc\\ctags_target_for_gcc_minus_e.cpp"

"C:\\Program Files\\Arduino\\tools-builder\\ctags\\5.8-arduino11/ctags" -u --language-force=c++ -f - --c++-kinds=svpf --fields=KSTtzns --line-directives "C:\\Users\\836D~1\\AppData\\Local\\Temp\\arduino_build_768818\\preproc\\ctags_target_for_gcc_minus_e.cpp"

Компиляция скетча...

"C:\\Users\\Администратор\\AppData\\Local\\Arduino15\\packages\\arduino\\tools\\avr-gcc\\7.3.0-atmel3.6.1-arduino7/bin/avr-g++" -c -g -Os -Wall -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -Wno-error=narrowing -MMD -flto -mmcu=atmega168 -DF_CPU=16000000L -DARDUINO=10819 -DARDUINO_AVR_NANO -DARDUINO_ARCH_AVR "-IC:\\Users\\Администратор\\AppData\\Local\\Arduino15\\packages\\arduino\\hardware\\avr\\1.8.6\\cores\\arduino" "-IC:\\Users\\Администратор\\AppData\\Local\\Arduino15\\packages\\arduino\\hardware\\avr\\1.8.6\\variants\\eightanaloginputs" "-IC:\\Users\\Администратор\\AppData\\Local\\Arduino15\\packages\\arduino\\hardware\\avr\\1.8.6\\libraries\\Wire" "-IC:\\Users\\Администратор\\Documents\\Arduino\\libraries\\LiquidCrystal_I2C" "C:\\Users\\836D~1\\AppData\\Local\\Temp\\arduino_build_768818\\sketch\\enc_test_4.ino.cpp" -o "C:\\Users\\836D~1\\AppData\\Local\\Temp\\arduino_build_768818\\sketch\\enc_test_4.ino.cpp.o"

E:\hobbi\sketchi\enc_test_4\enc_test_4\enc_test_4.ino: In function 'void setup()':

enc_test_4:38:13: error: no matching function for call to 'LiquidCrystal_I2C::begin()'

lcd.begin();

^

In file included from E:\hobbi\sketchi\enc_test_4\enc_test_4\enc_test_4.ino:3:0:

C:\Users\�������������\Documents\Arduino\libraries\LiquidCrystal_I2C/LiquidCrystal_I2C.h:58:8: note: candidate: void LiquidCrystal_I2C::begin(uint8_t, uint8_t, uint8_t)

void begin(uint8_t cols, uint8_t rows, uint8_t charsize = LCD_5x8DOTS );

^~~~~

C:\Users\�������������\Documents\Arduino\libraries\LiquidCrystal_I2C/LiquidCrystal_I2C.h:58:8: note: candidate expects 3 arguments, 0 provided

Несколько библиотек найдено для "LiquidCrystal_I2C.h"

Используется: C:\Users\Администратор\Documents\Arduino\libraries\LiquidCrystal_I2C

Не используется: C:\Users\Администратор\Documents\Arduino\libraries\LiquidCrystal_I2C-master

Используем библиотеку Wire в папке: C:\Users\Администратор\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.6\libraries\Wire (legacy)

Используем библиотеку LiquidCrystal_I2C версии 1.1.2 из папки: C:\Users\Администратор\Documents\Arduino\libraries\LiquidCrystal_I2C

exit status 1

no matching function for call to 'LiquidCrystal_I2C::begin()'
 
Сверху Снизу
Обнаружен блокировщик рекламы AdBlock

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

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

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

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