Ввод текста энкодером на Arduino

Данный мини проект на Ардуино позволит вам создавать текст (переменную String) с помощью модуля энкодера и сохранять ее в оперативной памяти  микроконтроллера.

Для этого занятия потребуется:

  • плата Arduino Uno / Arduino Nano / Arduino Mega;

  • цифровой энкодер (модуль KY-040);

  • дисплей LCD 1602 (по желанию);

  • провода «папа-мама».

Encoder

Arduino Uno

Arduino Nano

Arduino Mega

GND

GND

GND

GND

5V

5V

5V

SW

6

6

6

DT

4

4

4

CLC

2

2

2

Создание String с помощью энкодера

К следующему примеру программы добавлена функция использования дисплея для вывода символов и строки. При необходимости энкодер можно подключить к другим портам (в том числе и к аналоговым пинам  микроконтроллера), сделав при этом необходимые правки в скетче. Подключите к  Arduino Uno дисплей 1602 и энкодер по схеме, размещенной выше, и загрузите второй вариант скетча в плату.

Скетч. Создание переменной String энкодером

encoder_text_input.ino
#include <Wire.h>                             // библиотека для протокола I2C
#include <LiquidCrystal_I2C.h>       // библиотека для LCD 1602
LiquidCrystal_I2C LCD(0x27,20,2);  // присваиваем имя дисплею
#include "RotaryEncoder.h"      // библиотека для энкодера
RotaryEncoder encoder(4, 2);  // пины подключение энкодера (DT, CLK)
#define SW 6                              // пин подключения порты SW энкодера
byte scale = 5;  // указываем сколько символов должно быть в строке
// создаем массив из 39 символов - его можно увеличивать и уменьшать
char massiv[39] = {
  'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'G', 'K', 'L', 'M',
  'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
  ' ', '-', '/', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9'
};
String simvol;
String stroka;
byte w;
int pos;
int newPos;
boolean buttonWasUp = true;
void setup() {
   LCD.init();                                       // инициализация дисплея
   LCD.backlight();                             // включение подсветки
   pinMode(SW, INPUT_PULLUP);  // подключаем пин SW
   // выводим первый символ в массиве на дисплей
   simvol = massiv[pos];
   LCD.setCursor(w, 0);
   LCD.print(simvol);
}
void loop() {
   while (w < scale) {
     // проверяем положение ручки энкодера
     encoder.tick(); newPos = encoder.getPosition();
     // указываем максимальный и минимальный диапазон энкодера
     if (newPos > 38) { encoder.setPosition(0); }
     if (newPos < 0) { encoder.setPosition(38); }
     // если положение энкодера изменилось  - выводим на монитор символ
     if (pos != newPos && newPos <= 38 && newPos >= 0) {
        pos = newPos;
        simvol = massiv[pos];
        LCD.setCursor(w, 0);
        LCD.print(simvol);
     }
     // узнаем, отпущена ли кнопка энкодера сейчас
     boolean buttonIsUp = digitalRead(SW);
     // если кнопка была отпущена и не отпущена сейчас
     if (buttonWasUp && !buttonIsUp) {
        // исключаем дребезг контактов кнопки энкодера
        delay(10);
        // узнаем состояние кнопки энкодера снова
        buttonIsUp = digitalRead(SW);
        // если кнопка была нажата, то сохраняем символ в строку
        if (!buttonIsUp) {
           w = w + 1;
           stroka = stroka + simvol;
           encoder.setPosition(0);
           LCD.setCursor(w, 0);
           LCD.print(simvol);
      }
    }
    // запоминаем состояние кнопки энкодера
    buttonWasUp = buttonIsUp;
    }
   // если было введено 5 символов - выходим из цикла while
   LCD.clear();
   LCD.setCursor(0, 0);
   LCD.print("ITOG:");
   LCD.setCursor(0, 1);
   LCD.print(stroka);
   delay(1000);
}

Пояснения к коду:

  • переменная w в данной программе отвечает не только за выход из цикла while, но и положение курсора в строке на дисплее 1602;

  • при нажатии на кнопку энкодера происходит увеличение переменной w, сохранение символа в строку и обнуление позиции энкодера.

Заключение

Данный код можно внедрять в свои проекты при необходимости создания текстовой переменной. Если у вас возникли вопросы по данному мини-проекту или дополнения, то вы можете оставлять их в комментариях к этой записи.