Загрязнение воздуха становится все более актуальной проблемой для современных городов – индекс качества воздуха в большинстве из них ухудшается с каждым годом. При этом согласно докладу организации Environmental Protection Agency (EPA) воздух внутри помещений может быть от 2 до 5 более токсичен чем наружный воздух. При этом в последнее время все больше внимания в этой тематике уделяется ультрадисперсным взвешенным частицам PM2.5 и PM10, оказывающим значительное негативное воздействие на здоровье человека. В интернете на эту тематику очень много публикаций – можете почитать если интересно.
Ранее на нашем сайте мы уже рассматривали анализатор качества воздуха на основе датчика MQ135 и платы Arduino, в этой же статье мы рассмотрим создание на основе платы Arduino Nano и датчика SDS011 более «продвинутого» анализатора качества воздуха. Датчик SDS011 способен определять концентрацию в воздухе частиц PM2.5 и PM10, поэтому иногда его называют датчиком обнаружения пыли. В нашем проекте концентрация данных частиц будет отображаться на экране OLED дисплея.
Необходимые компоненты
- Плата Arduino Nano (купить на AliExpress).
- Nova PM Sensor SDS011 (датчик SDS011 от компании Nova) (купить на AliExpress).
- 0.96’ SPI OLED Display Module – модуль OLED дисплея с диагональю 0.96’ и поддержкой интерфейса SPI (купить на AliExpress — если будете покупать по приведенной ссылке, то выбирайте модель OLED дисплея с 7 контактами).
- Соединительные провода.
Nova PM Sensor SDS011
Датчик SDS011 – недавно появившийся на рынке анализатор качества воздуха, разработанный компанией Nova Fitness. Принцип его работы основан на активной лазерной спектроскопии (анализ рассеяния луча лазера). Данный датчик способен обнаруживать в воздухе частицы с размерами от 0.3 до 10μm (микрометров). Датчик состоит из небольшого вентилятора, клапана впуска воздуха, лазерного диода и фотодиода. Воздух в датчик поступает через клапан впуска (air inlet). Внутри датчика работает лазерный диод, который освещает поступивший внутрь датчика воздух и частицы, содержащиеся в нем. Получившийся рассеянный свет преобразуется в электрический сигнал с помощью фотодетектора. Этот сигнал затем усиливается и обрабатывается. В результате обработки вычисляется концентрация частиц PM2.5 и PM10.
Технические характеристик датчика 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 дисплеях используется тот же принцип формирования изображения, что и в современных телевизорах, только количество пикселей в них значительно меньше.
Для нашего проекта мы использовали монохромный 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 |
Подключение данного дисплея к плате Arduino рассматривалось в этой статье, а все проекты с использованием данного дисплея на нашем сайте вы можете посмотреть по следующей ссылке.
Технические характеристики OLED дисплея SSD1306:
- драйвер микросхемы OLED: SSD1306;
- разрешение: 128 x 64;
- угол зрения: >160°;
- входное напряжение: 3.3V ~ 6V;
- цвет пикселов: синий;
- диапазон рабочих температур: -30°C ~ 70°C.
Схема проекта
Схема анализатора качества воздуха на Arduino для определения частиц PM2.5 и PM10 представлена на следующем рисунке.
OLED дисплей | Плата Arduino Nano |
GND | Ground |
VCC | 5V |
D0 | 10 |
D1 | 9 |
RES | 13 |
DC | 11 |
CS | 12 |
Внешний вид получившейся у нас конструкции проекта показан на следующем рисунке.
Для сборки конструкции проекта мы использовали перфорированную плату. Внешний вид этой платы с установленными компонентами проекта показан на рисунке ниже. Но вы при желании можете использовать макетную или печатную плату для сборки проекта.
Объяснение программы для Arduino
Полный код программы приведен в конце статьи, здесь же мы кратко рассмотрим его основные фрагменты.
Код программы использует библиотеки SDS011, Adafruit_GFX и Adafruit_SSD1306. Все эти библиотеки можно скачать и установить в менеджере библиотек (Library Manager) в Arduino IDE. Для этого в Arduino IDE откройте пункт меню Sketch > Include Library > Manage Libraries. Запустите в нем поиск SDS011 и установите библиотеку SDS Sensor library, написанную R. Zschiegner.
Аналогичным образом установите библиотеки Adafruit GFX и Adafruit SSD1306 от компании Adafruit.
После установки всех необходимых библиотек код программы начнем с подключения заголовочных файлов данных библиотек.
1 2 3 4 |
#include <SDS011.h> #include <SPI.h> #include <Adafruit_GFX.h> #include <Adafruit_SSD1306.h> |
Далее объявим две переменные для хранения концентрации частиц PM10 и PM2.5.
1 |
float p10,p25; |
Затем в программе определим (укажем) ширину и высоту OLED дисплея (в пикселах) – для используемого нами дисплея это будут, соответственно, значения 128 и 64.
1 2 |
#define SCREEN_WIDTH 128 #define SCREEN_HEIGHT 64 |
Далее определим (укажем) контакты интерфейса SPI, к которым подключен OLED дисплей.
1 2 3 4 5 |
#define OLED_MOSI 9 #define OLED_CLK 10 #define OLED_DC 11 #define OLED_CS 12 #define OLED_RESET 13 |
Затем создадим объект для работы с OLED дисплеем.
1 |
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS); |
После этого в функции setup() мы инициализируем последовательную связь со скоростью 9600 бод для целей отладки. Также мы инициализируем OLED дисплей (с помощью функции begin()) и датчик SDS011.
1 2 3 |
my_sds.begin(3,4); Serial.begin(9600); display.begin(SSD1306_SWITCHCAPVCC); |
В функции void loop() мы будем считывать значения концентрации частиц PM10 и PM2.5 с датчика SDS011 и выводить их в окно монитора последовательной связи.
1 2 3 4 5 |
void loop() { error = my_sds.read(&p25,&p10); if (! error) { Serial.println("P2.5: "+String(p25)); Serial.println("P10: "+String(p10)); |
После этого установим размер и цвет текста на OLED дисплее с помощью функций setTextSize() и setTextColor().
1 2 |
display.setTextSize(2); display.setTextColor(WHITE); |
Далее установим позицию для начала вывода текста с помощью функции setCursor(x,y). Мы будем выводить на экран OLED дисплея значения концентрации частиц PM2.5 и PM10, поэтому установим для их вывода начальные позиции (0,15) и (0, 40).
1 2 3 4 5 6 7 8 |
display.setCursor(0,15); display.println("PM2.5"); display.setCursor(67,15); display.println(p25); display.setCursor(0,40); display.println("PM10"); display.setCursor(67,40); display.println(p10); |
И, наконец, с помощью функции display() мы отобразим необходимый нам текст на экране OLED дисплея.
1 2 |
display.display(); display.clearDisplay(); |
Тестирование работы проекта
После того как аппаратная часть проекта будет готова, подсоедините плату Arduino к компьютеру, выберите в Arduino IDE правильный вид платы и порт, к которому она подключена, и загрузите код программы в плату. После этого вы должны увидеть как на экране OLED будут показываться измеренные значения частиц PM2.5 и PM10.
Более подробно работу проекта вы можете посмотреть на видео, приведенном в конце статьи.
Исходный код программы (скетча)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
#include <SDS011.h> #include <SPI.h> #include <Adafruit_GFX.h> #include <Adafruit_SSD1306.h> float p10,p25; int error; SDS011 my_sds; #define SCREEN_WIDTH 128 // ширина OLED дисплея, в пикселах #define SCREEN_HEIGHT 64 // высота OLED дисплея, в пикселах // Declaration for SSD1306 display connected using software SPI (default case): #define OLED_MOSI 9 #define OLED_CLK 10 #define OLED_DC 11 #define OLED_CS 12 #define OLED_RESET 13 Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS); void setup() { my_sds.begin(3,4); Serial.begin(9600); display.begin(SSD1306_SWITCHCAPVCC); display.clearDisplay(); display.display(); } void loop() { error = my_sds.read(&p25,&p10); if (! error) { Serial.println("P2.5: "+String(p25)); Serial.println("P10: "+String(p10)); display.setTextSize(2); display.setTextColor(WHITE); display.setCursor(0,15); display.println("PM2.5"); display.setCursor(67,15); display.println(p25); display.setCursor(0,40); display.println("PM10"); display.setCursor(67,40); display.println(p10); display.display(); display.clearDisplay(); } delay(100); } |