Проблема с уставкой таймера 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 минуту после его выключения, он снова включится, в то время как он должен оставаться выключенным, пока не достигнет заданной точки поворота. ВКЛ.
Я знаю, что это звучит просто, но мне кажется запутанным, любые советы приветствуются...
@ElectronSurf, 👍-1
Обсуждение2 ответа
Лучший ответ:
Вам нужно добавить больше логики в вашу программу.
Как упоминалось в другом ответе, вы действительно хотите работать только с интервалом времени с самым высоким разрешением, который важен для вас - в вашем случае это минуты. Преобразуйте часы и минуты дня в количество минут, прошедших с полуночи:
onTime = onHourONE * 60 + onMinuteONE;
offTime = offHourONE * 60 + offHourONE;
И конвертировать текущее время в минуты с полуночи:
timeNow = now.hour() * 60 + now.minute();
Теперь самое сложное, но поскольку теперь вы работаете только с отдельными числами, это намного проще. Теперь вам нужно выяснить, что вы делаете.
У вас есть несколько сценариев:
- время < offTime – например, с 12:00 до 17:00.
- время работы > время выключения – например, с 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
Если слишком сложно использовать комбинацию секунд, минут и часов для сравнения. Для этого вы можете использовать время в секундах, как вы получаете его с помощью now.secondstime()
или now.unixtime()
. Если вы не хотите смотреть на секунды (поэтому значения кратны 60), вы можете выполнить целочисленное деление, чтобы получить минуты now.secondstime()/60
.
Чтобы рассчитать необходимые предельные значения из комбинации часов и минут, просто умножьте их в соответствии с единицей измерения. За секунды (час*60+минуты)*60
. Для минут час*60+минут
.
unixtime на время в текущий день? и как использование минут дня решает вопрос?, @Juraj
- Как объявить массив переменного размера (глобально)
- Программирование Arduino с использованием Python, а не C/C ++
- Загрузка Arduino Nano дает ошибку: avrdude: stk500_recv(): programmer is not responding
- Как справиться с rollover millis()?
- Является ли использование malloc() и free() действительно плохой идеей для Arduino?
- Можно ли сделать несколько функций loop() с помощью Arduino Uno?
- Какие накладные расходы и другие соображения существуют при использовании структуры по сравнению с классом?
- устаревшее преобразование из строковой константы в 'char*'
я писал как думал... 37:00 = 13:00 + 24:00...добавьте 24 часа ко времени выключения, @jsotola
Вы можете понять это, нарисовав диаграмму... кружок... "0" вверху "12" внизу... то есть 24 часа.... добавьте 24 часа, чтобы остановить время.... затем используйте что-нибудь как этот псевдокод
if (T>=14 && T+24 <=37) then ON else OFF
, @jsotola