// двигатель
int enA = 9;
int in1 = 8;
int in2 = 7;
bool modeWashingFinished = false;
int btn = 2; // ОБЯЗАТЕЛЬНО ИМЕННО 2 ПИН! Только на нем есть прерывание, котрые позволяют получить нажатие кнопки в любой момент
volatile bool modeDryingEnable = false;
// Все настройки (ускорение, макс скорость, длительность) для режима мойки так же работают для режима сушки. При необходимости, можно будет разделить.
// Кол-во циклов мойки работает только для мойки, сушки - для сушки
// начальная скорость вращения мотора в режиме мойки/сушки 0 - 255
int WASH_MODE_START_SPEED = 0;
// максимальная скорость работы в режиме мойки/сушки 0 - 256
int WASH_MODE_MAX_SPEED = 256;
// скорость ускорения и в режиме мойки/сушки
int WASH_MODE_ACCELERATION_SPEED_MS = 20;
// скорость остановки и в режиме мойки/сушки
int WASH_MODE_SLOWDOWN_SPEED_MS = 20;
// время работы мотора на полной скорости в режиме мойки/сушки (в миллисекундах)
int WASH_MODE_DELAY_FULL_SPEED_MS = 3000; // 20000 - 20 сек
// пауза между сменами сторон вращения в цикле в режиме мойки (в миллисекундах)
int WASH_MODE_DELAY_BETWEEN_DIRECTIONS_MS = 500;
// пауза между циклами в режиме мойки (в миллисекундах)
int WASH_MODE_DELAY_BETWEEN_CYCLES_MS = 500;
// ожидение после режима мойки (для нажатия кнопки сушки, но кнопку сушки можно нажать в любое время)
// если нужно, что бы кнопку сушки можно было нажать ТОЛЬКО ПОСЛЕ РЕЖИМА мойки, то нужно доработать (менять modeDryingEnable только если modeWashingFinished = true;)
int WASH_MODE_DELAY_AFTER_FINISHED_MS = 1000; // 10000 - 10 сек
// !!! кол-во циклов мойки !!!
int WASH_CYCLE_COUNT = 1;
// кол-во циклов сушки
int DRY_CYCLE_COUNT = 1;
void setup()
{
// инициализация всех пины для управления двигателями как outputs
pinMode(enA, OUTPUT);
pinMode(in1, OUTPUT);
pinMode(in2, OUTPUT);
// подключили кнопку на D2 и GND
pinMode(btn, INPUT_PULLUP);
attachInterrupt(0, buttonPress, FALLING);
Serial.begin(115200);
}
void buttonPress() {
logInfo("Нажата кнопка");
modeDryingEnable = true;
}
// запуск реэима сушки
void wash() {
bool directionLeft = true;
for(int washCycleCountCurrent = 0; washCycleCountCurrent < WASH_CYCLE_COUNT; washCycleCountCurrent++) {
logInfo(modeDryingEnable ? "Режим сушки АКТИВИРОВАН" : "Режим сушки выключен");
washCycle(directionLeft);
delay(WASH_MODE_DELAY_BETWEEN_DIRECTIONS_MS);
logInfo(modeDryingEnable ? "Режим сушки АКТИВИРОВАН" : "Режим сушки выключен");
washCycle(!directionLeft);
delay(WASH_MODE_DELAY_BETWEEN_CYCLES_MS);
}
modeWashingFinished = true;
delay(WASH_MODE_DELAY_AFTER_FINISHED_MS);
if (modeDryingEnable) {
logInfo("Старт сушки");
dry();
}
logInfo("Завершение работы");
}
// полу цикл режима сушки/мойки (вращение в одну сторону)
void washCycle(bool directionLeft) {
// включение стороны вращения
String directionLogInfo = directionLeft ? "Направление LEFT": "Направление RIGHT";
logInfo(directionLogInfo);
digitalWrite(in1, directionLeft ? HIGH : LOW);
digitalWrite(in2, directionLeft ? LOW : HIGH);
// ускорение
logInfo(directionLogInfo + ". Ускорение: " + String(WASH_MODE_START_SPEED) + " - " + String(WASH_MODE_MAX_SPEED));
for (int i = WASH_MODE_START_SPEED; i < WASH_MODE_MAX_SPEED; i++) {
// logInfo(directionLogInfo + ". Ускорение: " + String(i));
analogWrite(enA, i);
delay(WASH_MODE_ACCELERATION_SPEED_MS);
}
logInfo(directionLogInfo + ". Вращение ms: " + String(WASH_MODE_DELAY_FULL_SPEED_MS));
delay(WASH_MODE_DELAY_FULL_SPEED_MS);
// замедление
logInfo(directionLogInfo + ". Замедление: " + String(WASH_MODE_MAX_SPEED) + " - " + String(WASH_MODE_START_SPEED));
for (int i = WASH_MODE_MAX_SPEED; i > WASH_MODE_START_SPEED; i--) {
// logInfo(directionLogInfo + ". Замедление: " + String(i));
analogWrite(enA, i);
delay(WASH_MODE_SLOWDOWN_SPEED_MS);
}
}
void dry() {
for(int dryCycleCountCurrent = 0; dryCycleCountCurrent < DRY_CYCLE_COUNT; dryCycleCountCurrent++) {
logInfo("Сушка...");
washCycle(true);
}
}
void logInfo(String text) {
Serial.println(text);
}
void loop()
{
if (!modeWashingFinished) {
wash();
}
}