Помогите решить логическую задачу.. :)

exez
exez аватар
Offline
Зарегистрирован: 04.04.2015

Имеем сутки. В теплице необходимо поддерживать определенную температуру.

Tday = 25C 
Tnight = 17C

Имеется два варианта включения освещения:

- Основное освещение. К примеру, с 08-00(SvetOn) до 19-00(SvetOff). В этом случае SvetOn2 и SvetOff2 должны быть равны друг другу (по условию. не важно сколько. просто равны!)
- Досветка. К примеру, с 08-00(SvetOn) до 10-00(SvetOff) и с 16-00(SvetOn2) до 19-00(SvetOff2).

В обеих случаях температура с 08-00 до 19-00 должна быть Tden. Это очень просто указать. К примеру:

В первом: if (hh > SvetOn && hh < SvetOff && SvetOn2 == SvetOff2) {держим Tden} // hh - текущее время в часах.
Во втором: if (hh > SvetOn && hh < SvetOff2 && SvetOn2 < SvetOff2) {держим Tden}

Что делать если кто то решит задать параметры включения основного света к примеру в конце суток, а выключение в начале.

Варианта тут вижу два:

Первый: Включить свет1 в 23-00 выключить свет1 в 05-00. Возможно будут включать второй раз уже в 15-00 и выключать в 19-00.
Второй: Включили свет1в 12-00 выключили в 16-00, включили свет2 в 23-00, выключили свет2 в 02-00.

Это кажется абсолютно нелогичным, но как показывает практика всегда найдется уникал, которому надо будет пользоваться именно так :)

Буду признателен за любую идею.

vk007
Offline
Зарегистрирован: 16.06.2015

exez пишет:

Что делать если кто то решит задать параметры включения основного света к примеру в конце суток, а выключение в начале.

А ничего не делать. Какие параметры задали, так и работать. Может этому "кто-то" действительно так надо.

Основное освещение работает по своему таймеру, досветка - по своему.

exez
exez аватар
Offline
Зарегистрирован: 04.04.2015

В таком случае условие 1 и 2 никогда не выполнятся и будет всегда ночь.. :)

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

exez, а зачем теплицу лампочкой греть, этор что, привет из СССР? :) Сейчас полно современных обогревателей, купите метр греющей плёнки, да и делов-то .

exez
exez аватар
Offline
Зарегистрирован: 04.04.2015

теплицу греют другими приборами.

смысл в том что в дневное время для растений надо держать одну температуру, а в ночное другую. Соответственно проще всего привязываться под время которое задали для освещения. Это упростит эксплуатацию, уменьшит количество настроек, увеличит гемора разработчику :)

vk007
Offline
Зарегистрирован: 16.06.2015

exez пишет:

теплицу греют другими приборами.

смысл в том что в дневное время для растений надо держать одну температуру, а в ночное другую. Соответственно проще всего привязываться под время которое задали для освещения.

Т.е. у Вас сила обогрева включается не от термодатчика, а от времени суток?

Нарисуйте структурную схему этого всего хозяйства - чем надо управлять и что от чего зависит.

Duino A.R.
Offline
Зарегистрирован: 25.05.2015

Мы несколько лет назад делали довольно навороченную систему управления цеховым освещением. Там был сложный календарь плюс ручные режимы. Общий подход был такой. Если меняются параметры для циклического события, то, если событие уже наступило, новые параметры вступят в силу на следущем цикле. Если событие только ожидается, то новые параметры вступают в силу немедленно.

exez
exez аватар
Offline
Зарегистрирован: 04.04.2015

такой подход не подходит в данном варианте.

exez
exez аватар
Offline
Зарегистрирован: 04.04.2015

Итак решение найдено :) Выношу на суд общественности. Если это решение вобще кому то интересно! :)  Комменты писать влом. Кому интересно - сами разберутся.. Конструктивная критика приветствуется. Лишние делаи и прочее пропускаем мимо глаз. Тут выкладываю только логическое решение..

Очень приветствуют советы по оптимизации: 

int DNS[24];    // работа света
int DNT[24];    // дневной цикл растений

// int SvetStatus; // флаг

int SvetOn = 6;
int SvetOff = 10;
int SvetOn2 = 15;
int SvetOff2 = 19;

int i = 0;
int dn = 0;
int dt;

// int hh; // текущее время. с ним будем сравнивать данные из массивов.

void setup() {
 Serial.begin(9600);
}

void loop() {

dn = SvetOn; DNS[dn] = 1;
  
while (i < 24)
  {
 
    Serial.print(dn); Serial.print(" "); Serial.println(DNS[dn]); delay(50); 
    dn++; i++; if (dn > 23) {dn = 0;}  if (dn == SvetOff) {i = 24;}
    if ( dn != SvetOff && DNS[dn-1] == 1 || dn != SvetOff && dn-1 == -1 && DNS[23] == 1) { DNS[dn] = 1; } else { DNS[dn] = 0;}
    
  }
Serial.println("1 end");

i = 0;
if ( SvetOn2 != SvetOff2) 
{  
  dn = SvetOn2; DNS[dn] = 1;
while (i < 24)
  {
 
    Serial.print(dn); Serial.print(" "); Serial.println(DNS[dn]); delay(50); 
    dn++; i++; if (dn > 23) {dn = 0;} if (dn == SvetOff2) {i = 24;}
    if ( dn != SvetOff2 && DNS[dn-1] == 1  || dn != SvetOff2 && dn-1 == -1 && DNS[23] == 1) { DNS[dn] = 1; } else { DNS[dn] = 0;} // || DNS[dn] == 1 
    
  }
}
Serial.println("2 end");

 i = 0;
while (i < 24)
  {
 
    Serial.print(i); Serial.print(" "); Serial.println(DNS[i]); delay(50); 
   i++;
    
  }
Serial.println("DNS end __");

i = 0;
if ( SvetOn2 == SvetOff2) {dt = SvetOff;} else {dt = SvetOff2;} // проверяем включен ли второй период
{  
  dn = SvetOn; DNT[dn] = 1;
while (i < 24)
  {
 
    Serial.print(dn); Serial.print(" "); Serial.println(DNT[dn]); delay(50); 
    dn++; i++; if (dn > 23) {dn = 0;} if (dn == dt) {i = 24;}
    if ( dn != SvetOff2 && DNT[dn-1] == 1  || dn != SvetOff2 && dn-1 == -1 && DNT[23] == 1) { DNT[dn] = 1; } else { DNT[dn] = 0;} // || DNT[dn] == 1 
    
  }
}
Serial.println("DNT end __");
  
Serial.println("3 stop"); delay(100000);
}