Прошу помощи с кодом для сетика на Ардуино

Тема в разделе "Arduino & Shields", создана пользователем handless, 1 июл 2017.

  1. handless

    handless Нуб

    Вот кусок кода для септика. 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( "        " );
      }  
       }
     
  2. Igor68

    Igor68 Гуру

    Для часов ветки вы сделали... неужели для проверки единиц минут и секунд не вложите ещё ветки в последнюю ветку? Ну или условия? Ну или в массиве выборку... какой нибудь const?
     
  3. handless

    handless Нуб

    Делал с if, но в итоге что то все время работает не так. Я про остановку на 5 минут и включение на 5 сек. Сейчас попробую со switch. С массивами для меня сложновато будет
     
  4. Igor68

    Igor68 Гуру

    Может и не так понял вас... но если не думать, а "силовым методом":
    Код (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 секунды. Ну поправьте условие под себя
     
    Последнее редактирование: 2 июл 2017