// Управление двигателем State Machine
const int motor1Pin1 = 5; // номер контакта для IN1 драйвера двигателя
const int motor1Pin2 = 18; // номер контакта для IN2 драйвера двигателя
const int buttonPin = 22; // номер контакта для кнопки
int buttonState = 0; // переменная для хранения статуса кнопки
enum States {
STATE_WAIT, // Состояние ожидания
STATE_START, // Состояние набора оборотов
STATE_MOVE, // Состояние движения на одной скорости
STATE_BRAKE // Состояние торможения до полной остановки
};
uint8_t state; // Переменная для хранения текущего состояния
// задаем свойства ШИМ-сигнала:
const int freq = 5000; // Частота
const int ledChannel = 0; // Канал,генерирующий PWM-сигнал для motor1Pin2
const int ledChannel_1 = 1;// Канал,генерирующий PWM-сигнал для motor1Pin1
const int resolution = 8; // Разрешение
int dutyCycle;
int dutyCycle_1;
void setup() {
ledcSetup(ledChannel, freq, resolution); // настраиваем ШИМ-сигнал согласно свойствам, заданным выше
ledcSetup(ledChannel_1, freq, resolution);
pinMode(motor1Pin1, OUTPUT);
pinMode(motor1Pin2, OUTPUT);
pinMode(buttonPin, INPUT);
ledcAttachPin(motor1Pin1, ledChannel_1); // где: motor1Pin1 - контакт для вывода PWM, ledChannel - канал,генерирующий PWM-сигнал для motor1Pin1
ledcAttachPin(motor1Pin2, ledChannel);
state = STATE_WAIT; // Состояние после перезагрузки
}
void loop(){
buttonState = digitalRead(buttonPin);
if (buttonState == HIGH) {
state = STATE_START; // Если кнопка удерживается, включить Состояние набора оборотов
state = STATE_MOVE; // и перейти в Состояние движения на одной скорости
} else {
state = STATE_BRAKE; // Если кнопка Не удерживается, включить Состояние торможения до полной остановки
state = STATE_WAIT; // и перейти в Состояние ожидания
}
switch (state) {
case STATE_WAIT:
dutyCycle_1 = 0; // pin5
dutyCycle = 0; // pin18
ledcWrite(ledChannel_1, dutyCycle_1);
ledcWrite(ledChannel, dutyCycle);
break;
case STATE_START:
dutyCycle_1 = 50;
dutyCycle = 50;
ledcWrite(ledChannel_1, dutyCycle_1);
ledcWrite(ledChannel, dutyCycle);
break;
case STATE_MOVE:
dutyCycle_1 = 100;
dutyCycle = 100;
ledcWrite(ledChannel_1, dutyCycle_1);
ledcWrite(ledChannel, dutyCycle);
break;
case STATE_BRAKE:
dutyCycle_1 = 10;
dutyCycle = 10;
ledcWrite(ledChannel_1, dutyCycle_1);
ledcWrite(ledChannel, dutyCycle);
break;
}
}