#define iPSwLow A5 //зададим имя входа реле давления
#define pumpCount 5 //Количество компрессоров
int pumpPins[pumpCount] = { 3, 4, 5, 6, 7}; // массив значений пинов (выходов) реле включения компрессора;
unsigned long pumpDelays[pumpCount] = {3000, 3000, 3000, 3000, 10000}; // массив задержек запуска компрессоров в миллисекундах;
unsigned long systime; // текущее время;
unsigned long nextStartTmr; // таймер разрешения на запуск следующего компрессора;
bool pSwitch ; // состояние реле давления;
void setup() {
pinMode(iPSwLow, INPUT_PULLUP); // инициализируем входной сигнал реле давления
for (int i=0; i<pumpCount; i++) { // цикл инициализации выходов
pinMode(pumpPins[i], OUTPUT); // инициализируем выходы реле управления компрессорами
digitalWrite(pumpPins[i], LOW); // инициализируем исходное состояние выходов
}
}
void loop() {
pSwitch = !digitalRead(iPSwLow); // замыкания кнопки не исключает дребезга контактов (поставьте RC-цепочку на вход кнопки, либо можно использовать программный таймер)
systime = millis(); // сохраним в переменную systime время в мс с момента запуска контроллера
if (pSwitch && (systime > nextStartTmr)) { // проверим что реле давление сигнализирует о низком давлении ,
// и прошло достаточно времени с момента последнего запуска компрессора
nextRun(); // если true - запускаем следующий компрессор
} else if (!pSwitch){ // если false - проверяем сигнализирует ли реле давления о высоком давлении
nextStartTmr = systime; // если true - сбрасываем таймер времени следующего запуска на текущий момент
stopPump(); // и останавливаем все компрессоры
}
}
void nextRun() { // функция выбора случайного следующего компрессора для пуска
if (!isAllPumpRunning()) { // проверяем есть ли ещё не запущенные компрессоры
tryToStartPump(random(0, pumpCount)); // произвольно выбираем номер компрессора для запуска
} // В случае если выбранный компрессор уже запущен, то мы вернемся через основной цикл снова в это место для повторной попытки
}
void tryToStartPump(int i) { // функция запускает компрессор, если он не работал
if (isPumpStopped(i)) { // проверяем работает ли выбранный компрессор
startPump(i); // если true - запускаем компрессор
nextStartTmr = systime + pumpDelays[i]; // присваиваем переменной nextStartTmr время запуска следующего компрессора
}
}
boolean isAllPumpRunning() { // функция проверяет все ли компрессоры работают
for (int i=0; i<pumpCount; i++) { // проверим состояние всех выходов реле включения компрессора
if (isPumpStopped(i)) { // если какой либо компрессор не включен - вернем false
return false;
}
}
return true; // если после проверки всех выходов все компрессоры работают- вернем true
}
void stopPump() { // функция отключения всех компрессоров
for (int i=0; i<pumpCount; i++) { // в цикле перебираем все выходы
stopPump(i); // и переводим их в состояние Выключено
}
}
void stopPump(int i) { // функция отключения указанного компрессора
digitalWrite(pumpPins[i], LOW); //присваиваем выходу контроллера значение LOW
}
bool isPumpStopped(int i) { // функция проверяет отключен ли указанный компрессор
return digitalRead(pumpPins[i]) == LOW; // проверяем значение выхода контроллера на LOW
}
void startPump(int i) { //функция запускает выбранный компрессор
digitalWrite(pumpPins[i], HIGH); //присваиваем выходу контроллера значение HIGH
}