Проблема с уставкой таймера RTC

Это часть моего кода, посвященная таймеру:

int onHourONE = 11;
int onMinuteONE = 00;
int offHourONE = 23;
int offMinuteONE = 00;
byte PWMstatus = 0;

void setup{}

void loop{
    if ((now.hour() >= onHourONE) && (now.minute() >= onMinuteONE)) {
      PWMstatus = 1;
    }
    if ((now.hour() >= offHourONE) && (now.minute() >= offMinuteONE)) {
      PWMstatus = 2;
    }
    if (PWMstatus == 1) {
      // сделай это
    }
    if (PWMstatus == 2) {
      // сделай это
}

Он работает нормально, но проблема в том, что если я установлю offhourONE меньше, чем onhourONE, светодиод останется выключенным.

например, сейчас 14:00

onhourONE и offminuteONE также установлены на 14:00

offhourONE и offminuteONE установлены на 13:00

Таким образом, в этом случае светодиод должен оставаться включенным до 13:00 завтрашнего дня, но он остается выключенным, очевидно, из-за этого утверждения:

if ((now.hour() >= offHourONE) && (now.minute() >= offMinuteONE)) {}

Я могу изменить это на это:

if ((now.hour() == offHourONE) && (now.minute() == offMinuteONE)) {}

Но тогда он выключит светодиод только в это конкретное время, в этом случае, если я перезапущу Arduino примерно через 1 минуту после его выключения, он снова включится, в то время как он должен оставаться выключенным, пока не достигнет заданной точки поворота. ВКЛ.

Я знаю, что это звучит просто, но мне кажется запутанным, любые советы приветствуются...

, 👍-1

Обсуждение

я писал как думал... 37:00 = 13:00 + 24:00...добавьте 24 часа ко времени выключения, @jsotola

Вы можете понять это, нарисовав диаграмму... кружок... "0" вверху "12" внизу... то есть 24 часа.... добавьте 24 часа, чтобы остановить время.... затем используйте что-нибудь как этот псевдокод if (T>=14 && T+24 <=37) then ON else OFF, @jsotola


2 ответа


Лучший ответ:

2

Вам нужно добавить больше логики в вашу программу.

Как упоминалось в другом ответе, вы действительно хотите работать только с интервалом времени с самым высоким разрешением, который важен для вас - в вашем случае это минуты. Преобразуйте часы и минуты дня в количество минут, прошедших с полуночи:

onTime = onHourONE * 60 + onMinuteONE;
offTime = offHourONE * 60 + offHourONE;

И конвертировать текущее время в минуты с полуночи:

timeNow = now.hour() * 60 + now.minute();

Теперь самое сложное, но поскольку теперь вы работаете только с отдельными числами, это намного проще. Теперь вам нужно выяснить, что вы делаете.

У вас есть несколько сценариев:

  1. время < offTime – например, с 12:00 до 17:00.
  2. время работы > время выключения – например, с 21:00 до 03:00.

Вы должны принимать решения по-разному, в зависимости от того, в каком сценарии вы находитесь, и сравнивать одно число с одним числом намного проще, чем возиться с часами и минутами.

Итак, вы можете сделать что-то вроде:

if (onTime < offTime) {
    if ((timeNow >= onTime) && (timeNow < offTime)) {
      // Включено!
    } else {
      // Выключенный!
    }
} else {
    if ((timeNow >= onTime) || (timeNow < offTime)) {
      // Включено!
    } else {
      // Выключенный!
    }
}

На английском языке:

  • Если время начала раньше времени окончания:
    • Если время больше времени начала и меньше времени окончания, значит, оно включено.
    • В противном случае он отключен.
  • В противном случае время начала будет позже времени окончания:
    • Если время больше времени начала, или меньше времени окончания, то оно включено.
    • В противном случае он отключен.
,

спасибо за подробный ответ, что «сейчас» после первого «если» - это «timeNow», верно?, @ElectronSurf

Да все верно. Я отредактировал свой ответ. Хорошо подмечено., @Majenko

Я только что протестировал его, и он работает. еще раз спасибо. быстрый вопрос; могу ли я объединить это if после else вместе, как это else if(){}?, @ElectronSurf

Возможно, но это более логично, как у меня. Вы можете сразу увидеть смысл, и это не сделает его более или менее эффективным для запуска., @Majenko


1

Если слишком сложно использовать комбинацию секунд, минут и часов для сравнения. Для этого вы можете использовать время в секундах, как вы получаете его с помощью now.secondstime() или now.unixtime(). Если вы не хотите смотреть на секунды (поэтому значения кратны 60), вы можете выполнить целочисленное деление, чтобы получить минуты now.secondstime()/60.

Чтобы рассчитать необходимые предельные значения из комбинации часов и минут, просто умножьте их в соответствии с единицей измерения. За секунды (час*60+минуты)*60. Для минут час*60+минут.

,

unixtime на время в текущий день? и как использование минут дня решает вопрос?, @Juraj