В этой статье мы подключим датчик CO2 и TVOC SGP30 к Arduino и отобразим измеренные значение на экране OLED-дисплея. Датчик SGP30 способен обнаруживать эквивалентное количество углекислого газа (CO2) и общее количество летучих органических соединений (TVOC) в атмосфере. Ранее на нашем сайте мы измеряли CO2 и TVOC с помощью датчика газа CCS811, а также интегрированного датчика окружающей среды BME680.
Но SGP30 — это совершенно другой датчик, который может быстро давать правильные показания. В то время как CCS811 требует прогрева в течение 48 часов и обкатки в течение 20 минут, SGP30 готов к работе всего через 15 секунд.
В этом проекте мы сначала прочитаем значение CO2 и TVOC с датчика SGP30 с помощью библиотеки Arduino Sparkfun и отобразим их значение на последовательном мониторе. Датчик также может измерять значения этанола и водорода (H2) в необработанных значениях. Позже мы отобразим показания датчика на 0,96″ I2C OLED-дисплее и протестируем датчик, поместив немного духов рядом с датчиком.
Необходимые компоненты
- Плата Arduino Nano (купить на AliExpress).
- Датчик качества воздуха SGP30 (купить на AliExpress).
- Модуль OLED дисплея SSD1306 128×64 с интерфейсом I2C (купить на AliExpress).
- Макетная плата
- Соединительные провода.
Реклама: ООО "АЛИБАБА.КОМ (РУ)" ИНН: 7703380158
Датчик качества воздуха SGP30
Датчик газа SGP30 — это датчик качества воздуха, используемый для измерения VOC и eCO2. Это очень точный датчик качества воздуха от экспертов по датчикам компании Sensirion. Датчик имеет интерфейс I2C. Он выдает полностью откалиброванные выходные сигналы с типичной точностью 15% в пределах измеренных значений. SGP объединяет несколько чувствительных элементов на основе оксида металла на одном чипе для предоставления более подробных сигналов качества воздуха. Этот модуль обеспечивает вывод TVOC (общее количество летучих органических соединений) и CO2eq с выдающейся долговременной стабильностью и низким энергопотреблением. Это делает его идеальным выбором для определения качества воздуха в помещении с использованием Arduino или любого другого микроконтроллера.
Sensirion SGP30 — это цифровой многопиксельный газовый датчик, который можно легко интегрировать с очистителями воздуха или вентиляцией с регулируемой потребностью. Датчик работает на основе технологии CMOSens® компании Sensirion, которая объединяет полную сенсорную систему на одном чипе с микронагревателем с регулируемой температурой и двумя предварительно обработанными сигналами качества воздуха в помещении. Как первый металлооксидный газовый датчик с несколькими чувствительными элементами на одном чипе, SGP30 предоставляет более подробную информацию. Проверьте спецификацию SGP30 для получения дополнительной информации.
Он выводит эквивалент CO2 в ppm и общее количество летучих органических соединений (TVOC) в ppb. Датчик также предоставляет доступ к своим необработанным значениям измерений этанола и H2. SGP30 может похвастаться высокой стабильностью с низким долгосрочным дрейфом. Благодаря алгоритму непрерывной компенсации показания датчика остаются точными с течением времени. Вы даже можете точно настроить свои показания, подключив внешний датчик влажности для добавления компенсации влажности.
Характеристики датчика
- Датчик Sensiron SGP30 TVOC и eCO2.
- Измерение TVOC от 0 до 60 000 ppb (частей на миллиард).
- Измерение CO2 от 400 до 60 000 ppm (частей на миллион).
- Частота дискретизации 1 Гц.
- Интерфейс I2C (адрес 0x58).
- Совместимость с напряжением 3,3 В или 5 В.
- Распиновка, совместимая с Raspberry Pi (контакты 1, 3, 5, 7, 9).
- Совместим со всеми моделями Raspberry Pi и Arduino.
Приложения
- Очиститель воздуха.
- Вентиляция с регулируемой интенсивностью.
- Приложения Интернета вещей.
- Монитор кондиционирования воздуха в доме.
Библиотека SGP30 Sparkfun для Arduino
Библиотека для SGP30 разработана Adafruit, а также Sparkfun. Но в этом проекте мы будем использовать библиотеку SGP30 Sparkfun Arduino.
Вы можете скачать библиотеку SGP30 с Github'а. Загрузите библиотеку и добавьте в свою среду разработки Arduino через менеджер библиотек.
Взаимодействие датчика SGP30 с Arduino
Теперь давайте подключим датчик SGP30 к плате Arduino. Схема соединения между Arduino и SGP30 очень проста.
Подключите контакты VCC и GND SGP30 к контактам Arduino 3.3V и GND соответственно. Поскольку SGP30 является модулем I2C, подключите его контакты SDA и SCL к контактам Arduino A4 и A5 соответственно.
Исходный код программы для чтения CO2 и TVOC
Следующий код взят из примера библиотеки Sparkfun SGP30. Код выводит результаты измерения общего количества летучих органических соединений (TVOC) в частях на миллиард (ppb), эквивалента диоксида углерода (CO2) в частях на миллион (ppm).
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 "SparkFun_SGP30_Arduino_Library.h" // Click here to get the library: http://librarymanager/All#SparkFun_SGP30 #include <Wire.h> SGP30 mySensor; //create an object of the SGP30 class void setup() { Serial.begin(9600); Wire.begin(); //Initialize sensor if (mySensor.begin() == false) { Serial.println("No SGP30 Detected. Check connections."); while (1); } //Initializes sensor for air quality readings //measureAirQuality should be called in one second increments after a call to initAirQuality mySensor.initAirQuality(); } void loop() { //First fifteen readings will be //CO2: 400 ppm TVOC: 0 ppb delay(1000); //Wait 1 second //measure CO2 and TVOC levels mySensor.measureAirQuality(); Serial.print("CO2: "); Serial.print(mySensor.CO2); Serial.print(" ppm\tTVOC: "); Serial.print(mySensor.TVOC); Serial.println(" ppb"); } |
В менеджере плат выберите используемую вами плату Arduino. Также выберите COM-порт. Затем нажмите кнопку загрузки, чтобы загрузить код на плату Arduino.
После завершения загрузки кода откройте последовательный монитор.
Первоначально последовательный монитор будет отображать значение CO2 как 400 ppm и значение TVOC как 0 ppb. После 15-20 показаний датчик стабилизируется по мере нагревания. Затем значение датчика будет отображаться правильно.
Исходный код программы для чтения этанола и водорода (H2)
SGP30 использует динамический алгоритм компенсации базового значения (baseline) и встроенные в чип параметры калибровки для предоставления двух дополнительных сигналов качества воздуха. Базовое значение должно быть сохранена в EEPROM. Если при первом включении питания в EEPROM нет базового значения или базовая запись старше семи дней, датчик должен работать в течение 12 часов, пока базовое значение не будет сохранено. Блок-схема этой программы представлена на следующем рисунке.
Сигналы H2_Signal и Ethanol_signal - оба сигнала можно использовать для расчета концентрации газа c относительно опорной концентрации cref по формуле ln(C/Cref)=(Serf-Sout)/a , где a = 512, sref — выходной сигнал H2_signal или Ethanol_signal при опорной концентрации, а sout = Sout_H2 или Sout = Sout_EthOH.
Для более точного измерения можно установить компенсацию абсолютной влажности. Значение по умолчанию составляет 11,57 г/м3. Немного затруднительно то, что вам придется получать значение относительной влажности окружающей среды другим способом, поскольку в SGP30 нет встроенного устройства для измерения влажности.
Вот полный код программы, который считывает значения CO2, TVOC, H2 и этанола.
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 |
#include "SparkFun_SGP30_Arduino_Library.h" // Click here to get the library: http://librarymanager/All#SparkFun_SGP30 #include <Wire.h> SGP30 mySensor; //create an object of the SGP30 class long t1, t2; void setup() { Serial.begin(9600); Wire.begin(); //Sensor supports I2C speeds up to 400kHz Wire.setClock(400000); //Initialize sensor if (mySensor.begin() == false) { Serial.println("No SGP30 Detected. Check connections."); while (1); } //Initializes sensor for air quality readings //measureAirQuality should be called in one second increments after a call to initAirQuality mySensor.initAirQuality(); t1 = millis(); } void loop() { //First fifteen readings will be //CO2: 400 ppm TVOC: 0 ppb t2 = millis(); if ( t2 >= t1 + 1000) //only will occur if 1 second has passed { t1 = t2; //measure CO2 and TVOC levels mySensor.measureAirQuality(); Serial.print("CO2: "); Serial.print(mySensor.CO2); Serial.print(" ppm\tTVOC: "); Serial.print(mySensor.TVOC); Serial.println(" ppb"); //get raw values for H2 and Ethanol mySensor.measureRawSignals(); Serial.print("Raw H2: "); Serial.print(mySensor.H2); Serial.print(" \tRaw Ethanol: "); Serial.println(mySensor.ethanol); } } |
После загрузки кода вы можете снова открыть последовательный монитор. Наблюдайте за показаниями после 15-20 показаний, вы сможете увидеть значения CO2, TVOC, H2 и этанола. Примечание: значения H2 и этанола являются только необработанными значениями.
Отображение значений CO2 и TVOC на OLED-дисплее
Теперь давайте отобразим значение CO2 и TVOC на каком-нибудь дисплейном модуле вместо отображения на последовательном мониторе. Лучший модуль для этого — 0,96″ I2C OLED дисплей. Схема подключения снова довольно проста.
OLED-дисплей также является модулем I2C. Поэтому подключите его напрямую к выводам I2C платы Arduino.
Исходный код программы проекта с OLED-дисплеем
Для работы с OLED-дисплеем SSD1306 требуются две библиотеки. Загрузите следующие библиотеки и добавьте их в папку библиотек.
- Библиотека Adafruit SSD1306: https://github.com/adafruit/Adafruit_SSD1306
- Библиотека Adafruit GFX: https://github.com/adafruit/Adafruit-GFX-Library
Скопируйте следующий код и загрузите его на плату Arduino.
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 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 |
#include "SparkFun_SGP30_Arduino_Library.h" // Click here to get the library: http://librarymanager/All#SparkFun_SGP30 #include <Wire.h> #include <Adafruit_GFX.h> #include <Adafruit_SSD1306.h> #define SCREEN_WIDTH 128 // OLED display width, in pixels #define SCREEN_HEIGHT 64 // OLED display height, in pixels #define OLED_RESET 4 // Reset pin # (or -1 if sharing Arduino reset pin) #define SCREEN_ADDRESS 0x3C // 0x3D for 128x64, 0x3C for 128x32 Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET); SGP30 mySensor; //create an object of the SGP30 class void setup() { Serial.begin(9600); Wire.begin(); if (!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) { Serial.println(F("SSD1306 allocation failed")); for (;;); // Don't proceed, loop forever } display.clearDisplay(); //Initialize sensor if (mySensor.begin() == false) { Serial.println("No SGP30 Detected. Check connections."); while (1); } //Initializes sensor for air quality readings //measureAirQuality should be called in one second increments after a call to initAirQuality mySensor.initAirQuality(); } void loop() { //First fifteen readings will be //CO2: 400 ppm TVOC: 0 ppb delay(1000); //Wait 1 second //measure CO2 and TVOC levels mySensor.measureAirQuality(); Serial.print("CO2: "); Serial.print(mySensor.CO2); Serial.print(" ppm\tTVOC: "); Serial.print(mySensor.TVOC); Serial.println(" ppb"); display.setCursor(0, 10); //oled display display.setTextSize(2); display.setTextColor(WHITE); display.print("CO2:"); display.print(mySensor.CO2); display.setTextSize(1); display.print("ppm"); display.setCursor(0, 40); //oled display display.setTextSize(2); display.setTextColor(WHITE); display.print("TVOC:"); display.print(mySensor.TVOC); display.setTextSize(1); display.print("ppb"); display.display(); display.clearDisplay(); } |
OLED-дисплей инициализируется и начнет отображать значение CO2 и TVOC. Первоначально он будет отображать значение CO2 и TVOC как 400ppm и 0ppb соответственно.
После 15–20 считываний OLED-дисплей начнет отображать правильное стабильное значение.
Чтобы проверить работу датчика, вы можете поднести к нему духи, спрей или любое органическое соединение. Датчик покажет значение большими цифрами в ppm и ppb.