Помогите, плс

agcom
Offline
Зарегистрирован: 13.01.2014

Вот такой код:

if (h1==hour() && min1==minute() && sec1==second()) {
   Millis1 = millis();
   long  interval1=10000;
   if (Millis1 && (millis()-Millis1 <= interval1))  {
      lcd.print("вкл.");
      Millis1 = 0;
    }
else {
      lcd.print("выкл");
    }

По задумке должно работать так: при совпадении часов с заданными надпись на дисплее должна смениться на "вкл" на заданный интервал.

Всё работает, но надпись меняется но только на 1 сек (интервал не учитывается). Что не так?

Araris
Offline
Зарегистрирован: 09.11.2012

Через секунду перестает выполняться условие if (h1==hour() && min1==minute() && sec1==second()) и мы вновь попадаем в else.

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Потому что через секунду условие из строки 1 перестанет выполняться (вот эта часть sec1==second()) и начнет выполняться строка 9, которая будет выполняться следующие 23 часа 59 минут и 59 секунд и так по кругу.

Мой телепат предполагает, что в строке 4 вместо if должен быть while, но это плохой вариант, потому что потом у ВАс возникнет другой вопрос.

На форуме эта тема уже разжевывалась

 

agcom
Offline
Зарегистрирован: 13.01.2014

kisoft пишет:

Потому что через секунду условие из строки 1 перестанет выполняться (вот эта часть sec1==second()) и начнет выполняться строка 9, которая будет выполняться следующие 23 часа 59 минут и 59 секунд и так по кругу.

Мой телепат предполагает, что в строке 4 вместо if должен быть while, но это плохой вариант, потому что потом у ВАс возникнет другой вопрос.

Можно ли придумать какое-либо решение?

kisoft пишет:

На форуме эта тема уже разжевывалась

А можно тыкнуть где, поиском не нашел.

ivan_admin
Offline
Зарегистрирован: 09.01.2014

А почему нельзя просто второе условие вынести за рамки первого?

agcom
Offline
Зарегистрирован: 13.01.2014

То есть как?

Araris
Offline
Зарегистрирован: 09.11.2012

Уважаемый agcom, отчего же Вы отказываете себе в удовольствии самому подумать и самому найти решение, попутно подняв [себе же] скилл программирования ? 

maksim
Offline
Зарегистрирован: 12.02.2012

То есть так

if (!Millis1 && 1h1==hour() && min1==minute() && sec1==second()) Millis1 = millis();

if (Millis1 && (millis()-Millis1 >= 10000))  
{
  lcd.print("вкл.");
  Millis1 = 0;
}
else lcd.print("выкл");

 

Araris
Offline
Зарегистрирован: 09.11.2012

Вероятно, <= 10000 в строке 3.

maksim
Offline
Зарегистрирован: 12.02.2012

Кстати... да. Тогда и флаги не нужно, но тогда получаем постоянную дрочку lcd.print()

if (1h1==hour() && min1==minute() && sec1==second()) Millis1 = millis();

if (millis()-Millis1 <= 10000) lcd.print("вкл.");
else lcd.print("выкл");

и "вкл." будет длиться ~2 секунды...

maksim
Offline
Зарегистрирован: 12.02.2012

В общем правильно будет так:

if (!Millis1 && 1h1==hour() && min1==minute() && sec1==second()) 
{
  Millis1 = millis();
  lcd.print("вкл.");
}

if (Millis1 && millis()-Millis1 >= 10000)  
{
  Millis1 = 0;
  lcd.print("выкл");
}

 

agcom
Offline
Зарегистрирован: 13.01.2014

Всё равно "вкл" - на одну секунду.

maksim
Offline
Зарегистрирован: 12.02.2012

Что значит все равно? А вы думаете мы здесь еще должны телепатически определить что вы там где то у себя в коде дисплей затираете???

toc
Offline
Зарегистрирован: 09.02.2013

agcom, на худой конец используйте delay

agcom
Offline
Зарегистрирован: 13.01.2014

Всё решил просто в лоб - пересчитываю текущее время в мсек., сравниваю с заданным, добавляю интервал и т.д.

Всем спасибо.