Столкнулся тут с неожиданной проблемой.
На ардуино нужно прописать яркость света в зависимости от времени суток.
с 7 до 22 день
с 22 до 23 вечер
с 23 до 7 ночь
КАК прописать If для вечера и ночи?
Если кажется, что легко, замените 23 на 2.
Arduino - Timebetween или выполнение в определенное время
Модератор: immortal
- Eraser
- Сообщения: 1085
- Зарегистрирован: Вт окт 21, 2014 7:31 pm
- Откуда: Киров
- Благодарил (а): 14 раз
- Поблагодарили: 873 раза
- Контактная информация:
Re: Arduino - Timebetween или выполнение в определенное врем
h > 7 && h<22
h > 22 || h <=2
h > 2 && h <=7
h > 22 || h <=2
h > 2 && h <=7
Connect ---- Telegram
ЮMoney для благодарностей за помощь: 410012076838296 или нажмите кнопку "Спасибо"!!!
ЮMoney для благодарностей за помощь: 410012076838296 или нажмите кнопку "Спасибо"!!!

-
- Сообщения: 968
- Зарегистрирован: Пт дек 06, 2013 11:30 am
- Откуда: Москва
- Благодарил (а): 71 раз
- Поблагодарили: 95 раз
Re: Arduino - Timebetween или выполнение в определенное врем
А с 23?
Смысл в том, что время дня, вечера и ночи могут меняться. Т.е. если в настройках выставить ночь с 23, то ваш код уже не сработает.
Я пока выкрутился так:
lvd - день 7 утра
lve - вечер 22 вечера
lvn - ночь с 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);
}}
}
- xor
- Сообщения: 2045
- Зарегистрирован: Сб ноя 22, 2014 8:45 pm
- Благодарил (а): 289 раз
- Поблагодарили: 633 раза
Re: Arduino - Timebetween или выполнение в определенное врем
Проблема в переходе через 0?
Если да, то, может быть, ночной интервал разбить на два:
с 23 до 24 и с 0 до 7?
Если да, то, может быть, ночной интервал разбить на два:
с 23 до 24 и с 0 до 7?
- Рейтинг: 1.16%
win10 connect https://connect.smartliving.ru/profile/303
- slgeo
- Сообщения: 551
- Зарегистрирован: Чт фев 05, 2015 2:35 pm
- Откуда: РнД
- Благодарил (а): 139 раз
- Поблагодарили: 74 раза
Re: Arduino - Timebetween или выполнение в определенное врем
Все верно, именно так и разбивают ночной интервал для того, чтобы корректно работали вхождения в интервалы.xor писал(а):Проблема в переходе через 0?
Если да, то, может быть, ночной интервал разбить на два:
с 23 до 24 и с 0 до 7?
Raspberry Pi2 Model B + NRF24L01 (MySensors) + 1-Wire + Esp8266 (WiFi-IoT)
CONNECT
CONNECT
- xor
- Сообщения: 2045
- Зарегистрирован: Сб ноя 22, 2014 8:45 pm
- Благодарил (а): 289 раз
- Поблагодарили: 633 раза
Re: Arduino - Timebetween или выполнение в определенное врем
Есть ещё решения:
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 утра
Оба эти решения позволяют обойтись тремя интервалами, но накладные расходы присутствуют.
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 утра
Оба эти решения позволяют обойтись тремя интервалами, но накладные расходы присутствуют.
win10 connect https://connect.smartliving.ru/profile/303
-
- Сообщения: 968
- Зарегистрирован: Пт дек 06, 2013 11:30 am
- Откуда: Москва
- Благодарил (а): 71 раз
- Поблагодарили: 95 раз
Re: Arduino - Timebetween или выполнение в определенное врем
Забавно, да? Вроде простейшая задача, а вон как 
Самое веселое, что код Eraser работал два года, пока не появилась нгеобходимость изменить ночное время на 23 и тут я с удивление онаружил, что свет перестал работать правильно
)
Да и вообще, система 3 года крутится, а до сих пор вылезают какие-то ошибки логики
Пока, в общем, остановился на своем коде выше, он работает. Там по сути добавилась только проверка значения ночного времени - до 0 или после.

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

Да и вообще, система 3 года крутится, а до сих пор вылезают какие-то ошибки логики

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