Страница 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 или после.