const int mPinL = 0; // Пин мотора влево
const int mPinR = 1; // Пин мотора вправо
const int bPin = 2; // Пин кнопки - не забыть подтянуть кнопку резистором к +питанию!
int s = 0; // Переменная состояния: 0 - мотор выкл, 1 - мотор влево, 2 - пауза мотора после левого хода, 3 - мотор вправо, 4 - пауза мотора после хода вправо
unsigned long t = 0; // хранит время для хода и паузы
int w = 10000; // Время работы в одну сторону, миллисекунды
int p = 3000; // Время паузы между реверсом, миллисекунды
// Функция определения состояния кнопки. Спёрто тут: https://arduino-tex.ru/news/12/urok-8-arduino-drebezg-%E2%80%94-programmnoe-ustranenie-nazhatie.html
boolean lastBt = false;
boolean currentBt = false;
boolean debvence (boolean last)
{
boolean current = digitalRead(bPin);
if ( last != current)
{
delay(10); // Задержка на дребезг
current = digitalRead(bPin);
return current;
}
}
void setup() {
pinMode(mPinL, OUTPUT);
pinMode(mPinR, OUTPUT);
pinMode(bPin, INPUT_PULLUP);
}
void loop()
{
// Проверяем кнопку
currentBt = debvence(lastBt);
if (lastBt == HIGH && currentBt == LOW) // Если нажата
{
if (s == 0)
{
s = 1; //если был выкл, то вкл
t = millis() + w; // Запоминаем время для переключения
}
else {s = 0;} //если был вкл, то выкл
lastBt = currentBt; // запоминаем новое состояние кнопки
}
//Проверяем время
if (millis() > t //Прошло больше заданного секунд
&& s != 0 //И мотор не выкл
)
{
switch (s)
{
case 1: // работал влево
s = 2; //меняем состояние
t = millis() + p; // Запоминаем время для паузы
break;
case 2: // стоял на паузе после лев
s = 3; //меняем состояние на прав
t = millis() + w; // Запоминаем новое время работы
break;
case 3: // работал вправо
s = 4; //меняем состояние
t = millis() + p; // Запоминаем время для паузы
break;
case 4: // стоял на паузе после прав
s = 1; //меняем состояние на лев
t = millis() + w; // Запоминаем новое время работы
break;
default:
break;
}
}
// дергаем мотор. не стал заморачиваться с битами - сам сделай если захочешь
switch (s)
{
case 1:
digitalWrite(mPinR, LOW); // Сначала выключаем правй пин - на случай если мотор ехал вправо, чтобы не было ситуации когда оба пина подняты (не знаю что при этом с твоим драйвером будет, но лучше не рисковать)
digitalWrite(mPinL, HIGH);
break;
case 3:
digitalWrite(mPinL, LOW); // то же самое про опускание, только левый
digitalWrite(mPinR, HIGH);
break;
default : //во всех остальных случаях просто выключаем мотор (т.е. при нуле и при паузах)
digitalWrite(mPinL, LOW);
digitalWrite(mPinR, LOW);
break;
}
// ждем когда отпустят кнопку, иначе если будет нажата кнопка все время - мотор будет дергаться вкл-выкл
while(lastBt == LOW) // еще нажата
{
lastBt = debvence(lastBt);
}
}