Научно-технический прогресса и последующий за ним рост промышленного производства привели к увеличению загрязнения окружающей среды, в том числе и воздуха. Поэтому контроль качества воздуха является одной из актуальных задач в современном мире. При этом наиболее актуален контроль таких показателей как TVOC (Total Volatile Organic Compounds – общее количество летучих органических соединений) и CO2 (углекислый газ).
В данной статье мы рассмотрим подключение датчика качества воздуха CCS811 к плате Arduino и мониторинг с его помощью содержания TVOC и CO2 (углекислого газа) в окружающем воздухе. Также на нашем сайте можно прочитать статью про мониторинг качества воздуха с помощью датчика MQ135 и платы Arduino.
Необходимые компоненты
- Плата Arduino Uno (купить на AliExpress).
- Датчик качества воздуха (Air Quality Sensor) CCS811 (купить на AliExpress).
- Потенциометр 10 кОм (купить на AliExpress).
- ЖК дисплей 16х2 (купить на AliExpress).
- Макетная плата.
- Соединительные провода.
Работа схемы
Схема подключения датчика качества воздуха CCS811 к плате Arduino представлена на следующем рисунке.
Как видите, она достаточно проста и ее можно разместить на макетной плате. Контроль качества воздуха в схеме осуществляется с помощью датчика CCS811, а результаты контроля отображаются на экране ЖК дисплея 16х2.
Датчик качества воздуха CCS811
Данный датчик представляет собой цифровой датчик газа с низким энергопотреблением, который включает в себя датчик газа типа MOX (metal oxide) для обнаружения широкого диапазона VOCs (Volatile Organic Compounds - летучих органических соединений) внутри помещений и блок микроконтроллера (MCU, Micro-controller Unit). Блок микроконтроллера состоит из АЦП (аналого-цифрового преобразователя) и интерфейса I2C.
Распиновка датчика качества воздуха CCS811 представлена в следующей таблице.
№ контакта | Название контакта | Описание |
1 | Vin | питающее напряжение (от 3.3 до 5 В) |
2 | 3V3 | выходное напряжение 3.3 В для внешнего использования |
3 | Gnd | земля |
4 | SDA | контакт синхронизации для интерфейса I2C |
5 | SCL | контакт данных для интерфейса I2C |
6 | WAKE | контакт "пробуждения" датчика, должен быть замкнут на землю чтобы с датчиком можно было осуществлять информационный обмен |
7 | RST | контакт сброса, если замкнут на землю, то датчик может сбрасывать сам себя |
8 | INT | контакт входа внешнего прерывания |
Исходный код программы для Arduino
Полный код программы приведен в конце статьи, сначала рассмотрим его наиболее важные фрагменты.
Вначале программы необходимо подключить библиотеки для работы с ЖК дисплеем и датчиком качества воздуха CCS811. Скачать библиотеку для работы с датчиком CCS811 можно по следующей ссылке.
1 2 |
#include <LiquidCrystal.h> #include "Adafruit_CCS811.h" |
Далее сообщим плате Arduino к каким ее контактам подключен ЖК дисплей и создадим объект для работы с датчиком CCS811.
1 2 |
LiquidCrystal lcd(12, 13, 8, 9, 10, 11); /// REGISTER SELECT PIN,ENABLE PIN,D4 PIN,D5 PIN, D6 PIN, D7 PIN Adafruit_CCS811 ccs; |
Затем инициализируем ЖК дисплей и датчик CCS811 и откалибруем датчик чтобы он показывал правильную температуру.
1 2 3 4 5 6 7 8 |
void setup() { lcd.begin(16, 2); ccs.begin(); //калибровка датчика температуры while(!ccs.available()); float temp = ccs.calculateTemperature(); ccs.setTempOffset(temp - 25.0); } |
В следующем участке кода мы используем функцию “ccs.available()” чтобы проверить не поступают ли какие либо данные от датчика. Если поступают, то рассчитываем температуру.
Далее, если датчик CCS доступен и функция ccs.readData() возвращает ложь (false), мы считываем значение CO2 с помощью функции ccs.geteCO2() и значение TVOC с помощью функции ccs.getTVOC(). Таким образом мы получаем информацию о качестве воздуха с помощью датчика CCS811, которую отображаем потом на экране ЖК дисплея.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
void loop() { if(ccs.available()){ float temp = ccs.calculateTemperature(); if(!ccs.readData()){ int co2 = ccs.geteCO2(); int tvoc = ccs.getTVOC(); lcd.setCursor(0, 0); lcd.print(String ("CO2:")+ String (co2)+String(" PPM")); lcd.setCursor(0, 1); lcd.print(String ("TVOC:")+ String (tvoc)+String(" PPB ")); lcd.print(String("T:"+String (int(temp)))+String("C")); delay(3000); lcd.clear(); } else{ lcd.print("ERROR"); while(1); } } } |
Далее представлен полный код программы.
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 |
#include <LiquidCrystal.h> #include "Adafruit_CCS811.h" LiquidCrystal lcd(12, 13, 8, 9, 10, 11); /// REGISTER SELECT PIN,ENABLE PIN,D4 PIN,D5 PIN, D6 PIN, D7 PIN Adafruit_CCS811 ccs; void setup() { lcd.begin(16, 2); ccs.begin(); //калибровка температурного датчика while(!ccs.available()); float temp = ccs.calculateTemperature(); ccs.setTempOffset(temp - 25.0); } void loop() { if(ccs.available()){ float temp = ccs.calculateTemperature(); if(!ccs.readData()){ int co2 = ccs.geteCO2(); int tvoc = ccs.getTVOC(); lcd.setCursor(0, 0); lcd.print(String ("CO2:")+ String (co2)+String(" PPM")); lcd.setCursor(0, 1); lcd.print(String ("TVOC:")+ String (tvoc)+String(" PPB ")); lcd.print(String("T:"+String (int(temp)))+String("C")); delay(3000); lcd.clear(); } else{ lcd.print("ERROR"); while(1); } } } |
ccs.setTempOffset(temp - 25.0) - 25 это текущая температура окружающего воздуха?
В большинстве случаев да, но команда ccs.setTempOffset может и не использоваться - в сети есть примеры программ где эта команда не используется при подключении датчика к Ардуино. Команда ccs.setTempOffset используется для калибровки датчика и в большинстве случаев помогает повысить точность измерений. Более подробно можете посмотреть по адресу adafruit.github.io/Adafruit_CCS811/html/class_adafruit___c_c_s811.html
в монитор последовательного порта выводит показания а в LCD не получается. Также пробовал через i2c lcd - результат тот-же. Кстати у вас на рисунке-схеме подключения ошибка: перепутаны местами SCL и SDA
Спасибо за внимательность. Значит, у вас проблема с ЖК дисплеем. Целесообразно его сменить или использовать OLED дисплей с SPI интерфейсом.
На дисплее error
Причин может быть много почему электронные схемы не работают. Попробуйте добавить вывод информации о работе программы (в ее ключевых местах) в монитор последовательного порта. Так вы с большой вероятностью можете локализовать место где у вас происходит ошибка