Ввод (создание) текста энкодером на Ардуино


Данный мини проект на Ардуино позволит вам создавать текст (переменную String) с помощью модуля энкодера и сохранять ее в оперативной памяти микроконтроллера. Код можно использовать в своих программах, например, при записи информации в EEPROM Arduino или создании файла на SD карте. Для этого мини проекта достаточно будет подключить к плате энкодер (KY-040), не используя дисплей 1602.

Ввод текста на Ардуино с помощью энкодера

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

  • плата Arduino Uno / Arduino Nano / Arduino Mega;
  • цифровой энкодер (модуль KY-040);
  • дисплей LCD 1602 (по желанию);
  • провода «папа-мама».
Схема подключения энкодера (KY-040) к Ардуино Уно
Схема подключения энкодера (KY-040) к Ардуино Уно
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

Для первого примера программы следует подключить энкодер к Ардуино, согласно схеме размещенной выше, и установить библиотеку RotaryEncoder.h. Библиотеки можно скачать на нашем сайте здесь. Вся информация будет выводится на монитор порта Arduino IDE. А окончательный вариант строки String сохранится в переменную stroka. Большую часть настроек в программе можно менять по своему усмотрению.

Скетч. Ввод текста энкодером на Ардуино

#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() {
   Serial.begin(9600);                       // подключаем монитор порта
   pinMode(SW, INPUT_PULLUP);  // подключаем пин SW

   // выводим первый символ в массиве на монитор порта
   simvol = massiv[pos];
   Serial.println(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];
        Serial.println(simvol);
     }

     // узнаем, отпущена ли кнопка энкодера сейчас
     boolean buttonIsUp = digitalRead(SW);
     // если кнопка была отпущена и не отпущена сейчас
     if (buttonWasUp && !buttonIsUp) {
        // исключаем дребезг контактов кнопки энкодера
        delay(10);
        // узнаем состояние кнопки энкодера снова
        buttonIsUp = digitalRead(SW);
        // если кнопка была нажата, то сохраняем символ в строку
        if (!buttonIsUp) {
           w = w + 1;
           stroka = stroka + simvol;
           Serial.println(stroka);
           encoder.setPosition(0);
      }
    }
    // запоминаем состояние кнопки энкодера
    buttonWasUp = buttonIsUp;
   }

   // если было введено 5 символов - выходим из цикла while
   Serial.println(stroka);
   delay(1000);
}

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

  1. массив char massiv содержит 39 символов, при этом нумерация начинается с нуля. Т.е. позиции ручки энкодера «0» соответствует символ «А»;
  2. в программе цикл while выполняется 5 раз — это указывается в переменной byte scale, которая отвечает за конечную длину всей строки.



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

Схема подключения энкодера и дисплея к Ардуино Уно
Схема подключения энкодера и дисплея к Ардуино Уно

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

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

#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);
}

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

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

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



2 Replies to “Ввод текста энкодером на Ардуино”

  1. здраствуйте а можно сделать так чтобы при написании пяти символов ничего не удалялось

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.