Свет нужен всем и людям, и животным, и растениям. Если большинство людей могут выйти на улицу на свет, то некоторые животные и растения сами это сделать не могут. Поэтому для имитации дня, ночи, рассвета и заката используется искусственное освещение. Например, птичники в инкубаторах или теплицы для выращивания растений используют искусственное освещение, в том числе там, где естественного освещения нет.
Ещё один вариант использования — это желание продлить себе время светового дня. Для этого после заката, да и перед рассветом на заданное время можно включить искусственное освещение.
В обоих вариантах можно использовать самый простой и понятный способ — это поставить датчик освещенности на улице и по значению уровня освещенности включать искусственный свет. Причем для уличного освещения при уменьшении солнечного света нужно включить освещение, чтобы продлить световой день. А для птичника наоборот, на улице стемнело и в птичнике выключить, чтобы сымитировать смену дня и ночи для закрытого пространства.

Систему контроля рассвета и заката можно использовать для различных применений, например.

  • Можно открывать и закрывать жалюзи во время рассвета и заката;

  • можно включать и выключать свет в комнате в темное время суток;

  • можно имитировать день и ночь в птичнике;

  • можно поливать растения в зимнем саду;

  • можно выполнять и другие технологические действия.

Чтобы определить момент, когда же наступит рассвет и закат можно использовать два метода: первый — поставить датчик освещенности на улице и второй — посчитать действительное время рассвета и заката.

Постановка задачи

Задачу придумал не я, а ко мне пришел заказчик, которому нужно было выключать и включать освещение строго по времени рассвета и заката без использования датчика освещенности. А мне нужно было эту задачу решить, используя только часы.
И так, заказчику требовалось создать систему, которая будет открывать и закрывать жалюзи, а также включать и выключать подсветку во время рассвета и заката.
Для начала я сделал таблицу с годовым графиком времени включения и выключения светильника.

таблица с годовым графиком времени включения и выключения

Временной период

Отключение

Включение

1

1.01 — 15.01

9:02

16:58

2

16.01- 31.01

8:53

17:18

3

1.02 — 14.02

8:33

17:46

4

15.02 — 28.02

8:08

18:11

5

1.03 — 15.03

7:39

18:46

6

16.03 — 31.03

7:05

19:02

7

1.04 — 15.04

6:30

19:30

8

16.04 — 30.04

5:56

19:54

9

1.05 — 15.05

5:26

20:19

10

16.05 — 31.05

5:01

20:43

11

1.06 — 15.06

4:43

21:04

12

16.06 — 30.06

4:42

21:15

13

1.07 — 15.07

4:57

21:06

14

16.07 — 31.07

5:19

20:45

15

1.08 — 15.08

5:42

20:18

16

16.08 — 31.08

6:08

19:44

17

1.09 — 15.09

6:31

19:09

18

16.09 — 30.09

6:56

18:35

19

1.10 — 15.10

7:21

18:02

20

16.10 — 31.10

7:48

17:30

21

1.11 — 15.11

8:15

17:06

22

16.11 — 30.11

8:38

16:50

23

1.12 — 15.12

8:55

16:47

24

16.12 — 31.12

9:01

16:56

Эта таблица показывает во сколько стемнело или рассвело на улице и можно включить или выключить свет.

Эта таблица показывает во сколько стемнело или рассвело на улице. А для управления жалюзи нужно другое время управления открытия и закрытия.
Время открытия и закрытия жалюзи задано другой аналогичной таблицей.

Таблица открытия и закрытия жалюзи

Временной период

Открытие

Закрытие

1

1.01 — 15.01

9:02; 15:58

10:02; 16:58

2

16.01- 31.01

8:53; 16:18

9:53; 17:18

3

1.02 — 14.02

8:33; 16:46

9:33; 17:46;

4

15.02 — 28.02

8:08; 17:11

9:08; 18:11

5

1.03 — 15.03

7:39; 17:46

8:39; 18:46

6

16.03 — 31.03

7:05; 18:02

8:05; 19:02

7

1.04 — 15.04

6:30; 18:30

7:30; 19:30

8

16.04 — 30.04

5:56; 18:54

6:56; 19:54

9

1.05 — 15.05

5:26; 19:19

6:26; 20:19

10

16.05 — 31.05

5:01; 19:43

6:01; 20:43

11

1.06 — 15.06

4:43; 20:04

5:43; 21:04

12

16.06 — 30.06

4:42; 20:15

5:42;21:15

13

1.07 — 15.07

4:57; 20:06

5:57; 21:06

14

16.07 — 31.07

5:19; 19:45

6:19; 20:45

15

1.08 — 15.08

5:42; 19:18

6:42; 20:18

16

16.08 — 31.08

6:08; 18:44

7:08; 19:44

17

1.09 — 15.09

6:31; 18:09

7:31; 19:09

18

16.09 — 30.09

6:56; 17:35

7:56; 18:35

19

1.10 — 15.10

7:21; 17:02

8:21; 18:02

20

16.10 — 31.10

7:48; 16:30

8:48; 17:30

21

1.11 — 15.11

8:15; 16:06

9:15; 17:06

22

16.11 — 30.11

8:38; 15:50

9:38; 16:50

23

1.12 — 15.12

8:55; 15:47

9:55; 16:47

24

16.12 — 31.12

9:01;15:56

10:01; 16:56

Реализовывать алгоритм нужно было на модуле Интернет реле DRM88ER.
Используется три выхода. К выходу реле 1 подключена кнопка для открытия жалюзи.
К выходу реле 2 подключена кнопка для закрытия жалюзи.
К выходу реле 8 подключены светильники освещения.

Решение задачи

Если пойти прямым путем, сделать условия IF для каждого времени, даты и каждой строчки, то это займет очень много строк в программе и выделенной для этого памяти может не хватить. Да и писать их долго, ошибиться легко и точность будет небольшой.
Поэтому будем использовать другой. Более компактный алгоритм сценария. Вместо чисто условной логики будем использовать арифметическую логику работы.
Вместо проверки условия для каждой строчки сделаем расчет номера этой строчки. Вместо логической проверки времени выполнения команды сделаем расчет этого времени.
В регистрах IR20 — IR999 находятся ячейки ОЗУ, которые используются как переменные для расчетов. Диапазон данных в этих переменных может быть типа int -32768 +32767 целое со знаком.
Вообще в основе модуля DRM88ER лежат регистры Modbus и через эти регистры можно обращаться к ячейкам ОЗУ, параметрам настроек сети, временным параметрам, включая таймеры, к сценариям и другим данным.
В регистрах IR9004 — IR9010 можно прочитать текущие дату и время из встроенных часов реального времени.
Алгоритм работы будет выглядеть следующим образом:
Рассчитываем цикл работы, то есть номер строчки в нашей таблице

 IR33 = IR9006 * 30; текущее значение месяца умножаем на 30
 IR33 = IR33 – 15; вычитаем из полученного значения 15
 IR34 = IR33 + IR9004; прибавляем к значению текущий день
 IR35 = IR34 / 15; делим это значение на 15

Получили номер цикла в диапазоне от 1 до 25, записанный в переменную IR35 
Преобразуем время в минуты. Далее все расчеты будут производиться в минутах (0–1439), а не в часах и минутах как обычно принято.

IR36 = IR9008 * 60; умножаем часы на 60 получаем минуты
IR37 = IR36 + IR9009; прибавляем минуты

Получили текущее время в минутах в диапазоне от 0 до 1439, записанный в переменную IR37 
Теперь нужно текущее время в минутах сравнить с данными из таблицы. Для этого прописать каждое значение времени условиями IF.
Это тоже займет достаточно много строк в программе.
Но есть вариант получше, это рассчитать время рассвета и заката.

Строим график восхода и заката

График восхода и заката выглядит так:

График восхода и заката
График восхода и заката

Формула расчета восхода, взятая из Википедии, выглядит так:
cos ω∘ = − tan ϕ × tan δ, где
ω∘ — часовой угол Солнца при восходе или закате;
ϕ‑ географическая широта на Земле;
δ‑ склонение Солнца.
Более точное уравнение, которое учитывает явление атмосферной рефракции и то, что Солнце не является точкой, а диском, будет выглядеть так:

{\displaystyle \cos \omega _{\circ }={\dfrac {\sin a-\sin \phi \times \sin \delta }{\cos \phi \times \cos \delta }}}

Формула довольно сложная и для расчета потребуется компьютер, а не микроконтроллер. Поэтому я упростил формулу расчета и оставил только COS() и коэффициенты смещения функции вверх и вправо. Эти коэффициенты зависят от местоположения населенного пункта и смещения часового пояса.
Формула получилась упрощенная, приблизительная, но для нашей задачи управления освещением этой точности вполне достаточно.
Значение времени в минутах для рассвета рассчитываем по формуле:
Время = 130 * COS(2 * π / 25 * (номер цикла в году + смещение))+420 
2 * π / 25 = 0.251 — это круг, деленный на количество наших циклов 25 и умножаем это значение на 1000, так как регистры целочисленные и тригонометрия в нашем модуле пишется целыми числами в тысячных долях. Такой же получаем и результат в тысячных долях, который нужно будет потом разделить на 1000. Т.е. значения с фиксированной запятой и тремя знаками после неё. Номер цикла тоже нужно смещать с учетом того, что световой цикл начинается 22 декабря, а не 1 января.
Сравним полученный результат с данными из таблицы.

Таблица сравнения расчетного и реального времени рассвета и заката

Отключение

Минуты

Расчетное значение

Включение

Минуты

Расчетное значение

1

9:02

542

546

16:58

1018

1014

2

8:53

533

533

17:18

1038

1027

3

8:33

513

512

17:46

1066

1048

4

8:08

488

485

18:11

1091

1075

5

7:39

459

454

18:46

1126

1106

6

7:05

425

420

19:02

1142

1140

7

6:30

390

386

19:30

1170

1174

8

5:56

356

355

19:54

1194

1205

9

5:26

326

328

20:19

1219

1232

10

5:01

301

307

20:43

1243

1253

11

4:43

283

294

21:04

1264

1266

12

4:42

282

290

21:15

1275

1270

13

4:57

297

295

21:06

1266

1265

14

5:19

319

308

20:45

1245

1252

15

5:42

342

328

20:18

1218

1232

16

6:08

368

355

19:44

1184

1205

17

6:31

391

387

19:09

1149

1173

18

6:56

416

420

18:35

1115

1140

19

7:21

441

454

18:02

1082

1106

20

7:48

468

485

17:30

1050

1075

21

8:15

495

512

17:06

1026

1048

22

8:38

518

533

16:50

1010

1027

23

8:55

535

546

16:47

1007

1014

24

9:01

541

550

16:56

1016

1010

Сравнение расчетного и реального времени

По этой таблице в Excel можно построить и графики.
Сверим результат расчета с данными из таблицы визуально на графике.

График восхода и заката солнца для Тулы
График восхода и заката солнца для Тулы

Значения расходятся, но разница очень незначительная.
Возможно нужно учитывать ещё какой то параметр, например, высоту или я изначально мог составить неточную таблицу рассвета и заката.
Теперь напишем пример сценария расчета этого времени.

IR25 = 251 * IR35
IR25 = COS (IR25)
IR25 = IR25 * 13
IR25 = IR25 / 100
IR32 = IR25 + 420

В этом сценарии рассчитали время рассвета в минутах и записали в переменную IR32 
Теперь рассчитываем время заката по формуле: Время = 1440 — (время рассвета) + 120 
1440 это количество минут в сутках, 120 — время, зависящее от нашего местоположения на планете.

IR31 = 1560 - IR32

Получили время заката и записали в регистр IR31 
Чтобы узнать точное время рассвета и заката для определенной координаты можно воспользоваться каким либо Интернет ресурсом, например, с сайта: api.sunrise‑sunset.org
Или можно найти другой не заблокированный ресурс в Интернете.
В разных городах время рассвета и заката будет отличаться.
Для Москвы эти коэффициенты будут другие:
Время = 159 * COS(2 * π / 365 * (номер дня в году + 9))+381 
2 * π / 365 = 0.0172142 — это круг, деленный на количество дней. Прибавление 9 дней — это смещение, так как зимнее солнцестояние будет 21 декабря.
Расчетный график и реальный график восхода солнца для Москвы все равно расходится. Вероятно учитываются дополнительные параметры, например, снежный покров, который увеличивает освещенность.

График восхода и заката солнца для Москвы
График восхода и заката солнца для Москвы

Делаем управление подсветкой

Напишем сценарий для включения и выключения выхода реле, который подключен к подсветке.

IF(IR37 = IR32) THEN COIL8 = 0; однократно;  Если текущее время равно времени рассвета, тогда отключим подсветку.
IF(IR37 = IR31) THEN COIL8 = 1; однократно;  Если текущее время равно времени заката, тогда включим подсветку.

Теперь нужно сделать вторую часть задачи — это управление жалюзи. Для управления используется два временных промежутка, так как жалюзи открываются и закрываются в период рассвета и заката.
Рассчитываем дополнительное время открывания и закрывания жалюзи.

IR30 = IR31 - 60
IR29 = IR32 + 60

Посчитали дополнительное время и записали в регистры IR30 и IR29.
Включаем реле открытия и запускаем таймер на 5 секунд. Секунды задаются с точностью 0.1.

IF(IR37 = IR32) THEN COIL1 = 1; однократно
IF(IR37 = IR32) THEN TIMER1 = 50; однократно
IF(IR37 = IR30) THEN COIL1 = 1; однократно; Включили реле открытия жалюзи.
IF(IR37 = IR30) THEN TIMER1 = 50; однократно
IF(TIMER1 = 1) THEN COIL1 = 0; однократно; Через 5 сек выключили реле.
; Включаем реле закрытия и запускаем таймер на 5 секунд. Секунды задаются с точностью 0.1.
IF(IR37 = IR29) THEN COIL2 = 1; однократно
IF(IR37 = IR29) THEN TIMER1 = 50; однократно
IF(IR37 = IR31) THEN COIL2 = 1; однократно; Включили реле закрытия.
IF(IR37 = IR31) THEN TIMER1 = 50; однократно
IF(TIMER1 = 1) THEN COIL2 = 0; однократно; Через 5 сек выключили реле.  

Использование таймера

Можно применить другой алгоритм, использовав таймер TIMER1.

Таймер обратного отчета

В модуле DRM88ER есть таймер обратного отчета.
Timer — регистр таймера обратного отсчета — это регистр, который уменьшает свое значение на единицу каждые 0.1 секунды.
После того, как таймер доходит до 0 счет останавливается и будет оставаться значение 0.
Пока таймер уменьшается, в любое время можно из него читать промежуточные значения или менять его значения на ходу.
Всего в модуле 16 независимых таймера обратного отсчета. (0 … 15).
Разрядность таймера 16 бит, значение таймера может меняться от 65 535 до 0.
Таймер может использоваться для задания временных интервалов в логике работы контроллера.


Логика работы на таймере:

  1. При наступлении условия устанавливаем таймер на значение 5.1 секунды.

  2. При значении таймера = 5.0 секунды включаем реле.

  3. При значении таймера = 0.1 секунды выключаем реле.

  4. При значении таймера = 0 секунд таймер останавливается и его значение остается нулевым постоянно.

IF(IR37 = IR32) THEN TIMER1 = 51; однократно
IF(IR37 = IR30) THEN TIMER1 = 51; однократно
IF(TIMER1 = 50) THEN COIL1 = 1; однократно
IF(TIMER1 = 1) THEN COIL1 = 0; однократно;  Через 5 сек выключили реле.
 ; Включаем реле закрытия и запускаем таймер на 5 секунд. Секунды задаются с точностью 0.1.
IF(IR37 = IR29) THEN TIMER2 = 51; однократно
IF(IR37 = IR31) THEN TIMER2 = 51; однократно
IF(TIMER2 = 50) THEN COIL2 = 1; однократно
IF(TIMER2 = 1) THEN COIL2 = 0; однократно

Условия можно сделать не только логическими действиями, но и арифметическими. Например, Если IR37 = IR32, то разность между этими значениями будет равна нулю.

IR40 = IR37 - IR32
IR41 = IR37 - IR30
IF(IR40 = 0) OR (IR41 = 0) THEN TIMER2 = 51
IF(TIMER1 = 50) THEN COIL1 = 1; однократно
IF(TIMER1 = 1) THEN COIL1 = 0; однократно

Правда в этом случае строк получилось больше.
Алгоритм будет выполняться в течении всего года. В следующем году цикл алгоритма начнется заново.

Алгоритм управления жалюзи
Алгоритм управления жалюзи
Алгоритм управления жалюзи

Увеличиваем точность и делим на большее количество циклов в году

Выше был описан пример на 24 цикла, меняющийся два раза в месяц.
Теперь сделаем количество циклов 365 и рассчитаем время на каждый день.
Расчет номера дня в году довольно сложный. Поскольку нам не требуется высокой точности, то мы сильно упростим расчет и оставим точность ± 2 дня.

IR33 = IR9006 * 30; текущее значение месяца умножаем на 30
IR33 = IR33 – 30; вычитаем из полученного значения 30
IR34 = IR33 + IR9004; прибавляем к значению текущий день

Простым умножением получили номер цикла в диапазоне от 1 до 361, записанный в регистр IR35. Это не количество дней, а количество циклов, хотя и очень близкое значение.
Затем преобразуем время в минуты.

IR36 = IR9008 * 60; умножаем часы на 60 получаем минуты
IR37 = IR36 + IR9009; прибавляем минуты

Получили текущее время в минутах в диапазоне от 0 до 1439, записанный в регистр IR37.
Рассчитаем время начала светового дня.
Вычисление будет приблизительным по упрощенной формуле с использованием только COS и для населенного пункта, для которого составлена таблица. Значение времени в минутах для рассвета рассчитываем по формуле:
Время = 130 * COS(2 * π / 361 * (номер цикла в году))+420 
2 * π / 361 = 0.0174 — это круг, деленный на количество наших циклов 361 и умножаем это значение на 1000, так как тригонометрия в модуле пишется целыми числами в тысячных долях. Значение косинуса задается в радианах. Чем больше число в четвертом знаке после запятой, тем больше погрешность установки времени.
Записать можем только тысячную долю, то есть 17. Отбрасывая 4 мы теряем очень сильно в точности и погрешность может оказаться до одного часа. Точность будет выше, при числе циклов, в котором результат будет до 3 знаков после запятой. 2 * π / циклы = 0.ххх0. Больше 3 знаков записать в регистр нельзя. Когда последний день цикла умножается на это число, то должно получиться 2 * π, а результат COS должен быть 1. Тогда точность будет высокая.

IR25 = 17 * IR35
IR25 = COS (IR25)
IR25 = IR25 * 13
IR25 = IR25 / 100
IR32 = IR25 + 420

Рассчитали время рассвета и записали в регистр IR32 
Теперь рассчитываем время заката по формуле: Время = 1440 — (время рассвета) + 120

IR31 = 1560 - IR32

Получили время заката и записали в регистр IR31 
Далее пишем управление светом и жалюзи как в варианте, описанном выше.

Алгоритм управления жалюзи для DRM88ER
Алгоритм управления жалюзи
Алгоритм управления жалюзи

Таким образом, используя минимальное количество строк в программе, мы сделали управление с довольно массивной таблицей данных.

Дифференцирующая цепь

Для управления жалюзи используются два канала реле. Они подключены к кнопкам «Открыть» и «Закрыть». Чтобы осталась возможность пользоваться кнопками нужно, чтобы контакты реле не были постоянно замкнуты и не держали кнопки нажатыми.
Для этого нужно продифференцировать выходной сигнал.
Дифференцировать — значит из постоянного сигнала сделать импульсный.
Интегрировать — значит из импульсного сигнала сделать постоянный.
Продифференцировать сигнал можно двумя способами: программным и аппаратным.
 Программный способ.

  1. запускаем таймер;

  2. при значении таймера = 5.0 секунды включаем реле.;

  3. при значении таймера = 0.1 секунды выключаем реле.

Таймер доходит до 0 и останавливается.

IF(IR37 = IR30) THEN TIMER1 = 51; однократно
IF(TIMER1 = 50) THEN COIL1 = 1; однократно
IF(TIMER1 = 1) THEN COIL1 = 0; однократно

Через 5 сек после включения реле оно снова выключится.
Секунды задаются с точностью 0.1.
Аппаратный способ.

  1. Замыкаем контакты;

  2. заряжается конденсатор;

  3. после заряда конденсатора цепь разрывается;

  4. после размыкания контактов конденсатор разряжается.

Время заряда конденсатора считается по формуле=RC. Где это постоянная времени равная 63% от полного заряда конденсатора в секундах, R в Омах, C в Фарадах.
Нужно в цепи между реле и кнопками жалюзи последовательно подключить конденсатор.

Использование встроенного сценария расчета времени

Описанный выше метод показывает сколько действий нужно сделать, чтобы рассчитать время рассвета и заката. Но есть метод гораздо проще.
Почти во всех модулях Razumdom встроены параметры для расчета времени рассвета и заката.
В регистре IR9018 выводиться номер дня в году с учетом високосного года. от 0 до 365 или 366, если год високосный. Таким образом номер дня в году можно не рассчитывать самостоятельно.
В перечне сценарий есть команда для расчета времени рассвета.
В строку сценария пишутся значения: (регистр) = (значение) * COS(2 * PI / 365 * ((регистр) +9))+(значение). Например:

IR40 = 159 * COS(k * IR9018) + 381

Так время рассвета можно получить сразу из сценария.
А время заката для Тулы будет вычисляться командой: Закат = 1493 — Рассвет

IR31 = 1493 - IR40

Таким образом двумя командами получаем время рассвета и время заката в минутах.
В формуле присутствуют ещё два коэффициента, которые для каждого населенного пункта будут разные. Эти коэффициенты тоже нужно рассчитать по широте и долготе точки на карте.
Для этого в Интернет реле я уже написал расчет нужных коэффициентов. В WEB интерфейсе модуля, в разделе: Настройки — Системные — Дата и время можно увидеть вот такое поле для расчёта параметров.

Страница расчёта коэффициентов для сценария рассвета и заката
Страница расчёта коэффициентов для сценария рассвета и заката

На этой странице нужно ввести координаты, взятые из карты, например, Яндекс карты и часовой пояс. Нажав кнопку рассчитать страница покажет параметры на выбранный день и коэффициенты для формулы рассвета и заката.

Заключение

Описанный выше алгоритм позволяет организовать систему управления освещением и жалюзи по условию изменения светлого и темного времени суток. Рассвет и закат можно определить не только с помощью датчика освещенности, но и с помощью расчёта времени. Это время можно получить не с помощью сложного в написании табличного метода, а с помощью простого в написании математического метода. Таким образом, чтобы управлять светом или жалюзи, не нужен дорогой уличный датчик освещённости. Достаточно часов реального времени и простого расчёта по координатам. Математический метод, описанный в статье, работает в Интернет реле DRM88ER и позволяет точно определять рассвет и закат для любого населенного пункта.