Ввод текста энкодером на 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 энкодером
#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, сохранение символа в строку и обнуление позиции энкодера.
Заключение
Данный код можно внедрять в свои проекты при необходимости создания текстовой переменной. Если у вас возникли вопросы по данному мини-проекту или дополнения, то вы можете оставлять их в комментариях к этой записи.