Arduino - Timebetween или выполнение в определенное время

Использование системы в различных ситуациях, вопросы программирования сценариев.

Модератор: immortal

Ответить
PAV
Сообщения: 969
Зарегистрирован: Пт дек 06, 2013 11:30 am
Откуда: Москва
Благодарил (а): 71 раз
Поблагодарили: 95 раз

Arduino - Timebetween или выполнение в определенное время

Сообщение PAV » Вт янв 24, 2017 4:22 pm

Столкнулся тут с неожиданной проблемой.
На ардуино нужно прописать яркость света в зависимости от времени суток.
с 7 до 22 день
с 22 до 23 вечер
с 23 до 7 ночь

КАК прописать If для вечера и ночи?
Если кажется, что легко, замените 23 на 2.
Аватара пользователя
Eraser
Сообщения: 1085
Зарегистрирован: Вт окт 21, 2014 7:31 pm
Откуда: Киров
Благодарил (а): 14 раз
Поблагодарили: 873 раза
Контактная информация:

Re: Arduino - Timebetween или выполнение в определенное врем

Сообщение Eraser » Вт янв 24, 2017 4:25 pm

h > 7 && h<22
h > 22 || h <=2
h > 2 && h <=7
Connect ---- Telegram
ЮMoney для благодарностей за помощь: 410012076838296 или нажмите кнопку "Спасибо"!!! :D
PAV
Сообщения: 969
Зарегистрирован: Пт дек 06, 2013 11:30 am
Откуда: Москва
Благодарил (а): 71 раз
Поблагодарили: 95 раз

Re: Arduino - Timebetween или выполнение в определенное врем

Сообщение PAV » Вт янв 24, 2017 5:36 pm

А с 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 или выполнение в определенное врем

Сообщение xor » Вт янв 24, 2017 11:03 pm

Проблема в переходе через 0?
Если да, то, может быть, ночной интервал разбить на два:
с 23 до 24 и с 0 до 7?
За это сообщение автора xor поблагодарил:
slgeo (Вт янв 24, 2017 11:50 pm)
Рейтинг: 1.16%
Аватара пользователя
slgeo
Сообщения: 551
Зарегистрирован: Чт фев 05, 2015 2:35 pm
Откуда: РнД
Благодарил (а): 139 раз
Поблагодарили: 74 раза

Re: Arduino - Timebetween или выполнение в определенное врем

Сообщение slgeo » Вт янв 24, 2017 11:52 pm

xor писал(а):Проблема в переходе через 0?
Если да, то, может быть, ночной интервал разбить на два:
с 23 до 24 и с 0 до 7?
Все верно, именно так и разбивают ночной интервал для того, чтобы корректно работали вхождения в интервалы.
Raspberry Pi2 Model B + NRF24L01 (MySensors) + 1-Wire + Esp8266 (WiFi-IoT)
CONNECT
Аватара пользователя
xor
Сообщения: 2045
Зарегистрирован: Сб ноя 22, 2014 8:45 pm
Благодарил (а): 289 раз
Поблагодарили: 633 раза

Re: Arduino - Timebetween или выполнение в определенное врем

Сообщение xor » Ср янв 25, 2017 12:39 am

Есть ещё решения:
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 утра

Оба эти решения позволяют обойтись тремя интервалами, но накладные расходы присутствуют.
PAV
Сообщения: 969
Зарегистрирован: Пт дек 06, 2013 11:30 am
Откуда: Москва
Благодарил (а): 71 раз
Поблагодарили: 95 раз

Re: Arduino - Timebetween или выполнение в определенное врем

Сообщение PAV » Ср янв 25, 2017 12:22 pm

Забавно, да? Вроде простейшая задача, а вон как ;)
Самое веселое, что код Eraser работал два года, пока не появилась нгеобходимость изменить ночное время на 23 и тут я с удивление онаружил, что свет перестал работать правильно ;))
Да и вообще, система 3 года крутится, а до сих пор вылезают какие-то ошибки логики ;)

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