#include <AccelStepper.h>
#include <Wire.h>
#include <LiquidCrystal_I2C_Hangul.h>
#include <WiFi.h>
// Пины для подключения мотора
const int motorStepPin = 2; // Пин шагового сигнала мотора
const int motorDirPin = 4; // Пин направления мотора
const int motorEnablePin = 19; // Пин для включения/отключения мотора (подключен к "Enable" на мостовом драйвере)
// Пины для переменных резисторов
const int speedPotPin = 34; // Пин переменного резистора для скорости (0-4095)
const int torquePotPin = 35; // Пин переменного резистора для момента (0-4095)
// Пин для кнопки управления мотором (с фиксацией)
const int motorControlPin = 5; // Пин кнопки управления мотором
// Пины для LCD1602 через I2C
const int lcdAddress = 0x27; // Адрес I2C экрана (может отличаться)
// Создаем экземпляр шагового двигателя
AccelStepper cableMotor(AccelStepper::DRIVER, motorStepPin, motorDirPin);
bool motorRunning = false; // Флаг, указывающий, работает ли мотор
// Создаем экземпляр LCD1602
LiquidCrystal_I2C_Hangul lcd(lcdAddress, 16, 2);
void setup() {
// Отключаем Wi-Fi
WiFi.disconnect(true);
// Не инициализируем Bluetooth (просто игнорируем его)
// Устанавливаем параметры шагового мотора
cableMotor.setMaxSpeed(4000); // Максимальная скорость намотки
cableMotor.setAcceleration(1000); // Максимальное ускорение намотки
// Подключаем кнопку управления мотором
pinMode(motorControlPin, INPUT_PULLUP);
// Подключаем мотор к "Enable" пину мостового драйвера
pinMode(motorEnablePin, OUTPUT);
// Устанавливаем мотор в непрерывное вращение
cableMotor.setSpeed(100000); // Устанавливаем скорость вращения мотора
cableMotor.moveTo(100000); // Большое значение, чтобы мотор вращался непрерывно
// Инициализируем LCD1602
lcd.init();
lcd.backlight();
// Отображаем надпись "HighLine System" на экране в течение 3 секунд
// Отображаем "HighLine" по середине верхней строки
lcd.setCursor(4, 0);
lcd.print("HighLine");
// Отображаем "System" по середине нижней строки
lcd.setCursor(5, 1);
lcd.print("System");
delay(3000); // Подождите 3 секунды
lcd.clear(); // Очищаем экран
}
void loop() {
// Чтение состояния кнопки управления мотором
bool motorControlPressed = digitalRead(motorControlPin) == HIGH;
if (motorControlPressed) {
if (!motorRunning) {
// Если мотор выключен, включаем его
startMotor();
} else {
// Если мотор включен, выключаем его
stopMotor();
}
// Пауза для избежания ложных срабатываний
delay(100);
} else {lcd.clear();
lcd.setCursor(0, 0);
lcd.print(" STOP");
delay(500);
}
if (motorRunning) {
// Чтение значений скорости и момента с переменных резисторов
int speedValue = analogRead(speedPotPin); // Значение скорости (0-4095)
int torqueValue = analogRead(torquePotPin); // Значение момента (0-4095)
// Масштабирование значений скорости и момента в диапазоне от 0 до 100
float cableMotorSpeed = map(speedValue, 0, 4095, 0, 100); // Настройте максимальную скорость
float cableMotorTorque = map(torqueValue, 0, 4095, 0, 100); // Настройте максимальный момент
// Обновляем скорость и момент мотора намотки
cableMotor.setMaxSpeed(cableMotorSpeed);
cableMotor.setAcceleration(cableMotorTorque);
// Обновляем состояние мотора
cableMotor.run();
}
// Обновляем данные на LCD1602
updateLCD();
}
void startMotor() {
// Включить мотор намотки
motorRunning = true;
digitalWrite(motorEnablePin, HIGH); // Включаем подачу тока на мотор
cableMotor.setSpeed(1000); // Устанавливаем скорость вращения мотора
cableMotor.runSpeed();
}
void stopMotor() {
// Остановить мотор намотки
cableMotor.stop();
cableMotor.setCurrentPosition(0);
motorRunning = false;
digitalWrite(motorEnablePin, LOW); // Отключаем подачу тока на мотор
// Здесь вы можете добавить дополнительные действия при останове мотора
}
void updateLCD() {
// Отображение данных о скорости и моменте на LCD1602
lcd.setCursor(0, 0);
lcd.print(" Speed: ");
lcd.print(map(analogRead(speedPotPin), 0, 4095, 0, 100));
lcd.print(" % ");
lcd.setCursor(0, 1);
lcd.print(" Torque: ");
lcd.print(map(analogRead(torquePotPin), 0, 4095, 0, 100));
lcd.print(" % ");
}