Вот кусок кода для септика. switch в зависимости от времени Н выполняет нужную ветку. В последней ветке в определенные часы реле компрессора должно выключится и каждые 5 минут включаться на 5 секунд. Не могу правильно сделать, делей тоже не подходит - есть экран. Прошу помощи, понимаю что нужно 2 счетчика, но как их реализовать сломал голову. Могк и весь код разместить. Код (C++): switch (H) { case 3: //с 3 до 4 - фаза отстоя lcd.setCursor(8, 0); lcd.print( "OTCTO\5" ); if (level_2_State == HIGH) { // если в фазе отстоя будет превышен уровень 2 digitalWrite(rele_nasosa, HIGH); // включаем реле насоса digitalWrite(rele_aero, LOW); // выключаем реле компрессора digitalWrite(led_avaria, HIGH); // включаем сигнализацию ПЕРЕЛИВА-АВАРИИ ms = millis(); // Событие срабатывающее каждые 250 мс if( ( ms - ms1 ) > 100 || ms < ms1 ){ ms1 = ms; // Инвертируем светодиод digitalWrite(led_on_box, led_stat); led_stat = !led_stat; // Светодиод указания режима мигает с частотой 0,25 секунд } lcd.setCursor(8, 1); lcd.print( "\2EPE\4\3B!" ); } else { digitalWrite(rele_nasosa, LOW); // выключаем реле насоса digitalWrite(rele_aero, LOW); // выключаем реле компрессора digitalWrite(led_avaria, LOW); // выключаем сигнализацию ПЕРЕЛИВА-АВАРИИ ms = millis(); // Событие срабатывающее каждые 5000 мс if( ( ms - ms1 ) > 5000 || ms < ms1 ){ ms1 = ms; // Инвертируем светодиод digitalWrite(led_on_box, led_stat); led_stat = !led_stat; // Светодиод указания режима мигает с частотой 5 секунд } lcd.setCursor(8, 1); lcd.print( " " ); } break; case 4: // с 4 до 5 - фаза откачки до изменения состояния датчика уровня 1 lcd.setCursor(8, 0); lcd.print( "HACOC " ); if (level_1_State == HIGH) { // если в фазе откачки датчик 1 уровня показал нижний уровень, т.е. насос откачал небходимый уровень digitalWrite(rele_nasosa, LOW); // выключаем реле насоса digitalWrite(rele_aero, LOW); // выключаем реле компрессора digitalWrite(led_avaria, LOW); // выключаем сигнализацию ПЕРЕЛИВА-АВАРИИ analogWrite(led_on_box, 30); // Светодиод указания режима горит в 2 раза тускнее lcd.setCursor(8, 1); lcd.print( "\2\7CTO! " ); } else { digitalWrite(rele_nasosa, HIGH); // включаем реле насоса digitalWrite(rele_aero, LOW); // выключаем реле компрессора digitalWrite(led_avaria, LOW); // выключаем сигнализацию ПЕРЕЛИВА-АВАРИИ ms = millis(); // Событие срабатывающее каждые 10000 мс if( ( ms - ms1 ) > 10000 || ms < ms1 ){ ms1 = ms; // Инвертируем светодиод digitalWrite(led_on_box, led_stat); led_stat = !led_stat; // Светодиод указания режима мигает с частотой 10 секунды } lcd.setCursor(8, 1); lcd.print( " " ); } break; default: //основная фаза с 5 до 3 часов lcd.setCursor(8, 0); lcd.print( "BO" ); lcd.write(8); lcd.print( "\6\7X" ); if (level_2_State == HIGH) { // если в основной фазе будет превышен уровень 2 digitalWrite(rele_nasosa, HIGH); // включаем реле насоса digitalWrite(rele_aero, LOW); // выключаем реле компрессора digitalWrite(led_avaria, HIGH); // включаем сигнализацию ПЕРЕЛИВА-АВАРИИ ms = millis(); // Событие срабатывающее каждые 250 мс if( ( ms - ms1 ) > 100 || ms < ms1 ){ ms1 = ms; // Инвертируем светодиод digitalWrite(led_on_box, led_stat); led_stat = !led_stat; // Светодиод указания режима мигает с частотой 0,25 секунд } lcd.setCursor(8, 1); lcd.print( "\2EPE\4\3B!" ); } else { digitalWrite(led_avaria, LOW); // выключаем сигнализацию ПЕРЕЛИВА-АВАРИИ digitalWrite(rele_aero, HIGH); // включаем реле компрессора digitalWrite(rele_nasosa, LOW); // выключаем реле насоса digitalWrite(led_on_box, HIGH); // светодиод указания режима постоянно горит if ((H == 7) || (H == 10) || (H == 13) || (H == 16) || (H == 19) || (H == 22) || (H == 1)) { // каждые два часа выключаем аэрацию на час digitalWrite(rele_aero, LOW); // выключаем реле компрессора unsigned long currentMillis = millis(); if(currentMillis - previousMillis > interval) { //проверяем не прошел ли нужный интервал 5 минут, если прошел то previousMillis = currentMillis; // сохраняем время последнего переключения digitalWrite(rele_aero, HIGH); delay(3000); // 3 секунды время работы компрессора после 5 минут покоя (5000) } } lcd.setCursor(8, 1); lcd.print( " " ); } }
Для часов ветки вы сделали... неужели для проверки единиц минут и секунд не вложите ещё ветки в последнюю ветку? Ну или условия? Ну или в массиве выборку... какой нибудь const?
Делал с if, но в итоге что то все время работает не так. Я про остановку на 5 минут и включение на 5 сек. Сейчас попробую со switch. С массивами для меня сложновато будет
Может и не так понял вас... но если не думать, а "силовым методом": Код (C++): //проверка минут .... switch(min) { case 0: case 5: case 10: .... case 50: case 55: //проверка секунд и активность на это время if((sec > 0) && (sec < 6)) enable = true; else enable = false; break; default: enable = false; break; } Тут просто проверка минут и на время от 1 до 5 секунд включено... хотя это 4 секунды. Ну поправьте условие под себя