#include <Wire.h> // Подключаем библиотеку Wire для связи по I2C
#include <LiquidCrystal_I2C.h> // Подключаем библиотеку для связи с экраном
#include <Keypad.h> // Подключаем библиотеку для работы с матричной клавиатурой
// Определение пинов для шагового двигателя
#define stepPin 12
#define dirPin 11
#define enablePin 10
// Определение переменных
#define countStepsPerAngle 8 //Количество шаков на один угол
#define oneStepSpeed 500 // Количество микросекунд между шагами
// Определения для экрана
#define LCD_ADDRESS 0x27 // I2C адрес дисплея
#define LCD_ROWS 2 // количество строк в дисплее
#define LCD_COLS 16 // Количество столбцов в дисплее
// Определение кнопок на клавиатуре
char keys[4][3] = {
{'1', '2', '3'},
{'4', '5', '6'},
{'7', '8', '9'},
{'*', '0', '#'}
};
// Определение пинов для клавиатуры
byte rowPins[4] = {9, 8, 7, 6}; // пины для строк клавиатуры
byte colPins[3] = {5, 4, 3}; //пины для столбцов клавиатуры
// Создаем объект клавиатуры
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, 4, 3);
// cСоздаем объект для дисплея
LiquidCrystal_I2C lcd(LCD_ADDRESS, LCD_ROWS, LCD_COLS);
// Переменные для хранения углов
float current_angle = 0;
int angle = 0;
float oneStep = 1.8;
void setup() {
// Инициализация и установка пинов для двигателя
pinMode(stepPin, OUTPUT);
pinMode(dirPin, OUTPUT);
pinMode(enablePin, OUTPUT);
digitalWrite(stepPin, LOW);
digitalWrite(dirPin, LOW);
digitalWrite(enablePin, LOW);
// Инрициализация экрана
lcd.init();
lcd.backlight();
// Вывести текущий угол на экран
lcd.print(0);
}
void loop() {
// Получить нажатую кнопку
char key = keypad.getKey();
// Если кнопка нажата
if (key) {
// Если нажато число
if (key >= '0' && key <= '9') {
angle = angle * 10 + (key - '0');
lcd.setCursor(0, 1);
lcd.print(angle);
}
// Если нажата *
else if (key == '*') {
digitalWrite(dirPin, HIGH);
int int_cur_ang = (int)current_angle;
for (float i = current_angle-int_cur_ang; i < angle; i=i+oneStep/countStepsPerAngle) {
digitalWrite(stepPin, HIGH);
delayMicroseconds(oneStepSpeed);
digitalWrite(stepPin, LOW);
delayMicroseconds(oneStepSpeed);
current_angle += oneStep/countStepsPerAngle;
}
//Установить текущий угол как сумму с введенной
while (current_angle>360)
{
current_angle -= 360;
}
lcd.setCursor(0, 0);
lcd.print(" ");
// Вывести текущий угол на экран
int currentAngle = (int)current_angle;
lcd.setCursor(0, 0);
lcd.print(currentAngle);
angle = 0;
// Удалить введенный угол
lcd.setCursor(0, 1);
lcd.print(" ");
}
// Если нажата #
else if (key == '#') {
digitalWrite(dirPin, LOW);
for (; current_angle > 0; current_angle = current_angle - oneStep/countStepsPerAngle) {
digitalWrite(stepPin, HIGH);
delayMicroseconds(oneStepSpeed);
digitalWrite(stepPin, LOW);
delayMicroseconds(oneStepSpeed);
}
// Удалить текущий угол
current_angle = 0;
lcd.setCursor(0, 0);
lcd.print(" ");
lcd.setCursor(0, 0);
// Вывести его на дисплей
lcd.print(0);
// Удалить введенный угол
lcd.setCursor(0, 1);
lcd.print(" ");
}
}
}