Оглавление:
- Шаг 1. Проектирование оборудования
- Шаг 2: Разработка программного обеспечения
- Шаг 3: закрытие и список задач
Видео: SilverLight: Монитор окружающей среды на базе Arduino для серверных комнат: 3 шага (с изображениями)
2024 Автор: John Day | [email protected]. Последнее изменение: 2024-01-30 11:51
Однажды мне дали задание найти датчик окружающей среды для мониторинга температуры в серверной моей компании. Моя первая идея была: почему бы просто не использовать Raspberry PI и датчик DHT, его можно настроить менее чем за час, включая установку ОС. В связи с этим я получил холодный ответ от властных людей с завязанными глазами, что мы не будем этого делать, потому что его установка будет стоить больше рабочих часов, чем покупка устройства. Одно дело принимать таких узколобых людей, как этот, и я заказал на Ebay какую-то хлам EATON корпоративного уровня и назвал его, но в тот момент я решил, что для своей серверной я построю Arduino с полностью открытым исходным кодом. на базе устройства, которое будет намного лучше, чем то, что я только что заказал.
Этот проект носит кодовое название SilverLight, не спрашивайте меня, откуда у меня эти названия:) Я просто посмотрел на блестящую полуакриловую коробку и решил, что с этим названием оно не имеет ничего общего с продуктом микрокопыто, о котором я узнал после.
Шаг 1. Проектирование оборудования
Обзор коммерческого оборудования.
Хорошо, я даже не начал с того, чья прекрасная идея заключалась в том, чтобы поместить монитор окружающей среды в ИБП, но, очевидно, для него есть рынок, поэтому давайте посмотрим, что они могут сделать:
СОВМЕСТИМОСТЬ устройства экологического мониторинга
Сеть 10/100 Мбит / с, PXGUPS, PXGPDP и PXGMS.
10/100 Мбит ConnectUPS-X, ConnectUPS-BD и ConnectUPS-E с FW V3.01 и выше. РАЗМЕРЫ (ДXШXВ)
2,26 x 1,48 x 1,15 (дюймов) 57,6 x 37,6 x 29,3 (мм) ВЕС
1,19 унций (34 г)
Это очень полезная информация, не правда ли? Не беспокойтесь, потому что они мало что могут сделать. Чтобы даже начать работу, вашему ИБП понадобится еще одна дорогая дополнительная карта, которая соединяет его с датчиком окружающей среды, который вы покупаете отдельно, обычно со стандартным кабелем CAT5 (даже не пытайтесь что-либо подключать к этому порту, потому что нет ничего стандартного об этом). Они утверждают, что устройству требуется 10 минут, чтобы «разогреться», что на самом деле составляло часы, и как только это произошло, оно появилось в их медленно обновляющемся java-интерфейсе, и у нас есть температура и влажность. С этого момента настроить условия на основе предупреждений было легко, но кого это волнует, давайте создадим что-нибудь получше.
Этот проект является соединением нескольких моих проектов: метеостанция Наталья, Тень феникса. Коробка способна отслеживать следующие ограничения окружающей среды:
- Индекс температуры / влажности / тепла
- Концентрации сжиженного нефтяного газа, дыма, спирта, пропана, водорода, метана и окиси углерода в воздухе (MQ2)
- Чувствительность к солнечному свету (горит ли свет в серверной?)
- Датчик движения PIR (с этого момента вы даже можете автоматически включать / выключать свет благодаря датчику движения, когда кто-то входит в комнату)
Все эти данные красиво отображаются на ЖК-экране, а также передаются на компьютер (Orange PI Zero) для дальнейшей обработки и оповещений. Хотя можно было бы напрямую подключить цифровые датчики, такие как DHT и цифровой вывод MQ2, к OrangePI, я всегда предпочитаю использовать специальные микросхемы для этих задач, а также когда вам нужно обновить ЖК-дисплей и выполнить другие низкоуровневые операции. Дело в том, что Arduino просто непревзойден и может надежно работать без остановки в течение многих лет (на самом деле ни один Arduino, который работает 24/7, еще не отказал мне). OrangePI с его недостатками (давайте посмотрим правде в глаза, это компьютер за 10 долларов), например, непригодный для тяжелых рабочих нагрузок, отсутствие поддержки bsd, раздутие встроенного Wi-Fi и т. Д., Он легко справляется с небольшими рабочими нагрузками, такими как считывание показаний датчика через последовательный порт (USB) и их обработка.
Это очень простой аппаратный проект, требующий следующих компонентов:
- Arduino PRO Micro
- ЖК-экран 2x16 символов RGB
- Модуль питания с разделительным переключателем AC-DC от 220V до 5V HLK-5M05 (это очень хорошо для проектов Arduino / ESP), это версия 5V / 5W!
- Резисторы 2x300ohm
- 2xleds (красный / зеленый)
- Датчик движения PIR
- Датчик MQ2
- DHT22
- LDR
- Резистор 2X10кОм
- Зуммер
- Оранжевый PI Zero
- кабель для передачи данных mini USB
Я даже не стал делать печатную плату для этого, просто использовала обычную макетную плату, потому что компоненты можно просто подключить к Arduino (см. Прилагаемые изображения):
-DHT22 потребует подтягивания 10K к VCC (цифровой)
-LDR потребует сброса 10K на GND (аналоговый)
-MQ2 может быть напрямую подключен к любому аналоговому выводу (аналогу) <предпочитаю использовать аналоговый, потому что почему бы и нет, когда у нас есть MCU с аналоговыми выводами, где мы можем получить точное значение вместо регулировки некоторого потенциометра на задней панели устройства, чтобы получить ВЫСОКИЙ или НИЗКИЙ из-за склейки в моей конструкции, которая и так недоступна. Проверить:
-PIR может быть напрямую подключен к любому контакту (цифровому)
-ЖК: может управляться с 4 контактами, может быть подключен к любому контакту (цифровому), потребуется +2 RS / E (цифровой)
-Buzzer: может быть напрямую подключен к любым контактам Arduino (цифровой)
Распиновку, которую я использовал, можно увидеть в коде. Соединить все вместе после того, как это довольно просто, вы также можете сделать их один за другим, убедитесь, что один датчик работает безупречно, затем переходите к следующему, все, что вы можете ошибиться, - это ошибочное подключение проводов к неправильным местам (например, замена vcc / gnd для датчика, до сих пор это ни разу не убило ни одно из моих устройств). Что я хотел бы здесь отметить, что для меня было собрано слишком много VCC и GND, я не мог протолкнуть их через клеммную колодку, поэтому я спаял их все.
Также о DHT не забывайте из других моих проектов: если вы поместите библиотеку DHT в свой код, а датчик DHT не подключен или подключен неправильный DHT (например, 11, определенный в коде, который вы используете 22), что может привести к программе вечно зависать при старте.
Что касается датчиков обнаружения движения PIR, как вы можете видеть на моей фотографии, существует множество поддельных их подделок, на самом деле мне даже было бы трудно купить подлинный на Ebay. Подделки работают так же хорошо, даже в долгосрочной перспективе, но их схема зеркально отражена, что приводит к переворачиванию контактов + и -, также их легко распознать по: синяя печатная плата, а не обычная зеленая, отсутствие этикеток для потенциометры. Мне посчастливилось найти оригинал в своей коробке, иначе при изменении положения я закрывал бы 2 светодиода. Я обнаружил, что оба горшка, повернутые на полпути, мне подходят. Это даст вам достаточно большой диапазон для обнаружения движения, цифровая нога будет удерживаться в ВЫСОКОМ положении около минуты, поэтому вам не нужно исправлять это в коде. На подделках легко определить, с какой стороны - и + достаточно посмотреть на соответствующие ножки электролитических колпачков, подключенных к контактам.
Для резки ящика я использовал алмазную головку дремеля (что было излишним, но работало отлично) и обычный сверлильный станок. С этими распределительными коробками легко работать, и, хотя я не люблю склеивать, у меня не было винтов и болтов под рукой при их сборке, поэтому я решил склеить вещи вместе (которые также можно легко разогреть и разобрать позже, используя тот же клеевой пистолет без наполнителя).
Шаг 2: Разработка программного обеспечения
Код Arduino также прост, он в основном считывает все показания датчиков в начале каждого цикла. Включает светодиоды, если есть движение или дым, а также воспроизводит звуковой сигнал зуммера, если есть дым (это единственный код блокировки, поэтому я сделал его коротким), затем отображает данные на ЖК-дисплее и, наконец, отправляет их на ПК с периодом удержания 10 секунд, чтобы порт не заливал.
В этом проекте используется односторонняя связь от Arduino-> OrangePI, никаких команд не реализовано. Хотя это было бы вполне возможно сделать так, как я сделал это в одном из моих других проектов, где компьютер может отправлять LCD_PRINT1 или LCD_PRINT2 для перезаписи одной строки ЖК-экрана своим собственным сообщением (например: IP-адрес, время безотказной работы, системная дата, использование процессора), площадь экрана настолько мала для отображения данных с 3-х датчиков, что я даже не заморачивался. Значения SOL и SMK могут достигать 4 цифр 0000-1023, занимая уже 8 ценных символов на экране.
С ЖК-дисплеем вы можете заметить небольшую хитрость в коде: после каждого измеренного значения применяется печать пробелов (""), а затем я перемещаю курсор в фиксированные положения, чтобы разместить новые значки и данные. Они есть, потому что ЖК-дисплей не настолько умен, чтобы понимать числа, он просто рисует то, что получает, и, например, если у вас было солнечное значение 525, которое внезапно уменьшилось до 3, тогда он отобразит 325, оставив старый мусор на экране. там.
Управляющий код C, работающий на OrangePI, регистрирует данные об окружающей среде и отправляет оповещения по электронной почте при необходимости.
OrangePI работает под управлением Armbian (который на момент написания был основан на Debian Stretch). Я включу это в программную часть, поскольку это была проблема, которую он решил. Вот средняя потребляемая мощность устройства:
0,17 А - только Arduino + датчики
0,5-0,62 А - загрузка OrangePI
0,31 А - Оранжевый PI в холостом режиме
0,29 A - Orange PI выключен (не могу выключить его, у него нет ACPI или чего-то подобного)
0,60 А - Стресс-тест 100% загрузка ЦП на 4 ядрах
Этот OrangePI у меня давно стоял в коробке. Со старым ядром устройство потребляло такой большой ток (как показал измеритель, достигал пика около 0,63 А), что его блок питания, вероятно, не мог обеспечить, что он просто не загружался, процесс загрузки зависал, и у меня загорелись 2 светодиода Ethernet. постоянно и ничего не делает.
Это немного раздражает, поскольку HLK-5M05 утверждает, что он может выдавать 5 Вт на 5 В, что дает возможность выдавать 1 ампер, но с этими устройствами, выходящими из Китая, вы просто никогда не узнаете, пиковое значение 0,63 А было намного ниже номинального максимума. ценить. Итак, я проводил простые тесты перезагрузки, из 10 перезагрузок OrangePI успешно загружался только дважды, что почти заставило меня выбросить его из проекта, так как мне не нравится непоследовательное поведение с ошибками в схемах. Итак, я начал поискать в Google, возможно, есть способ снизить энергопотребление во время загрузки из программного обеспечения (поскольку тогда это было только проблемой), и нашел статью, в которой говорилось о настройке script.bin, но это было для Orange PI PC и файлы отсутствовали в хранилище, поэтому, что бы я ни делал в крайнем случае, я сделал волшебное «подходящее обновление», чтобы обновить прошивку, ядро и все остальное, надеясь, что оно будет истощать меньше, и устройство сможет загрузиться и:
Linux silverlight 4.14.18-sunxi # 24 SMP Пт 9 февраля 16:24:32 CET 2018 armv7l GNU / Linux
Linux silverlight 4.19.62-sunxi # 5.92 SMP 31 июля, 22:07:23 CEST 2019 armv7l GNU / Linux
Это сработало! Обычно ленивые Java-разработчики бросают аппаратные средства на решение программной проблемы, но в данном случае мы решили аппаратную проблему с помощью программного обеспечения, что является большим успехом. Я провел еще около 20 тестов на перезагрузку, устройство загружалось в каждом отдельном случае. Я все же хотел бы отметить, что скачок напряжения от включения Opi (подключение / отключение) настолько велик, что он сбросит Arduino в любой момент времени (простая перезагрузка просто мигнет на ЖК-дисплее, но не вызовет дальнейших проблем), но эта проблема остается скрыто, так как 2 будут загружены вместе.
Я также посмотрел на модули ядра:
usb_f_acm u_serial g_serial libcomposite xradio_wlan mac80211 лима sun8i_codec_analog snd_soc_simple_card gpu_sched sun8i_adda_pr_regmap sun4i_i2s snd_soc_simple_card_utils ТТМ sun4i_gpadc_iio snd_soc_core cfg80211 snd_pcm_dmaengine industrialio snd_pcm snd_timer SND sun8i_ths soundcore cpufreq_dt uio_pdrv_genirq UIO thermal_sys pwrseq_simple
Что нам от них действительно нужно? Хорошо, питание и тепловизор могут быть полезны, но звук, последовательный порт, Wi-Fi (уже сломанный hw) нам не нужно, все это можно занести в черный список. Позже я также создам собственное ядро только с необходимыми модулями.
Что нам действительно нужно, и он не загружается по умолчанию, так это CDC ACM для связи с Arduino, включите его с помощью:
эхо "cdc-acm" >> / etc / modules
После этого вы уже можете проверить соединение с помощью:
экран / dev / ttyACM0 9600
Вы должны видеть, что данные о состоянии отправляются каждые 10 секунд.
Оповещения и мониторинг
Что касается предупреждений, я просто вставил вызовы system () в управляющий код C, который получает данные через последовательный порт, поэтому никаких внешних инструментов не требуется. Некоторые примеры предупреждений:
- Температура превышает 30 C
- Влажность превышает 70% (небезопасно для серверов)
- Обнаружено движение в комнате (это может раздражать, если вы продолжаете заходить в свою серверную)
- Обнаружен дым или газ (более 100 предупреждений можно воспринимать серьезно, я поигрался с этим датчиком, и он включается для множества вещей, например, создание дыма рядом с датчиком с помощью паяльника привело к чуть более 50 при курении сигареты в следующий раз o подскочил до 500, даже газ из обычного дезодоранта обнаружил издалека)
Для хранения исторических данных я не утруждал себя разработкой инструмента, потому что зачем изобретать велосипед, когда у нас есть отличные фреймворки для мониторинга. Я покажу пример того, как интегрировать это в мой любимый Zabbix:
apt-get установить zabbix-agent
Добавьте в конец: /etc/zabbix/zabbix_agentd.conf
UserParameter = silverlight.hum, head -1 /dev/shm/silverlight-zbx.log | awk -F "," '{напечатать $ 1}'
UserParameter = silverlight.tmp, head -1 /dev/shm/silverlight-zbx.log | awk -F "," '{print $ 2}' UserParameter = silverlight.sol, head -1 /dev/shm/silverlight-zbx.log | awk -F "," '{print $ 4}' UserParameter = silverlight.mot, head -1 /dev/shm/silverlight-zbx.log | awk -F "," '{print $ 5}' UserParameter = silverlight.smk, head -1 /dev/shm/silverlight-zbx.log | awk -F "," '{распечатать $ 6}'
Запуск zabbix_agentd -p должен теперь вернуть правильные значения:
silverlight.hum [t | 41]
silverlight.tmp [t | 23] silverlight.sol [t | 144] silverlight.mot [t | 0] silverlight.smk [t | 19]
Тепловой индекс, я собираю его, но не вижу в нем практического применения, поэтому он просто регистрируется. В управляющем коде C я реализовал 2 функции регистрации, первая будет регистрировать все данные в удобном для пользователя формате:
[SILVERLIGHT] Данные получены 2019-09-10 23:36:08 => Влажность: 44, Температура: 22, Высокая: 25, Солнечная энергия: 0, Движение: 0, Дым: 21
[SILVERLIGHT] Данные получены 10.09.2019 23:36:18 => Влажность: 44, Температура: 22, Выс: 25, Солнечная энергия: 0, Движение: 0, Дым: 21 [SILVERLIGHT] Данные получены 2019-09 -10 23:36:29 => Влажность: 44, Температура: 22, Привет: 25, Солнечная энергия: 0, Движение: 0, Дым: 22 [SILVERLIGHT] Данные получены 2019-09-10 23:36:39 => Влажность: 44, Температура: 22, Привет: 25, Солнечная энергия: 0, Движение: 0, Дым: 21
Второй:
void logger2 (char * text) {
ФАЙЛ * f = fopen ("/ dev / shm / silverlight-zbx.log", "w"); if (f == NULL) {printf ("Ошибка при открытии файла журнала памяти! / n"); возвращение; } fprintf (f, «% s», текст); fclose (f); возвращение; }
Это поместит в память 1 лайнер-журнал (устранит ненужные операции rw на SD-карте), который всегда будет перезаписан в следующий раз. Этот журнал будет содержать только 6 столбцов данных без отметки времени, он легко читается для Zabbix.
В качестве последнего бонуса: как запрограммировать Arduino прямо из OrangePI, чтобы вам не приходилось каждый раз подходить к устройству и подключать ноутбук.
Есть 2 способа:
-Простой способ: установите полную IDE Arduino и библиотеки, используйте удаленный рабочий стол, например X11 с пересылкой, Xrdp, Xvnc, Nxserver и т. Д.
-Жесткий способ: установите Arduino IDE и используйте командную строку
На этот раз мы пойдем по трудному пути, так как я не люблю устанавливать X11 на серверы. Для этого вам понадобится 6 компонентов:
1, Arduino IDE для 32-разрядной версии ARM ->
2, серийный номер Python -> apt-get install python-serial
3, проект Makefile Arduino -> git clone
4, библиотека DHT
5, определения платы Sparkfun
6, SilverLight.ino, основной код
Чтобы упростить задачу, я собрал файлы, необходимые для последних 4 пунктов (sketchbook.tgz), поэтому вам понадобятся только первые 2
Во-первых, лучше всего создать обычного пользователя с доступом rw к USB-порту:
приводящее серебро
usermod -a -G dialout серебристый
Подключите sketchbook.tgz к устройству в домашнем каталоге вновь созданного пользователя и распакуйте его прямо здесь:
cd / home / silver
tar xvzf sketchbook.tgz
Чтобы немного понять, что происходит под капотом, когда вы используете графическую среду IDE:
Рабочий процесс построения эскиза Arduino при использовании Arduino IDE описан на веб-сайте Arduino https://www.arduino.cc/en/Hacking/BuildProcess и более подробно здесь: https://www.arduino.cc/ ru / Hacking / BuildProcess
Как правило, стандартный процесс сборки Arduino:
Объедините файлы.ino в основной файл эскиза. Преобразование основного файла скетча: добавить оператор #include; создавать объявления функций (прототипы) всех функций в основном файле скетча; добавить содержимое файла main.cxx цели к основному файлу скетча. Скомпилируйте код в объектные файлы. Свяжите объектные файлы, чтобы получить файл.hex, готовый для загрузки в Arduino.
Между стандартным процессом сборки Arduino и процессом сборки с использованием Arduino-Makefile есть небольшие различия:
Поддерживается только один файл.ino. Объявления функций не создаются автоматически в файле.ino. Пользователь должен позаботиться о создании правильных объявлений функций.
В основе процесса сборки лежит Makefile. Не волнуйтесь, все подготовлено для вас, это немного сложнее при компиляции таким образом для нестандартных плат, таких как серия SparkFun.
BOARD_TAG = promicro
ALTERNATE_CORE = SparkFun BOARD_SUB = 16MHzatmega32U4 ARDUINO_PORT = / dev / ttyACM0 USER_LIB_PATH = / home / silver / sketchbook / libraries ARDUINO_DIR = /opt/arduino-1.8.9, включая /home/silver/sketch-book/Active
И все, что вам нужно ввести, это: make upload (который сначала создаст файлы.hex, а затем использует avrdude для их загрузки), в итоге получится что-то вроде:
mkdir -p build-promicro-16MHzatmega32U4
make reset make [1]: вход в каталог '/ home / silver / sketchbook' / home / silver / sketchbook / Arduino-Makefile / bin / ard-reset-arduino --caterina / dev / ttyACM0 make [1]: выход из каталога ' / home / silver / sketchbook 'make do_upload make [1]: вход в каталог' / home / silver / sketchbook '/opt/arduino-1.8.9/hardware/tools/avr/bin/avrdude -q -V -p atmega32u4 - C /opt/arduino-1.8.9/hardware/tools/avr/etc/avrdude.conf -D -c avr109 -b 57600 -P / dev / ttyACM0 / -U flash: w: build-promicro-16MHzatmega32U4 / sketchbook. hex: i Подключение к программатору:. Найден программист: Id = "CATERIN"; type = S Версия программного обеспечения = 1.0; Версия оборудования не указана. Программист поддерживает автоматическое увеличение адреса. Программист поддерживает доступ к буферизованной памяти с размером буфера = 128 байт. Программист поддерживает следующие устройства: Код устройства: 0x44 avrdude: устройство AVR инициализировано и готово принимать инструкции avrdude: сигнатура устройства = 0x1e9587 (возможно, m32u4) avrdude: чтение входного файла "build-promicro-16MHzatmega32U4 / sketchbook.hex" avrdude: запись флэш-памяти (11580 байт): avrdude: 11580 байт записано во флеш-память avrdude: safemode: Предохранители исправны (E: CB, H: D8, L: FF) avrdude done. Спасибо.
Что ж, спасибо, avrdude, и теперь наш Arduino сброшен и запрограммирован с новым кодом, который вы можете просто редактировать с помощью vi или вашего любимого редактора локально, никаких IDE не требуется. Я хотел бы отметить, что вы должны закрыть как управляющую программу C, так и экран или что-либо еще, имеющее доступ к arduino во время загрузки, иначе порт вернется как / dev / ttyACM1 после сброса.
Шаг 3: закрытие и список задач
Хотя я создал этот блок датчиков окружающей среды для серверных комнат, вы можете использовать его для химических / электронных лабораторий, складов, обычных помещений и всего остального. И да, поскольку он использует TCP / IP, это устройство IoT, G, я должен был добавить это в заголовок, чтобы сделать его более предприимчивым:)
Вы можете легко модифицировать как аппаратное, так и программное обеспечение, чтобы иметь возможность автоматически включать свет в комнате. Взгляните на мой другой проект: Shadow of Phoenix, как это работает для управления освещением, у вас есть все оборудование под рукой, чтобы делать то же самое (он использует таймеры удержания, чтобы свет оставался включенным, пока было обнаружено движение внутри период времени, если снова есть движение, таймер будет увеличен).
Возможности OrangePI с полным стеком Armbian безграничны, вы можете создать локальный веб-интерфейс, написанный с нуля на php, для отображения исторических данных на графиках. Разве это уже не лучше, если у вас есть устройство с полностью открытым исходным кодом, контролирующее вашу серверную комнату, что вы можете гордиться строительством, если вы так думаете, создайте его сами!
Рекомендуемые:
Mood Speaker - мощный динамик для воспроизведения музыки с настроением в зависимости от температуры окружающей среды: 9 шагов
Mood Speaker - мощный динамик для воспроизведения музыки настроения в зависимости от температуры окружающей среды: Привет! Для моего школьного проекта в MCT Howest Kortrijk я сделал динамик Mood Speaker, это умный динамик Bluetooth с различными датчиками, ЖК-дисплеем и WS2812b светодиодная лента в комплекте. Динамик воспроизводит фоновую музыку в зависимости от температуры, но может
Светодиодная лампа Lotus (Устойчивое развитие окружающей среды): 4 шага
Светодиодная лампа Lotus (Sustainability Natural Environment): Аннотация: Лампа с формой, похожей на хорошо известный цветок лотоса. Идея лампы заключается в том, что ее можно использовать в различных конфигурациях в зависимости от предпочтений конечных пользователей, поскольку она будет светиться, когда (Lotus flo
Новый слой беспроводного датчика IOT для системы мониторинга окружающей среды дома: 5 шагов (с изображениями)
Новый уровень беспроводного датчика IOT для системы мониторинга окружающей среды дома: в этом руководстве описывается недорогой уровень беспроводного датчика IOT с питанием от батареи для моего предыдущего руководства: система мониторинга домашней среды LoRa IOT. Если вы еще не просматривали это руководство ранее, я рекомендую прочитать введение
Крепление системы датчиков окружающей среды для БПЛА: 18 ступеней
Присоединение системы датчиков окружающей среды для БПЛА: цель данного руководства - описать, как построить, прикрепить и использовать систему датчиков окружающей среды Integrated Solutions Technology в сочетании с дроном DJI Phantom 4. Эти датчики используют дрон для трансляции
1-е Учебное пособие по Blender - Окклюзии окружающей среды: 4 шага
1-й учебник по Blender - Окклюзии окружающего света: (ЭЙ! Это моя самая первая инструкция, поэтому, пожалуйста, дайте мне хорошие отзывы и некоторые вещи, которые я могу улучшить.) В этом уроке вы узнаете, как изменить свое освещение с обычного освещения (с помощью лампы ) до амбиентных окклюзий (без а-ля