#include <LiquidCrystal.h> // Подключаем стандартную библиотеку LiquidCrystal
// Инициализируем объект-экран, передаём использованные
// для подключения контакты на Arduino в порядке:
// RS, E, D4, D5, D6, D7
LiquidCrystal lcd(12, 11, 10, 9, 8, 7);
const int potPin = A0; // потенциометр
const int ledPin = 6; // светодиод на выводе с ШИМ
int potValue = 0; // значение от потенциометра
int brightness = 0; // конвертируем в яркость
int progress = 0; // индикатор прогресса
//Пользовательский символ
byte pBar[8] =
{
B11111,
B11111,
B11111,
B11111,
B11111,
B11111,
B11111,
};
uint8_t col = 0, row =0;
byte sym = 'A';
const int pinX = A0; // ось X джойстика
const int pinY = A1; // ось Y джойстика
const int pinSel = 2; // кнопка джойстика
const int button = 2;
int lastButton = LOW; //предыдущее состояние кнопки
int curButton = LOW; //Текущее состояние кнопки
int joy_x, joy_y, joy_prev_x, joy_prev_y;
#define JOY_GAP ((int)50)
#define JOY_MIDDLE ((int)512)
void setup() {
// put your setup code here, to run once:
// устанавливаем размер (количество столбцов и строк) экрана
lcd.begin(16, 2);
// Создаем символы для индикатора прогресса
lcd.createChar(0, pBar);
// ощищаем экран
lcd.clear();
// выводим сообщение в первой строчке
lcd.setCursor(col, row);
lcd.blink();
lcd.cursor();
lcd.write(sym);
lcd.setCursor(col, row);
}
void loop() {
// put your main code here, to run repeatedly:
joy_x = analogRead(pinX);
joy_y = analogRead(pinY);
if (joy_x != joy_prev_x)
{
joy_prev_x = joy_x;
if (joy_x < (JOY_MIDDLE - JOY_GAP))
{
if (col < 16)
{
//lcd.setCursor(col, row);
//lcd.write(' ');
col++;
lcd.setCursor(col, row);
lcd.write(sym);
lcd.setCursor(col, row);
}
}
if (joy_x > (JOY_MIDDLE + JOY_GAP))
{
if (col > 0)
{
//lcd.setCursor(col, row);
//lcd.write(' ');
col--;
lcd.setCursor(col, row);
}
}
//int a = map(x, 0, 1023, -135, 134);
}
if (joy_y != joy_prev_y)
{
joy_prev_y = joy_y;
if (joy_y < (JOY_MIDDLE - JOY_GAP))
{
if (sym > 'A')
{
sym--;
lcd.write(sym);
lcd.setCursor(col, row);
}
}
if (joy_y > (JOY_MIDDLE + JOY_GAP))
{
if (sym < 'Z')
{
sym++;
lcd.write(sym);
lcd.setCursor(col, row);
}
}
//int a = map(x, 0, 1023, -135, 134);
}
curButton = debounce (lastButton);
if(lastButton == HIGH && curButton == LOW) //условие нажатия
{
row = 1- row;
lcd.setCursor(col, row);
lcd.write(sym);
lcd.setCursor(col, row);
}
lastButton = curButton;
}
/*Функция подавления дребезга
last - предыдущее состояние кнопки*/
int debounce (int last)
{
int current = digitalRead(button);
if(last != current) //если состояние изменилось
{
delay(5);
current = digitalRead(button);
}
return current;
}
/*
Задача №3. Управление жидкокристаллическим индикатором с помощью аналогового джойстика
Соберите в симуляторе WOKWI схему, состоящую из платы Arduino UNO, жидкокристаллического индикатора 16 х 2 и аналогового джойстика.
Джойстик подключите к линиям питания GND и +5V, его аналоговые выводы подключите к аналоговым входам платы Arduino UNO,
а выход кнопки джойстика - к любому входу платы Arduino UNO. Подключите жидкокрисллический индикатор к оставшимся свободным выводам платы Arduino UNO.
Разработайте программу, в которой перемещение джойстика по оси Х приводит к перемещению курсора по строке жидкокристаллического индикатора,
а перемещение по оси Y - к выбору символа из диапазона от A до Z (обратитесь к таблице кодов ASCII).
Нажатие на кнопку джойстика переключает активную строку жидкокристаллического индикатора.
Для управления жидкокристаллическим индикатором использовать готовую библиотеку. Выделите законченные логические блоки программы в отдельные функции.
*/