Оглавление:

Недорогой монитор качества воздуха для Интернета вещей на основе RaspberryPi 4:15 шагов (с изображениями)
Недорогой монитор качества воздуха для Интернета вещей на основе RaspberryPi 4:15 шагов (с изображениями)

Видео: Недорогой монитор качества воздуха для Интернета вещей на основе RaspberryPi 4:15 шагов (с изображениями)

Видео: Недорогой монитор качества воздуха для Интернета вещей на основе RaspberryPi 4:15 шагов (с изображениями)
Видео: Плата мониторинга окружающей среды Pimoroni Enviro+ HAT для Raspberry Pi. Железки Амперки 2024, Июль
Anonim
Недорогой монитор качества воздуха для Интернета вещей на основе RaspberryPi 4
Недорогой монитор качества воздуха для Интернета вещей на основе RaspberryPi 4
Недорогой монитор качества воздуха для Интернета вещей на основе RaspberryPi 4
Недорогой монитор качества воздуха для Интернета вещей на основе RaspberryPi 4
Недорогой монитор качества воздуха для Интернета вещей на основе RaspberryPi 4
Недорогой монитор качества воздуха для Интернета вещей на основе RaspberryPi 4
Недорогой монитор качества воздуха для Интернета вещей на основе RaspberryPi 4
Недорогой монитор качества воздуха для Интернета вещей на основе RaspberryPi 4

Сантьяго, Чили, во время зимней чрезвычайной экологической ситуации могут жить в одной из самых красивых стран мира, но, к сожалению, это не все розы. Зимой Чили сильно страдает от загрязнения воздуха, в основном из-за твердых частиц, таких как пыль и смог.

Из-за холодной погоды на юге загрязнение воздуха происходит в основном из-за древесных калефакторов, а в Сантьяго (столица в центре страны) смешанные с промышленностью, автомобилями и уникальным географическим положением между двумя огромными горными цепями.

В настоящее время загрязнение воздуха является большой проблемой во всем мире, и в этой статье мы рассмотрим, как разработать недорогой самодельный монитор качества воздуха на основе Raspberry Pi. Если вам интересно узнать больше о качестве воздуха, посетите проект «Мировой индекс качества воздуха».

Запасы

  • Raspberry Pi 4
  • 1SDS011 - Высокоточный лазерный датчик качества воздуха pm2.5
  • Пластиковая коробка

Шаг 1. Твердые частицы (PM): что это такое? Как он попадает в воздух?

Твердые частицы (PM): что это такое? Как он попадает в воздух?
Твердые частицы (PM): что это такое? Как он попадает в воздух?

Итак, чтобы понять загрязнение или загрязнение воздуха, мы должны изучить частицы, которые связаны с тем, что также известно как твердые частицы. Глядя на графики в предыдущем разделе, мы можем заметить, что они упомянули PM2,5 и PM10. Давайте кратко рассмотрим это.

ТЧ означает твердые частицы (также называемые загрязнением частицами): термин, обозначающий смесь твердых частиц и жидких капель, находящихся в воздухе. Некоторые частицы, такие как пыль, грязь, сажа или дым, достаточно большие или темные, чтобы их можно было увидеть невооруженным глазом. Другие настолько малы, что их можно обнаружить только с помощью электронного микроскопа. Частицы бывают самых разных размеров. Частицы диаметром менее 10 микрометров настолько малы, что могут попасть в легкие, что может вызвать серьезные проблемы со здоровьем. Десять микрометров меньше ширины человеческого волоса.

Загрязнение твердыми частицами включает крупные частицы пыли (PM10): вдыхаемые частицы, диаметр которых обычно составляет 10 микрометров и меньше. Источники включают операции дробления или измельчения, а также пыль, поднимаемую транспортными средствами на дорогах. Мелкие частицы (PM2,5): мелкие частицы, пригодные для вдыхания, обычно имеют диаметр 2,5 микрометра и меньше. Мелкие частицы образуются при сжигании всех типов, включая автомобили, электростанции, сжигание древесины в жилых домах, лесные пожары, сельскохозяйственное сжигание и некоторые промышленные процессы. Подробнее о твердых частицах можно узнать на сайте EPA: Агентство по охране окружающей среды США.

Шаг 2. Почему важно заботиться о твердых частицах?

Почему так важно заботиться о твердых частицах?
Почему так важно заботиться о твердых частицах?

Как описал Джерардо АЛЬВАРАДО З. в своей работе в Чилийском университете, исследования эпизодов высокого загрязнения воздуха в долине Маас (Бельгия) в 1930 году, Донора (Пенсильвания) в 1948 году и Лондоне в 1952 году были первыми задокументированными источниками, связанными со смертностью. с загрязнением частицами (Préndez, 1993). Достижения в исследовании воздействия загрязнения воздуха на здоровье людей показали, что риски для здоровья вызываются вдыхаемыми частицами в зависимости от их проникновения и осаждения в различных частях дыхательной системы, а также биологической реакции на осажденные материалы.

Самые толстые частицы, около 5 мкм, фильтруются совместным действием ресничек носового прохода и слизистой оболочки, покрывающей носовую полость и трахею. Частицы диаметром от 0,5 до 5 мкм могут откладываться в бронхах и даже в легочных альвеолах, однако через несколько часов они удаляются ресничками бронхов и бронхиол. Частицы размером менее 0,5 мкм могут проникать глубоко, пока не осядут в легочных альвеолах, оставаясь от недель до лет, поскольку отсутствует механизм мукоцилиарного транспорта, облегчающий удаление. На следующем рисунке показано проникновение частиц в дыхательную систему в зависимости от их размера.

Таким образом, очень важно обнаружить оба типа частиц (PM2,5 и PM10), и хорошая новость заключается в том, что оба типа могут быть прочитаны простым и недорогим датчиком SDS011.

Шаг 3: Датчик частиц - SDS011

Датчик частиц - SDS011
Датчик частиц - SDS011
Датчик частиц - SDS011
Датчик частиц - SDS011

Мониторинг качества воздуха - это хорошо известная и устоявшаяся наука, которая началась еще в 80-х годах. В то время технология была довольно ограниченной, а решение, используемое для количественной оценки загрязнения воздуха, было громоздким и очень дорогим.

К счастью, в настоящее время, благодаря новейшим и современным технологиям, решения, используемые для мониторинга качества воздуха, становятся не только более точными, но и более быстрыми в измерениях. Устройства становятся меньше и стоят намного доступнее, чем когда-либо прежде.

В этой статье мы сосредоточимся на датчике частиц, который может определять количество пыли в воздухе. В то время как первое поколение было способно только определять степень непрозрачности, самые последние датчики, такие как SDS011 от INOVAFIT, дочернего предприятия Университета Цзинань (в Шаньдуне), теперь могут обнаруживать PM2,5 и PM10.

При своих размерах SDS011, вероятно, является одним из лучших датчиков с точки зрения точности и цены (менее 40 долларов США).

  • Измеренные значения: PM2,5, PM10
  • Диапазон: 0–999,9 мкг / м³.
  • Напряжение питания: 5 В (4,7–5,3 В)
  • Потребляемая мощность (работа): 70 мА ± 10 мА
  • Потребляемая мощность (лазер и вентилятор в спящем режиме): <4 мА
  • Температура хранения: от -20 до + 60С
  • Температура работы: от -10 до + 50С
  • Влажность (хранение): Макс. 90%
  • Влажность (работа): Макс. 70% (конденсация водяного пара искажает показания)
  • Точность: 70% для 0,3 мкм и 98% для 0,5 мкм
  • Размер: 71x70x23 мм
  • Сертификация: CE, FCC, RoHS

В SD011 печатная плата используется как одна сторона корпуса, что позволяет снизить его стоимость. Приемный диод устанавливается на стороне печатной платы (это обязательно, поскольку следует избегать любых шумов между диодом и МШУ). Излучатель лазера закреплен на пластиковом корпусе и подключен к печатной плате гибким проводом.

Одним словом, Nova Fitness SDS011 - это профессиональный лазерный датчик пыли. Вентилятор, установленный на датчике, автоматически всасывает воздух. Датчик использует принцип рассеяния лазерного света * для измерения количества взвешенных в воздухе частиц пыли. Датчик обеспечивает высокую точность и надежность показаний значений PM2,5 и PM10. Любые изменения в окружающей среде можно наблюдать практически мгновенно, при коротком времени отклика менее 10 секунд. Датчик в стандартном режиме сообщает показания с интервалом в 1 секунду.

* Принцип лазерного рассеяния: светорассеяние может быть вызвано, когда частицы проходят через зону обнаружения. Рассеянный свет преобразуется в электрические сигналы, которые будут усиливаться и обрабатываться. Число и диаметр частиц можно получить путем анализа, поскольку форма сигнала имеет определенные отношения с диаметром частиц.

Шаг 4. Но как SDS011 может улавливать эти частицы?

Но как SDS011 может улавливать эти частицы?
Но как SDS011 может улавливать эти частицы?
Но как SDS011 может улавливать эти частицы?
Но как SDS011 может улавливать эти частицы?

Как отмечалось ранее, принцип, используемый SDS011, - это рассеяние света или, лучше, динамическое рассеяние света (DLS), которое представляет собой метод в физике, который можно использовать для определения профиля распределения по размерам мелких частиц в суспензии или полимеров в растворе. В рамках DLS временные флуктуации обычно анализируются с помощью функции автокорреляции интенсивности или фотонной автокорреляции (также известной как фотонная корреляционная спектроскопия или квазиупругое рассеяние света). При анализе во временной области автокорреляционная функция (ACF) обычно затухает, начиная с нулевого времени задержки, а более быстрая динамика из-за более мелких частиц приводит к более быстрой декорреляции рассеянного следа интенсивности. Было показано, что ACF интенсивности является преобразованием Фурье спектра мощности, и поэтому измерения DLS могут быть одинаково хорошо выполнены в спектральной области.

Выше гипотетическое динамическое рассеяние света двух образцов: более крупные частицы (например, PM10) вверху и более мелкие частицы (например, PM2,5) внизу. А заглянув внутрь нашего сенсора, мы можем увидеть, как реализуется принцип светорассеяния.

Электрический сигнал, зафиксированный на диоде, поступает на малошумящий усилитель, а оттуда преобразуется в цифровой сигнал через АЦП и наружу через UART.

Чтобы узнать больше о SDS011 на основе реального научного опыта, ознакомьтесь с работой Константиноса и др. За 2018 год «Разработка и полевые испытания недорогой портативной системы для мониторинга концентраций PM2,5».

Шаг 5: время показа

Время для шоу!
Время для шоу!
Время для шоу!
Время для шоу!

Давайте сделаем перерыв во всей этой теории и сосредоточимся на том, как измерять твердые частицы с помощью Raspberry Pi и датчика SDS011.

Подключение HW на самом деле очень простое. Датчик продается с USB-адаптером для подключения выходных данных от его 7-контактного UART к одному из стандартных USB-разъемов RPi.

Распиновка SDS011:

  • Контакт 1 - не подключен
  • Контакт 2 - PM2,5: 0–999 мкг / м³; Выход ШИМ
  • Вывод 3–5В
  • Пин 4 - PM10: 0–999 мкг / м³; Выход ШИМ
  • Контакт 5 - GND
  • Контакт 6 - RX UART (TTL) 3,3 В
  • Контакт 7 - TX UART (TTL) 3,3 В

Для этого урока я впервые использую совершенно новый Raspberry-Pi 4. Но, конечно, любая предыдущая модель также будет работать нормально.

Как только вы подключите датчик к одному из USB-портов RPi, вы автоматически начнете слушать звук его вентилятора. Шум немного раздражает, поэтому, возможно, вам следует отключить его и подождать, пока вы не настроите все с помощью SW.

Связь между датчиком и RPi будет через последовательный протокол. Подробности об этом протоколе можно найти здесь: Протокол управления датчиком лазерной пыли V1.3. Но для этого проекта лучше всего использовать интерфейс python, чтобы упростить разрабатываемый код. Вы можете создать свой собственный интерфейс или использовать те, что доступны в Интернете, например, Франка Хойера или Ивана Калчева. Мы будем использовать последний, который очень прост и отлично работает (вы можете скачать скрипт sds011.py с его GitHub или у меня).

Файл sds011.py должен находиться в том же каталоге, где вы создаете свой скрипт.

На этапе разработки я буду использовать Jupyter Notebook, но вы можете использовать любую IDE, которая вам нравится (например, Thonny или Geany, которые являются частью пакета Raspberry Pi Debian, оба очень хороши).

Начните импортировать sds011 и создать свой экземпляр датчика. SDS011 предоставляет метод чтения с датчика с помощью UART.

из sds011 импорт *

датчик = SDS011 ("/ dev / ttyUSB0")

Вы можете включить или выключить датчик с помощью команды sleep:

pmt_2_5, pmt_10 = sensor.query ()

Подождите не менее 10 секунд для стабилизации перед измерениями и не менее 2 секунд, чтобы начать новое (см. Код выше).

И это все, что вам нужно знать о программном обеспечении для использования датчика. Но давайте поговорим о контроле качества воздуха подробнее! В начале этой статьи, если вы изучали сайты, которые дают информацию о том, насколько хорош или плох воздух, вы должны понимать, что цвета связаны с этими значениями. Каждый цвет - это индекс. Самым известным из них является AQI (индекс качества воздуха), используемый в США и некоторых других странах.

Шаг 6: Индекс качества воздуха - AQI

Индекс качества воздуха - AQI
Индекс качества воздуха - AQI
Индекс качества воздуха - AQI
Индекс качества воздуха - AQI
Индекс качества воздуха - AQI
Индекс качества воздуха - AQI

AQI - это индекс для ежедневного отчета о качестве воздуха. Он сообщает вам, насколько чист или загрязнен ваш воздух и какие связанные с этим последствия для здоровья могут вас беспокоить. AQI фокусируется на последствиях для здоровья, которые вы можете испытать в течение нескольких часов или дней после вдыхания загрязненного воздуха.

EPA (Агентство по охране окружающей среды США), например, рассчитывает AQI не только для загрязнения частицами (PM2,5 и PM10), но и для других основных загрязнителей воздуха, регулируемых Законом о чистом воздухе: приземный озон, оксид углерода., диоксид серы и диоксид азота. Для каждого из этих загрязнителей EPA установило национальные стандарты качества воздуха в целях защиты здоровья населения. См. Изображение выше со значениями AQI, цветами и сообщением о состоянии здоровья.

Как отмечалось ранее, эти значения и цвета AQI относятся к каждому из загрязнителей, но как связать с ними значения, генерируемые датчиками? Дополнительная таблица соединяет их все, как показано выше.

Но пользоваться такой таблицей, конечно, нет смысла. В конце концов, это простой математический алгоритм, который производит вычисления. Для этого мы импортируем библиотеку для преобразования между значением AQI и концентрацией загрязнителя (мкг / м³): python-aqi.

Установите библиотеку с помощью PIP и сделайте тест (см. Код выше)

pip установить python-aqi

А как насчет Чили?

В Чили используется аналогичный индекс - ICAP: индекс качества воздуха для воздухопроницаемых частиц. Верховный декрет 59 от 16 марта 1998 года генерального секретаря министерства при президенте республики устанавливает в своей статье 1, буква g), что уровни, которые определяют ICA для воздухопроницаемых твердых частиц (ICAP).

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

Шаг 7. Локальная запись данных

Локальная запись данных
Локальная запись данных
Локальная запись данных
Локальная запись данных
Локальная запись данных
Локальная запись данных

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

Давайте создадим функцию для захвата этих значений. Мы последовательно захватим 3 значения, выбрав среднее из них:

def get_data (n = 3):

sensor.sleep (sleep = False) pmt_2_5 = 0 pmt_10 = 0 time.sleep (10) для i в диапазоне (n): x = sensor.query () pmt_2_5 = pmt_2_5 + x [0] pmt_10 = pmt_10 + x [1] time.sleep (2) pmt_2_5 = round (pmt_2_5 / n, 1) pmt_10 = round (pmt_10 / n, 1) sensor.sleep (sleep = True) time.sleep (2) return pmt_2_5, pmt_10 Выше вы можете увидеть результат теста. Давайте также сделаем функцию для преобразования числовых значений PM в индекс AQI.

def conv_aqi (pmt_2_5, pmt_10):

aqi_2_5 = aqi.to_iaqi (aqi. POLLUTANT_PM25, str (pmt_2_5)) aqi_10 = aqi.to_iaqi (aqi. POLLUTANT_PM10, str (pmt_10)) return aqi_2_5, aqi_10 над результатом теста с обеими функциями. Но что с ними делать? Самый простой ответ - создать функцию для сохранения захваченных данных, сохраняя их в локальном файле.

def save_log ():

с open ("ВАШ ПУТЬ ЗДЕСЬ / air_quality.csv", "a") как журнал: dt = datetime.now () log.write ("{}, {}, {}, {}, {} n". формат (dt, pmt_2_5, aqi_2_5, pmt_10, aqi_10)) log.close () С помощью одного цикла вы можете регулярно регистрировать данные в локальном файле, например, каждую минуту.

в то время как (Истина):

pmt_2_5, pmt_10 = get_data () aqi_2_5, aqi_10 = conv_aqi (pmt_2_5, pmt_10) try: save_log () except: print ("[INFO] Failure in logging data") time.sleep (60) Каждые 60 секунд метка времени и данные будут «добавляться» к этому файлу, как мы видим выше.

Шаг 8: отправка данных в облачную службу

Отправка данных в облачный сервис
Отправка данных в облачный сервис

На этом этапе мы узнали, как собирать данные с датчика, сохраняя их в локальном CSV-файле. Теперь пора посмотреть, как отправить эти данные на платформу IoT. В этом руководстве мы будем использовать ThingSpeak.com.

«ThingSpeak - это приложение Интернета вещей (IoT) с открытым исходным кодом для хранения и извлечения данных с вещей с использованием REST и MQTT API. ThingSpeak позволяет создавать приложения для регистрации датчиков, приложения для отслеживания местоположения и социальные сети с обновлениями статуса ».

Во-первых, у вас должна быть учетная запись на ThinkSpeak.com. Затем следуйте инструкциям по созданию канала с учетом его идентификатора канала и ключа API записи.

При создании канала вы также должны определить, какая информация будет загружена в каждое из 8 полей, как показано выше (в нашем случае будут использоваться только 4 из них).

Шаг 9: Протокол MQTT и соединение ThingSpeak

Протокол MQTT и соединение ThingSpeak
Протокол MQTT и соединение ThingSpeak

MQTT - это архитектура публикации / подписки, которая была разработана в первую очередь для подключения устройств с ограниченной пропускной способностью и мощностью по беспроводным сетям. Это простой и легкий протокол, который работает через сокеты TCP / IP или WebSockets. MQTT через WebSockets можно защитить с помощью SSL. Архитектура публикации / подписки позволяет отправлять сообщения на клиентские устройства без необходимости постоянного опроса устройства на сервере.

Брокер MQTT является центральной точкой связи и отвечает за отправку всех сообщений между отправителями и законными получателями. Клиент - это любое устройство, которое подключается к брокеру и может публиковать или подписываться на темы для доступа к информации. Тема содержит информацию о маршрутизации для брокера. Каждый клиент, который хочет отправлять сообщения, публикует их в определенной теме, и каждый клиент, который хочет получать сообщения, подписывается на определенную тему. Брокер доставляет все сообщения с соответствующей темой соответствующим клиентам.

ThingSpeak ™ имеет брокера MQTT по URL-адресу mqtt.thingspeak.com и порту 1883. Брокер ThingSpeak поддерживает как публикацию MQTT, так и подписку MQTT.

В нашем случае мы будем использовать MQTT Publish.

Шаг 10: публикация MQTT

MQTT Публикация
MQTT Публикация

Для начала давайте установим клиентскую библиотеку Eclipse Paho MQTT Python, которая реализует версии 3.1 и 3.1.1 протокола MQTT.

sudo pip установить paho-mqtt

Затем давайте импортируем библиотеку paho:

импортировать paho.mqtt.publish as publish

и инициируйте канал Thingspeak и протокол MQTT. Этот способ подключения самый простой и требует меньше всего системных ресурсов:

channelID = "ИДЕНТИФИКАТОР ВАШЕГО КАНАЛА"

apiKey = "ВАШ КЛЮЧ ЗАПИСИ" topic = "channels /" + channelID + "/ publish /" + apiKey mqttHost = "mqtt.thingspeak.com" Теперь мы должны определить нашу «полезную нагрузку».

tPayload = "field1 =" + str (pmt_2_5) + "& field2 =" + str (aqi_2_5) + "& field3 =" + str (pmt_10) + "& field4 =" + str (aqi_10)

Вот и все! мы готовы начать отправку данных в облако! Давайте перепишем предыдущую функцию цикла, чтобы включить в нее часть ThingSpeak.

# Отправка всех данных в ThingSpeak каждые 1 минуту

while (True): pmt_2_5, pmt_10 = get_data () aqi_2_5, aqi_10 = conv_aqi (pmt_2_5, pmt_10) tPayload = "field1 =" + str (pmt_2_5) + "& field2 =" + str (aqi_2_5) + "& field3 =" (pmt_10) + "& field4 =" + str (aqi_10) try: publish.single (topic, payload = tPayload, hostname = mqttHost, port = tPort, tls = tTLS, transport = tTransport) save_log () except: print ("[ИНФОРМАЦИЯ] Ошибка при отправке данных ») time.sleep (60) Если все в порядке, данные также должны отображаться на вашем канале на сайте thingspeak.com, как показано выше.

Шаг 11: последний сценарий

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

Например, «ts_air_quality_logger.py», который вы должны запустить с помощью команды:

Python 3 ts_air_quality_logger.py

Этот сценарий, а также Jupyter Notebook и sds011.py можно найти в моем репозитории по адресу RPi_Air_Quality_Sensor.

Обратите внимание, что этот сценарий применим только для тестирования. Лучше всего не использовать задержки внутри последнего цикла (которые помещают код в «паузу»), а использовать таймеры. Или для реального приложения лучше всего не использовать цикл, если Linux запрограммирован на регулярное выполнение сценария с помощью crontab.

Шаг 12: вынимаем монитор на улицу

Вынос монитора на улицу
Вынос монитора на улицу
Вынос монитора на улицу
Вынос монитора на улицу
Вынос монитора на улицу
Вынос монитора на улицу
Вынос монитора на улицу
Вынос монитора на улицу

Как только мой монитор качества воздуха Raspberry Pi заработал, я собрал RPi в пластиковой коробке, оставив датчик снаружи, и поместил его снаружи дома.

Было сделано два опыта.

Шаг 13: Сгорание бензинового двигателя

Сжигание бензинового двигателя
Сжигание бензинового двигателя
Сжигание бензинового двигателя
Сжигание бензинового двигателя

Датчик был размещен на расстоянии около 1 метра от газовой оболочки Lambretta, и его двигатель включился. Мотор поработал пару минут и выключился. Из приведенного выше файла журнала результат, который я получил. Интересно подтвердить, что PM2,5 были наиболее опасными частицами, выбрасываемыми из двигателя.

Шаг 14: выжигание по дереву

Сжигание древесины
Сжигание древесины
Сжигание древесины
Сжигание древесины

Глядя на файл журнала, мы понимаем, что данные датчика были мгновенно "вне диапазона" и не были хорошо зафиксированы библиотекой преобразования AQI, поэтому я изменяю предыдущий код, чтобы обработать его:

def conv_aqi (pmt_2_5, pmt_10):

попробуйте: aqi_2_5 = aqi.to_iaqi (aqi. POLLUTANT_PM25, str (pmt_2_5)) aqi_10 = aqi.to_iaqi (aqi. POLLUTANT_PM10, str (pmt_10)) вернуть aqi_2_5, aqi_10, за исключением: return 600, 600, за исключением: return Такая ситуация может произойти в полевых условиях, и это нормально. Помните, что на самом деле вы должны использовать скользящую среднюю, чтобы действительно получить AQI (по крайней мере, ежечасно, но обычно ежедневно).

Шаг 15: Заключение

Заключение
Заключение

Как всегда, я надеюсь, что этот проект поможет другим найти свой путь в захватывающий мир электроники и науки о данных!

Для получения подробной информации и окончательного кода посетите мой депозитарий GitHub: RPi_Air_Quality_Sensor.

Салудо с юга мира!

Увидимся на моем следующем уроке!

Спасибо, Марсело

Рекомендуемые: