Страница 1 из 1
Arduino - Timebetween или выполнение в определенное время
Добавлено: Вт янв 24, 2017 4:22 pm
PAV
Столкнулся тут с неожиданной проблемой.
На ардуино нужно прописать яркость света в зависимости от времени суток.
с 7 до 22 день
с 22 до 23 вечер
с 23 до 7 ночь
КАК прописать If для вечера и ночи?
Если кажется, что легко, замените 23 на 2.
Re: Arduino - Timebetween или выполнение в определенное врем
Добавлено: Вт янв 24, 2017 4:25 pm
Eraser
h > 7 && h<22
h > 22 || h <=2
h > 2 && h <=7
Re: Arduino - Timebetween или выполнение в определенное врем
Добавлено: Вт янв 24, 2017 5:36 pm
PAV
А с 23?
Смысл в том, что время дня, вечера и ночи могут меняться. Т.е. если в настройках выставить ночь с 23, то ваш код уже не сработает.
Я пока выкрутился так:
lvd - день 7 утра
lve - вечер 22 вечера
lvn - ночь с 23
Код: Выделить всё
if ((hour() >= lvd) && (hour() < lve)) {
for (brightness = 0; brightness < lightValDay; brightness++) {
analogWrite(DimPin1, brightness);
delay(10);
}}
if ((lvn >= lve) && (lvn <= 23)) {
if ((hour() >= lve) && (hour() < lvn)) {
for (brightness = 0; brightness < lightValEv; brightness++) {
analogWrite(DimPin1, brightness);
delay(10);
}}
if ((hour() >= lvn) || (hour() < lvd)) {
for (brightness = 0; brightness < lightValNight; brightness++) {
analogWrite(DimPin1, brightness);
delay(10);
}}
}
if (lvn < lvd){
if ((hour() >= lve) || (hour() < lvn)){
for (brightness = 0; brightness < lightValEv; brightness++) {
analogWrite(DimPin1, brightness);
delay(10);
}}
if ((hour() >= lvn) && (hour() < lvd)) {
for (brightness = 0; brightness < lightValNight; brightness++) {
analogWrite(DimPin1, brightness);
delay(10);
}}
}
Re: Arduino - Timebetween или выполнение в определенное врем
Добавлено: Вт янв 24, 2017 11:03 pm
xor
Проблема в переходе через 0?
Если да, то, может быть, ночной интервал разбить на два:
с 23 до 24 и с 0 до 7?
Re: Arduino - Timebetween или выполнение в определенное врем
Добавлено: Вт янв 24, 2017 11:52 pm
slgeo
xor писал(а):Проблема в переходе через 0?
Если да, то, может быть, ночной интервал разбить на два:
с 23 до 24 и с 0 до 7?
Все верно, именно так и разбивают ночной интервал для того, чтобы корректно работали вхождения в интервалы.
Re: Arduino - Timebetween или выполнение в определенное врем
Добавлено: Ср янв 25, 2017 12:39 am
xor
Есть ещё решения:
1 - перейти от часов к спецформату времени - ГГММДДЧЧ, те. сейчас 25/01/17 0:22 представлять как число 17012500 без минут, а границы интервалов каждый день пересчитывать, те, 7 утра =17012507, 23 ч=17012523, 2 ч завтра=17012602, 7 утра завтра=17012607, тогда можно обойтись и тремя интервалами;
2 - "передвинуть стрелки" - использовать относительное время для яркости - ведь у нас цикл охватывает 24 часа. Для этого принимаем за 0 часов относительного времени старт дневной яркости - 7 утра.
if hour >= 0 and <7 then hour_new=(hour+24)-7 else hour_new=hour-7
if hour_new >=0 and hour_new<15 день, где 15=22-7
if hour_new >=15 and hour_new<16 вечер, где 16=23-7
if hour_new >=16 and hour_new<24 ночь, где 24=7 утра
Оба эти решения позволяют обойтись тремя интервалами, но накладные расходы присутствуют.
Re: Arduino - Timebetween или выполнение в определенное врем
Добавлено: Ср янв 25, 2017 12:22 pm
PAV
Забавно, да? Вроде простейшая задача, а вон как

Самое веселое, что код Eraser работал два года, пока не появилась нгеобходимость изменить ночное время на 23 и тут я с удивление онаружил, что свет перестал работать правильно

)
Да и вообще, система 3 года крутится, а до сих пор вылезают какие-то ошибки логики
Пока, в общем, остановился на своем коде выше, он работает. Там по сути добавилась только проверка значения ночного времени - до 0 или после.