Анализатор качества воздуха с определением частиц PM2.5, PM10 и CO на ESP32


В настоящее время в связи с текущим ухудшением экологической обстановки во всем мире повышается актуальность использования различных анализаторов качества воздуха. В связи с этим в данной статье мы рассмотрим создание анализатора качества воздуха с определением частиц PM2.5, PM10 и CO на основе модуля ESP32 и датчиков Nova PM SDS011, MQ-7 и DHT11. Вывод измеряемых значений мы будем производить на экран OLED дисплея.

Внешний вид проекта анализатора качества воздуха с определением частиц PM2.5, PM10 и CO на ESP32

В современном мире основными загрязнителями воздуха, влияющим на здоровье человека, являются ультрадисперсные взвешенные частицы PM2.5 и PM10, а также окись углерода (CO). На основе этих трех показателей мы и будем определять индекс качества воздуха. Все измеряемые значения мы будем передавать на онлайн сервис Adafruit IO, что позволит иметь доступ к ним из любой точки земного шара где есть подключение к сети интернет.

Ранее на нашем сайте мы рассматривали подобный анализатор качества воздуха с определением частиц PM2.5 и PM10 на основе платы Arduino. Также на нашем сайте вы можете посмотреть и другие проекты анализаторов качества воздуха:

Необходимые компоненты

  1. Модуль ESP32 (купить на AliExpress).
  2. Nova PM Sensor SDS011 (датчик SDS011 от компании Nova) (купить на AliExpress).
  3. 0.96’ SPI OLED Display Module – модуль OLED дисплея с диагональю 0.96’ и поддержкой интерфейса SPI (купить на AliExpress - если будете покупать по приведенной ссылке, то выбирайте модель OLED дисплея с 7 контактами).
  4. Датчик температуры и влажности DHT11 (купить на AliExpress).
  5. Датчик газа MQ-7.
  6. Соединительные провода.

Nova PM Sensor SDS011

Внешний вид датчика Nova PM Sensor SDS011

Датчик SDS011 – недавно появившийся на рынке анализатор качества воздуха, разработанный компанией Nova Fitness. Принцип его работы основан на активной лазерной спектроскопии (анализ рассеяния луча лазера). Данный датчик способен обнаруживать в воздухе частицы с размерами от 0.3 до 10μm (микрометров). Датчик состоит из небольшого вентилятора, клапана впуска воздуха, лазерного диода и фотодиода. Воздух в датчик поступает через клапан впуска (air inlet). Внутри датчика работает лазерный диод, который освещает поступивший внутрь датчика воздух и частицы, содержащиеся в нем. Получившийся рассеянный свет преобразуется в электрический сигнал с помощью фотодетектора. Этот сигнал затем усиливается и обрабатывается. В результате обработки вычисляется концентрация частиц PM2.5 и PM10.

Внутрення структура датчика Nova PM Sensor SDS011

Технические характеристик датчика SDS011:

  • обнаружение частиц: PM2.5, PM10;
  • диапазон измерений: 0.0-999.9μg/m3;
  • входное напряжение: от 4.7V до 5.3V;
  • максимальный ток: 100mA;
  • ток покоя (в "спящем" состоянии): 2mA;
  • время отклика: 1 секунда;
  • разрешающая способность при обнаружении частиц: ≤ 0.3μm;
  • относительная ошибка: 10% ;
  • диапазон рабочих температур: -20~50°C.

Модуль OLED дисплея (0.96’ OLED Display Module)

OLED (Organic Light-Emitting Diodes, органический светоизлучающий диод) – это светоизлучающая технология, которая применяется в большинстве современных телевизоров. В OLED дисплеях используется тот же принцип формирования изображения, что и в современных телевизорах, только количество пикселей в них значительно меньше.

Внешний вид модуля OLED дисплея с поддержкой интерфейса SPI

Для нашего проекта мы использовали монохромный 7-ми контактный OLED дисплей SSD1306 с диагональю 0.96”. Он может использовать 3 различных коммуникационных протокола: 3-х проводный SPI, 4-х проводный SPI и I2C.

Назначение его контактов (распиновка) приведены в следующей таблице.

Номер контакта Название контакта Альтернативное название контакта Назначение контакта
1 Gnd Ground земля
2 Vdd Vcc, 5V напряжение питания (в диапазоне 3-5 В)
3 SCK D0, SCL, CLK используется как контакт часов (clock pin). Применяется в интерфейсах I2C и SPI
4 SDA D1, MOSI контакт данных. Применяется в интерфейсах I2C и SPI
5 RES RST, RESET контакт сброса модуля. Применяется в интерфейсе SPI
6 DC A0 контакт команд (Data Command pin). Применяется в интерфейсе SPI
7 CS Chip Select (выбор чипа) используется когда несколько устройств взаимодействуют по интерфейсу SPI

Все проекты с использованием данного дисплея на нашем сайте вы можете посмотреть по следующей ссылке.

Технические характеристики OLED дисплея SSD1306:

  • драйвер микросхемы OLED: SSD1306;
  • разрешение: 128 x 64;
  • угол зрения: >160°;
  • входное напряжение: 3.3V ~ 6V;
  • цвет пикселов: синий;
  • диапазон рабочих температур: -30°C ~ 70°C.

Подготовка датчика MQ-7 для измерения окиси углерода (CO)

Датчик MQ-7 (CO Carbon Monoxide Gas Sensor Module) способен определять концентрацию окиси углерода/угарного газа (CO) в окружающем воздухе. Он способен измерять концентрации данного газа от 10 до 10,000 ppm (part(s) per million – число частиц на миллион). MQ-7 можно купить либо в виде модуле, либо в виде отдельного датчика. Ранее на нашем сайте мы уже рассматривали проекты с использованием различных датчиков газа, посмотреть их вы можете по этой ссылке. В этом проекте мы будем использовать датчик MQ-7 для измерения концентрации окиси углерода в PPM. Принципиальная схема датчика MQ-7 представлена на следующем рисунке.

Принципиальная схема датчика MQ-7

Важную роль в работе данного датчика играет нагрузочный резистор RL. Его сопротивление изменяется в зависимости от концентрации газа. По умолчанию датчик MQ-7 поставляется с резистором RL сопротивлением 1 кОм, которое практически бесполезно в нашем проекте, поэтому нам необходимо заменить его на резистор сопротивлением 10 кОм.

Резистор, который необходимо заменить в датчике MQ-7

Индекс качества воздуха (ИКВ)

Индекс качества воздуха (ИКВ) в различных странах рассчитывается исходя из средней концентрации определенных загрязнителей, измеряемых в течение стандартного интервала времени (24 часа для большинства загрязнителей, 8 часов для окиси углерода и озона). Для частиц PM2.5 и PM10 также используется 24-часовой интервал измерения. Суммарный индекс качества воздуха включает 8 загрязнителей: PM10, PM2.5, двуокись азота (NO2), диоксид серы/сернистый газ (SO2), окись углерода (CO), озон в околоземном пространстве (O3), аммиак (NH3) и свинец (Pb). Но не в каждой локации измеряются все эти 8 загрязнителей.

Поэтому часто вместо полного индекса качества воздуха измеряется субиндекс, который представляет собой линейную функцию концентрации частиц PM2.5 и PM10, например, субиндекс для частиц PM2.5 при их концентрации 31 µg/m3 будет равен 51, при их концентрации 60 µg/m3 он будет равен 100, а при концентрации 45 µg/m3 – 75. Самый худший субиндекс (по максимуму всех параметров) будет определять суммарный индекс качества воздуха.

Схема проекта

Схема анализатора качества воздуха с определением частиц PM2.5, PM10 и CO на основе модуля ESP32 представлена на следующем рисунке.

Схема анализатора качества воздуха с определением частиц PM2.5, PM10 и CO на основе модуля ESP32Датчики SDS011, DHT11 и MQ-7 запитываются от +5V, а OLED дисплей – от 3.3V. Передающий и приемный контакты датчика SDS011 подключены к контактам GPIO16 & 17 модуля ESP32. Аналоговый контакт датчика MQ-7 подключен к контакту GPIO 25 модуля, а контакт данных датчика DHT11 – к контакту GPIO27 модуля. OLED дисплей подключен к модулю ESP32 по интерфейсу SPI. Полная схема соединений проекта приведена в следующей таблице.

№ п/п OLED дисплей Модуль ESP32
1 GND Ground
2 VCC 5V
3 D0 18
4 D1 23
5 RES 2
6 DC 4
7 CS 5
№ п/п Датчик SDS011 Модуль ESP32
1 5V 5V
2 GND GND
3 RX 17
4 TX 16
№ п/п Датчик DHT11 Модуль ESP32
1 Vcc 5V
2 GND GND
3 Data 27
№ п/п Датчик MQ-7 Модуль ESP32
1 Vcc 5V
2 GND GND
3 A0 25

Корпус нашего проекта мы напечатаем на 3D принтере, поэтому схему нашего проекта мы спаяли на перфорированной плате. Учтите, что соединительные провода должны иметь достаточную длину для подключения датчиков и OLED дисплее. Внешний вид собранной на перфорированной плате конструкции проекта приведен на следующем рисунке.

Внешний вид собранной на перфорированной плате конструкции проекта

Настройка сервиса Adafruit IO

Adafruit IO – это открытая облачная платформа, которая позволяет агрегировать, визуализировать и анализировать данные реального времени. Используя Adafruit IO вы можете загружать, отображать и производить мониторинг данных через сеть интернет, что делает ее чрезвычайно удобной для применения в различных проекта интернета вещей (IoT).

Для использования Adafruit IO вам сначала необходимо зарегистрироваться в данной платформе. Для этого перейдите на веб-сайт Adafruit IO и нажмите на ‘Get started for Free’ в правом верхнем углу экрана.

Регистрация в сервисе Adafruit IO

После окончания регистрации зайдите в свой аккаунт и нажмите на ‘View AIO Key’ в правом верхнем углу экрана чтобы получить имя пользователя (username) и AIO key (ключ).

Иконка для получения имени пользователя и AIO ключа

Когда вы нажмете на ‘AIO Key’, откроется всплывающее окно с данными AIO Key и username. Скопируйте и сохраните этот ключ и имя пользователя, в дальнейшем они нам понадобятся при написании программы.

Отображение имени пользователя и AIO ключа

Теперь, после получения AIO ключа, создайте фид (feed) для хранения данных датчика DHT. Для создания фида нажмите на ‘Feed’. Затем нажмите на ‘Actions’ (действия), после этого выберите ‘Create a New Feed’ из доступных пунктов.

Начало создания нового фида в Adafruit IO

После этого откроется новое окно, в котором вам необходимо ввести имя (Name) и описание (Description) фида. Описание можно не указывать.

Ввод имени и описания нового фида в Adafruit IO

Затем нажмите на кнопку ‘Create’, после этого вы будете перенаправлены на новый созданный фид. Для данного проекта мы создадим 6 фидов – для PM10, PM2.5, CO, температуры, влажности и индекса качества воздуха (AQI).

Созданные фиды для нашего проекта в Adafruit IO

После создания фидов создадим панель инструментов (dashboard) Adafruit IO, на которой мы будем визуализировать данные от наших датчиков. Для этого создайте панель инструментов и добавьте на нее все наши фиды.

Для создания панели инструментов нажмите на Dashboard, затем на ‘Action’, и после этого на ‘Create a New Dashboard’ (создать новую панель инструментов).

В следующем открывшемся окне введите имя панели инструментов и нажмите на ‘Create’.

Создание новой панели инструментов в Adafruit IO

После того как панель инструментов будет создана, вы можете использовать блоки Adafruit IO типа Gauge и Slider для визуализации данных. Для добавления блоков нажмите на иконку ‘+’ в правом верхнем углу экрана.

Добавление новых блоков на панель инструментов в Adafruit IO

Далее выберите блок ‘Gauge’.

Выбор блоков Gauge в Adafruit IO

В следующем окне выберите данные фида, которые вы хотите визуализировать.

Выбор фида для визуализации в Adafruit IO

И, наконец, измените настройки блока в соответствии со своими предпочтениями.

Изменение настроек блока в Adafruit IO

Аналогичным образом добавьте блоки визуализации для остальных фидов. После этого панель инструментов Adafruit IO должна у вас выглядеть примерно следующим образом:

Внешний вид панели инструментов для нашего проекта в Adafruit IO

Объяснение программы для модуля ESP32

Полный код программы приведен в конце статьи, здесь же мы кратко рассмотрим его основные фрагменты.

В коде нашей программы будут использоваться библиотеки SDS011, Adafruit_GFX, Adafruit_SSD1306, Adafruit_MQTT и DHT.h. При этом библиотеки SDS011, Adafruit_GFX и Adafruit_SSD1306 можно скачать и установить с помощью менеджера библиотек (Library Manager) Arduino IDE. Для этого откройте Arduino IDE и выберите в ней пункт меню Sketch < Include Library < Manage Libraries. После этого выполните поиск библиотеки SDS011 и в открывшихся результатах поиска установите библиотеку от R. Zschiegner.

Выбор библиотеки для датчика SDS011

Аналогичным образом установите библиотеки Adafruit GFX и Adafruit SSD1306 от компании Adafruit. Библиотеки Adafruit_MQTT.h и DHT11.h можно скачать с репозитория Github.

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

Затем зададим ширину и высоту экрана OLED дисплея в пикселах.

Затем укажем контакты для связи по интерфейсу SPI с OLED дисплеем.

Далее создадим объект для работы с OLED дисплеем.

После этого укажем параметры доступа к сети WiFi (имя пользователя и пароль) и параметры для работы с платформой Adafruit IO, которые будут включать MQTT сервер, номер порта, имя пользователя и ключ AIO (AIO Key).

Затем укажем фиды Adafruit IO для хранения данных от датчиков. В нашем случае мы использовали 6 фидов с именами AirQuality, Temperature, Humidity, PM10, PM25 и CO.

После этого внутри функции void setup() инициализируем последовательную связь со скоростью 9600 бод для целей отладки. Также инициализируем OLED дисплей, датчики DHT и SDS011 с помощью функций begin().

Далее цикл for внутри функции setup используется для сбора значений с определенного номера и затем установки счетчика в 0.

После этого мы будем считывать данные с датчиков. Для этого внутри функции loop мы будем использовать функцию millis() чтобы считывать данные с датчиков каждый час. После считывания данных c аналогового выхода датчика MQ-7 мы получаем значения на выходе АЦП в диапазоне от 0 до 4095. Для преобразования этого значения в аналоговое значение напряжения используем формулу:

RvRo = MQ7Raw * (3.3 / 4095)

где MQ7Raw – значение с выхода АЦП аналогового контакта, к которому подключен датчик MQ-7.

Также считаем данные о концентрации частиц PM2.5 и PM10 с датчика SDS011.

Мы считываем значения PM2.5 и PM10 с датчика SDS011 в µg/m3, а значения окиси углерода (Carbon Monoxide) – в PPM (частиц на миллион). Нам их необходимо преобразовать в mg/m3, для этого используем формулу:

в которой молекулярная масса (Molecular Mass) CO равна 28.06 g/mol, а ее молярный объем (Molar Volume) равен 24.45L при 25 градусах Цельсия.

Расчет средних значений за 24 часа

В следующем фрагменте кода рассчитаем средние за 24 часа значения частиц PM10, PM2.5 и средние за 8 часов значения окиси углерода. В первой строке этого фрагмента кода из общей суммы значений вычтем первый элемент массива. Затем получим текущее значение и прибавим его к общему, и увеличим номер индекса. Если значение индекса равно или больше чем numReadings, сбросим значение индекса снова в 0.

И, наконец, опубликуем эти данные на платформе Adafruit IO.

Изготовление корпуса для нашего проекта

Далее мы измерили размеры всех компонентов нашего проекта и на основе их значений спроектировали модель корпуса, показанную на следующем рисунке.

Модель корпуса для нашего проекта анализатора воздуха

После этого мы экспортировали эту модель в STL и закачали его на сервис Thingiverse - вы ее можете скачать и использовать для изготовления корпуса проекта. Также этот STL файл мы использовали для печати данной модели корпуса на 3D принтере. После этого мы разместили в нее все компоненты нашего проекта. Внешний вид собранной в корпусе конструкции нашего проекта показан на следующем рисунке.

Внешний вид собранной в корпусе конструкции нашего проекта

Тестирование работы проекта

После того как аппаратная часть проекта будет готова можно приступить к тестированию его работы. Мы использовали адаптер 12V 1A для подачи питания на устройство. Как вы видите из представленного ниже рисунка, на экране OLED дисплея отображаются значения концентрации частиц PM10 и PM2.5 (в µg/m3), а также концентрация окиси углерода (в mg/m3).

Внешний вид работающего анализатора воздуха

Тестирование работы проекта

Эти же значения публикуются и в нашей панели инструментов Adafruit IO. Максимальное значение из всех этих трех параметров (PM10, PM2.5 & CO) и будет значением индекса качества воздуха (AQI).

Измеряемые нами значение в панели инструментов Adafruit IO

Также значения индекса качества воздуха (AQI) за последние 30 дней будут выводиться на графике.

График индекса качества воздуха в Adafruit IO

Более подробно работу проекта вы можете посмотреть на видео, приведенном в конце статьи.

Исходный код программы (скетча)

Видео, демонстрирующее работу проекта

Источник статьи

(Проголосуй первым!)
Загрузка...
138 просмотров

Добавить комментарий

Ваш адрес email не будет опубликован.