МІНІСТЕРСТВО ВНУТРІШНІХ СПРАВ УКРАЇНИ

ЛЬВІВСЬКИЙ ДЕРЖАВНИЙ УНІВЕРСИТЕТ ВНУТРІШНІХ СПРАВ

Навчально-науковий інститут управління, психології та безпеки

Кафедра інформаційних технологій

РОЗРОБЛЕННЯ ЦИФРОВОГО пристрою

для моніторингу якості повітря в в бойових броньованих машинах на платформі Arduino з використанням

давача CCS811

Кваліфікаційна робота

здобувача вищої освіти

4 курсу денної форми навчання

Романа Возного

Науковий керівник:

доцент, кандидат технічних наук Ігор Фармага

Рецензент:

____________________________

вчене звання, науковий ступінь

____________________________

(Ім’я ПРІЗВИЩЕ рецензента)

Кваліфікаційна робота допущена до захисту

«___» _______________ 2025 р., протокол № ____

Завідувач кафедри інформаційних технологій

_________________Ігор ФЕДЧАК_

(підпис)

Львів

2025

СПИСОК УМОВНИХ СКОРОЧЕНЬ

ПК – персональний комп’ютер.

МК – мікроконтролер.

АЗ – апаратне забезпечення.

ПЗ – програмне забезпечення.

САПР – система автоматизованого проектування.

ЦП – цифровий пристрій.

IAQ (indoor air quality) – якість повітря в бойових броньованих машинах.

AVR – сімейство 8 - розрядних мікроконтролерів фірми Atmel.

Arduino Uno –апаратно-програмна платформа на МК ATmega328P-PU.

Arduino IDE – інтегроване середовище розробки, яке використовується для написання і прошивки програмного коду в МК плати Arduino.

FLASH – різновид напівпровідникової технології пам’яті, яка перепрограмовується електричним методом.

EEPROM (Electrically Erasable Programmable Read-Only Memory) – постійна пам’ять, яка стирається та перепрограмовується електричним методом.

ПЗП (ROM – read-only memory) – постійний запам’ятовуючий пристрій. Енергонезалежна пам’ять, з якої може проводитися тільки читання даних.

ОЗП (RAM - Random Access Memory) – оперативна пам’ять або оперативний запам’ятовуючий пристрій.

РКД (LCD) – рідкокристалічний дисплей.

I2C – послідовна шина даних для зв’язку інтегральних схем, що використовує дві двонаправлені лінії зв’язку (SDA і SCL).

UART (Universal Asynchronous Receiver/Transmitter) - універсальний асинхронний приймач/передавач.

Анотація

Возний Р., Фармага І. (керівник). Розроблення цифрового пристрою для моніторингу якості повітря в бойових броньованих машинах на платформі Arduino з використанням давача CCS811. Бакалаврська кваліфікаційна робота. – Львівський державний університет внутрішніх справ, Львів, 2025.

У бакалаврській дипломній роботі розроблено апаратне та програмне забезпечення цифрового пристрою для моніторингу якості повітря в бойових броньованих машинах. Пристрій в режимі реального часу виявляє широкий спектр летких органічних сполук в повітрі, та визначає загальну кількість летких органічних сполук TVOC (в одиницях ppb) та еквівалентний рівень двоокису вуглецю (вуглекислого газу) eCO2 (в одиницях ppm). При допустимій концентрації летких органічних сполук в бойових броньованих машинах пристрій перебуває в звичайному робочому режимі моніторингу, що свідчить свічення зеленого світлодіода. При перевищенні заданих порогових значень концентрації летких органічних сполук спрацьовує сигналізація і пристрій переходить в режим тривоги. В режимі тривоги вмикається зумер, засвічується червоний світлодіод, виводиться повідомлення тривоги на дисплей та в послідовний порт. Пристрій має меню налаштування його режимів роботи (цикл вимірювання, порогові значення…).

Апаратне забезпечення цифрового пристрою моніторингу якості повітря в бойових броньованих машинах розроблено з використанням плати Arduino Uno R3, цифрового давача якості повітря в бойових броньованих машинах CCS811, цифрового давача температури і воогості SHT31-D, модуля символьного рідкокристалічного дисплею LCD1602 на мікросхемі драйвері HD44780.

В роботі розроблено електричну принципову схему (модель) цифрового пристрою для моніторингу якості повітря в бойових броньованих машинах засобами САПР Proteus. Розроблено програмно-алгоритмічне забезпечення цифрового пристрою для моніторингу якості повітря в бойових броньованих машинах. Проведено моделювання роботи пристрою в емуляторі Proteus ISIS. Створено та досліджено макет цифрового пристрою для моніторингу якості повітря в бойових броньованих машинах.

Ключові слова: цифровий пристрій, моніторинг, цифровий давач якості повітря в бойових броньованих машинах CCS811, цифровий давач температури і вологості SHT31-D, платформа Arduino Uno R3, мікроконтролер ATmega328P-PU, САПР Proteus Design Suite, мова програмування C/C++, середовище розробки Arduino IDE.

Abstract

Voznyy R., Farmaha I. (supervisor). Development of a digital device for air quality monitoring in combat armored vehicles on the Arduino platform using the CCS811 sensor. Bachelor’s thesis. – Lviv State University of Internal Affairs, Lviv, 2025.

In the bachelor’s thesis, the hardware and software of the digital device for indoor air quality monitoring have been developed. The device in real-time mode detects a wide range of indoor volatile organic compounds, and determines the total amount of organic compounds TVOC (in units of ppb) and the equivalent level of carbon dioxide eCO2 (in units of ppm). When the concentration of the volatile organic compounds is acceptable, the device operates in the normal monitoring mode and the green LED glows. When the set threshold values of the concentration of volatile organic compounds are exceeded, the alert is triggered and the device goes into alarm mode. In the alarm mode, the buzzer turns on, the red LED lights up, and an alarm message is sent on the LCD and to the serial port. The device has a menu for setting its operation modes (measurement cycle, threshold values and others…)

The digital device for indoor air quality monitoring has been developed using the Arduino Uno R3 platform, digital indoor air quality sensor (IAQ) CCS811, digital temperature and humidity sensor SHT31-D, alpha-numeric LCD1602 module based on the HD44780 driver chip.

In the work, the electronic circuit (model) of the digital device has been developed using the Proteus ECAD system. The algorithms and software of the digital device for indoor air quality monitoring have been developed. The device simulation has been performed in Proteus ISIS. The prototype of the digital device for indoor air quality monitoring has been created and researched.

Keywords: digital device, monitoring, digital indoor air quality (IAQ) sensor CCS811, digital temperature and humidity sensor SHT31-D, Arduino Uno R3, microcontroller ATmega328P-PU, ECAD Proteus Design Suite, programming languages C/C++, embedded software development tool Arduino IDE.

Зміст

Вступ	7

Розділ I. Стан проблемної області	11

1.1.	Методи виявлення летких органічних сполук	11

1.2.	Огляд цифрових пристроїв моніторингу якості повітря фірм-виробників	14

Розділ II. Засоби розробки цифрового пристрою моніторингу якості повітря в бойових броньованих машинах	25

2.1.	Система автоматизованого проектування та моделювання електронних схем Proteus Design Suite	25

2.2.	Середовище розробки скетчів - Arduino IDE	26

Розділ III. Апаратне забезпечення цифрового пристрою моніторингу якості повітря в бойових броньованих машинах	30

3.1	Огляд електронних комплектуючих для проектування цифрового пристрою моніторингу якості повітря в бойових броньованих машинах	30

3.2.	Проектування цифрового пристрою в системі Proteus ISIS	57

Розділ IV. Програмно-алгоритмічне забезпечення цифрового пристрою для моніторингу якості повітря в бойових броньованих машинах	61

4.1.	Алгоритм калібрування давача якості повітря CCS811	61

4.2.	Алгоритм роботи пристрою моніторингу якості повітря в бойових броньованих машинах	65

4.3.	Розробка бібліотеки для роботи з цифровим давачем якості повітря в бойових броньованих машинах CCS811	73

4.4.	Розробка бібліотеки для роботи з цифровим давачем температури і вологості SHT31-D	74

4.5.	Розробка бібліотеки для роботи з алфавітно-цифровим РК - дисплеєм HD44780	74

4.6.	Програмна реалізація алгоритму роботи цифрового пристрою моніторингу якості повітря в бойових броньованих машинах	74

4.7.	Моделювання та дослідження макету цифрового пристрою моніторингу якості повітря в бойових броньованих машинах	77

Висновки	78

Список використаних літературних джерел	80

Додатки	83

Вступ

Науково-технічний прогрес призвів до збільшення забруднення навколишнього середовища, в тому числі і повітря [10]. Тому, контроль якості повітря є однією з актуальних завдань в сучасному світі. При цьому найбільш актуальним є контроль таких показників як TVOC (Total Volatile Organic Compounds – загальна кількість летких органічних сполук) і CO2 (вуглекислий газ).

Леткі органічні сполуки – це органічні (вуглецевмісні) сполуки, які мають властивість летючості. Сполуки можна назвати леткими, якщо вони мають дуже низьку температуру кипіння, і тому мають тенденцію легко виділятися в повітря при кімнатній температурі. Цей термін охоплює досить величезний набір матеріалів, в тому числі декілька з них виробляє людський організм. Щоразу при видиху людина виробляє (продукує) леткі органічні сполуки. Більшість ароматів та запахів, що відчуває людина, є леткими органічними сполуками. Багато з них є нешкідливими в нормальних концентраціях, але є також такі, які є шкідливими для людей і/або навколишнього середовища.

З дня на день люди стикаються з самими високими концентраціями летких органічних сполук в машині. Фарби, чистячі засоби (хімія), машини, люди і тварини містять та виділяють леткі органічні сполуки, що мають тенденцію накопичуватися в закритих машині без належної вентиляції. Саме по цій причині леткі органічні сполуки продуковані людиною (або антропогенні) регулюються законом в багатьох країнах.

Вплив летких органічних сполук на здоров’я є складним для вивчення, оскільки вони, як правило, викликають кумулятивну шкоду протягом багатьох років сповільненої дії. Вони не представляють значний ризик для здоров’я звичайних людей, що проживають в будинках з належною вентиляцією, але про якість повітря в бойових броньованих машинах варто подумати. Деякі спеціалізовані системи опалення, вентиляції та кондиціонування повітря (системи опалення, вентиляції і кондиіцоінування повітря) (HVAC systems – heating, ventilation, and air conditioning systems) навіть містять давачі для виявлення підвищення рівня летких органічних сполук та увімкнення припливної вентиляції або очищувачів повітря.

Вентиляція машини залежить від кількості людей. Чим більше людей знаходиться в бойових броньованих машинах, тим більше CO2 вони видихають і тим більше потрібна вентиляція. Тепер, можна проектувати і експлуатувати систему HVAC в розрахунку на зайнятість будівлі або бойових броньованих машинах, тобто на кількість людей, що будуть використовувати простір. Це означає, що буде витрата енергії впусту, тоді як будівля насправді не зайнята. Щоб вирішити цю проблему, багато систем HVAC будуть контролювати концентрацію CO2 в заданій області, щоб розрахувати об’єм повітрообміну, необхідний в схемі, що називається вентиляція за необхідності.

Методом контролю стану повітря в бойових броньованих машинах є постійний його моніторинг на вміст шкідливих газів, різних летких органічних сполук та визначення їх концентрації. Тому, розроблення якісно нових недорогих приладів виявлення шкідливих газів та різних летких органічних сполук є актуальним завданням.

На сьогоднійшній день завдяки розвитку мікроелектроніки появилися мікроконтролери та різні давачі, на яких можна створювати недорогі вимірювальні пристрої та системи. Зокрема, таким може бути цифровий пристрій для моніторингу якості повітря в бойових броньованих машинах.

Метою роботи є розробка апаратного та програмного забезпечення цифрового пристрою моніторингу якості повітря в бойових броньованих машинах, що в режимі реального часу виявляє широкий спектр летких органічних сполук в повітрі, та визначає загальну кількість летких органічних сполук TVOC (в ppb) та еквівалентний рівень вуглекислого газу eCO2 (в ppm), а при перевищені їх гранично-допустимих значень (порогових значень) сповіщає звуковим сигналом, світловою індикацією та виводом попереджувального повідомлення на дисплей і в послідовний порт.

Для досягнення мети необхідно вирішити наступні завдання:

розробити цифровий пристрій для моніторингу якості повітря в бойових броньованих машинах на основі наступних даних:

плата Arduino Uno R3 на основі мікроконтролера ATmega328P-PU;

цифровий давач якості повітря в бойових броньованих машинах (IAQ sensor) CCS811;

цифровий давач температури і вологості SHT31-D;

модуль алфавітно-цифрового дисплею (2 рядки по 16 символів) з підсвіткою та HD44780 – сумісним контролером управління;

4 двохконтактні кнопки на 4 виводи;

спроєктувати цифровий пристрій для моніторингу якості повітря в бойових броньованих машинах засобами САПР Proteus;

розробити алгоритм роботи цифрового пристрою для моніторингу якості повітря в бойових броньованих машинах;

створити бібліотеку для роботи з цифровим давачем якості повітря в бойових броньованих машинах CCS811;

створити бібліотеку для роботи з цифровим давачем температури і вологості SHT31-D;

розробити головне програмне забезпечення цифрового пристрою для моніторингу якості повітря в бойових броньованих машинах відповідно до алгоритму його роботи;

створити та дослідити модель цифрового пристрою для моніторингу якості повітря в бойових броньованих машинах в Proteus ISIS;

зібрати макет цифрового пристрою для моніторингу якості повітря в бойових броньованих машинах та протестувати його роботу.

Об’єкт дослідження – проєктування цифрового пристрою для моніторингу якості повітря в бойових броньованих машинах.

Предмет дослідження – моделі та засоби проєктування цифрового пристрою для моніторингу якості повітря в бойових броньованих машинах на платформі Arduino з використанням давача CCS811.

Методи досліджень. Під час виконання роботи застосовано низку загальновідомих методів пізнання, які дозволили у повному обсязі досягти мети та вирішити завдання дослідження. Так, за допомогою бібліометричного методу здійснено опрацювання опублікованих наукових праць, що дозволило осягнути динаміку розвитку даної проблеми. За допомогою різних філософських (діалектичного, феноменологічного, синергетичного, аксіологічного) методів пізнання здійснено всебічний аналіз поглядів на предмет дослідження. Використання значної кількості загальнонаукових методів (структурного, індуктивного, дедуктивного, аналізу, синтезу, моделювання) дозволило досягнути виконання визначених вище теоретичних та практичних завдань дослідження.

Структура роботи. Кваліфікаційна робота складається із вступу, чотирьох розділів, висновків, списку використаних джерел, додатків. Обсяг основного тексту роботи складає 73 сторінки, 34 рисунки, 3 таблиць, 12 додатків і 24 бібліографічних джерел. Загальний обсяг роботи – 163 сторінки.

Розділ I

Стан проблемної області

Методи виявлення летких органічних сполук

Вимірювання летких органічних сполук в атмосферному повітрі

Леткі органічні сполуки складаються з різних рідких і газоподібних речовин, які шкодять здоров’ю людини і створюють забруднення повітря. Ці сполуки (леткі органічні сполуки - ЛОС) можна виявити в лабораторіях з допомогою спеціальних приладів. Вимірювання ЛОС призначене для виявлення концентрації летких органічних сполук у повітрі робочого середовища. Коли леткі органічні сполуки на основі вуглеводнів вдихаються з повітрям, вони можуть викликати багато спадкових проблем зі здоров’ям у людей.

Визначення якості повітря в бойових броньованих машинах є важливою функцією багатьох споживчих товарів (виробів), таких як автоматичні системи опалення, вентиляції і кондиціонування повітря. Ці часто крихітні давачі можуть точно виявити шкідливі леткі органічні сполуки та інші шкідливі гази, такі як CO2 (двоокис вуглецю, діоксин вуглецю, оксид карбону, вуглекислий газ).

Вуглеводні, кисневмісні сполуки, гальгеновані сполуки, сполуки сірки та азотисті сполуки ефективні в утворенні летких органічних сполук. Основними джерелами летких органічних сполук є нафта та нафтопродукти, різні розчинники, фарби, клеї, вихлопні гази та викопне паливо. При виробництві та використанні багатьох продуктів у промисловості в повітря потрапляють леткі органічні сполуки.

Концентрацію газу або речовини у визначеному об’ємі прийнято вимірювати в одиницях ppm (читають пі-пі-ем), з англійської parts per million – частинок на мільйон або мільйонна частка. Ppm є аналогічною до процентів (відсотків) або проміле.

1 ppm=0,000001=10-6=0,0001% або 0,001‰.

Наприклад, маємо суміш з масовою часткою речовини 15 ppm, тоді в 1 кг суміші будемо мати 15 мг речовини, а в 1 тонні 15 грам цієї речовини.

При об’ємних концентраціях (частинок в об’ємі) 1 ppm є 1 см3/м3 (або 1 мл/м3). Наприклад, в атмосфері Землі концентрація вуглекислого газу CO2 становить приблизно 380 ppm, тобто в 1 м3 повітря є 380 мл вуглекислого газу (~ 2 склянки). Ppm також часто називають 1 міліграм речовини приведеного до 1 м3 газу за нормальних умов. Це є правильно частково, оскільки 1 метр кубічний повітря практично дорівнює 1 кілограму, але не для довільного газу. Також, не цілком вірно вважати, що 1 ppm дорівнює 1 мг/л, це вірно частково для водних розчинів, проте є велика похибка для вуглеводнів, в яких щільність складає 0,5 – 1 кг/л.

В Україні показники вимірюють у відсотках (%) або у відношенні маси до об’єму (мг/м3). Закордоном є країни, що використовують показник ppm. Показник ppm відрізняється від відсотка тільки розмірністю. 1 ppm рівний 0,0001%, відповідно 5% = 50000 ppm.

Щоб перевести показник у відсотках або ppm в мг/м3 потрібно враховувати молярну масу газу, тиск і температуру. Формула перетворення має наступний вигляд:

(1.1)

де P - тиск, VM - молярний об’єм, R - універсальна газова стала, T – абсолютна температура в Кельвінах (не Цельсій і не Фаренгейт). В Інтернеті є онлайн-калькулятори, що дозволяють самостійно виконати розрахунок. Наприклад, CO: 5% = 50000 ppm = 57280,45 мг/м3, CO2: 5% = 50000 ppm = 90000,45 мг/м3. Дані наведено при нормальному атмосферному тиску і кімнатній температурі. В порівнянні у процентному співвідношенні CO2 майже вдвічі важчий за CO, тому що молекула CO2 має на один атом більше, звідси різниця. Через цю різницю вуглекислий газ CO2 накопичується у низинах, а чадний газ CO у стелі.

50000 ppm [CO] = 57280,45 мг/м3

Слід відзначити, що при перерахунку з об’ємних часток в % об.: 1 об. % дрівнює 10000 ppm (об.). При перерахунку рідини (наприклад 5 ppm Сu2SO2 у воді), то 1 ppm дорівнює 1 мг/дм3. Для перерахунку концентрації газу з одних одиниць вимірювання у інші використовують спеціальну таблицю з коефіцієнтами, або можна визначити коефіцієнти самостійно через молекулярну масу, газову сталу, температуру і тиск. Розрахунок за нормальних умов при T = 293,15 К і P = 101325 Н/м2 здійснюють з використанням рівняння Клапейорна - Менделєїва:

(1.2)

де P - тиск; VM - молярний об’єм; R - універсальна газова стала; T - абсолютна температура в Кельвінах. Рівняння має також другу форму наступного вигляду:

P×V=(m/M)×RT	(1.3)

де m – маса, а М – молярна маса. Оскільки ppm це одна мільйонна, то одержимо наступну формулу:

Cмг/м3=M·Сppm/(R*T/p)	(1.4)

Наприклад, для 1 ppm розрахунок СO матиме наступний вигляд:

Cмг/м3=(12+16)·10-3·1 ppm/(8,314472·293,15/101325) = 1,164 мг/м3

Перетворення з ppm в ppt матиме вигляд:

1 ppm = 1/106 = 10-6

1 ppt = 1/1012 = 10-12

Отже, 1 ppm = 106 ppt.

Число частинок на мільйон xppt є рівним числу частинок на мільйон xppm×106:

xppt = xppm⋅106

Приклад: 7 ppm дорівнює 7000 ppb: xppt = 7 ppm⋅106 = 7000000 ppt.

Табл.1.1 Перетворення показника з ppm в ppt

ppm	ppt
0,000001	1
0,00001	10
0,0001	100
0,001	1000
0,01	10000
0,1	100000
1	106
10	107
100	108
1000	109
10000	1010

Перетворення ppb в ppm: 1 ppm = 1/106 = 10-6, 1 ppb = 1/109 = 10-9. Отже, 1 ppm рівний 1000 ppb.

Число частинок на мільйон xppm є рівним числу частинок на міліард xppb поділене на 1000: xppm = xppb/1000.

Наприклад, 7000 ppb дорівнює 7 ppm: xppm = 7000 ppb/1000 = 7 ppm.

Табл.1.2 Перетворення показника з ppb в ppm

ppb	ppm
1	0,001
10	0,01
100	0,1
1000	1
10000	10
100000	100
1000000	1000

Огляд цифрових пристроїв моніторингу якості повітря фірм-виробників

Щоб визначити якісний та кількісний склад сумішей газів використовують спеціальні вимірювальні прилади, вони називаються газоаналізатори. Газоаналізатори класифікують на аналізатори ручної дії та автоматичні. До перших відносяться абсорбційні газоаналізатори, вони є найбільш поширеними і в них здійснюється послідовне поглинання компонентів газової суміші з допомогою різних реагентів [1,2].

В автоматичних газоаналізаторах виконується безперервне вимірювання будь-якої фізичної або фізико-хімічної характеристики суміші газів або її компонентів.

Автоматичні газоаналізатори безперервно вимірюють будь-яку фізичну або фізико-хімічну характеристику газової суміші або її окремих компонентів. Газоаналізатори широко використовують в різних галузях промисловості, наукових дослідженнях для аналізу газового складу. З допомогою них виконується безперервний автоматичний контроль складу газу (вмісту), який необхідний для управління хіміко-технологічними процесами одержання і використання газів у коксохімічному виробництві, металургії, нафтопереробній і газовій промисловості.

На теплоелектростанціях при спалюванні органічного палива для контролю процесу горіння та визначення необхідного надлишку повітря використовують автоматичні газоаналізатори. Важливі функції виконують також прилади аналізу газів в системах забезпечення безпечного функціонування технологічних об’єктів. Наприклад, такі газоаналізатори використовують для вимірювання концентрації водню у системах охолодження турбогенераторів, на АЕС в газодувках апаратів з радіоактивним теплоносієм тощо.

За останні роки з посиленням уваги до охорони навколишнього середовища розширилося виробництво і використання газоаналізаторів, які призначені для контролю вмісту шкідливих домішок у газових викидах промислових підприємств і електростанцій, в повітрі виробничих приміщень і атмосфері.

На рисунках нижче зображено пристрої для моніторингу якості повітря, реєстрації шкідливих газів, летких органічних сполук від різних фірм – виробників.

Рис.1.1. INKBIRDPLUS пристрій реєстрації вуглекислого газу CO2 в приміщенні, моніторингу якості, тестер для вуглекислого газу, температури і відносної вологості, монітор CO2 в приміщенні з сигналізацією. Може використовуватися в теплицях, винних погребах (сховищах), будинках, автомобілях (PTH-9C). Ціна $69,99

INKBIRDPLUS – це багатофункціональний монітор якості повітря, який може точно визначати поточну концентрацію CO2, температуру і вологість повітря. Він дозволяє оцінити якість повітря в машині. Пристрій визначає концентрацію CO2, має звукову сигналізацію. Детектор CO2 має 3 рівні концентрації CO2: нормальний рівень 400 – 700 ppm, рівень попередження 700 – 1500 ppm і небезпечний рівень 1500 – 5000 ppm. Він здатний попередити про виявлення концентрації CO2, яка перевищує встановлені користувачем безпечені значення.

Для забезпечення точності вимірювання цей детектор CO2 підтримує функцію калібрування. Калібрується він (монітор CO2) на відкритому повітрі протягом 200 секунд. В детекторі CO2 використовується давач NDIR CO2.

Всередині монітора CO2 вбудована літієва батарея ємністю 2400 мАг, що забезпечує тривале неперервне використання. Він має великий, чіткий, світлодіодний екран для зручного перегляду температури або даних.

Внутрішній вимірювач CO2 ідеально підходить для використання в теплицях, офісах, кухнях, школах, шкільних підвалах і автомобілях.

Рис.1.2. SAF Aranet4 Home: безпровідний портативний пристрій моніторнгу якості повітря в приміщенні для дому, офісу, або школи (CO2, температура, вологість і т. д.) з живленням від батареї, має екран з електронними чорнилами, ПЗ для налаштування та історії даних

Пристрій є простим у використанні, має додатково зумер, який попереджає користувача про надто високу концетрацію CO2.

В пристрої є енергоефективний дисплей з техологією електронних чорнил, що забезпечує тривалий срок служби акумулятора для цього бездротового пристрою (до 4 років). Він має програмне забезпечення для смартфона, що дозволяє переглядати і аналізувати дані за період до 14 днів і є версії для iPhone з iOS і для Android – пристроїв з Bluetooth 4.1 і вище. Пристрій використовує технологію дисперсійного інфрачервоного давача (NDIR) для більш точних і надійних вимірювань CO2.

Рис.1.3. Детектор вуглекислого газу CO2, монітор якості повітря в приміщенні 4-в-1 Портативний монітор CO2, тестер вуглекислого газу, температури і відносної вологості, вимірювач CO2 з сигналізаціє. Пристрій призначений для використання в палатках, будинках, автомобілях

В пристрої використовується вдосконалена високоточна сенсорна техологія NDIR для точного і швидкого визначення вмісту вуглекислого газу, що дозволяє точно і швидко визначити вміст вуглекислого газу, провести оцінку небезпеки при перевищенні рівня CO2 в повітрі за встановлені значення сигналу тривоги (значення сигналу тривоги 1000 ppm). Пристій попереджає, щоб нагадати присутнім в приміщенні відкрити вікно або включити очищувач повітря для підтримки балансу повітря.

Пристрій має напіпровідниковий точний і стабільний давач повітря для моніторингу якості повітря, температури і волгості 4-в-1. Пристрій є зручним для носіння, живиться від вбудованого акумулятора ємністю 1600 мАг. Пристрій може працювати безперервно приблизно протягом 8 годин після повної зарядки. Детектор є простим у користуванні після кожного включення потребує автоматичного калібрування. Для калібрування детектор потрібно помістити у вентильоване місце на 1-2 хвилини, після чого тестер CO2 можна використовувати в звичайному режимі. Діапазон вимірювання детектора CO2 становить 0 - 5000 ppm.

Пристрій моніторингу якості повітря може бути використання для виявлення газу і забруднювачів повітря в будинках, кухнях, спальнях, офісах, школах, автомобілях, готелях, подорожах, кемпінгах, на вечірках, щоб завжди захищати оточуючих в умовах здорового повітр’я.

Рис.1.4. Пристрій для моніторингу якості повітря, температури і вологості в приміщенні AcuRite (PM2,5, температура, вологість). $89

Пристрій моніторить в режимі реального часу, має індикатор якості повітря, покази поновлюються кодних 5 секунд. Має просте налаштування, живеться від електромережі через адаптер. Вимірює концентрацію твердих частинок 2,5 (PM 2.5), контролює в приміщенні пилюку, забруднюючі речовини та інші дрібні частинки, які можуть потрапити в дихальну систему. Має кольоровий РК – дисплей, що допомагає відслідковувати температуру і вологість в приміщенні з 12 – або 24 – годинним форматом часу.

Рис.1.5. AirKnight 9-в-1 портативний пристрій моніторингу якості повітря в приміщенні. Виявляє CO2, ЛОС, формальдегиді, AQI PM2.5 + 4.

Пристрій якості повітря 9-в-1 AirKnight оснащений потужними давачами, які виявляють в реальному часі 8 основних типів забруднювачів повітря: CO2, леткі органічні сполуки (ЛОС), формальдегід, AQI, частинки пилу PM2.5 і PM10 тощо. Результати вимірювань в режимі реального часу відображаються на РК – дисплеї.

Рис.1.6. Пристрій Newentor для моніторингу CO2 якості повітря, виявлення вуглекислого газу в приміщенні з голосовим оповіщенням, великим кольоровим дисплеєм. Пристрій вимірює також температуру і вологість, має будильник для дому. Діапазон виявлення (вимірювання) 400 – 5000 ppm

Пристрій має високоточний давач CO2, який створено за унікальною технологією PASens від Swiss Sensirion. Ця технологія використовує принцип фотоакустичного виявлення для виконання точних і достовірних вимірювань у широкому діапазоні областей концентрації та застосувань. Пристрій попереджає про недопустиму концентрацію вуглекислого газу. Значення попередження про концентрацію CO2 можна налаштувати, щоб зробити роботу чи виробниче середовище безпечнішими. Пристрій також в режимі реального часу моніторить температуру та вологість, які тісно пов’язані з тілом людини, рослинами чи середовищем зберігання. В пристрої є також функції годинника, календара і будильника. Пристрій має широкий діапазон застосувань – це викоритсання в сільськогосподарських насадженнях, овочевих і фруктових теплицях, виробничих складах, обробці сировини, повсякденному житті, комп’ютерних кімнатах, винних льохах, фургонах, школах, кафе тощо.

Рис.1.7. Пристрій моніторингу якості повітря. Виявляє формальдегіди, CO2 (HCHO) TVOC/AQI. Має багатофункціональний детектор газу в повітрі, запис даних і середнього значення в режимі реального часу, підходить для використання в домашньому офісі. Ціна $67,99

Пристрій має унікальну форму та дизайн, оснащений 5,5” світлодіодним цифровим дисплеєм. Ви можете безпосередньо дізнатися загальну якість навколишнього середовища та відстежувати середнє значення кожного газу, щоб знати, який газ у повітрі небезпечний, і вживати відповідних заходів.

Пристрій працює від акумуляторної батареї ємністю 2000 мАг, оснащенй одним USB-кабелем, час роботи в режимі очікування може тривати 8-10 годин. Цей пристрій моніторингу якості повітря призначений для промислового використання.

Рис.1.8. Пристрій моніторингу якості повітря в приміщенні з різними функціями. Має точний тестер CO2, формальдегідів HCHO, TVOC, PM2.5. Пристрій має моживість запису даних і середнього значення в режимі реального часу

Пристрій представляє собою багатофункціональний монітор якості повітря і є доступним для 8 типів даних. Він контролює загальну якість повітря, здатний виявляти формальдегід (HCHO), леткі органічні сполуки (TVOC), тверді частинки (PM2.5), вимірює температуру (⸰C) і вологість (%). Пристрій калібрується автоматично, для цього його потрібно розмістити принаймі на 1 годину у вентильоване середовище. Пристрій має великий цифровий кольоровий, читабельний РК – дисплей. На дисплеї відображається індикатор забруднення: нема забруднення (добре – зелений колір), слабке забруднення (жовтий колір), помірне забруднення (червоний колір) і сильне забруднення (фіолетовий колір). Пристрій дає змогу дізнатися загальну якість навколишнього середовища, відстежити середнє значення кожного газу, виявити шкідливі речовини HCHO та TVOC в режимі реального часу, щоб вжити відповідних загодів при перевищенні їх гранично-допустимих значень. Детектор має кольорову і звукову сигналізації. При перевищенні норми на дисплеї індикатор змінює колір і чути звуковий сигнал тривоги. Детектор якості повітря живеться від вбудованого літієвого акумулятора ємністю 1500 мАг, що може забезпечити автономну роботу протягом 4 – 5 годин.

Рис.1.9. Пристрій для вимірювання вуглекислого газу CO2, вологості, температури, виявлення загальної кількості летких органічних сполук (TVOC) і формальдегідів (HCHO). Ціна $ 41,58

Детектор якості повітря виявляє в навколишньому середовищі TVOC, моніторить і відображає в режимі реального часу концентрацію вуглекислого газу на кубічний метр, визначає і відображає температуру і вологість навколишнього сердовища.

Рис.1.10. Детектор якості повітря в приміщенні VOC-21. Визначає рівень забруднення повітря IAQ в діапазоні 0 ~ 50 ppm, вимірює температуру, вологість. Пристрій підходить лоя використання в машинах.

Пристрій призначений для виявлення шкідливих газів з допомогою напівпровідникового давача, має налаштування управління через релейний вихід для автоматизації вентиляційного обладнання, очищувача повітря та інших пристроїв припливного повітря для підтримки хорошої якості повітря в приміщенні. Крмі того, пристрій має звуковий сигнал, що з’являється при перевищенні виміряного значення 25 ppm. Давач пристрою є чутливим не лише до летких органічних сполук, таких як толуол і формальдегід, з продуктів обивки деревини і будівельних матеріалів, а також до чадного газу, спирту, дезінфекуючих засобів та іншим забруднювачам повітря, таким як цигарковий дим, аміак, сірководень, що дозволяє його використовувати для моніторингу якості повітря всередині приміщення. Детектор можна використовувати в домашньому і офісному середовищі (спальня, гостьова, кабінет і столова, дитячий садік, класна кімната, автомобіль, ресторан та інші громадські місця).

Рис.1.11. DRNKS вимірювач CO2, моніторнг якості повітря в приміщенні, сигналізція, РК – дисплей, цифровий давач температури і вологості, вуглекислого газу. Ціна $171,35

Пристрій моніторить якість повітря в приміщенні, має вбудовану літієву батарею 2000 мАг для довготривалої роботи, USB – кабель для зарядки. Має хорошу точність, великий РК – дисплей, NDIR (давач з не дисперсійним інфрачервоним випромінюванням) давач. Має перемикач одиниць вимірювання температури між градусами Цельсія і Фаренгейта, - 24 годинний моніторинг в режимі реального часу. Пристрій моніторить і визначає рівень CO2, температуру і вологість бойових броньованих машинах.

Розділ II

Засоби розробки цифрового пристрою моніторингу якості повітря в бойових броньованих машинах

2.1.	Система автоматизованого проектування та моделювання електронних схем Proteus Design Suite

Proteus Design Suite [12] є потужною системою автоматизованого проектування та моделювання різних аналогових і цифрових пристроїв. Proteus Design Suite дає змогу виявити помилки ще на етапах проектування і трасування. Програмне забаезпечення має два модулі ISIS та ARES. Модуль ISIS представляє собою редактор електронних схем з можливістю подальшої симуляції їх роботи. Модуль ARES – це редактор друкованих плат з автотрасувальником Electra, вбудованим редактором бібліотек, автоматичною системою розміщення компонент на платі і підмодулем тривимірної візуалізації друкованої плати.

Proteus Design Suite містить понад 6000 електронних компонентів з довідковими даними, а також приклади демонстраційних проектів для ознайомлення. Вона має інструменти USBCONN та COMPIM, з допомогою них можна підключити віртуальний пристрій до USB і COM - портів комп’ютера. Якщо будь-який зовнішній прилад підключити до цих портів, то віртуальна схема буде працювати з ним, як нібито вона реально існує. В Proteus є підтримка багатьох компіляторів, таких як: HiTECH (8051, Microchip PIC) і Keil (8051, ARM), WinAVR (AVR) і CodeVisionAVR, ICC (AVR, ARM7, Motorola). Програмне забезпечення також дозволяє експортувати з програми PSpice моделі електронних компонент.

Програма дозволяє спроектувати пристрій навіть з декількома мікроконтролерами різних виробників, але, потрібно мати на увазі, що симуляція не дозволяє абсолютно точно відтворити роботу реального пристрою. Proteus є комерційним програмним забезпеченням компанії Labcenter Electronics. Демонстраційну версію можна безкоштовно завантажити з сайту Labcenter Electronics: (https://www.labcenter.com/­downloads/). В ній є всі функції і можливості платного програмного забезпечення, але вона не дозволяє зберігати або роздруковувати результати роботи.

Рис.2.1. Середовище Proteus ISIS

2.2.	Середовище розробки скетчів - Arduino IDE

Arduino IDE є офіційним безкоштовним середовищем, яке дозволяє розробляти свої власні програми для Arduino – сумісних плат. В цьому середовищі можна писати, компілювати і завантажувати програми (в Arduino вони називаються скетчі) у мікроконтролер плати Arduino. Середовище для програмування мікроконтролерів Arduino використовує власну версію мови C/C++, яка доповнена додатковими функціями. З офіційного сайту Arduino https://www.arduino.cc/en/software можна завантажити останню версію середовища Arduino IDE для різних операційних систем, таких як Windows, Linux і macOS. На теперішній час останньою версією є Arduino IDE 2.0.0.

Рис.2.2. Середовище розробки скетчів для мікроконтролерів Arduino – сумісних плат - Arduino IDE

Налаштування середовища Arduino IDE

Середовище Arduino IDE має редактор програмного коду, область повідомлень, вікно текстового виводу, інструментальну панель з кнопками для доступу до найвживаніших команд та декілька меню.

Arduino - програма називається скетч. Для написання скетчу є текстовий редактор з колірною підсвіткою програмного коду. При зберіганні або експорті проекту в області повідомлень середовища Arduin IDE виводяться інформація про помилки та пояснення. У вікні текстового виводу Arduino IDE виводить повідомлення зі звітами про помилки та іншою супровідною (додатковою) інформацією. З допомогою кнопок на інструментальній панелі можна швидко сторити новий, відкрити і зберегти скетч, перевірити і завантажити скетч в плату Arduino. Функціонал скетча можна розширити з використанням додаткових бібліотек. Бібіліотеки представляють спеціально оформлений код, що реалізує потрібний функціонал і може бути включений у скетч. На сьогоднішній день є велике різноманіття спеціалізованих бібліотек. Як правило, бібліотеки створюють для вирішення того чи іншого завдання, вони дозволяють сховати від розробника деталі реалізації апартного і програмного забезпечення.

Середовище Arduino IDE має стандартні бібліотеки [13, 14] Serial, EEPROM, SPI, Wire та інші, які встановлюютья в підкаталозі libraries каталогу Arduino. Додаткові бібліотеки з потрібним функціоналом можна завантажити з різних Інтернет - ресурсів. Каталог бібліотеки копіюють в каталог зі стандартними бібліотеками (підкаталог libraries каталогу інстальованого Arduino). У каталозі бібліотеки є заголовний файл *.h і файл з вихідним кодом *.c,/*.cpp. В багатьох бібліотеках можна знайти приклади її використання в різних проектах, які знаходяться в каталозі examples. Після вдалого встановлення бібліотеки, вона має появитися в меню Sketch | Include Library. Щоб додати бібліотеку у скетч потрібно в меню її вибрати, тоді в коді програми з’явиться рядок #include <назва_бібліотеки.h>. З допомогою цієї директиви підключається заголовочний файл бібліотеки, що може містити опис її об’єктів, функцій та констант, які доступні для використання у скетчі. Середовище Arduino IDE скомпілює скетч разом з підключеню бібліотекою.

Для завантаження скетча в мікроконтролер плати Arduino необхідно в меню Сервіс|Плата (Tools|Board) вибрати тип плати і Сервіс|Послідовний порт (Tools|Serial Port) COM - порт до якого вона підключена (її підключення). Сучасні плати Arduino виконують автоматичне перезавантаження перед завантаженням скетча. В старих платах Arduino потрібно було натискати кнопку перезавантаження. В більшості плат Arduino протягом завантаження програми (скетча) блимають світлодіоди (RX і TX). Cпеціальна програма, яка називається bootloader, використовується для завантаження скетча в плату Arduino. Bootloader знаходиться в флеш - пам’ятті мікроконтролера плати Arduino і дозволяє завантажувати вихідний код скетча без застосування додаткових програматорів. Роботу bootloader’а можна розпізнати по блиманню світлодіода підключеного до піна D13 плати Arduino.

В середовищі Arduino IDE є утиліта - монітор послідовного порта (Serial Monitor), яка має два призначення. Перше призначення – це отримання даних з плати Arduino і вивід їх на екран (використовується, зазвичай, для відладки і моніторингу). Друге призначення – це відсилання даних (команд) з комп’ютера до Arduino. Обмін даними між монітором послідовного порта і Arduino здійснюється через USB – кабель, який також використовується для завантаження коду Arduino. Щоб відправити дані спочатку потрібно зі списку вибрати швидкість передачі, що відповідає значенню Serial.begin в скетчі, а потім ввести у відповідне поле текст і натиснути кнопку Send або клавішу [Enter]. В операційних системах macOS і Linux при підключенні монітора послідовного порта плата Arduino буде перезавантажена (виконання скетчу почнеться спочатку).

Структура Arduino - скетча. Функції setup() і loop().

Скетч Arduino складається щонайменше з двох обов’язкових функцій setup() і loop(). Перед функцією setup() оголошують змінні, підключають потрібні бібліотеки. Виконання функції setup() відбувається тільки один раз відразу після включення або скидання плати Arduino. У функції setup() проводять ініціалізацію змінних, виставлення режимів роботи портів та інших підготовчих дій до запуску головного циклу скетча. Вона є обов’язковою в програмі, навіть якщо в ній нема виконання жодних команд. Функція loop() реалізує нескінченний цикл скетча. Вона виконує послідовно команди, що є в її тілі. Виконання цієї функції повторюється до тих пір, поки на плату Arduino подано живлення. В ній виконується основна робота скетча.

Розділ III

Апаратне забезпечення цифрового пристрою моніторингу якості повітря в бойових броньованих машинах

3.1	Огляд електронних комплектуючих для проектування цифрового пристрою моніторингу якості повітря в бойових броньованих машинах

Для проектування цифрового пристрою моніторингу якості повітря в приміщенні вибрано наступні комплектуючі:

Плата Arduino Uno R3 на мікроконтролері ATmega328P-PU;

символьний LCD – модуль 1602 на контролері HD44780;

цифровий давач якості повітря в приміщенні (IAQ) CCS811;

цифровий давач температури і вологості SHT31-D;

4 двохконтактні кнопки на 4 виводи.

Огляд платформи Arduino Uno R3

В теперішній час на ринку електронних комплектуючих можна знайти різні мікроконтролери та платформи на їх основі, які відрізняються архітектурою, швидкодією, енергоспоживанням, областю застосування і ціною. Однією з найдоступніших і простих для освоєння є мікроконтролерна платформа Arduino.

Arduino є відкритою платформою, яка складається з двох частин: самої плати (часто називають мікроконтролером) і програмного забезпечення (спеціального середовища для програмування плати) або IDE (Integrated Development Environment). Програмне забезпечення запускається на персональному комп’ютері і дозволяє записувати розроблений код в мікроконтролер плати. Arduino отримала особливо сильну популярність серед людей, які починають займатися електронікою. На це є декілька причин. На відмінну від більшості попередників, Arduino не потребує додаткового обладнання (програматора) для завантаження коду в плату. Arduino використовує стандартизований форм фактор для більшості своїх плат, завдяки чому з’явився цілий комплект додаткових модулів “шилдів”.

На платі розміщенні наступні виводи живлення:

VIN – напруга, яка надходить до Arduino безпеосердньо від зовнішнього джерела живлення (не зв’язано з 5В від USB або іншою стабілізованою напругою). Через цей вивід можна подавати зовнішнє живлення, так і споживати струм, якщо пристрій живиться від зовнішнього адаптера.

5V – на вивід надходить напруга 5 В від стабілізатора напруги на платі, незалежно від того як заживлено пристрій: від адаптера (7-12В), від USB (5В) або через вивід VIN (7-12В). Заживлювати пристрій через виводи 5V або 3V3 не рекомендують, оскільки в цьому випадку не використовується стабілізатор напруги, що може призвести до виходу плати з ладу.

3V3 - напруга 3,3В, яка надходить від стабілізатора напруги на платі. Максимальний струм, який може споживатися з цього вивода, становить 50 мА.

GND - виводи землі.

IOREF – цей вивід надає платам розширення інформацію про робочу напругу мікроконтролера Arduino. В залежності від напруги, зчитаної з вивода IOREF, плата розширення може переключитися на відповідне джерело напруги або задіяти перетворювачі рівнів, що дозволить їй працювати як з 5В, так і з 3,3В – пристроями.

Пам’ять в Arduino Uno R3

Об’єм флеш - пам’яті ATmega328 становить 32 КБ (з них 0,5 КБ використовуються завантажувачем (bootloader’ом) ). Мікроконтролер також має 2 КБ пам’яті SRAM і 1 КБ EEPROM (з якої можна зчитувати і записувати інформацію з допомогою бібліотеки EEPROM).

Входи і виходи плати Arduino Uno R3

З використанням функцій pinMode(), digitalWrite() і digitalRead() кожний з 14 цифрових виводів може працювати як вхід або вихід. Рівень напруги на вивдах обмежений 5В. Максимальний струм, який може відавати або споживати один вивід, становить 40 мА. Всі виводи спряжені з внутрішніми підтягуючими резисторами (за замовчуванням відключені) номіналом 20-50 кОм. Крім цього, деякі виводи Arduino можуть виконувати додаткоів функції.

Комунікації плати Arduino R3

Arduino Uno має ряд можливостей для здійснення зв’язку (підключення) з комп’ютером, ще однією Arduino або іншими мікроконтролерами [15]. В ATmega328 є прийомопередавач UART, що дозволяє здійснювати послідовний зв’язок через цифрові виводі 0 (RX) і 1 (TX). Мікроконтролер ATmega16U2 на платі забезпечує зв’язок прийомопередавача з USB – портом комп’ютера, і при підключенні до комп’ютера дозволяє Arduino розпізнаватися як віртуальний COM – порт. Прошивка мікросхеми ATmega16U2 використовує стандартні драйвери USB-COM, тому встановлювати зовнішні драйвера непотрібно. На платформі Windows необхідним є тільки відповідний .inf – файл. В пакет програмного забезпечення Arduino входить спеціальна програма, що дозволяє зчитувати і відправляти до Arduino прості текстові дані. При передачі даних через мікросхему – перетворювач USB-UART протягом USB – підключення з комп’ютером, на платі будуть блимати світлодіоди RX і TX. При послідовній передачі даних через виводи 0 і 1, без використання USB-перетворювача, дані світлодіоди незадіяні.

Бібліотека SoftwareSerial дозволяє реалізувати послідовне підключення на буд-яких цифрових виводах Arduino Uno. В мікроконтролері ATmega328 також реалізована підтримка послідовних інтерфейсів I2C (TWI) і SPI. В Arduino IDE входить бібліотека Wire, що дозволяє спростити роботу з шиною I2C. Для роботи з шиною SPI використовується бібліотека SPI.

Захист USB – порта від перевантажень

В Arduino Uno є відновлювальні запобіжники, що захищають USB - порт комп’ютера від короткого замикання і перевантажень. Не дивлячись на те, що більшість комп’ютерів мають власний захист, такі запобіжники забезпечують додатковий рівень захисту. Якщо від USB – порта споживається струм більше 500 мА, запобіжник автоматично розірве з’єднання до усунення причин короткого замикання або перевантаження.

Фізичні характеристики плати Arduino Uno R3

Максимальна довжина і ширина друкованої плати Uno становить 6,9 і 5,4 см відповідно, з врахуванням роз’єма USB і роз’єма живлення, які виходять за межі плати. Чотири отвори кріплення дозволяють закріпляти плату до поверхні або корпусу. Відстань між цифровими виводами 7 і 8 не кратна традиційним 2,54 мм і складає 4 мм.

Опис цифрового давача якості повітря в бойових броньованих машинах CCS811

Для розробки пристрою вимірювання параметрів якості повітря потрібним є надійний з хорошими технічними характеристиками давач якості повітря. Одним з таких давачів є давач якості повітря CCS811 від AMS AG (ScioSense).

CCS811 – це цифровий давач газу з низьким енергоспоживанням, що має інтегрований давач газу на основі окислу металу (MOX) для виявлення широкого спектру летких органічних сполук (ЛОС) та моніторингу якості повітря в бойових броньованих машинах.

Давач CCS811 (Додаток 2) підтримує декілька режимів, такі як виявлення (вимірювання) кожну секунду, кожних 10 секунд, кожну хвилину, кожних 250 мс і режим сну. Ці режими оптимізовані для низького енергоспоживання при вимірюванні давача, тому давач CCS811 також підходить для використання у портативних пристроях.

CCS811 підтримує інтелектуальні алгоритми обробки вимірювань давача, що визначають еквівалентні значення загальної кількості летючих органічних сполук (eTVOC) і еквівалентні значення CO2 (eCO2), коли основною причиною утворення летких органічних сполук є люди.

CCS811 доступний в корпусі LGA з 10 виводами 2,7 мм x 4,00 мм x 1,1 мм і кроком 0,6 мм.

Розміщення виводів модулів давача якості повітря CCS811 та їх призначення представлена в Таблиці, додаток 2.

Давач CCS811 є одним з кращих цифрових давачів газу для точного моніторингу якості повітря з використанням Arduino, STM32, Raspberry Pi і т.д.. Модуль давача CCS811 має невелекий розмір, широкий діапазон і високу роздільну здатність.

Давач призначений для відстеження якості повітря в приміщенні в персональних пристроях, такі як розумні годинники, телефони, для легкого доступу кращим є модуль CJMCU-811, щоб можна було його використовувати як стандартний пристрій I2C.

Ця мікросхема давача може бути в основному використана в обладнанні для моніторингу якості повітря в бойових броньованих машинах, системи автоматизації будинку і будівель.

Рис.3.1. Машина станів давача CCS811

Стани живлення

На попередній діаграмі показано, що якщо давач CCS811 включений (On), то він може знаходиися в декількох функціональних станах (наприклад App з Mode1s). Також якщо давач CCS811 увімкнений (On), він може бути в декількох станах живлення. На наступному рисунку показано стани живлення.

Рис.3.2. Стани живлення давача CCS811

До тих пір поки давач CSS811 має роботу, наприклад, обробка транзакцій I2C від ведучого пристрою (master), виконання вимірювань або запуск алгоритмів перетворення вимірювання у значення eCO2/eTVOC, давач є занятим (Busy). Якщо вимірювання дозволені, таймер запущений (термін дії витікає кожних 1, 10, 60 або 0,25 секунди), але запуск таймера не важається роботою давача.

Коли нема роботи, стан живлення переходить з стану зайнятості (Busy) в стан очікування (Idle) або стан сну (Sleep), в залежності від стану вивода nWake. При високому логічному рівні на виводі (піні) nWake, ведучий пристрій виконує запит режиму сна (Sleep mode), при низькому логічному рівні на виводі nWAKE, давач CCS811 залишається прокинутим (Wake), але бездіяльним (Idle).

В режимі очікування (Idle mode) може появитися робота, або транзакція I2C від ведучого пристрою (хоста, master), або закінчення часу таймера, запуск вимірювання (за яким слідує крок алгоритму).

В режимі сну (Sleep mode) CCS811 не готовий до обробки транзакцій I2C. Ведучий пристрій (master) повинен спочатку перевести вивід nWAKE в низький рівень, що приведе до переходу давача CCS811 в режим пробудження (Wake) (очікування Idle). Таймер може бути запущений, коли він закінчиться, він також приведе до переходу давача CCS811 в режим пробудження (Wake), але як зайнятий (Busy).

Режими роботи давача CCS811

Давач CCS811 має 5 наступних режимів роблти:

Режим 0: очікування (Idle), режим малого струму, низького енергоспоживання.

Режим 1: режим постійної роботи (constant power mode), вимірює якість повітря (IAQ – indoor air quality) в бойових броньованих машинах кожну секунду.

Режим 2: Імпульсний режим нагрівання, вимірювання якості повітря в бойових броньованих машинах кожних 10 секунд.

Режим 3: Режим імпульсного нагрівання з низьким (малим) енергоспоживанням. Вимірювання якості повітря в бойових броньованих машинах кожні 60 секунд.

Режим 4: режим постійної потужності (повної потужності). Давач виконує вимірювання кожні 250 мс. В режимах 1, 2, 3 еквівалентна концентрація CO2 (ppm) і концентрація eTVOC (ppb) розраховуються для кожного заміру (вимірювання).

eCO2. Вихідний діапазон еквівалентного CO2 (eCO2) для CCS811 становить від 400 до 29206 ppm.

eTVOC. Діапазон еквівалентної загальної кількості летких органічних сполук (eTVOC) для CCS811 складає від 0 до 32768 ppb (частинок на міліард).

Компенсація температури і вологості

Якщо доступним є зовнішній давач температури і вологості, то інформація про навколишню температуру і вологість з нього може бути записана у давач CCS811, щоб використати її для компенсації показів газу через зміну температури і вологості [18, 19, 20]. Після запису регістра ENV_DATA, наступні покази вимірювання eCO2 і eTVOC (в регістрі ALG_RESULT_DATA) можуть ще не використовувати останні дані з ENV_DATA. Всі наступні покази будуть використовувати ALG_RESULT_DATA. Регістр ENV_DATA (дані про навколишнє середовище) 0x05.

Переривання готовності даних і порогове переривання

В кінці кожного циклу вимірювання (250 мс, 1 с, 10 с, 60 с) встановлюється прапорець і додатково може бути активований вивід переривання (nINT) (регістр MEAS_MODE).

Користувач може активувати nINT тільки в тому випадку, якщо значення eCO2 переходять в інший діапазон, який встановлено значенням в регістрі THRESHOLDS (0x10). Регістр THRESHOLDS (0x10).

Рис.3.3. Рекомендована схема включення мікросхеми давача CCS811

Сигнали PWM (вивід 4) і Sense (вивід 5) на CCS811 мають бути з’єднані разом. Конденсатор розв’язки має бути розміщенй рядом з виводом (контактом) живлення VDD на давачі CCS811. Величина (значення) підтягуючих резисторів для ліній SCL і SDA залежить від конфігурації хост-системи (необхідна (визначеної, бажаної) швидкість, довжина шина, кількість ведучих пристроїв тощо). Якщо живлення не являється проблемою, вивід nWAKE (nWake) можна підключити до землі, якщо на хост-процесорі нема запасного GPIO. Вивід ADDR має бути підключений до VDD (лог. 1), або до землі (лог. 0) в залежності від потрібного молодшого біта адреси підлеглого пристрою I2C CCS811.

Вимоги до програмного забезпечення хост-системи

Мінімальний рівень підтримки драйвера, який потрібний хост-системі – це транзакція читання і запису байтів даних I2C, в якій вивід nWAKE встановлюється як мінімум на час tAWAKE перед транзакцією і залишається активним протягом всього часу. Також рекомендовано використовувати обробник переривань, щоб повідомляти коду програми, що пристрій згенерував (повідомив про переривання) переривання.

Інтерфейс I2C

Транзакції I2C потребують вибору (запису) адреси регістра, за якою слідують дані, як описано для типів транзакцій в підрозділах нижче. Кожне розміщення регістра (кожна комірка регістра) відповідає байту або декільком байтам. Декілька операцій читання або запису в одній послідовності будуть здійснюватися (виконуватися) в одне і те саме місце або з нього (адреса не збільшується). Тому, в цьому документі регістри інколи називають поштовими ящиками.

CCS811 потребує, щоб хост-процесор (мікроконтролер) підтримував розтяг тактової частоти.

Рис.3.4. I2C запис регістра

Write, register address only – Запис тільки адреси регістра. Write value to register – Запис значення в регістр. Write multiple data values to register (mailbox) – Запис декількох значень даних в регістр (mailbox – поштовий ящик).

Як показано вище на рисунку транзакція може складатися з:

Одного байту, щоб вибрати адресу регістра для подальшого зчитування (читання),

Двох байтів для вибору адреси регістра і запису в нього байта, зазвичай для встановлення значення однобайтового регістра.

Декількох байтів, щоб вибрати адресу регістра і записати в нього декілька байтів, зазвичай (типово) для встановлення декількох байтів конфігурації.

Рис.3.5. I2C запис регістра

Select and read register value – Вибрати і прочитати значення регістра.

Select and read register value, as single transaction – Вибрати і прочитати значення регістра як одна транзакція.

Select and repeatedly read multiple data values from register – Вибрати і повторно прочитати декілька значень даних з регістра.

Оскільки адреса регістра не може бути надана під час читання по шині I2C, тому на початку має бути доданий (потрібно виконати) I2C – запис для вибору потрібного регістра. Операції запису і читання можуть бути додатково об’єднанні в одну (єдину) транзакцію з використанням умови повторного запуску, як показано вище на Рис.

Карта регістрів давача CCS811

Всі транзакції I2C повинні використовувати (7-бітну) підлеглу адресу 0x5A або 0x5B в залежності від стану виводу ADDR при запису і читанні з CCS811. В додатку 3 показано карту регістрів CCS811. На Рис. показано карту регістрів завантажувача.

Кількість байтів, прочитаних з регістра, не повинно перевищувати розмір в цій таблиці. Додаткові відомості (додаткова інформація) щодо вимог до програмування CCS811 наведено в документації по застосуванню AMS AN000369.

Регістр стану (STATUS регістр 0x00)

Однобайтовий регістр тільки для читання, що показує чи активним є пристрій, чи доступними є нові дані, або чи виникла помилка.

Рис.3.6. Регістр стану (STATUS регістр)

Регістр MEAS_MODE (регістр вимірювання і умов)

Регістр MEAS_MODE є однобайтовим регістром з адресою 0x01, який використовується для встановлення режиму роботи давача і переривань.

Рис.3.7. Регістр режиму вимірювання (MEAS_MODE регістр)

Регістр ALG_RESULT_DATA (дані результатів алгоритму). Адреса регістра 0x02.

Регістр ALG_RESULT_DATA - це багатобайтовий регістр тільки для читання, що містить обчислені значення eCO2 (ppm) і eTVOC (ppb), за якими слідують (знаходяться) регістри STATUS, ERROR_ID і RAW_DATA.

Якщо потрібним є тільки значення eCO2, то достатньо прочитати тільки перших 2 байти.

Якщо потрібне значення eTVOC, то необхідно прочитати 4 байти. В системі, в якій не реалізовані переривання і хосту (ведучому пристрою) необхідно опитати регістр STATUS, щоб визначити чи є нові дані, ефективною альтернативою є читання 5 байтів в одній транзакції, оскільки вона поверне значення eCO2, eTVOC і регістру стану.

При бажанні, всі 8 байтів можуть бути прочитані за одну транзакцію, так щоб були доступними навіть статус помилки і неопрацьовані дані (покази давача).

Рис.3.8. Порядок байтів регістру результатів алгоритму

Регістр RAW_DATA (0x03)

Регістр RAW_DATA - це двохбайтовий регістр RAW_DAT тільки для читання, який містить останні покази давача. Старші 6 біт байта 0 містять значення струму через давач (від 0 мкА до 63 мкА). Молодші 10 біт містять (обчислені з АЦП) покази напруги на давачі при заданому (вибраному) струмі (1023 = 1,65 В).

Рис.3.9. Порядок байтів в регістрі (регістра) RAW_DATA

Регістр ENV_DATA (дані середовища) (0x05)

Регістр ENV_DATA є багатобаштовим регістром, в який можна записати поточні значення вологості і температури, якщо вони відомі.

Рис.3.10. Поля відносної вологості та порядок байтів регістра ENV_DATA

Вологість зберігається у вигляді 16 біт без знаку (16 бітного беззнакового числа) з відносною вологістю (крок відносної вологості 0,001953125% RH) 1/512%RH. Значення за замовчуванням: 50% = 0x64, 0x00. Наприклад, вологість 48,5% буде рівню 0x61.

Рис.3.11. Поля температури та порядок байтів в регістрі ENV_DATA

Температура зберігається у вигляді 16-бітного цілого числа без знаку з кроком 1/512 градуса (°C). Є зміщення: 0 відповідає -25 °C. Значення за замовчуванням: 25 °C = 0x64, 0x00. Наприклад, температура 23,5 °C буде рівною 0x61, 0x00.

Внутрішній алгоритм використовує значення ENV_DATA (або значення за замовчуванням, якщо вони не встановлені програмою) для компенсації змін відносної вологості і темпеарутри навколишнього середовища.

Для температур нижче -25 °C в 7-бітному полі температури в Byte 2 (Байті 2) повинно бути встановлені всі біти в нулі.

Регістр THRESHOLDS (0x10)

Якщо в регістрі режиму (Mode register) встановлено переривання при зміні порогу, то значення в цьому багатобайтовому регістрі тільки для запису використовуються для визначення порогів.

Рис.3.12. Порядок байтів в регістрі порогових значень THRESHOLDS

Молодший байт

Переривання встановлюється, якщо значення eCO2 переміщується (переходить) з поточного діапазоу (Низький (Low), Середній (Mediun), або Високий (High)) в інший діапазон більше ніж на 50 ppm (частинок на мільйон).

Низький і середній поріг за замовчуванням = 1500 ppm = 0x05DC. Від середнього до високого порогу за замовчуванням = 2500 ppm (частинок на мільйон) = 0x09C4

Регістр базової лінії BASELINE (0x11)

Двобайтовий регістр читання/запису, який містить закодовану версію поточного базового рівня (базової лінії), що використовується в обчисленях аолгритму.

Раніше збережене значення може бути назад записане в цей двобайтовий регістр. Алгоритми будуть використовувати нове значення в своїх обчисленнях (до тих пір, поки воно не буде скоректоване як частина його внутрішньої автоматичної корекції базової лінії). Додаткову інформацію можна отримати з ams AN000370: CCS811 Clean Air Baseline Save and Restore.

Регістр HW_ID (ідентифікатор пристрою). Адреса регістра 0x20.

Однобайтовий регістр тільки для читання, який містить ідентифікатор пристрою, що дорівнює 0x81 для цього сімейства пристроїв CCS81x.

Регістр HW_Version (версія виробу – версія пристрою). Адреса регістра 0x21.

Однобайтовий регістр тільки для читання, який містить основну і додаткову версії виробу. Верхні чотири біта зчитують основну версію виробу (пристрою) 1 - ідентифікуючи виріб як CCS811. Нижні чотири біта ідентифікують будь-який варіант виробу. Значення за замовчуванням – 0x1X.

Регістр FW_Boot_Version (Версія завантажувача прошивки). Адреса регістра (0x23).

Регістр FW_Boot_Version є двобаштовим регістром, що містить версію завантажувальника (загружчика) прошивки (мікропрограми), яка зберігається в CCS811, в форматі Major.Minor.Trivial.

Рис.3.13. Формат версії загружчика (завантажувальник) прошивки (мікропрограми)

Регістр FW_App_Version (версія програмної прошивки (мікропрограми)). Адреса регістра 0x24

Регістр FW_App_Version - це двобайтовий регістр для читання, який містить версію програмної прошивки (мікропрограми), яка зберігається в CCS811 у форматі Major.Minor.Trivial. FW_App_Version буде читати FFFF, якщо нема програмної прошивки (мікропрограми), Рис..

Рис.3.14. Формат версії програмної прошивки (мікропрограми)

Регістр ERROR_ID (ідентифікатор помилки). Адреса регістра (0xE0).

Якщо біт ERR[0] регістра STATUS встановлено, то цей однобайтовий регістр тільки для читання покаже джерело (джерела) помилки.

Регістр SW_RESET (0xFF)

В якості альтернативи скидання при включенні (подачі живлення на давач) давача або апаратному скиданню є доступним програмне скидання. Встановлення SW_RESET перезапустить CCS811 в режим завантаження (Boot Mode), щоб дозволити завантаження нової програмної прошивки (мікропрограми).

Щоб запобігти випадковому програмному скиданню SW_RESET, потрібно в цей регістр записати послідовність з чотирьох байтів в одній I2C – послідовності: 0x11, 0xE5, 0x72, 0x8A.

CCS811 Bootloader Register Map

Всі транзакції на шині I2C повинні використовувати (7-бітний) підлеглу адресу (адресу підлеглого пристрою) 0x5A або 0x5B в залежності від стану контакта (виводу) ADDR при запису або читанні з CCS811. В Табл. Додаток 3 показано карту регістрів загружчика (завантажувача) для CCS811.

Регістр APP_ERASE (програмне стирання) (0xF1).

Для запобігання випадкового APP_ERASE в цей регістр необхідно записати послідовність з чотирьох байтів в одній послідовності I2C: 0xE7, 0xA7, 0xE6, 0x09.

APP_ERASE може зайняти різну кількість часу. Регістр стану можна опитувати, щоб визначити, коли ця функція завершена. Шостий біт (0x40) ініціалізується рівним 0 і встановлюється рівним 1 по завершенню функції APP_ERASE. Після стирання цей біт очищається тільки шляхом скидання або запуском програми.

Регістр APP_DATA (0xF2)

Дев’ятий байтовий регістр тільки для запису для відправки невеликих фрагментів даних програми, які будуть записані в код флеш-пам’яті CCS811.

Регістр APP_VERIFY (0xF3)

Однобайтовий регістр тільки для запису, який запускає процес перевірки програми, запускається завантажувачем для перевірки повного образу коду програми. Команду необхідно викликати тільки один раз після завантаження прошивки, так як результат зберігається у флеш-пам’яті, яка перевіряється під час ініціалізації пристрою.

APP_VERIFY може зайняти різний час. Регістр стану може бути опитаний, щоб визначити, коли ця функція завершена. П’ятий біт (0x20) ініціалізується рівним 0 і встановлюється рівним 1 по завершенню функції APP_VERIFY. Після APP_VERIFY цей біт очищається тільки при скиданні або запуску програми.

Регістр APP_START (0xF4)

Щоб змінити режим CCS811 з режиму завантаження на запуск програми, потрібен однобайтовий запис 0xF4. CCS811 інтерпретує це як запис адреси для вибору регістра APP_START і запускає завантажене прикладне програмне забезпечення, якщо воно є допустимою версією (див. регістр STATUS (0x00)).

Раніше з метою оцінки якості повітря TOVC застосовували давачі CO2: спочатку обчислювали концентрацію вуглекислого газу CO2, а далі визначали TVOC. Традиційні давачі CO2 є нечутливими до паління, побутової хімії, засобів для чищення, лакофарбових матеріалів та іншої парфумерії. Давач якості повітря CCS811 обчислює концентрацію летких органічних речовин (сполук) (TVOC), а тільки потім обчислює еквівалентне значення вуглекислого газу (eCO2): еквівалентне, оскільки кількість вуглекислого газу (CO2) визначається розрахунковим шляхом з концентрації летких органічних сполук (речовин) (TVOC). Давач CCS811 здатний виявляти спирти, альдегіди, кетони, органічні кислоти, аміни, аліфатичні і ароматичні вуглеводні.

В наступних таблицях (Табл.3.1 – 3.2) наведено вплив двоокису вуглецю (вуглекислого газу) CO2 і летких органіних сполук TVOC на організм людини.

Табл.3.1. Вплив різної концентрації CO2 (вуглекислого газу) на організм людини

Концентрація вуглекислого газу (ppm)	Вплив на людину
< 500	нема впливу
500-1000	некомфортно, незручно, (каламутне повітря)
1000-2500	втомленість, відчуття сонливості
2500-5000	шкідливо для людського організму
> 5000	токсичний

Табл.3.2. Вплив концентрацій TVOC (летких органічних сполук) на організм людини

Концентрація TVOC (ppb)	Вплив на людину
< 50	нема впливу
50-750	некомфортно, нервозний стан
750-6000	некомфортно, нервозний, депресивний стан, головна біль
> 6000	головна біль, неврологічні проблеми

Опис цифрового давача температури і вологості SH31-D

SHT3x-DIS – це нове покоління давачів температури і вологості від компанії Sensirion. Нова серія цифрових давачів вологості SHT3x піднімає сенсорну технологію на новий рівень. Як наступник серії SHT2x, він визначає наступний промисловий стандарт у вимірюванні вологості. Давач SHT3x створено на абсолютно новому сенсорному чіпі CMOSens®, що має підвищену надійність та покращені технічні характеристики (Рис.3.19). Він має покращену обробку сигналу, дві унікальні на вибір користувача I2C адреси, режим оповіщення (тривоги) з програмованими границями вологості та температури, швидкість передачі даних до 1 МГц [23, 24].

Давач упакований в DFN – корпус 2,5×2,5 мм2 з висотою 0,9 мм, що надає змогу інтегрувати його в різних задачах. Крім того, він має широкий діапазон напруги живлення від 2,15 до 5,5 В, що гарантує сумісність з різними вимогами монтажу. Загалом, серія давачів вологості SHT3x увібрала 15 - річний досвід компанії Sensirion, яка є лідером в індустрії (в галузі) давачів вологості.

Рис.3.15. Цифровий давач вологості і температури SHT3x-DIS

Серія давачів вологості SHT3x (Додаток 4) складається з дешевої версії - давачі вологості SHT30, стандартної версії – давачі вологості SHT31 та версії високого класу – давачі вологості SHT35. Серія давачів вологості SHT3x поєднує в собі множину функцій та різних інтерфейсів (I2C, аналоговий вихід напруги) з придатністю для застосування в ріних областях.

Модуль цифрового давача температури і вологості SHT-31D відкриває новий рівень в технології вимірювань. Давач містить схему обробки та підсилення сигналу, блок пам’яті калібрування, АЦП і схему скидання по живленню, а також широкий діапазон напруги живлення від 2,5 до 5 В (Рис.3.16). Даний давач може використовуватися з різними мікроконтролерами на базі Arduino або Raspberry Pi.

Рис.3.16. Функціональна блок-схема SHT3x-DIS. Сигнали давача для вологості і температури відкалібровані на заводі, лінеаризовані і зкомпенсовані для залежностей від температури і напруги живлення

Рис.3.17. Розміщення виводів в корпусі мікросхеми давача SHT3x-DIS (вигляд зверху). Пунктирними лініями зображено те, що видно знизу. Підкладка мікросхеми внутрішньо (всердині) з’єднана з VSS (землі)

Адресний пін (пін вибору адреси) ADDR

Через відповідне підключення піна (виводу) ADDR можна вибрати адресу I2C. Пін ADDR може бути підключений до високого логічного рівня або низького. Адреса давача може бути змінена динамічно з допомогою операції зміни логічного рівня (напруги) на піні (виводі) ADDR. Єдиною вимогою є те що рівень має залишатися незмінним починаючи від умови старту I2C до завершення обміну даними. Це дає змогу підключити більше двох давачів SHT3x-DIS на одну і ту саму шину.

Для динамічного переключення є потрібними окремі лінії ADDR до давачі. Адреса I2C пристрою представлена 7 старшими бітами I2С – заголовку читання або запису. Наймолодший біт переключає між заголовком читання або запису. Підключення для адреси за замовчуванням показано в табл. і Рис.. Вивід (пін) ADDR не має бути залишеним плаваючим (непід’єднаним). Слід відмітити, що тільки 7 старших розрядів (бітів) заголовка читання/запису протокола I2C становлять адресу I2C.

Табл.3.3. I2C адреси пристрою

SHT3x-DIS	I2C адреса в шістнадцятковому представленні	Умова
I2C адреса A	0×44 (за замовчуванням)	На піні ADDR (пін 2) низький рівень (лог. 0)
I2C адреса B	0×45	На піні ADDR (пін 2) високий рівень (лог. 1)

Пін тривоги (ALERT пін)

Вивід (пін) тривоги може використовуватися для підключення до виводу переривання мікроконтролера. Вихід піна (виводу) залежить від значення показу RH/T відносно програмованих границь. Його функція пояснена в окремій документації по приміненню. Якщо цей пін (вивід) не використовується, то він має бути залишеним плаваючи (не підключеним). Пін переключається на високий рівень, якщо виконується умова тривоги. Слід мати на увазі, що в залежності від величини протікачого струму може виникнути самонагрівання. Самонагрівнню можна запобігти, якщо пін (вивід) сповіщення використовувати тільки для переключення транзистора.

Пін nRESET

Пін nReset може використовуватия для скидання давача. Мінімальна тривалість імпульсу необхідна для надійного спрацювання скиадання давача є 1 мкс. Якщо він не використовується, то рекомендують його залишити плаваючим або підключити до VDD через послідовний резистор номіналом R >= 2 кОм. Проте, пін nRESET внутрішньо підключений до VDD з підтягуючим резистором R = 50 кОм (зазвичай).

Принцип роботи та комунікація давача SHT3x

Давач SHT3x-DIS підтримує швидкий режим роботи по шині I2C (і частоти до 1000 кГц). Швидкість (частота синхронізації) може бути встановлена за допомогою відповідної команди. Детальна інформація по протоколу I2C наведено в документації NXP I2C – шина.

Після відсилання команди до сенсора, мінімальний час очікування 1 мс перед тим як сенсор зможе прийняти іншу команду.

Всі SHT3x-DIS команди і дані відображаються у 16-бітному адресному просторі. Додатково, дані і команди є захищеними контрольною сумою CRC, що підвищує надійність комунікації. 16-бітні команди сенсора включають 3-бітну контрольну суму CRC. Після даних отриманих з давача або відісланих давачу завжди слідує 8-бітна контрольна сума CRC.

При запису обов’язково потрібно передавати контрольну суму, оскільки SHT3x-DIS приймає дані, тільки в тому випадку, якщо після них слідує правильна контрольна сума. При читанні (в напрямку читання) ведучий-пристрій зчитує та обробляє контрольну суму.

Увімкнення та початок (старт) комунікації

Давач включається після досягнення порогової напруги включення VPOR. Після досягнення цього порогового значення, давачу потрібен час tPU для переходу в стан очікування. Після входження в стан очікування він готовий до прийому команд від ведучого пристрою (міроконтролера).

Кожна послідовність передачі починається з умови START (S) і закінчується умовою STOP (P), як описано в документації шини I2C. Кожний раз, коли давач включений, але не виконує вимірювання або комунікації (обміну даними), він автоматично переходить в стан очікування для економії енергіїї. Цей стан простою не може контролюватися користувачем.

Початок вимірювання

Послідовність вимірювального зв’язку (комунікації) складається з умови START, заголовка запису I2C (7-бітний адрес пристрою I2C плюс 0 в якості біта запису) та 16-бітної команди вимірювання. Правильний прийом кожного байту вказується давачем. Він понижує вивід SDA (біт ACK) після спадаючого фронту 8-го тактового сигналу SCL, щоб вказати прийом. Повний цикл вимірювання наведено на Рис.3.6.

Після підтвердження команди вимірювання SHT3x-DIS починає вимірювання вологості і температури.

Команди вимірювання для збору однієї пари даних

В цьому режимі одна видана команда запускає збір однієї пари даних. Кожна пара даних складається з однієї 16-бітної температури і одного 16-бітного значення вологості (в цьому порядку). Під час передачі за кожним значенням даних завжди слідує контрольна сума CRC.

Зчитування результатів в режимі одноразового вимірювання

Після того, як давач завершив вимірювання, ведучий пристрій (master) може прочитати результати вимірювання (пара RH & відправивши умову START, а потім заголовок читання I2C). Давач підтверджує прийом прочитаного заголовку і відправить два байти даних (температура) за ним слідує одна байтова контрольна сума CRC і ще два байти даних (відносна вологість), за якими слідує одна байтова контрольна сума CRC. Кожний байт має бути підтверджений мікроконтролером з умовою ACK, щоб давач продовжив відправку даних. Якщо давач не отримує ACK від ведучого пристрою (мікроконтролера) після будь-якого байту даних, він не буде продовжувати відсилання даних. Давач спочатку відправить значення температури, а потім значення відносної вологості. Після отримання контрольної суми для значення вологості необхідно відправити NACK і умову зупинки.

Ведущий I2C может прервать передачу чтения с условием NACK после любого байта данных, если он не заинтересован в последующих данных, например байт CRC или второй результат измерения, чтобы сэкономить время.

Якщо користувачу потрібні дані волгості і температури, але він не хоче обробляти дані CRC, рекомендується зчитувати два байти даних температури з байтом CRC (без обробки даних CRC), після зчитування двох байтів вологості, передача даних може бути перервана за допомогою NACK.

Нема розтягу тактової частоти

Коли була подана команда без розтягування тактового сигналу, давач реагує на заголовок читання за допомогою підтвердження (NACK), якщо дані відсутні.

Розтяг тактової частоти

Коли була видана команда з розтягом тактового сигналу, давач відповідає на прочитаний заголовок з підтвердженням ACK і потім відпускає лінію SCL. Лінія SCL опускається до завершення вимірювання. Як тільки вимірювання завершено, давач звільняє лінію SCL і відправляє результати вимірювання.

Команди вимірювання для режиму періодичного збору даних

В цьому режимі одна видана команда вимірювання дає потік пар даних. Кожна пара даних складаєься з однієї 16-бітної температури і одного 16-бітного значення вологості (в цьому порядку).

В періодичному режимі можуть бути вибрані різні команди вимірювання. Відповідні 16-бітні команди показано на Рис.3.7. Вони відрізняються у відношенні повторюваності (низька, середня і висока) і частоти збору даних (0,5,1,2,4 і 10 вимірювань за секунду). В цьому режимі не можна вибрати розтяг тактового генератора.

Частота збору даних і налаштування повторюваності впливають на тривалість вимірювання і струм споживання давачем. Якщо видається (генерується) команда вимірювання, в той час як давач зайнятий вимірюванням, тоді рекомендовано спочатку подати команду переривання. При отриманні команди переривання давач перериває поточне вимірювання і переходить в режим одноразового вимірювання.

Зчитування результатів вимірювання для періодичного режиму

Передача даних вимірювань може бути ініційована з допомогою команди вибірки даних. Якщо дані вимірювань відсутні, то на заголовок читання I2C відправляється відповідь NACK (біт 9 на Рис.3.25), і зв'язок переривається. Після подачі команди зчитування даних вибірки, пам’ять даних очищується, тобто дані вимірювань відсутні.

Команда ART

Функція ART (прискорений час відгуку) може бути активована з допомогою команди на Рис.3.26. Після видачі команди ART давач починає збирати дані з частотою 4 Гц. Команда ART структурно аналогічна будь-якій іншій команді.

Команда розриву / Зупинка режиму періодичного збору даних

Режим збору періодичних даних може бути зупинений за допомогою команди переривання/розриву. Рекомендують зупинити періодичний збір даних до відправки другої команди (крім команди отримання даних) з допомогою команди переривання/розриву. Після отримання команди переривання/розриву давач перериває поточне вимірювання і переходить в режим однократного вимірювання. Це займає 1 мс.

Скидання інтерфейсу

Якщо зв’язок з пристроєм втрачено, наступна послідовність сигналів приведе до скиадання послідовного інтерфейсу: залишаючи лінію SDA високою, переключаємо лінію SCL дев’ять або більше разів. Це має супроводжуватися послідовністю початку передачі, що слідує перед наступною командою. Ця послідовність скидає лище інтерфейс. Регістр статусу (стану) зберігає свій вміст.

Скидання з допомогою піна (через пін) nReset

Переведення виходу nReset в низький рівень згенерує скидання, подібне до апаратного скидання. Пін (вивід) nReset внутрішньо підключений до VDD через підтягуючий резистор і, відповідно, активним є низький рівень. На піні (виводі) nReset повинен бути низький логічний рівень щонайменше 1 мкс, щоб скинути давач.

Програмне скидання / повторна ініціалізація

SHT3x-DIS представляє механізм програмного скидання, який переводить систему в чітко визначений стан без відключення джерела живлення. Коли система знаходиться в режимі очікування, команда програмного скидання може бути відправлена на SHT3x-DIS калбрування з пам’яті. Для запуску процедури програмного скидання необхідно відправити команду показану на Рис.6 додатку 4. Слід відмітити, що давач перезавантажує дані калібрування перед кожним вимірюванням за замовуванням.

Скидання через загальний виклик

Крім того, скидання давача також може бути згенероване з використанням режиму “загального виклику” відовідно зі специфікацією на шину I2C. Він генерує скидання, яке функціонально ідентичне використранню піна (виводу) nReset. Важливо розуміти, що згенероване таким чином скидання не залежить від пристрою. Всі пристрої на одній шині I2C, які підтримують загальний режим виклику, виконають скидання. Крім того, ця команда працює тільки тоді, коли давач здатний обробляти (опрацьовувати) команди I2C. Відповідна команда скаладється з двох байтів і показана на Рис.7. у додатку 4.

Скидання

Скидання системи SHT3x-DIS може бути згенероване зовні з допомогою команди (програмне скидання) або відправкою імпульсу на відповідний пін (вивід) скидання (пін nReset). Крім цього, скидання системи генерується всередині при включенні живлення. Під час процедури скидання, давач не буде обробляти команди.

Щоб досягти повного скидання давача ьез відключення живлення, рекомендують використовуати вивід (пін) nRESET SHT3x-DIS.

Апаратне скидання (Hard Reset)

Повне скидання досягається шляхом відключення і подальшого включення напруги живлення на вивід VDD. Щоб запобігти подачі живлення на давач через ESD діоди, необхідно зняти напругу з пінів 1 (SDA), 4 (SCL) і 2 (ADDR).

Нагрівач

SHT3x має внутрішній нагрівач, який призначений тільки для перевірки достовірності. Підвищення температури, що досягяється нагрівачем, залежить віл різних параметрів і знаходиться в діапазоні декількох градусів Цельсія. Його можна включати і виключати з допомогою команди (Рис.3.8. у додатку 4). Статус знаходиться в регістрі стану. Після скиадання нагрівач відключений (за замовчуванням).

Регістр стану

Регістр стану містить інформацію про робочий стан нагрівача, режим сповіщення (тривоги), стан виконання останньої команди і останньої послідовності запису. Команда для зчитування регістра стану показано на Рис.3.31, а опис вмісту регістра на Рис.3.32.

Очистка регістра стану (статусу)

Всі прапорці (біти 15, 11, 10, 4) в регістрі стану можна скинути (встановити в нуль), відправивши команду, яка зображено на Рис.11. у додатку 4

Перетворення вихідного сигналу

Дані вимірювань завжди передаються у вигляді 16-бітних значень (ціле число без знаку). Ці значення вже лінеразуються і компенсуються під дією температури і напруги живлення. Перетворення цих неопрацюваних значень у фізичну шкалу може бути виконано за допомогою наступних формул:

Формула перетворення відносної вологості (результат в %RH):

(3.1)

Формула перетворення температури (результат в °C & °F):

(3.2)

(3.3)

SRH і ST позначають необроблені (неопрацьовані) вихідні дані давача для вологості і температури, відповідно. У формулах 1-3 SRH і ST мають бути в десятковому представлені.

3.2.	Проектування цифрового пристрою в системі Proteus ISIS

Розроблювальний пристрій має моніторити концентрацію летких органічних сполук TVOC, визначати еквівалентний рівень вуглекислого газу eCO2 та попереджувати про їх перевищення звуковим сигналом, світловою індикацією, виводом повідомлення на LCD. На Рис.3.18 зображено блок-схему цифрового пристрою моніторингу якості повітря в бойових броньованих машинах. Пристрій включає в себе як апаратне так і програмне забезпечення. Апаратне забезпечення цифрового пристрою моніторингу якості повітря в бойових броньованих машинах складається з плати Arduino Uno R3 на МК AVR ATmega328P-PU, який є основним модулем опрацювання даних з давачів CCS811, SHT31-DIS, алфавітно-цифрового на 16 символів дворядкового рідкокристалічного дисплею.

Рис.3.18. Блок-схема цифрового пристрою моніторингу якості повітря в бойових броньованих машинах

Мікроконтролер ATmega328P-PU плати Arduino Uno R3 опрацьовує дані з давачів та виводить результати опрацювання згідно алгоритму роботи на дисплей. На Рис. 3.19 зображено спроектоване апаратне забезпечення цифрового пристрою моніторингу якості повітря в бойових броньованих машинах з використанням системи автоматизованого проектування та моделювання електронних схем та програмованих пристроїв Proteus ISIS.

Модуль давача CCS811 можна легко підключити до плати Arduino та інших мікроконтролерів, що підтримують інтерфейс I2C.

Рис.3.19. Підключення давача CCS811 до плати Arduino

Для підключення модуля давача CCS811 до плати Arduino потрібно лише 4 проводи, щоб мати змогу отримувати покази з давача. Вивід 3,3 В модуля давача підключають до виводу 3,3 В Arduino і GND до виводу GND плати Arduino або до відповідних виводів джерела живлення на 3,3 В. Вивід SDA підключають до виводу A4, а вивід SCL до виводу A5 плати Arduino.

На схемі пристрою моніторингу якості повітря давачі якості повітря CCS811, вологості і температури SHT31-DIS підключені по інтерфейсу I2C до пінів А4 (SDA) і А5 (SCL) плати Arduino Uno. Виводи Vin і GND давача CCS811 підключено до виводів живлення 3.3V і землі (GND) плати Arduino, відповідно. Шістнадцяти символьний двохрядковий рідкокристалічний дисплей (з контролером HD44780) підключено в 4-х бітному режимі, що використовує лише чотири виводи даних з D4 по D7. Виводи даних D4..D7 дисплею під’єднані відповідно до виводів ~10 (PB2/OC1B/SS), ~11 (PB3/OC2A/MOSI), 12 (PB4/MISO) і 13 (PB5/SCK). Вивід вибору регістра (RS) дисплею під’єднано до виводу (піна) ~6 (PD6/AIN0/OC0A) (~7 (PD7/AIN1)) плати Arduino Uno. Вивід вибору режиму читання або запису (R/W) під’єднано на землю (GND). Вивід дозволу звернення до індикатора (E) під’єднано до виводу (піна) 7 (PD7/AIN1) ( 8 (PB0/ICP1/CLKO)) плати Arduino Uno.

Кнопка MENU_ENTER (вхід в головне меню) підключена до виводу (піна) 2 (PD2/INT0) плати Arduino Uno. Кнопка SEL_PLUS (вибрати/збільшити) підключена до виводу (піна) ~3 (PD3/INT1/OC2B) плати Arduino Uno. Кнопка SEL_MIN (вибрати/зменшити) під’єднана до піна 4 (PD4/T0/XCK) плати Arduino Uno. Кнопка EXIT_BTN (вихід з меню в режим моніторингу) під’єднана до піна ~5 (PD5/T1) плати Arduino Uno.

Кнопки під’єднані за схемою pull-down резистора. Pull-down резистор 10 кОм під’єднано між виводом плати Arduino Uno і землею (GND). Кнопка підключена між виводом живлення VCC і виводом (піном) мікроконтролера. Якщо кнопка натиснута, на виводі (вході) мікроконтролера лог. 1. Якщо кнопка відпущена (не натиснута), pull-down резистор притискає (притяує) вивід мікроконтролера на землю (на виводі (вході) мікроконтролера лог. 0).

Рис.3.20. Апаратне забезпечення цифрового пристрою моніторингу якості повітря в бойових броньованих машинах спроектоване в САПР Proteus VSM

Розділ IV

Програмно-алгоритмічне забезпечення цифрового пристрою для моніторингу якості повітря в бойових броньованих машинах

4.1.	Алгоритм калібрування давача якості повітря CCS811

Давач CCS811, як і всі давачі летких органічних сполук, газу, мають варіативність і для отримання точних даних його потрібно відкалібрувати по відомих джерелах. Функціонування давача CCS811 зі зміною рівнів опору і чутливості змінюється протягом раннього періоду життя. Зміна опору є найбільшою протягом перших 48 годин роботи давача. AMS рекомендує запустити давач CCS811 на 48 годин при першому включенні, щоб “пропалити” (burn-in). CCS811 управляє періодом вигорання дозволяючи використовувати покази eCO2 і eTVOC з моменту першого включення після 60 хвилин роботи в режимах 1-3.

Після раннього терміну служби (burn-in) є період обкатки або опрацювання – це час необхідний для досягнення хорошої стабільності давача перед вимірюванням летких органічних сполук (ЛОС) після довгого часу простою. Після запису в регістр MEAS_MODE для налаштування давача в режим 1-4 потрібно запустити давач CCS811 на 20 хвилин кожний раз, перш ніж будуть отримані точні покази. Період обкатки також повинен бути дотриманий перед записом в регістр BASELINE. Час зчитування точних показів можна зменшити встановивши базовий рівень середовища. Метод отримання і налаштування базового рівня описано нижче.

Автоматична корекція базової лінії (BASELINE)

Опір Rs чутливого шару є виходом давача. Проте давачі оксиду металу не дають абсолютних показів. Опір Rs міняється від давача до давача (виробнича варіація), від варіанту використання до варіанту використання і з протіканням часу. Щоб пом’якшити (зменшити) цю проблему, вихідний сигнал давача нормалізують: Rs ділять на RA. Значення RA відоме, як базова лінія (базовий рівень). RA не може бути визначене одноразовим калібруванням, воно визначається на льоту програмним забезпеченням. Цей процес відомий як корекція базової лінії. Очікується, що якість повітря в типовому навколишньому середовищі буде варіюватися, тому мінімальний час, протягом якого застосовується базова поправка (корекція), становить 24 години. Автоматична корекція базової лінії дозволена після операції ініціалізації пристрою.

Ручна корекція базової лінії (Baseline)

В CCS811 є механізм для ручного збереження і відновлення раніше збереженого базового значення з використанням регістра BASELINE. Регістр для функцій збереження і відновлення має адресу 0x11, BASELINE. Хост (ведучий) пристрій повинен прочитати 2 байти з цього регістра, щоб отримати поточну вихідну (базову) лінію (вихідні дані), або записати 2 байти за цією адресою, щоб відновити раніше збережену базову лінію (базові вихідні дані). Значення базової лінії – це не просто вихідне опору давача в чистому повітрі, воно також включає деякі додаткові фактори, які використовуються внутрішніми алгоритмами. Він є в нечитабельному для людини форматі і ніколи не повинен змінюватися. Порядок байтів та вміст мають бути збережені (дотримані). На Рис.4.1 зображено діаграму зберігання і відновлення базової лінії.

Рис.4.1. I2C транзакції збереження та відновлення базової лінії Baseline

Значення базової лінії зчитується з давача CCS811 і зберігається в енергонезалежній пам’яті хост - пристрою. Збережена базова лінія (збережений базовий рівень) може бути потім записаний назад в давач CCS811, щоб дозволити давачу визначати якість повітря якомога щвидше при наступному включенні давача. Базовий рівень відноситься до умов навколишнього середовища, в яких працює давач, коли він включений. В давачі CCS811 не зберігаються жодні дані з попереднього часу виконання, тому базовий рівень повинен бути збережений перед відключенням давача. Для того щоб базовий рівень відповідав умовам хорошої якості повітря, давач CCS811 повинен бути поміщений (підаватися впливу) в чисте повітря.

Запуск давача CCS811 в забрудненому повітрі

Давача CCS811 обчислює значення eCO2 і eTVOC використовуючи базовий рівень як свою контрольну (відправну) точку. Він порвінює поточний опір давача з базовим рівнем і якщо поточний опір меньше базового рівня, то давач вказує на наявність газу. Якщо поточний опір більший або рівний базового рівня, то поточний опір стає новою базовою лінією (базовим рівнем). Це спрощений опис, насправді алгоритм складніший і враховує умови температури і вологості при управлінні своїм базовим рівнем (базовою лінією).

На рисунку нижче показано основну причину, через яку відновлення раніше збереженого базового рівня важливо у застостуваннях (проектах), в яких необхідно визначати якість повітря як тільки давач прогрівся (нагрівся).

Рис.4.2. Графіки зміни опору давача з часом в чистому і забрудненому повітрі

Синя лінія на рисунку показує, що давач стабілізувався на рівні 350 кОм в чистому повітрі. Такии чином, базовий рівень в цьому середовищі і на даному етапі терміни служби (роботи) давача становить 350 кОм (на рисунку зображено синьою пунктирною лінією). Збереження базового рівня в будь-який час після точки 3 дає значення, що відповідає 350 кОм. Припустимо, що давач виключений, а потім через 1 день знову включений в більш забрудненому повітрі. На цей раз давач стабілізується на 300 кОм, так як повітря більщ забруднене, це показано червоною лінією.

Якщо базовий рівень не відновлюється, давач CCS811 буде вважати, що значення 300 кОм відповідає чистому повітрю, і буде використовувати йлшл в якості базового рівня. Він не зберігає вихідну інформацію з моменту останнього вкключення. В якості базової лінії (базового рівня) використовується максимальне значення опору за визначений проміжок часу (за замовчуванням 24 години).

Алгоритм роботи пристрою моніторингу якості повітря в бойових броньованих машинах

У додатку 5 зображено блок-схеми функцій setup(), loop() та головного меню цифрового пристрою моніторингу якості повітря в бойових броньованих машинах.

При увімкненні пристрою стартує виконання програми записаної у флеш – пам’ять мікроконтролера плати Arduino Uno. Спочатку викликається функція setup(). В функції setup() проходить ініціалізається послідовного інтерфейсу erial.begin(9600); while (!Serial), конфігурування режиму роботи виводів до яких підключені кнопки MENU_ENTER, SEL_PLUS, SEL_MINUS і EXIT як входи:

pinMode(MENU_ENTER_BUTTON_PIN, INPUT);

pinMode(SELECT_PLUS_BUTTON_PIN, INPUT);

pinMode(SELECT_MINUS_BUTTON_PIN, INPUT);

pinMode(EXIT_BUTTON_PIN, INPUT).

Встановлення режиму роботи виводів до яких підключено світлодіоди і зумер як виходи:

pinMode(ALARM_LED1_PIN, OUTPUT);

pinMode(ALARM_LED2_PIN, OUTPUT);

pinMode(BUZZER_PIN, OUTPUT);

Підключення функцій обробки переривання при натисненні кнопки MENU_ENTER для виклику головного меню притсрою і переривання від давача CCS811:

attachInterrupt(digitalPinToInterrupt(MENU_ENTER_BUTTON_PIN), btn_pressed_interrupt, RISING);

attachInterrupt(digitalPinToInterrupt(CCS811_INT_PIN), ccs811_interrupt, RISING).

Ініціалізація LCD 16 символів ×2 рядки і створення власних символів:

lcd.begin(16, 2);

lcd.createChar(0, zero);

lcd.createChar(1, one);

lcd.createChar(2, two);

lcd.createChar(3, three);

lcd.createChar(4, four);

lcd.createChar(5, five).

Вивід інформації про пристрій і його розробника на LCD і у вікні послідовного інтерфейсу Serial monitor:

lcd.print("IAQ monitoring");

lcd.setCursor(5,1);

lcd.print("device");

/*lcd.setCursor(4,0);

lcd.print(F("Пристрiй"));

lcd.setCursor(0,1);

lcd.print(F("монiторингу IAQ"));*/

delay(500);

lcd.clear();

lcd.setCursor(2,0);

lcd.print(F("developed by"));

/*

lcd.setCursor(3,0);

lcd.print(F("розробив:"));*/

lcd.setCursor(2,1);

lcd.print(F("Roman Voznyy"));

/*

lcd.setCursor(2,0);

lcd.print(F("Роман Возний"));

*/

Ініціалізація давача якості повітря в бойових броньованих машинах (IAQ) CCS811

/* чекаємо на завершення ініціалізації давача, і тоді виходимо з циклу */

while (CCS811.begin() != 0) {

lcd.setCursor(0,1);

lcd.print("failed!");

Serial.println(F("failed to init chip, please check if the chip connection is fine"));

//Serial.println(F("ініціалізація пройшла невдало, будь-ласка перевірте підключення давача"));

digitalWrite(ALARM_LED2_PIN, HIGH);

delay(500);

digitalWrite(ALARM_LED2_PIN, LOW);

}

lcd.setCursor(0,1);

lcd.print("OK!");

Serial.println(F("OK!"));

Ініціалізація давача вологості і температури SHT:

lcd.clear();

lcd.print("SHT31 init...");

Serial.println(F("SHT31 sensor initialization..."));

while (! sht31.begin(SHT_I2C_ADDRESS)) { // встановити в 0x45 для альтернативної адреси i2c

Serial.println(F("Couldn't find SHT31"));

//Serial.println(F("давач SHT31 не знайдено"));

lcd.setCursor(0,1);

lcd.print("failed!");

digitalWrite(ALARM_LED2_PIN, HIGH);

delay(500);

digitalWrite(ALARM_LED2_PIN, LOW);

}

lcd.setCursor(0,1);

lcd.print("OK!");

Serial.println(F("OK!"));

Встановлення параметрів середовища

* temperature - встановлення температури в ℃, діапазон: -40~85℃

* humidity - встановлення вологості, одиниці: RH, діапазон: 0~100RH

*/

// Читаємо температуру і вологість з давача SHT31

temperature = sht31.readTemperature();

humidity = sht31.readHumidity();

if (isnan(temperature)) {

Serial.println(F("Failed to read temperature")); //

//Serial.println(F("невдалося прочитати температуру"));

}

if (isnan(humidity)) {

Serial.println("Failed to read humidity");

//Serial.println(F("невдалося прочитати вологість"));

}

CCS811.setInTempHum(temperature, humidity);

/**

* Налаштування параметрів вимірювання

* mode: in typedef enum {

* eClosed, // Idle (вимірювання відключенні в цьому режимі)

* eCycle_1s, // режим постійної потужності, вимірювання IAQ кожну секунду

* eCycle_10s, // режим імпульсного нагрівання, вимірювання IAQ кожних 10 секунд

* eCycle_60s, // режим імпульсного нагрівання низької потужності, вимірювання IAQ кожних 60 секунд

* eCycle_250ms // режим постійної потужності, вимірювання давача відбуваються кожних 250 мілісекунд

* // 1xx: Reserved modes (For future use)

* } eCycle_t;

*/

mode = CCS811.eCycle_250ms;

CCS811.setMeasurementMode(mode);

Serial.println();

Serial.print(F("Current configured parameter code is "));

//Serial.print(F("код поточного параметра конфігурації (режим роботи) є "));

Serial.print(F("CCS811 baaseline is: "));

Serial.println(CCS811.readBaseLine(), HEX); //0x447B

Serial.print(F("CCS811 measurement mode is: "));

Serial.println(CCS811.getMeasurementMode(), HEX);

Тестовий запуск вимірювання на 20 хвилин для прогріву і стабілізації коректних показів давача CCS811:

run20min();

uint16_t result = CCS811.readBaseLine();

// збереження baseline (with valid data indicator bytes)

lcd.clear();

lcd.print("Baseline saving");

lcd.setCursor(0,1);

lcd.print("into EEPROM..");

EEPROM.write(0, 0xA5);

EEPROM.write(1, 0xB2);

EEPROM.write(2, (result >> 8) & 0x00FF); // MSB

EEPROM.write(3, result & 0x00FF); // LSB

lcd.print("OK!");

Після іцініадізації пристрій переходить в робочий режим моніторингу, викликається функція loop(). В режимі моніторингу пристрій вимірює концентрацію вуглекислого газу CO2 і летких органічних сполук TVOC. Як тільки рівень концентрації eCO2 та летких органічних сполук TVOC в повітрі перевищує встановлену межу пристрій переходить в режим тривоги.

Далі в циклі функція

if (GPIO1TRIG == 1) // перевіряємо чи виставлено прапорець переривання від CCS811

{

if (int_thresh) // переривання INT_THRES

{

Serial.println(F("CO2 range has changed"));

Serial.print(F("CO2: "));

Serial.print(CCS811.getCO2PPM());

Serial.print(F(" ppm, TVOC: "));

Serial.print(CCS811.getTVOCPPB());

Serial.println(F(" ppb"));

delay(1000);

}

else // переривання INT_DATARDY

getCO2andTVOC(&eCO2, &eTVOC);

GPIO1TRIG = 0;

}

else if (!int_datardy)

{

if (CCS811.checkDataReady() == true)

getCO2andTVOC(&eCO2, &eTVOC);

else

Serial.println(F("Data is not ready!"));

}

/* Вплив концентрації CO2 на організм людини

* <500 нема впливу

* 500-1000 каламутне повітря

* 1000-2500 відчуття сонливості

* 2500-5000 шкідливо для людського організму

* >5000 токсичний

*/

/* Вплив концентрації TVOC на організм людини

* <50 нема впливу

* 50-750 некомфортно, нервозний стан

* 760-6000 некомфортно, нервозний стан, головна біль

* >6000 головна біль, неврологічні проблеми

*/

/*if ((eCO2 >= 500 && eCO2 < 2500) || (eTVOC >= 50 && eTVOC < 760))

{

digitalWrite(ALARM_LED1_PIN, HIGH);

tone(BUZZER_PIN, 500);

alarm_flag = true;

//delay(1000);

//noTone(BUZZER_PIN);

}

else if (eCO2 >= 2500 || eTVOC >= 760)

{

digitalWrite(ALARM_LED2_PIN, HIGH);

tone(BUZZER_PIN, 500);

alarm_flag = true;

//delay(1000);

//noTone(BUZZER_PIN);

}

else if (alarm_flag)

{

digitalWrite(ALARM_LED1_PIN, LOW);

digitalWrite(ALARM_LED2_PIN, LOW);

noTone(BUZZER_PIN);

alarm_flag = false;

}*/

if (eCO2 > 500 || eTVOC > 50)

{

Serial.println(F("Alarm !!!"));

digitalWrite(ALARM_LED2_PIN, HIGH);

tone(BUZZER_PIN, 500);

lcd.setCursor(15,1);

lcd.print("A");

delay(1000);

digitalWrite(ALARM_LED2_PIN, LOW);

noTone(BUZZER_PIN);

lcd.setCursor(15,1);

lcd.print(" ");

}

if (mainMenuInvoke)

{

detachInterrupt(digitalPinToInterrupt(MENU_ENTER_BUTTON_PIN));

showMainMenu();

mainMenuInvoke = false;

attachInterrupt(digitalPinToInterrupt(MENU_ENTER_BUTTON_PIN), btn_pressed_interrupt, CHANGE);

lcd.clear();

}

float temp = temperature, humi = humidity;

// зчитуємо температуру і вологість з давача SHT

getTempHum(&temp, &humi);

if (( (temperature - temp) >= TEMP_HYSTERESIS || (temp - temperature) >= TEMP_HYSTERESIS )

|| ( (humidity - humi) >= HUMI_HYSTERESIS || (humi - humidity) >= HUMI_HYSTERESIS))

/* if (abs(temperature - temp) >= 5 || abs(humidity - humi) >= 5) */

{

Serial.println(F("Environmental paramaters have changed"));

CCS811.setInTempHum(temperature, humidity); // змінилися параметри навколишнього середовища

}

//delay cannot be less than measurement cycle

delay(500);

4.3.	Розробка бібліотеки для роботи з цифровим давачем якості повітря в бойових броньованих машинах CCS811

Для програмної взаємодії плати Arduino з давачем CCS811 в наш час є готові бібліотеки різних розробників, які можна вільно завантажити з Інтернет ресурсів. Зокрема, такими бібліотеками є DFRobot_CCS811 і SparkFun_CCS811_Arduino_Library. Для роботи з цифровим давачем якості повітря в бойових броньованих машинах CCS811 було вибрано і модифіковано бібліотеку DFRobot_CCS811. Бібліотека містить спеціальні константи, змінні та клас з методами для роботи з давачем CCS811, які приведено в лістингу заголовочного файлу бібліотеки у додатку 6.

4.4.	Розробка бібліотеки для роботи з цифровим давачем температури і вологості SHT31-D

Давачі SHT31 використовують інтерфейс I2C для комунікації, що потребує лише двох пінів (виводів) для підключення. У додатку 7 наведено лістинг бібліотеки з класом та методами для роботи з цифровим давачем вологості і температури SHT31.

4.5.	Розробка бібліотеки для роботи з алфавітно-цифровим РК - дисплеєм HD44780

Для виводу інформації на LCD [25, 26] в Arduino є бібліотека LiquidCrystal (Додаток 8). Ця бібліотека дає змогу платі Arduino управляти LCD на контролері Hitachi HD44780, який є в більшості текстових LCD. Бібліотека може працювати як 4- так і в 8-бітному режимі (використовуючи 4 або 8 ліній даних та RS, Enable, і, додатково, RW лінії управління). Бібілотека має наступні функції:

lcd.print() – відображає на дисплеї довільну інформацію починаючи з поточної позиції курсора. В якості аргумента можна використовувати текстовий рядок або змінну.

4.6.	Програмна реалізація алгоритму роботи цифрового пристрою моніторингу якості повітря в бойових броньованих машинах

void loop() {

if (GPIO1TRIG == 1) // перевіряємо чи виставлено прапорець переривання від CCS811

{

if (int_thresh) // переривання INT_THRES

{

Serial.println(F("CO2 range has changed"));

Serial.print(F("CO2: "));

Serial.print(CCS811.getCO2PPM());

Serial.print(F(" ppm, TVOC: "));

Serial.print(CCS811.getTVOCPPB());

Serial.println(F(" ppb"));

delay(1000);

}

else // переривання INT_DATARDY

getCO2andTVOC(&eCO2, &eTVOC);

GPIO1TRIG = 0;

}

else if (!int_datardy)

{

if (CCS811.checkDataReady() == true)

getCO2andTVOC(&eCO2, &eTVOC);

else

Serial.println(F("Data is not ready!"));

}

/* Вплив концентрації CO2 на організм людини

* <500 нема впливу

* 500-1000 каламутне повітря

* 1000-2500 відчуття сонливості

* 2500-5000 шкідливо для людського організму

* >5000 токсичний

*/

/* Вплив концентрації TVOC на організм людини

* <50 нема впливу

* 50-750 некомфортно, нервозний стан

* 760-6000 некомфортно, нервозний стан, головна біль

* >6000 головна біль, неврологічні проблеми

*/

/*if ((eCO2 >= 500 && eCO2 < 2500) || (eTVOC >= 50 && eTVOC < 760))

{

digitalWrite(ALARM_LED1_PIN, HIGH);

tone(BUZZER_PIN, 500);

alarm_flag = true;

//delay(1000);

//noTone(BUZZER_PIN);

}

else if (eCO2 >= 2500 || eTVOC >= 760)

{

digitalWrite(ALARM_LED2_PIN, HIGH);

tone(BUZZER_PIN, 500);

alarm_flag = true;

//delay(1000);

//noTone(BUZZER_PIN);

}

else if (alarm_flag)

{

digitalWrite(ALARM_LED1_PIN, LOW);

digitalWrite(ALARM_LED2_PIN, LOW);

noTone(BUZZER_PIN);

alarm_flag = false;

}*/

if (eCO2 > 500 || eTVOC > 50)

{

Serial.println(F("Alarm !!!"));

digitalWrite(ALARM_LED2_PIN, HIGH);

tone(BUZZER_PIN, 500);

lcd.setCursor(15,1);

lcd.print("A");

delay(1000);

digitalWrite(ALARM_LED2_PIN, LOW);

noTone(BUZZER_PIN);

lcd.setCursor(15,1);

lcd.print(" ");

}

if (mainMenuInvoke) {

detachInterrupt(digitalPinToInterrupt(MENU_ENTER_BUTTON_PIN));

showMainMenu();

mainMenuInvoke = false;

attachInterrupt(digitalPinToInterrupt(MENU_ENTER_BUTTON_PIN), btn_pressed_interrupt, CHANGE);

lcd.clear();

}

float temp = temperature, humi = humidity;

// зчитуємо температуру і вологість з давача SHT

getTempHum(&temp, &humi);

if (( (temperature - temp) >= TEMP_HYSTERESIS || (temp - temperature) >= TEMP_HYSTERESIS ) || ( (humidity - humi) >= HUMI_HYSTERESIS || (humi - humidity) >= HUMI_HYSTERESIS))

{

Serial.println(F("Environmental paramaters have changed"));

CCS811.setInTempHum(temperature, humidity); // змінилися параметри навколишнього середовища

}

delay(500);

}

Моделювання та дослідження макету цифрового пристрою моніторингу якості повітря в бойових броньованих машинах

Щоб змоделювати роботу цифрового пристрою моніторингу якості повітря в Proteus ISIS потрібно завантажити файл програмної прошивки .hex у створену модель пристрою. Моделювання дає змогу оцінити коректність роботи розробленого ПЗ згідно алгоритму роботи пристрою до його завантаження у реальний пристрій. Proteus ISIS є потужною системою моделювання і відлагодження досить складних пристроїв, що можуть містити подекілька мікроконтролерів з різних родин в одному пристрої одночасно.

На рисунках у додатку 10 показано моделювання цифрового пристрою для моніторингу якості повітря в бойових броньованих машинах на платформі Arduino і давачах CCS811, SHT31-D. Тут показано результати дослідження зібраного макету цифрового пристрою для моніторингу якості повітря в бойових броньованих машинах на платформі Arduino, цифрових давачах CCS811, SHT31-D і рідкокристалічному дисплейному модулі.

Висновки

В дипломній роботі розроблено апаратне та програмне забезпечення цифрового пристрою моніторингу якості повітря в бойових броньованих машинах. Пристрій в режимі реального часу виявляє в повітрі широкий спектр шкідливих летких органічних сполук VOC (Volatile Organic Compounds) і газів. Пристрій використовує давач CCS811, що дозволяє визначати концентрацію летких органічних сполук TVOC (Total Volatile Organic Compounds) в діапазоні від 0 до 1187 ppb та еквівалентний рівень вуглекислого газу eCO2 в діапазоні від 400 до 8192 ppm. Давач CCS811 може виявляти етанол, метанол, альдегіди, кетони, органічні кислоти, аліфатичні і ароматичні вуглеводи та аміни.

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

В розробці цифрового пристрою моніторингу якості повітря використано плату Arduino Uno R3 на мікроконтролері ATmega328P-PU, цифровий давач якості повітря в бойових броньованих машинах CCS811, цифровий давач температури і вологості SHT31-D, дисплейний модуль LCD1602 з чіпом драйвера HD44780.

В роботі розроблено електричну принципову схему (модель) цифрового пристрою в САПР Proteus. Розроблено програмно-алгоритмічне забезпечення цифрового пристрою для моніторингу якості повітря в бойових броньованих машинах. Проведено моделювання роботи пристрою в емуляторі Proteus ISIS. Створено та досліджено макет цифрового пристрою для моніторингу якості повітря в бойових броньованих машинах.

Спроектовано електричну принципову схему й створено модель цифрового пристрою в САПР Proteus. Розроблено алгоритми і програмне забезпечення цифрового пристрою моніторингу якості повітря. Розроблено бібіліотеки для роботи з давачем якості повітря CCS811, давачем температури і вологості SHT31-D та виведення інформації на рідкокристалічний дисплей з контролером HD44780. Проведено моделювання цифрового пристрою моніторингу якості повітря в бойових броньованих машинах в емуляторі Proteus ISIS. Створено та досліджено макет цифрового пристрою для моніторингу якості повітря в бойових броньованих машинах.

Результати моделювання і дослідження макету пристрою дозволили (переконатися) відлагодити коректну роботу створеного програмного забезпечення (показали коректну роботи створеного програмного забезпечення).

Список використаних літературних джерел

Mark Geddes. Arduino Project Handbook: 25 Practical Projects to Get You Started. – Published by No Starch Press, San Francisco, 2016. – p. 272.

Michael Margolis. Arduino Cookbook: Recipes to Begin, Expand, and Enhance Your Projects. – Published by O’Reilly Media, 2nd Edition. 2012. – p. 721.

John Baichtal. Arduino for Beginners: Essential Skills Every Maker Needs. – Published by Que Pub, 1st ed., 2013. – p. 376.

Tyson Popynick. Arduino Guide and Project book. – 2016 for Aus Electronics Direct. – p. 73.

Jonathan Oxer and Hugh Blemings. Practical Arduino: Cool Projects for Open Source Hardware. - Springer-Verlag New York, 2009. – p. 445.

Massimo Banzi. Getting Started with Arduino. – 2nd Edition. O’Really Media Inc., 2011. – p. 130.

Michael Margolis. Arduino Cookbook, Second Edition. – Published by O’Reilly Media Inc., 2012. – p. 724.

Enrique Ramos Melgar and Ciriaco Castro Diez with Przemek Jawosrki. Arduino and Kinect Projects. Design, Build, Blow Their Minds. – Springer Sceince+Business Media New York, 2012. – p. 411.

Brian Huang and Derek Runberg. The Arduino Inventor’s Guide. – SparkFun Electronics, 2017. – p. 472.

Emily Gertz & Patrick Di Justo. Environmental Monitoring with Arduino. 32. Building Simple Devices to Collect Data About the World Around Us. – Published by O’Really Media Inc., 2012 – p. 96.

Електронні навчальні ресурси по Arduino: https://www.tutorialspoint.com/arduino/index.htm, https://www.program-mingelectronics.com/tutorial-3-arduino-ide-and-sketch-overview/, https://www.javatpoint.com/arduino.

САПР Proteus VSM [Електронний ресурс]. – Режим доступу: https://www.labcenter.com/simulation/.

Середовище розробки Arduino IDE. Електронний ресурс: https://www.arduino.cc/en/Main/Software

Brian Evans. Beginning Arduino Programming. Writing Code for the Most Popular Microcontroller Board in the World. – Springer Science + Business Media, 2011 – p. 271.

Sarful Hassan. Arduino Programming Essentials: A Practical Handbook for Makers, Engineers, and Students. – Independently published, 2024. – p. 308.

Blum Richard. Arduino Programming in 24 Hours, Sams Teach Yourself. – Sams Publishing; 1st ed., 2014. – p. 434.

Jack Purdum. Beginning C for Arduino, Second Edition: Learn C Programming for the Arduino. – Published by Apress; 2nd ed., 2015. – p. 414.

Електронний ресурс datasheet по цифровому давачі якості повітря в приміщенні CCS811: https://pdf1.alldatasheet.com/datasheet-pdf/view/1047395/AMSCO/CCS811.html, https://cdn.sparkfun.com/assets/learn_tutorials/1/4/3/CCS811_Datasheet-DS000459.pdf.

Електронні ресурси по давачу (IAQ sensor) CCS811: https://how2electronics.com/measure-co2-tvoc-using-ccs811-gas-sensor-arduino/, https://learn.adafruit.com/adafruit-ccs811-air-quality-sensor/­arduino-wiring-test, https://create.arduino.cc/projecthub/dragos-iosub/­arduino-ccs811-co2-tvoc-air-quality-monitor-570af1, https://learn.sparkfun.com/tutorials/ccs811-air-quality-breakout-hookup-guide/all.

Електронний ресурс Measure CO2 & TVOC using CCS811 Gas Sensor & Arduino: https://how2electronics.com/measure-co2-tvoc-using-ccs811-gas-sensor-arduino/.

Електронний ресурс CCS811 Air Quality Breakout Hookup Guide: https://learn.sparkfun.com/tutorials/ccs811-air-quality-breakout-hookup-guide/all.

Електронний ресурс I2C Wiring Adafruit CCS811 Air Quality Sensor: https://learn.adafruit.com/adafruit-ccs811-air-quality-sensor/arduino-wiring-test.

Електронний ресурс datasheet по давачу SHT3x-DIS. Режим доступу: https://pdf1.alldatasheet.com/datasheet-pdf/view/756282/ETC2/SHT3X-DIS.html, https://www.mouser.com/datasheet/2/682/Sensirion­_Humidity_Sensors_SHT3x_Datasheet_digital-971521.pdf.

Електронні ресурси по підключенню давача SHT3x-DIS до Arduino: https://how2electronics.com/interfacing-sht3x-humidity-temperature-sensor-arduino/, https://www.circuitschools.com/interfacing-sht3x-temperature-and-humidity-sensor-with-arduino/.

Електронний ресурс по точково-матричному LCD контролеру/драйверу Hitachi HD44780: https://circuitdigest.com/sites/default/files/HD44780U.pdf.

Електронний ресурс веб-аплікації генерування користувацьких шаблонів символів LCD: https://maxpromer.github.io/LCD-Character-Creator/.

Додатки

Додаток 1

Плата та технічні характеристики Arduino Uno R3

Рис.1. Плата Arduino Uno R3

Табл.1. Технічні характеристики плати Arduino Uno R3

Мікроконтролер	ATmega328
Робоча напруга	5 В
Напруга живлення (рекомендована)	7-12 В
Напруга живлення (гранична)	6-20 В
Цифрові входи/виходи	14 (з них 6 можуть використовуватися в якості ШІМ (PWM) - виходів)
Аналогові входи	6
Максимальний струм одного вивода	40 мА
Максимальний вихідний струм вивода 3,3 В	50 мА
Flash - пам’ять	32 КБ (ATmega328) з яких 0,5 КБ використовуються для bootloader’а (завантажувача).
SRAM	2 КБ (ATmega328)
EEPROM	1 КБ (ATmega328)
Тактова частота	16 МГц

Додаток 2

Характеристики давача повітря CCS811

Рис.1. Модулі з давачем якості повітря CCS811

Табл.1. Виводи модуля з мікросхемою давача CCS811

Номер виводу	Назва виводу	Призначення
1	VCC	Джерело живлення для модуля. Зазвичай використовується 3,3 В.
2	GND	Земля модуля, з’єднана з землею схеми.
3	SCL	Тактова лінія (лінія синхронізації), що використовується для забезпечення тактового сигналу шини I2C.
4	SDA	Лінія послідовних даних шини I2C..
5	WAK	Сигнал пробудження (активний низький рівень)
6	INT	Сигнал переривання (активний низький рівень)
7	RST	Сигнал перезавантаження (активний низький рівень)
8	ADD	Біт вибору адреси, що дозволяє вибрати альтернативну адресу.

Табл.2. Виводи модуля з мікросхемою давача CCS811

Номер контакту (виводу)	Назва контакту (виводу)	Призначення (опис)
1	Vin	напруга живлення (від 3,3 до 5 В)
2	3V3	вихідна напруга 3,3 В для зовнішнього використання
3	GND	земля
4	SDA	контакт даних для інтерфейсу I2C
5	SCL	контакт (вивід) синхронізації для інтерфейсу I2C
6	WAKE	контакт “пробудження” давача, повинен бути замкнутий на землю, щоб з давачем можна було здійснювати інформаційний обмін
7	RST	контакт скидання, якщо замкнути на землю, то давач може скидати сам себе
8	INT	контакт входу зовнішнього переривання

Табл.3. Технічні характеристики мікросхеми давача CCS811

Параметр	Опис
Загальний вміст летких органічних сполук (eTVOC) виявляє з	0 до 32,768 частинок на мільярд (ppb)
Еквівалент вуглекислого газу (eCO2) визначає з	400 частинок на мільйон до 29,206 (ppm)
Розміри модуля	15 мм x 21 мм
Робоча напруга	1,8 В ~ 3,3 В DC
Струм споживання	30 мА
Температура зберігання	-40 ~ 125 °C
Споживана потужність	60 мВт

Табл.4. Переваги і особливості давача CCS811

Переваги	Особливості
Управляє режимами роботи давача і вимірювання при виявленні ЛОС	Вбудований мікроконтролер
Забезпечує індикацію рівня eCO2 або eTVOC без участі хоста	Бортове опрацювання (обробка)
Спрощує інтеграцію апаратного і програмного забезпечення	Стандартний (100 Кбіт/с) і швидкий (400 Кбіт/с) I²C- інтерфейс
Збільшенний час роботи від батареї в поративних приміненях.	Оптимізовані режими з низьким енергоспоживанням
Розроблений азработан для больших объемов и надежности (> 5 лет жизни)	Перевірена технологічна платформа

Рис.2. Блок-схема мікросхеми давача CCS811

Табл.5. Виводи мікросхеми давача CCS811

Номер піна	Назва піна	Функціональне призначення
1	ADDR	Біт вибору одного адресу, що дозволяє вибрати альтернативний адрес. Якщо ADDR має низький рівень,то 7-бітний адрес I2C представляє собою число 90 в десятковій системі / 0x5A в шістнадцятковій системі числення. Якщо ADDR має високий рівень, то 7-бітний адрес I2C представляє собою число 91 (в десятковій системі)/0x5B (в шістнадцятовій системі числення).
2	nRESET	Вивід nRESET є активним при низькому рівні і за замовчуванням підтягується (підтягнутий) до VDD. Для nRESET не обов’язково, але може бути потрібна підтяжка 4,7 кОм і/або розв’язка виводу (піна) nRESET, щоб уникнути помилкових скидань викликаних (зумовлених) шумом. Цей вивід (пін) буде опущений в низький рівень при скидані.
3	nINT	nINT – активний низький додатковий вихід. Давач CCS811 встановлює його в низький рівень, щоб повідомити про завершення вимірювання або спрацювання порогового значення.
4	PWM	ШІМ – вихід (PWM вихід) драйвера давача нагрівача. Виводи (контакти) 4 і 5 мають бути з’єднані разом.
5	Sense	Вивід (контакт) для вимірювання (реєстрації) струму нагрівача. Виводи (контакти) 4 і 5 мають бути з’єднані разом.
6	VDD	Напруга живлення.
7	nWAKE	nWAKE є активним низьким входом і має бути встановлений хостом (ведучим пристроєм) перед транзакцією I2C і утримуватися на низькому рівні протягом всього часу транзакції.
8	NC	Не підключений.
9	SDA	Вивід SDA використовується для даних I2C. Має бути підтягнутий через резистор до VDD.
10	SCL	Вивід SCL використовується для синхронізації I2C. Має бути підтягнутий до VDD через резистор.
EP	Exposed Pad	Має бути підключений до землі (ground (GND)).

Рис.3. Часові діаграми давача CCS811

Рис.4. Машина станів давача CCS811

Додаток 3

Регістри та помилки давача CCS811

Табл.1. Карта регістрів давача CCS811

Адреса	Регістр	R/W	Розмір	Опис (призначення)
0x00	STATUS	R	1 байт	Регістр стану
0x01	MEAS_MODE	R/W	1 байт	Регістр режимів і умов вимірювання
0x02	ALG_RESULT_DATA	R	до 8 байт	Результат алгоритму. Старші 2 байти містять оцінку еквівалентного рівня CO2 (eCO2) в ppm, а наступні 2 байти містять оцінку загального рівня VOC в ppb.
0x03	RAW_DATA	R	2 байти	Неопрацьовані значення даних АЦП для опору і джерела струму, що використовуються
0x05	ENV_DATA	W	4 байти	Дані температури і вологості можуть бути записані для компенсації (щоб дозволити компенсацію)
0x10	THRESHOLDS	W	4 байти	Порогові значення для дії, якщо переривання генеруються лише коли eCO2 ppm перетинає поріг (переходить порогове значення).
0x11	BASELINE	R/W	2 байти	Може бути прочитане закодоване поточне базове значення. Можна записати попередньо збережену закодовану базову лінію.
0x20	HW_ID	R	1 байт	Апаратне ID пристрою. Значення 0x81.
0x21	HW Version	R	1 байт	Версія пристрою (апаратна версія). Значення 0x1X.
0x23	FW_Boot_Version	R	2 байти	Завантажувальна версія прошивки. Перші 2 байти містять номер версії прошивки для завантажувального коду.
0x24	FW_App_Version	R	2 байти	Версія програмної прошивки. Перші 2 байти містять номер версії прошивки для програмного коду.
0xA0	Internal_State	R	1 байт	Внутрішній регістр стану
0xE0	ERROR_ID	R	1 байт	Ідентиікатор (ID) помилки. Коли регістр стану повідомляє про помилку, його джерело знаходиться в цьому регістрі.
0xFF	SW_RESET	W	4 байти	Якщо записані правильні 4 байти (0x11, 0xE5, 0x72, 0x8A) в цей регістр в одній послідовності пристрій буде скинуто і він повернеться в режим BOOT.

Табл.2. Номера бітів, назви та призначення полів регістра STATUS

Біти	Назва поля	Призначення
7	FW_MODE	0: Прошивка знаходиться в режимі завантаження, що дозволяє завантажити нову прошивку. 1: Прошивка знаходиться в режимі застосування (application mode). CCS811 готовий до вимірювань АЦП.
6	APP_ERASE	Тільки режим завантаження. 0: Стирання не завершено. 1: Операцію (дію) стирання (видалення) …успішно завершено (прапорцеь скидається (очищається) з допомогою APP_DATA, а також з допомогою APP_START, SW_RESET, nRESET і APP_VERIFY). Після видачі команди ERASE прикладне програмне забезпечення повинне дочекатися (почекати) 500 мс, перш ніж виконувати будь-які транзакції в CCS811 чере інтерфейс I2C.
5	APP_VERIFY	Тільки режим завантаження. 0: Перевірка незакінчена (незавершена). 1: Операція перевірки ПЗ успішно закінчена (завершена) (прапорцеь скидається (очищається) з допомогою APP_START, SW_RESET і nRESET). Після видачі команди VERIFY прикладне програмне забезпечення має почекати 70 мс, перш ніж (перед тим як) виконати будь-які транзакції до CCS811 через інтерфейс I2C.
4	APP_VALID	0: Програмна прошивка не завантажена. 1: Завантажена дійсна (коректна) програмна прошивка.
3	DATA_READY	0: Нема готових нових вимірювань (даних вибірки – даних вимірювання). 1: Нові дані вимірювання є готові в регістрі ALH_RESULT_DATA, цей біт очищається (скидається) при зчитуванні регістра ALG_RESULT_DATA по інтерфейсу I2C.
2:1	-	Зарезервовані
0	ERROR	Цей біт очищається (стирається) читанням ERROR_ID (недостатньо прочитати поле ERROR регістрів ALG_RESULT_DATA і STATUS). 0: Помилок не було. 1: Помилка на шині I2C або в давачі, регістр ERROR_ID (адреса 0xE0) містить джерело помилки.

Табл.3. Номера бітів, назви та призначення полів регістра MEAS_MODE

Біт	Назва поля	Опис (призначення)
7	-	Зарезервований – запис ‘0’
6:4	DRIVE_MODE	000: Режим 0 – Idle (простою, очікування) (Вимірювання відключені в цьому режимі). 001: Режим 1 – Режим постійної потужності, вимірювання якості повітря (IAQ) кожну секунду. 010: Режим 2 – Імпульсний режим нагріву, вимірювання якості повітря (IAQ) кожних 10 секунд. 011: Режим 3 – Режим імпульсного нагріву малої потужності. Вимірювання якості повітря в приміщенні (IAQ) кожних 60 секунд. 100: Режим 4 – Режим постійної потужності, вимірювання давача кожні 250 мс (Давач проводить вимірювання кожних 250 мс). 1xx: Зарезервовані режими (для використання в майбутньому). В режимі 4, регістр ALG_RESULT_DATA не поновлюється, тільки RAW_DATA; опрацювання даних (обробка) повинна виконуватися хост-системою (мікроконтролером). Нове вимірювання поміщається в регістри ALG_RESULT_DATA і RAW_DATA, а біт DATA_READY в регістрі STATUS встановлюється на визначений інтервал вимірювання.
3	INT_DATARDY	0: Генерування переривань відключено. 1: Сигнал nINT встановлюється (керуючий встановлюється в низький рівень), якщо нове вимірювання (новий замір, вибірка) є готовим в регістрі ALG_RESULT_DATA. Сигнал nINT перестає мати низький логічний рівень, після читання даних (вимірювань) з регістра ALG_RESULT_DATA по інтерфейсу (шині) I2C. В кінці кожного циклу вимірювання (250 мс, 1 с, 10 с, 60 с) встановлюється прапорець в регістрі STATUS незалежно від встановлення (встановленого значення) цього біта.
2	INT_THRESH	0: Режим переривання (якщо дозволений - включений) функціонує (працює) нормально. 1: Режим переривання (якщо дозволений - включений) встановлює сигнал nINT (приведений в низький рівень), тільки тоді якщо нові дані вимірювання з ALG_RESULT_DATA виходять за одне з порогових значень, що встановлені (записані) в регістрі THRESHOLDS, більше ніж на значення гістерезису (також в регістрі THRESHOLDS).
1:0	-	Зарезервовані – запис ‘00’.

Табл.4. Коди помилок в регістрі ERROR_ID

Біт	ERROR_CODE	Опис (призначення)
0	WRITE_REG_INVALID	Давач CCS811 отримав I2C - запит запису, який адресований цьому пристрою, але з некоректним ID (ідентифікатором) адреси регістра.
1	READ_REG_INVALID	CSS811 отримав недопустимий (недозволений) I2C - запит на читання для ідентифікатора (ID) регістра.
2	MEASMODE_INVALID	CCS811 отримав запит I2C на запис режиму, що не підтримується, у регістр MEAS_MODE.
3	MAX_RESISTANCE	Вимірювання опору давача досягло або перевищело максимальний діапазон.
4	HEATER_FAULT	Струм нагрівача в CCS811 не відповідає дозволеному (допустимому) діапазону.
5	HEATER_SUPPLY	Напруга нагрівача подяється неправильно.
6	-	Зарезервоано для використання в майбутньому.
7	-	Зарезервовано для використання в майбутньому.

Табл.5. Карта регістрів загружчика (завантажувача – Bootloader Regiser Map) CCS811

Адреса	Регістр	R/W	Розмір	Призначення
0x00	STATUS	R	1 байт	Регістр стану
0x20	HW_ID	R	1 байт	Ідентифікатор пристрою. Значення 0x81.
0x21	HW_Version	R	1 байт	Версія пристрою. Значення 0x1X.
0x23	FW_Boot_Version	R	1 байт	Версія завантажувача програмної прошивки. Перші 2 байти містять номер версії прошивки (мікропрограми) для коду завантаження.
0x24	FW_App_Version	R	2 байти	Версія програмної прошивки. Перші 2 байти містять номер версії прошивки для програмного коду.
0xE0	ERROR_ID	R	1 байт	Ідентифікатор помилки (Error ID). Коли регістр стану повідомляє про помилку, то її джерело (причина) знаходиться в цьому регістрі.
0xF1	APP_ERASE	W	4 байти	Якщо в цей регістр записно коректні 4 байти (0xE7 0xA7 0xE6 0x09) в єдиній послідовності, то пристрій запустить стиранні програми.
0xF2	APP_DATA	W	9 байтів	Передати флеш код (флеш пам’яті) для завантажувача, щоб записати в простір коду флеш-пам’яті.
0xF3	APP_VERIFY	W	-	Запускає процес перевірки завантажувача через програму, щоб переконатися, шо повний образ є дійсним (дійчим).
0xF4	APP_START	W	-	Запуск програми. Використовується для переходу стану CCS811 з режиму завантаження в режим застосування (програми), потрібно виконати запис без даних. Перед виконанням запису в APP_START необхідно отримати доступ до регістра стану, щоб перевірити чи присутня допустима програма (applucation).
0xFF	SW_RESET	W	4 байти	Якщо будуть записані правильні (коректні) 4 байти (0x11 0xE5 )x72 0X8A) в цей регістр в одній послідовності, то пристрій перезавантажиться і повернеться в режим завантаження (BOOT mode).

Додаток 4

Давачі SHT3x

Табл.1. Версії давача SHT3x

Давач	Точність і діапазон вимірювання RH (% RH)	Точність і діапазон вимірювання температури (°C)	Діапазон напруги живлення VDD (В)	Інтерфейс
SHT30-ARP-B	±3@10-90% RH	±0,3@0-65 °C	2,4 до 5,5	Аналогова напруга
SHT30-DIS-B	±2@10-90% RH	±0,2@0-65 °C	2,15 до 5,5	I2C
SHT31-ARP-B	±3@0-100% RH	±0,2@-40-90 °C	2,4 до 5,5	Аналогова напруга
SHT31-DIS-B	±2@0-100% RH	±0,2@0-90 °C	2,15 до 5,5	I2C
SHT30-ARP-B	±2@0-100% RH	±0,2@0-90 °C	2,15 до 5,5	I2C
SHT30-DIS-B	±2@0-100% RH	±0,2@0-90 °C	2,15 до 5,5	I2C
SHT31-ARP-B	±1,5@0-80% RH	±0,1@20-60 °C	2,15 до 5,5	I2C
SHT31-DIS-B	±1,5@0-80% RH	±0,1@20-60 °C	2,15 до 5,5	I2C
SHT35-DIS-B	±1,5@0-80% RH	±0,1@-40-125 °C	2,4 до 5,5	I2C
SHT35-DIS-F	±1,5@0-100% RH	±0,1@-40-125 °C	2,4 до 5,5	I2C

Табл.2. Розпіновка (розміщення і призначення виводів) 8-вивідного DFN корпусу мікросхеми давача SHT3x-DIS

Пін (вивід)	Назва виводу	Призначення
1	SDA	Лінія даних шини I2C, вхід.вихід
2	ADDR	Вивід адреси; вхід: потрібно подати на вивід високий логічний рівень або низький, не залишати плаваючим (не підключеним)
3	ALERT	Сповіщає про тривогу; вихід; має залишатися не підключеним (плаваючим), якщо не використовується
4	SCL	Лінія синхронізації шини I2C; вхід/вихід
5	nRESET	Вивід скидання (активним є низький логічний рівень); вхід; якщо не використовується, то рекомендовано залишити його плаваючим (не підключеним); може бути підключеним до VDD через послідовний резистор номіналом R >= 2 кОм
6	R	Немає електричної функції; підключається до VSS
7	VSS	Вивід землі (GND.

Рис.1. Команди вимірювання в одиночному режимі. Перший блок вказує мінімальний час очікування 1 мс. (Чисті блоки контролюються мікроконтролером, сірі блоки давачем)

Рис.2. Команди вимірювання для режиму періодичного збору даних (чисті блоки управляються мікроконтролером, а сірі блоки- давачем). При максимальних налаштуваннях mps може настати самонагрів давача.

Рис.3. Команда вибірки даних (чисті блоки контролюються мікрокотнролером, а сірі – давачем)

Рис.4. Команда для періодичного збору даних з функцією ART

Рис.5. Команда розриву (світлі блоки управляються мікроконтролером, сірі блоки - давачем)

Рис.6. Команда програмного скидання (світлі блоки управляються мікроконтролером, сірі блоки - давачем)

Рис.7. Скидання через адресу загального виклику (світлі блоки управляються мікроконтролером, сірі блоки - давачем)

Рис.8. Команда нагрівача (світлі блоки управляються мікроконтролером, сірі блоки - давачем)

Рис.9. Команда зчитування регістра стану (статусу) (світлі блоки управляються мікроконтролером, сірі блоки - давачем)

Рис.10. Опис вмісту регістра стану

Рис.11. Команда очищення регістра стану (чисті блоки управляються мікроконтролером, сірі блоки - давачем).

Рис.12. Часова діаграма для цифрових виводів, що можуть працювати на вхід або вихід. Напрямок SDA видно з давача. Товсті лінії контролюються давачем, прості лінії SDA контролюються мікроконтролером. Дійсний час читання SDA запускається по задньому фронту попереднього переключення.

Додаток 5

Алгоритми роботи пристрою моніторингу якості повітря в бойових броньованих машинах

Рис. 1. Алгоритм роботи функції ініціалізації setup()

Рис. 2. Алгоритм роботи цифрового пристрою моніторингу якості повітря в бойових броньованих машинах. Головна функція безперервного циклу loop()

Рис. 3. Алгоритм роботи функціії головного меню цифрового пристрою моніторингу якості повітря в бойових броньованих машинах

Додаток 6

Розробка бібліотеки для роботи з цифровим давачем якості повітря в бойових броньованих машинах CCS811

/* Адреса I2C */

#define CCS811_I2C_ADDRESS1 0x5A

#define CCS811_I2C_ADDRESS2 0x5B

/* Регістри давача CCS811 */

#define CCS811_REG_STATUS 0x00

#define CCS811_REG_MEAS_MODE 0x01

#define CCS811_REG_ALG_RESULT_DATA 0x02

#define CCS811_REG_RAW_DATA 0x03

#define CCS811_REG_ENV_DATA 0x05

#define CCS811_REG_NTC 0x06

#define CCS811_REG_THRESHOLDS 0x10

#define CCS811_REG_BASELINE 0x11

#define CCS811_REG_HW_ID 0x20

#define CCS811_REG_HW_VERSION 0x21

#define CCS811_REG_FW_BOOT_VERSION 0x23

#define CCS811_REG_FW_APP_VERSION 0x24

#define CCS811_REG_INTERNAL_STATE 0xA0

#define CCS811_REG_ERROR_ID 0xE0

#define CCS811_REG_SW_RESET 0xFF

#define CCS811_BOOTLOADER_APP_ERASE 0xF1

#define CCS811_BOOTLOADER_APP_DATA 0xF2

#define CCS811_BOOTLOADER_APP_VERIFY 0xF3

#define CCS811_BOOTLOADER_APP_START 0xF4

#define CCS811_HW_ID 0x81

//Open the macro to see the detailed program execution process.

//#define ENABLE_DBG

#ifdef ENABLE_DBG

#define DBG(...) {Serial.print("[");Serial.print(__FUNCTION__); Serial.print("(): "); Serial.print(__LINE__); Serial.print(" ] "); Serial.println(__VA_ARGS__);}

#else

#define DBG(...)

#endif

class DFRobot_CCS811

{

public:

#define ERR_OK 0 // OK

#define ERR_DATA_BUS -1 // помилка на щині даних

#define ERR_IC_VERSION -2 // невідповідність версії чіпа

uint8_t _deviceAddr;

/**

* @enum eCycle_t - режим вимірювання

*/

typedef enum{

eClosed, /* Режим простою (Idle). Вимірювання відключені в цьому режимі. */

eCycle_1s, /* Режим постійної (сталої) потужності. Вимірювання IAQ кожну секунду. */

eCycle_10s, /* Режим імпульсного нагріву. Вимірювання кожних 10 секунд. */

eCycle_60s, /* Режим малої потужності імпульсного нагріву. Вимірювання кожні 60 секунд. */

eCycle_250ms /* Режим постійної потужності, вимірювання давача еожних 250 мс 1xx: Зарезервовані режими для використання в майбутньому. */

}eCycle_t;

/**

* @fn DFRobot_CCS811 - конструктор

* @param pWire - TwoWire

* @param deviceAddr - IIC адреса давача

*/

DFRobot_CCS811(TwoWire *pWire = &Wire, uint8_t deviceAddr = 0x5A){_pWire = pWire; _deviceAddr = deviceAddr;};

/**

* @fn begin - метод ініціалізації

* @return - статус ініціалізації

* @retval ERR_OK - ініціалізація пройшла успішно

* @retval ERR_DATA_BUS - помилка на шині даних

* @retval ERR_IC_VERSION - невідповідність версії чіпа

*/

int begin();

/**

* @fn checkDataReady - метод перевірки готовності даних для читання

* @return - повертає результат перевірки

* @retval true - якщо дані готові для читання

* @retval false - якщо нема готових даних для читання

*/

bool checkDataReady();

/**

* @fn softReset - скидає давач, очищує всі сконфігуровані дані.

*/

void softReset();

/**

* @fn setInTempHum - метод запису в давач параметрів навколишнього середовища

* @param temperature - встановлює значення температури, одиниці: градус Цельсія, діапазон (-40~85℃)

* @param humidity - встановлює значення вологості, одиниці: RH, діапазон (0~100)

*/

void setInTempHum(float temperature, float humidity);

/**

* @fn setMeasurementMode - метод налаштування параметрів вимірювання

* @param mode - режим вимірювання

* @n eClosed - Idle (вимірювані відключені в цьому режимі)

* @n eCycle_1s - Режим постійної потужності, вимірювання IAQ кожну секунду

* @n eCycle_10s - Режим імпульсного нагріву, вимірювання IAQ кожних 10 секунд

* @n eCycle_60s Low power pulse heating mode IAQ measurement every 60 seconds

* @n eCycle_250ms Constant power mode, sensor measurement every 250ms 1xx: Reserved modes (For future use)

* @param thresh

* @n 0 для режиму переривання працює в нормальному режимі for Interrupt mode operates normally

* @n 1 для режиму переривання only asserts the nINT signal (driven low) if the new

* @param interrupt

* @n 0 для відключення (заборони) генерування переривання

* @n 1 для видачі (подання) сигналу nINT signal (driven low) коли готові нові дані

*/

void setMeasurementMode(eCycle_t mode, uint8_t thresh = 0, uint8_t interrupt = 0);

/**

* @fn setThresholds - метод встановлення порогових значень переривання

* @param lowToMed: значення спрацювання переривання в діапазоні від low до middle

* @param medToHigh: значення спрацювання переривання в діапазоні від middle до high

*/

void setThresholds(uint16_t lowToMed, uint16_t medToHigh);

/**

* @fn getMeasurementMode - метод отримання поточного сконфігурованого параметра

* @return конфіугураційний код, має бути перетворений у двійковий код для аналізу

* @n другий біт: режим переривання (якщо дозволено(включено)) працює в звичайному режимі,

1: режим переривання (якщо довзолено (включено)) тільки підтверджує (видає) сигнал nINT (упрввління низьким рівнем) якщо новий

* @n третій: генерування переривання відключено (заборонене), 1: сигнал nINT генерується (видається) (driven low) коли готова нова вибірка hen a new sample is ready in

* @n четвертий: щостий: в typedef enum eCycle_t

*/

uint8_t getMeasurementMode();

/**

* @fn getCO2PPM - метод отримання поточної конентрації діоксиду вуглецю (вуглекислого газу) CO2

* @return - повертає поточне значення концентрації діоксиду вуглецю (вуглекислого газу) CO2, в одиницях ppm

*/

uint16_t getCO2PPM();

/**

* @fn getTVOCPPB - метод отримання концентрації загальної кількості летких органічних сполук в повітрі

* @return - повертає концентрацію летких оранічних сполук в одиницях ppb

*/

uint16_t getTVOCPPB();

/**

* @fn readBaseLine - метод отримання (зчитує) поточного числа baseline

* повертає шістнадцяткове число (число в шістнадцятковій системі) поточного числа baseline

*/

uint16_t readBaseLine();

/**

* @fn writeBaseLine - функція, яка записує число baseline в регістр.

* @param baseLine - шістнадцяткове число отримане з baseLine()

*/

void writeBaseLine(uint16_t baseLine);

protected:

/**

* @struct sError_id

* @brief Error id

*/

/**

* струкутра sError_id - id помилки

*/

typedef struct{

uint8_t sWRITE_REG_INVALID: 1; /**< Давач CCS811 отримав I²C запит запмсу до цієї станції, але з недійсною адресою регістра ID */

uint8_t sREAD_REG_INVALID: 1; /**< Давач CCS811 отримав I²C запит читання до a mailbox ID, який є недійсним */

uint8_t sMEASMODE_INVALID: 1; /**< Давач CCS811 отримав I²C запит для запису режиму, що непідтримкється, в регістр MEAS_MODE */

uint8_t sMAX_RESISTANCE: 1; /**< The sensor resistance measurement has reached or exceeded the maximum range */

uint8_t sHEATER_FAULT: 1; /**< Струм нагрівача в давачі CCS811 не знаходиться в діапазоні */

uint8_t sHEATER_SUPPLY: 1; /**< Напругу нагрівача не прикладено коректно */

} __attribute__ ((packed))sError_id;

/**

* @struct sMeas_mode - структура режиму вимірювання

*/

typedef struct{

uint8_t sINT_THRESH: 1; /**< ALG_RESULT_DATA виходить за одне з встановлених порогових налаштувань (значень) в регістрі THRESHOLDS більше ніж гістерезисне значення (також в регістрі THRESHOLDS) */

uint8_t sINT_DATARDY: 1; /**< В кінці кожного циклу вимірювання (250мс, 1с, 10с, 60с) встановлюється прапорець в регістрі STATUS незважаючи на вміст (налаштування) цього біта. */

uint8_t sDRIVE_MODE: 3; /**< Нова вибірка (виміряні значення) розміщується в регістрах ALG_RESULT_DATA і RAW_DATA, а біт DATA_READY в регістрі STATUS встановлюється при визначеному інтервалі вимірювання. */

} __attribute__ ((packed))sMeas_mode;

/**

* @struct sStatus - структура статусу давача

*/

typedef struct{

uint8_t sERROR: 1; /**< Цей біт очищується при зчитуванні ERROR_ID. Недостатньо для зчитування поля ERROR регістрів ALG_RESULT_DATA і STATUS */

uint8_t sDATA_READY: 1; /**< ALG_RESULT_DATA зчитуються через інтерфйес I²C */

uint8_t sAPP_VALID: 1;

uint8_t sAPP_VERIFY: 1; /**< Після видачі команди VERIFY, програма має почекати 70 мс перед видачею (провеленням) будь-яких транзакій з давачем CCS811 через інтерфйес I²C */

uint8_t sAPP_ERASE: 1; /**< Після видачі команди ERASE, програма має зачекати 500 мс педед тим, як проводити будь-які транзакції - давачем CCS811 через інтерфйес I2C. */

uint8_t sFW_MODE: 1;

} __attribute__ ((packed))sStatus;

uint8_t sFW_MODE: 1;

/**

* @fn writeReg - метод запису в регістр

* @param reg - адреса регістра 8 бітів

* @param pBuf - буфер з даними, які будуть записані

* @param size - розмір даних, які будуть записані

*/

void writeReg(uint8_t reg, const void* pBuf, size_t size);

/**

* @fn функція зчитування регістра readReg

* @param reg - адреса регістра 8 бітів

* @param pBuf - буфер для даних, які будуть прочитані

* @param size - розмір (двжина) даних, які будуть прочитані

* @return - повертає розмір прочитаних даних, при невдачі читання повертає 0.

*/

uint8_t readReg(uint8_t reg, const void* pBuf, size_t size);

private:

TwoWire *_pWire; // інтерфейс IIC

uint16_t eCO2; // значення еківалентної концентрації вуглекислого газу eCO2

uint16_t eTVOC; // значення концентрації летких органічних сполук eTVOC

};

Додаток 7

Розробка бібліотеки для роботи з цифровим давачем температури і вологості SHT31-D

#ifndef ADAFRUIT_SHT31_H

#define ADAFRUIT_SHT31_H

#include "Arduino.h"

#include "Wire.h"

#define SHT31_DEFAULT_ADDR 0x44 /* Адреса SHT31 за замовчуванням */

#define SHT31_MEAS_HIGHREP_STRETCH 0x2C06 /* Висока повторюваність вимірювань з включеною опцією призупинки тактування (синхронізації) */

#define SHT31_MEAS_MEDREP_STRETCH 0x2C0D /* Середня повторюваність вимірювань з включенням розтягування тактового сигналу

(опція призупинки I2C slave - пристроєм тактування мастером і переведення його в режим очікування) */

#define SHT31_MEAS_LOWREP_STRETCH 0x2C10 /* Низька повторюваність вимірювань з включенням призупинки тактування (тактового сигналу) (опція I2C slave - пристрою, що призупиняє тактування і переведення msater-пристрій в режим очікування.

Slave-пристрій може використовувати clock stretching, якщо він потребує більше часу для опрацювання даних, таких як наприклад збереження отриманих даних, або підготовка до передачі наступного байта даних)

*/

#define SHT31_MEAS_HIGHREP 0x2400 /**< Висока повторюваність з відключеним розтягуванням тактового сигнлу */

#define SHT31_MEAS_MEDREP 0x240B /**< Середня повторюваність вимірювань з відключеним розтягуванням тактового сигналу */

#define SHT31_MEAS_LOWREP 0x2416 /**< Низька повторюваність вимірювань з відключеним розтягуванням тактового сигналу (призупиняє тактування master-пристрою і переводить його в режим очікування) */

#define SHT31_READSTATUS 0xF32D /**< Зчитування регістра статусу */

#define SHT31_CLEARSTATUS 0x3041 /**< Очищення статусу */

#define SHT31_SOFTRESET 0x30A2 /**< Програмне скидання */

#define SHT31_HEATEREN 0x306D /**< Включення нагрівального елемента */

#define SHT31_HEATERDIS 0x3066 /**< Виключення нагрівального елемента */

extern TwoWire Wire; /**< Попередні оголошення Wire для комбінацій плат/варіантів, які не мають за замовчуванням свого 'Wire' */

/**

* Драйвер для давача вологості і температури Adafruit SHT31-D

*/

class Adafruit_SHT31 {

public:

/**

* Конструктор

*/

Adafruit_SHT31(TwoWire *theWire = &Wire);

/**

* Ініціалізує шину I2C, і присвоює (привязує) для нас адресу I2C.

* @param i2caddr - Адреса I2C, яку використовує давач.

*

* @return - True якщо ініціалізація пройшла успішно, в іншому випадку False.

*/

bool begin(uint8_t i2caddr = SHT31_DEFAULT_ADDR);

/**

* Функція отримання одного зчитування температури з давача.

* @return - повертає значення типу float, яке представляє температуру.

*/

float readTemperature(void);

/**

* Функція одноразового зчитування вологості з давача.

* @return - повертає значення типу float, яке представляє відносну вологість.

*/

float readHumidity(void);

/**

* Функція отримання поточного вмісту регістра статусу.

* @return - повертає 16-бітне значення регістра статусу.

*/

uint16_t readStatus(void);

/**

* Функція скидання давача, яка переводить його у визначений стан.

*/

void reset(void);

/**

* Функця включення/виключення (дозволу/заборони) нагрівального елемента.

*

* @param h True - включає нагрівач, False - відключає його.

*/

void heater(bool h);

TwoWire *_wire; /**< об'єкт Wire */

private:

/**

* внутрішня змінна для зберігання значення вологості

*/

float humidity;

/**

* внутрішня змінна для зберігання значення температури

*/

float temp;

/**

* змінна для збереження I2C адреси давача

*/

uint8_t _i2caddr;

/**

* Внутрішня функція для зчитування температури + вологості

* @return - повертає True якщо зчитування пройшло успішно, в іншому випадку false.

*/

bool readTempHum(void);

/**

* Внутрішня функція, яка виконує I2C запис

* @param cmd - приймає (відсилається) 16-бітне ID команди.

*/

void writeCommand(uint16_t cmd);

/**

* Внутрішня функція зчитування даних по шині I2C.

* @return - повертає True при успішному зчитуванні, інакше повертає False.

*/

bool readData(void);

};

#endif

Додаток 8.

Розробка бібліотеки для роботи з алфавітно-цифровим РК - дисплеєм HD44780

lcd.setCursor(Pos, Str) – виставляє курсор LCD в позицію Pos рядка Str.

lcd.home() – встановлює курсор LCD в позицію 0 рядка 0 дисплею.

lcd.clear() – очищає LCD.

lcd.Display() – включає LCD.

lcd.noDisplay() – виключає LCD.

lcd.Cursor() – включає курсор.

lcd.noCursor() – виключає курсор.

lcd.blink() – включає мигання курсора.

lcd.noblink() – виключає мигання курсора.

lcd.scrollDisplayLeft() – зсув інформації на LCD вліво.

lcd.scrollDisplayRight() – зсув інформації на LCD вправо.

lcd.leftToRight() – встановлює вивід текстового рядка зліва направо.

lcd.rightToLeft() – встановлює вивід текстового рядка справа на ліво.

lcd.createChar(adr, ch[]) – створення власного символу. Команда записує до пам’яті LCD символ ch. Запис виконується в пам’ять знакогенератора. Символ ch[] представляє собою масив з 8 байт.

Додаток 9

Моделювання цифрового пристрою для моніторингу якості повітря в бойових броньованих машинах на платформі Arduino і давачах CCS811, SHT31-D

Рис.1. Моделювання роботи цифрового пристрою моніторингу якості повітря в бойових броньованих машинах в Proteus ISIS: режим моніторингу

Рис. 2. Моделювання роботи цифрового пристрою моніторингу якості повітря в бойових броньованих машинах в емуляторі Proteus ISIS: режим тривоги

Рис.3. Моделювання роботи цифрового пристрою моніторингу якості повітря в бойових броньованих машинах

Додаток 10

Результати дослідження зібраного макету цифрового пристрою для моніторингу якості повітря в бойових броньованих машинах на платформі Arduino, цифрових давачах CCS811, SHT31-D і рідкокристалічному дисплейному модулі.

Рис.1. Дослідження макету цифрового пристрою моніторингу якості повітря в бойових броньованих машинах

Рис.2. Дослідження макету цифрового пристрою моніторингу якості повітря в бойових броньованих машинах

Додаток 11

Цифровий пристрій моніторингу якості повітря в бойових броньованих машинах на платформі Arduino і давачі CCS811

Додаток 12

Головний програмний модуль цифрового пристрою для моніторингу якості повітря в бойових броньованих машинах на платформі Arduino з використанням давача CCS811

/* Цифровий пристрій для моніторингу якості повітря в бойових броньованих машинах на платформі Arduino і давачі CCS811

Digital device for indoor air quality monitoring based on Arduino platform and CCS811 sensor

Розробив: студент групи ІТ-41, Возний Роман */

/*

AMS recommends that you run this sensor for 48 hours when you first receive it to "burn it in",

and then 20 minutes in the desired mode every time the sensor is in use.

This is because the sensitivity levels of the sensor will change during early use.

*/

#include <Wire.h>

#include <EEPROM.h>

#include "DFRobot_CCS811.h"

#include "Adafruit_SHT31.h"

#include <SHT25.h>

#include <LiquidCrystal.h>

//#include <LiquidCrystalRus.h>

/* підключення давачів CCS811, SHT3x-DIS до Arduino:

VCC = 3.3V

GND = GND

SDA = A4 (використовувати резистор 10k якщо плата є 5V)

SCL = A5 (використовувати резистор 10k якщо плата є 5V)

*/

#define SHT_I2C_ADDRESS 0x44 // альтернативна i2c адреса 0x45

#define TEMP_HYSTERESIS 5 // 5°C

#define HUMI_HYSTERESIS 5 // 5%RH

Adafruit_SHT31 sht31 = Adafruit_SHT31();

//SHT25 sht;

float temperature, humidity;

/*

* Адреса IIC давача CCS811 за замовчуванням 0x5A, адреса стає 0x5B, якщо ADDR_SEL підключено до лінії живлення.

* Якщо на піні ADDR низкий рівень, то 7-бітна адраеса I²C є decimal 90 / hex 0x5A.

* Якщо ADDR є високим, то 7-бітна адреса I²C є decimal 91 / hex 0x5B.

*/

#define CCS811_I2C_ADDRESS 0x5A // альтернативна i2c адреса 0x5B

#define CCS811_INT_PIN 2 // пін переривання давача CCS811

//DFRobot_CCS811 CCS811(&Wire, /*IIC_ADDRESS=*/0x5A);

DFRobot_CCS811 CCS811;

uint16_t baseLine, eCO2 = 0, eTVOC = 0;

uint8_t mode = 0, int_datardy = 0, int_thresh = 0;

volatile int8_t GPIO1TRIG = 0;

void ccs811_interrupt();

bool alarm_flag = false;

// виводи підключення LCD

/*#define RS 6 // register select

#define EN 7 // enable

#define D4 10 // data pin 4

#define D5 11 // data pin 5

#define D6 12 // data pin 6

#define D7 13 // data pin 7

*/

#define RS 7 // register select

#define EN 8 // enable

#define D4 10 // data pin 4

#define D5 11 // data pin 5

#define D6 12 // data pin 6

#define D7 13 // data pin 7

LiquidCrystal lcd(RS, EN, D4, D5, D6, D7);

//LiquidCrystalRus lcd(RS, EN, D4, D5, D6, D7);

// interrupt0 - pin 2, interrupt1 - pin 3, interrupt2 - pin 21, interrupt3 - pin 20, interrupt4 - pin 19, interrupt5 - pin 18

// виводи підключення кнопок

#define NUMBER_OF_BUTTONS 4

#define MENU_ENTER_BUTTON_PIN 3

#define SELECT_PLUS_BUTTON_PIN 4

#define SELECT_MINUS_BUTTON_PIN 5

#define EXIT_BUTTON_PIN 6

#define ALARM_LED1_PIN 14

#define ALARM_LED2_PIN 15

#define BUZZER_PIN 9

// час деренчання; збільшити якщо вихід деренчить (шумить), час затримки

#define DEBOUNCE_DELAY 50

unsigned long lastDebounceTime[NUMBER_OF_BUTTONS] = {0, 0, 0, 0}; // останній час, коли вихідний пін був переключений

int lastButtonState[NUMBER_OF_BUTTONS] = {LOW, LOW, LOW, LOW};

int buttonState[NUMBER_OF_BUTTONS];

int buttonsArray[NUMBER_OF_BUTTONS] = {MENU_ENTER_BUTTON_PIN, SELECT_PLUS_BUTTON_PIN, SELECT_MINUS_BUTTON_PIN, EXIT_BUTTON_PIN};

volatile bool mainMenuInvoke = false;

unsigned long delayTime; // час деренчання; збільшити якщо вихід деренчить (шумить), час затримки

String lcd_buffer;

/*const char item0[] PROGMEM = "## MAIN MENU ##";

const char item1[] PROGMEM = "Measurement Mode";

const char item2[] PROGMEM = "Set Thresholds";

const char item3[] PROGMEM = "Set Baseline";

const char item4[] PROGMEM = "Alarm Settings";

const char item5[] PROGMEM = "Exit"; */

/*const char item0[] PROGMEM = "# ГОЛОВНЕ МЕНЮ #";

const char item1[] PROGMEM = "Режим вимiрювання";

const char item2[] PROGMEM = "Порогові значення";

const char item3[] PROGMEM = "Базова лінія";

const char item4[] PROGMEM = "Режим тривоги";

const char item5[] PROGMEM = "Вихiд"; */

const char *const mainMenu[] = {"** MAIN MENU **", "Baseline", "Measurement Mode", "Set Thresholds", "Set Interrupts", "Alarm Settings", "Env. Params", "Exit"};

//const char *const mainMenu[] = {"* ГОЛОВНЕ МЕНЮ *", "Режим вимiр-ня", "Пороговi значення", "Базова лiнiя", "Режим тривоги", "Вихiд"};

//const char *const mainMenu[] PROGMEM = {item0, item1, item2, item3, item4, item5};

void btn_pressed_interrupt();

// button array pos

int buttonToPos(uint8_t button)

{

for (int i = 0; i < NUMBER_OF_BUTTONS; i++) {

if (buttonsArray[i] == button)

return i;

}

return -1;

}

bool debounceButton(int buttonPin)

{

// читаємо пін кнопки, якщо кнопка натиснута буде високим, якщо ні буде низьким

int value = digitalRead(buttonPin);

int pos = buttonToPos(buttonPin);

/* випалку якщо зчитане значення не рівне останьому стану кнопки, то встановити останній час деренчання (брязкотіння) у поточний час в мілісекундках,

що пройшоа з початку викоання програми millis() */

if (value != lastButtonState[pos]) {

lastDebounceTime[pos] = millis();

}

// перевірити різницю між поточним часом і останнім зареєстрованим часом натиснення кнопки, якшо він більший встановленого часу затримки, то означає що натиснута кнопка

if ((millis() - lastDebounceTime[pos]) > DEBOUNCE_DELAY) {

if (value != buttonState[pos]) {

buttonState[pos] = value;

if (buttonState[pos] == HIGH)

return true;

}

}

//зберегти зчитане значення стан кнопки. наступного ращу в циклі зчитаний стан кнопки буде вже як lastButtonState

lastButtonState[pos] = value;

return false;

}

void btn_pressed_interrupt() {

/*buttonState = digitalRead(buttonPin);

digitalWrite(ledPin, buttonState);.*/

// check if the pushbutton is pressed. If it is, the buttonState is HIGH:

if (digitalRead(MENU_ENTER_BUTTON_PIN) == HIGH) //isBtnPressed(MENU_BTN_PIN))

{

mainMenuInvoke = true;

}

}

void setCCS811Mode() /* вст. режим вимірювання */

{

//const char *const ccs811_mode[] = {"1 second", "10 seconds", "60 seconds", "250 milliseconds"};

const char *const ccs811_mode_name[] = {"idle", "1 second", "10 seconds", "60 seconds", "0.25 seconds"};

//const char *const ccs811_mode[] = {"idle", "1 секунда", "10 секунд", "60 секунд", "0.25 секунд"};

const uint8_t lcd_item_x_pos[] = {6, 4, 3, 3, 2};

bool lcd_refresh = true;

mode = CCS811.getMeasurementMode();

while(1)

{

if (lcd_refresh)

{

lcd.clear();

lcd.setCursor(0,0);

lcd.print(mainMenu[2]);

lcd.setCursor(lcd_item_x_pos[mode],1);

lcd.print(ccs811_mode_name[mode]);

lcd_refresh = false;

}

if (debounceButton(SELECT_PLUS_BUTTON_PIN))

{

if (mode < 4)

mode++;

else

mode = 0;

lcd_refresh = true;

}

if (debounceButton(SELECT_MINUS_BUTTON_PIN))

{

if (mode > 0)

mode--;

else

mode = 4;

lcd_refresh = !lcd_refresh;

}

if (debounceButton(MENU_ENTER_BUTTON_PIN))

{

switch(mode)

{

case 0: CCS811.setMeasurementMode(CCS811.eClosed); break;

case 1: CCS811.setMeasurementMode(CCS811.eCycle_1s); break;

case 2: CCS811.setMeasurementMode(CCS811.eCycle_10s); break;

case 3: CCS811.setMeasurementMode(CCS811.eCycle_60s); break;

case 4: CCS811.setMeasurementMode(CCS811.eCycle_250ms); break;

default: break;

}

return;

}

if (debounceButton(EXIT_BUTTON_PIN))

{

return;

}

}

}

void setCCS811Thresholds()

{

bool lcd_refresh = true, set_flag = false;

const char *const ccs811_thresholds[] = {"eCO2 Low to Med ", "eCO2 Med to High"};

uint16_t lowToMed = 1500 /*0x05DC*/;

uint16_t medToHigh = 2500 /*0x09C4*/; // eCO2 ppm

//uint8_t buf[4];

/*if (! readReg(CCS811_REG_THRESHOLDS, buf, 4))

{

//

lowToMed = buf[0];

lowToMed <<= 8;

// lowToMed = ((uint16_t) buf[0]) << 8;

lowToMed |= (uint16_t) buf[1];

//

medToHigh = buf[3];

medToHigh |= ((uint16_t) buf[2]) << 8;

}*/

lcd.clear();

lcd.setCursor(0,0);

lcd.print(ccs811_thresholds[0]);

while(!set_flag)

{

if (lcd_refresh)

{

lcd.setCursor(0,1);

lcd.print(lowToMed);

lcd.print(" ppm ");

lcd_refresh = false;

}

if (debounceButton(SELECT_PLUS_BUTTON_PIN))

{

if (lowToMed < 8192)

lowToMed++;

else

lowToMed = 1500;

lcd_refresh = true;

}

if (debounceButton(SELECT_MINUS_BUTTON_PIN))

{

if (lowToMed > 1500)

lowToMed--;

else

lowToMed = 1500;

lcd_refresh = !lcd_refresh;

}

if (debounceButton(MENU_ENTER_BUTTON_PIN))

{

set_flag = true;

}

if (debounceButton(EXIT_BUTTON_PIN))

{

set_flag = true;

//return;

}

}

if (lowToMed > medToHigh)

medToHigh = lowToMed + 50;

lcd.clear();

lcd.setCursor(0,0);

lcd.print(ccs811_thresholds[1]);

set_flag = false;

lcd_refresh = true;

while(!set_flag)

{

if (lcd_refresh)

{

lcd.setCursor(0,1);

lcd.print(medToHigh);

lcd.print(" ppm ");

lcd_refresh = false;

}

if (debounceButton(SELECT_PLUS_BUTTON_PIN))

{

if (medToHigh < 8192)

medToHigh++;

else

medToHigh = lowToMed;

lcd_refresh = true;

}

if (debounceButton(SELECT_MINUS_BUTTON_PIN))

{

if (medToHigh > lowToMed)

medToHigh--;

else

medToHigh = lowToMed;

lcd_refresh = !lcd_refresh;

}

if (debounceButton(MENU_ENTER_BUTTON_PIN))

{

set_flag = true;

}

if (debounceButton(EXIT_BUTTON_PIN))

return;

}

/**

* виставлення переривання при виході за порогові значення Set interrupt thresholds

* lowToMed: значення спрацювання переривання в діапазоні interrupt triggered value in range low to middle

* medToHigh: значення спрацювання переривання в діапазоні interrupt triggered value in range middle to high

* переривання спрацьовує, якщо значення eCO2 переходить з поточного діапазону (Low, Medium, High) в інший діапазон на значення більше 50 ppm

*/

CCS811.setThresholds(lowToMed, medToHigh); //1500,2500);

}

void CCS811Baseline() {

const char *const ccs811_baseline[] = {"Save baseline into EEPROM", "Load and apply baseline",

"Clear baseline from EEPROM", "Read and print sensor data"};

unsigned int result, baselineToApply;

bool lcd_refresh = true;

uint8_t i = 0;

Serial.println(F("CCS811 Baseline"));

//This looks for previously saved data in the eeprom at program start

lcd.clear();

if ((EEPROM.read(0) == 0xA5) && (EEPROM.read(1) == 0xB2))

{

Serial.println(F("EEPROM contains saved data."));

//lcd.setCursor(0,0);

lcd.print("EEPROM contains");

lcd.setCursor(0,1);

lcd.print("saved data");

}

else

{

Serial.println(F("Saved data not found!"));

//lcd.setCursor(0,0);

lcd.print("Saved data");

lcd.setCursor(0,1);

lcd.print("not found!");

}

delay(500);

while (1)

{

if (lcd_refresh)

{

String temp = String(ccs811_baseline[i]);

lcd.clear();

lcd.setCursor(0,0);

lcd.print(temp.substring(0,15));

lcd.setCursor(0,1);

lcd.print(temp.substring(16,31));

lcd_refresh = false;

}

if (debounceButton(SELECT_PLUS_BUTTON_PIN))

{

if (i < 3)

i++;

else

i = 0;

lcd_refresh = true;

}

if (debounceButton(SELECT_MINUS_BUTTON_PIN))

{

if (i > 0)

i--;

else

i = 3;

lcd_refresh = !lcd_refresh;

}

if (debounceButton(MENU_ENTER_BUTTON_PIN))

{

switch(i)

{

case 0: // 's'

// отримати останнє значення baseline з давача

result = CCS811.readBaseLine();

Serial.print("Baseline for this sensor: 0x");

lcd.clear();

lcd.print("Sensor baseline:");

lcd.setCursor(0,1);

if (result < 0x100)

{

Serial.print(F("0"));

lcd.write('0');

}

if (result < 0x10)

{

Serial.print(F("0"));

lcd.write('0');

}

Serial.println(result, HEX);

lcd.print(result, HEX);

delay(500);

// збереження baseline (with valid data indicator bytes)

lcd.clear();

lcd.print("Baseline saving");

lcd.setCursor(0,1);

lcd.print("into EEPROM..");

EEPROM.write(0, 0xA5);

EEPROM.write(1, 0xB2);

EEPROM.write(2, (result >> 8) & 0x00FF); // MSB

EEPROM.write(3, result & 0x00FF); // LSB

lcd.print("OK");

delay(500);

break;

case 1: // 'l'

if ((EEPROM.read(0) == 0xA5) && (EEPROM.read(1) == 0xB2))

{

Serial.println(F("EEPROM contains saved data"));

//зчитування і відновлення (упакування) baseline у 16 - розрядне слово

baselineToApply = ((unsigned int)EEPROM.read(2) << 8) | EEPROM.read(3);

Serial.print(F("Saved baseline: 0x"));

lcd.clear();

lcd.print("Saved baseline:");

lcd.setCursor(0,1);

lcd.print("0x");

if (baselineToApply < 0x100)

{

Serial.print(F("0"));

lcd.write('0');

}

if (baselineToApply < 0x10)

{

Serial.print(F("0"));

lcd.write('0');

}

Serial.println(baselineToApply, HEX);

lcd.print(result, HEX);

// встановлення, запис baseline в давач CCS811

CCS811.writeBaseLine(baselineToApply);

delay(500);

}

else

{

Serial.println(F("Saved data not found!"));

lcd.clear();

lcd.print("Saved data");

lcd.setCursor(0,1);

lcd.print("not found!");

delay(500);

}

break;

case 2: // 'c'

//Витирання індикатора даних і даних з eeprom

Serial.println(F("Clearing EEPROM space"));

lcd.clear();

lcd.print("Clearing EEPROM");

lcd.setCursor(0,1);

lcd.print("space");

EEPROM.write(0, 0x00);

EEPROM.write(1, 0x00);

EEPROM.write(2, 0x00);

EEPROM.write(3, 0x00);

delay(500);

break;

case 3: // 'r'

if (CCS811.checkDataReady() == true)

{

Serial.print(F("CO2["));

eCO2 = CCS811.getCO2PPM();

Serial.print(eCO2);

Serial.print(F("] tVOC["));

eTVOC = CCS811.getTVOCPPB();

Serial.print(eTVOC);

Serial.print(F("]"));

Serial.println();

lcd.clear();

lcd.print("CO2[");

lcd.print(eCO2);

lcd.print("]");

lcd.setCursor(0,1);

lcd.print("tVOC[");

lcd.print(eTVOC);

lcd.print("]");

delay(500);

}

else

{

Serial.println(F("Sensor data not available"));

lcd.clear();

lcd.print("Sensor data");

lcd.setCursor(0,1);

lcd.print("not available");

delay(500);

}

break;

default:

break;

}

lcd_refresh = true;

}

if (debounceButton(EXIT_BUTTON_PIN))

{

return;

}

}

}

void setCCS811Alarm()

{

bool lcd_refresh = true;

const char *const buzzer_mode[] = {"ON ", "OFF"};

uint8_t i = 0;

lcd.clear();

lcd.setCursor(2,0);

lcd.print(F("Buzzer Sound"));

while(1)

{

if (lcd_refresh)

{

lcd.setCursor(7,1);

lcd.print(buzzer_mode[i]);

lcd_refresh = false;

}

if (debounceButton(SELECT_PLUS_BUTTON_PIN))

{

if (i < 1)

i++;

else

i = 0;

lcd_refresh = true;

}

if (debounceButton(SELECT_MINUS_BUTTON_PIN))

{

if (i > 0)

i--;

else

i = 1;

lcd_refresh = !lcd_refresh;

}

if (debounceButton(MENU_ENTER_BUTTON_PIN))

{

return;

}

if (debounceButton(EXIT_BUTTON_PIN))

{

return;

}

}

}

void setCCS811Interrupts()

{

bool lcd_refresh = true;

const char *const int_gen[] = {"Disable", "Enable "};

uint8_t i = 0;

bool set_flag = false;

lcd.clear();

lcd.setCursor(1,0);

lcd.print(F("INT Data Ready"));

while(!set_flag)

{

if (lcd_refresh)

{

lcd.setCursor(4,1);

lcd.print(int_gen[i]);

lcd_refresh = false;

}

if (debounceButton(SELECT_PLUS_BUTTON_PIN))

{

if (i < 1)

i++;

else

i = 0;

lcd_refresh = true;

}

if (debounceButton(SELECT_MINUS_BUTTON_PIN))

{

if (i > 0)

i--;

else

i = 1;

lcd_refresh = !lcd_refresh;

}

if (debounceButton(MENU_ENTER_BUTTON_PIN))

{

int_datardy = i;

set_flag = true;

//return;

}

if (debounceButton(EXIT_BUTTON_PIN))

{

set_flag = true;

//return;

}

}

//

lcd.clear();

lcd.setCursor(2,0);

lcd.print(F("INT Threshold"));

i = 0; set_flag = false;

lcd_refresh = true;

while(!set_flag)

{

if (lcd_refresh)

{

lcd.setCursor(4,1);

lcd.print(int_gen[i]);

lcd_refresh = false;

}

if (debounceButton(SELECT_PLUS_BUTTON_PIN))

{

if (i < 1)

i++;

else

i = 0;

lcd_refresh = true;

}

if (debounceButton(SELECT_MINUS_BUTTON_PIN))

{

if (i > 0)

i--;

else

i = 1;

lcd_refresh = !lcd_refresh;

}

if (debounceButton(MENU_ENTER_BUTTON_PIN))

{

int_thresh = i;

set_flag = true;

//return;

}

if (debounceButton(EXIT_BUTTON_PIN))

{

set_flag = true;

//return;

}

}

CCS811.setMeasurementMode(CCS811.getMeasurementMode(), int_thresh, int_datardy);

}

void getEnvironmentalParams()

{

lcd.clear();

lcd.setCursor(0,1);

lcd.print("MENU_ENTR to set");

while (1)

{

getTempHum();

lcd_buffer = String(temperature, 1); lcd_buffer += (char)223; lcd_buffer += 'C';

lcd_buffer += String(humidity, 1) + "% RH";

lcd.setCursor(0,0);

lcd.print(lcd_buffer);

if (debounceButton(MENU_ENTER_BUTTON_PIN))

{

CCS811.setInTempHum(temperature, humidity);

return;

}

if (debounceButton(EXIT_BUTTON_PIN))

{

return;

}

delay(500);

}

}

void test20minutes()

{

char buffer[50];

int minutes = 0;

Serial.println(F("20 minute test"));

while (minutes < 20)

{

unsigned long runTime = millis();

minutes = runTime / (60 * 1000L);

if (CCS811.checkDataReady() == true)

{

Serial.print(F("CO2["));

Serial.print(CCS811.getCO2PPM());

Serial.print(F("] tVOC["));

Serial.print(CCS811.getTVOCPPB());

Serial.print(F("] millis["));

Serial.print(millis());

Serial.println(F("] "));

} else {

Serial.println("Data is not ready!");

}

/*!

* @brief Set baseline

* @param get from getBaseline.ino

*/

CCS811.writeBaseLine(0x447B);

}

}

void printRunTime()

{

char buffer[50];

unsigned long runTime = millis();

int hours = runTime / (60 * 60 * 1000L);

runTime %= (60 * 60 * 1000L);

int minutes = runTime / (60 * 1000L);

runTime %= (60 * 1000L);

int seconds = runTime / 1000L;

sprintf(buffer, "RunTime[%02d:%02d:%02d]", hours, minutes, seconds);

Serial.print(buffer);

if (hours == 0 && minutes < 20)

Serial.print(" Not yet valid");

}

void showMainMenu()

{

//"Baseline", "Measurement Mode", "Set Thresholds", "Set Interrupts", "Alarm Settings", "Env. Params", "Exit"

const uint8_t lcd_item_x_pos[] = {0, 4, 0, 1, 1, 1, 2, 5};

uint8_t i = 1;

bool lcd_refresh = true;

while(1)

{

if (lcd_refresh)

{

lcd.clear();

//strcpy_P(lcd_1_row_buffer, (char*)pgm_read_word(&(mainMenu[0])));

lcd.setCursor(lcd_item_x_pos[0],0);

//lcd.print(lcd_1_row_buffer);

lcd.print(mainMenu[0]);

//strcpy_P(lcd_1_row_buffer, (char*)pgm_read_word(&(mainMenu[i])));

lcd.setCursor(lcd_item_x_pos[i],1);

//lcd.print(lcd_1_row_buffer);

lcd.print(mainMenu[i]);

lcd_refresh = !lcd_refresh;

}

if (debounceButton(SELECT_PLUS_BUTTON_PIN))

{

if (i == 6) i = 1;

else i++;

lcd_refresh = !lcd_refresh;

}

if (debounceButton(SELECT_MINUS_BUTTON_PIN))

{

if (i == 1) i = 6;

else i--;

lcd_refresh = !lcd_refresh;

}

if(debounceButton(MENU_ENTER_BUTTON_PIN))

{

switch(i)

{

case 1: CCS811Baseline(); break;

case 2: setCCS811Mode(); break; /* вст. режим вимірювання */

case 3: setCCS811Thresholds(); break;

case 4: setCCS811Interrupts(); break;

case 5: setCCS811Alarm(); break;

case 6: getEnvironmentalParams(); break;

case 7: return; // exit

default: break;

}

lcd_refresh = !lcd_refresh;

}

if (debounceButton(EXIT_BUTTON_PIN))

{

return;

}

}

}

void setup(void)

{

Serial.begin(9600); //115200);

while (!Serial);

delay(200);

// Ініціалізація виводів до яких підключені кнопки

pinMode(MENU_ENTER_BUTTON_PIN, INPUT);

pinMode(SELECT_PLUS_BUTTON_PIN, INPUT);

pinMode(SELECT_MINUS_BUTTON_PIN, INPUT);

pinMode(EXIT_BUTTON_PIN, INPUT);

// Ініцілізація виводів LEDs і BUZZER

pinMode(ALARM_LED1_PIN, OUTPUT);

pinMode(ALARM_LED2_PIN, OUTPUT);

pinMode(BUZZER_PIN, OUTPUT);

/*Serial.println(F("Система моніторингу якості повітря в бойових броньованих машинах на платформі Arduino з використанням давача CCS811"));

Serial.println(F("2025, розробив: Роман Возний"));*/

Serial.println(F("IAQ monitoring device based on Arduino Uno platform and CCS811 sensor"));

Serial.println(F("developed by Roman Voznyy"));

// виставляємо кількість стовпців і рядків в LCD

lcd.begin(16, 2);

lcd.setCursor(1,0);

lcd.print("IAQ monitoring");

lcd.setCursor(5,1);

lcd.print("device");

/*lcd.setCursor(4,0);

lcd.print(F("Пристрій"));

lcd.setCursor(0,1);

lcd.print(F("монiторингу IAQ"));*/

delay(500);

lcd.clear();

lcd.setCursor(2,0);

lcd.print(F("developed by"));

/*

lcd.setCursor(3,0);

lcd.print(F("розробив:"));*/

lcd.setCursor(2,1);

lcd.print(F("Roman Voznyy"));

/*

lcd.setCursor(2,0);

lcd.print(F("Роман Возний"));

*/

delay(500);

// Ініціалізація давача якості повітря в бойових броньованих машинах (IAQ) CCS811

lcd.clear();

lcd.print("CCS811 init...");

Serial.println(F("CCS811 sensor initialization..."));

//Serial.println(F("Ініціалізація давача CCS811..."));

/* чекаємо на завершення ініціалізації давача, і тоді виходимо з циклу */

while (CCS811.begin() != 0) {

lcd.setCursor(0,1);

lcd.print("failed!");

Serial.println(F("failed to init chip, please check if the chip connection is fine"));

//Serial.println(F("ініціалізація пройшла невдало, будь-ласка перевірте підключення давача"));

digitalWrite(ALARM_LED2_PIN, HIGH);

delay(500);

digitalWrite(ALARM_LED2_PIN, LOW);

}

lcd.setCursor(0,1);

lcd.print("OK!");

Serial.println(F("OK!"));

// Ініціалізація давача вологості і температури SHT

lcd.clear();

lcd.print("SHT31 init...");

Serial.println(F("SHT31 sensor initialization..."));

while (! sht31.begin(SHT_I2C_ADDRESS)) { // встановити в 0x45 для альтернативної адреси i2c

Serial.println(F("Couldn't find SHT31"));

//Serial.println(F("давач SHT31 не знайдено"));

lcd.setCursor(0,1);

lcd.print("failed!");

digitalWrite(ALARM_LED2_PIN, HIGH);

delay(500);

digitalWrite(ALARM_LED2_PIN, LOW);

}

lcd.setCursor(0,1);

lcd.print("OK!");

Serial.println(F("OK!"));

Serial.println();

Serial.print(F("current configured parameter code is "));

CCS811.writeBaseLine(0x447B);

//Serial.print(F("код поточного параметра конфігурації (режим роботи) є "));

Serial.println(CCS811.getMeasurementMode(), BIN);

/**

* Налаштування параметрів вимірювання

* mode: in typedef enum {

* eClosed, // Idle (вимірювання відключенні в цьому режимі)

* eCycle_1s, // режим постійної потужності, вимірювання IAQ кожну секунду

* eCycle_10s, // режим імпульсного нагрівання, вимірювання IAQ кожних 10 секунд

* eCycle_60s, // режим імпульсного нагрівання низької потужності, вимірювання IAQ кожних 60 секунд

* eCycle_250ms // режим постійної потужності, вимірювання давача відбуваються кожних 250 мілісекунд

* // 1xx: Reserved modes (For future use)

* } eCycle_t;

*/

CCS811.setMeasurementMode(CCS811.eCycle_250ms);

Serial.println(CCS811.getMeasurementMode(), HEX);

/**

* Встановлення параметрів середовища

* temperature - встановлення температури в ℃, діапазон: -40~85℃

* humidity - встановлення вологості, одиниці: RH, діапазон: 0~100RH

*/

// Читаємо температуру і вологість з давача SHT31

temperature = sht31.readTemperature();

humidity = sht31.readHumidity();

/*humidity = sht.getHumidity();

temperature = sht.getTemperature();*/

if (isnan(temperature)) { // перевіряємо чи 'не число'

Serial.println(F("Failed to read temperature")); //

//Serial.println(F("невдалося прочитати температуру"));

}

if (isnan(humidity)) { // перевіряємо якщо 'не число'

Serial.println("Failed to read humidity");

//Serial.println(F("невдалося прочитати вологість"));

}

CCS811.setInTempHum(temperature, humidity); // temperature=25, humidity=50

// підключення функції обробки переривання - Attach an interrupt to the ISR vector

attachInterrupt(digitalPinToInterrupt(MENU_ENTER_BUTTON_PIN), btn_pressed_interrupt, RISING); //CHANGE);

attachInterrupt(digitalPinToInterrupt(CCS811_INT_PIN), ccs811_interrupt, RISING);

}

void getTempHum()

{

temperature = sht31.readTemperature();

humidity = sht31.readHumidity();

/*humidity = sht.getHumidity();

temperature = sht.getTemperature();*/

if (! isnan(temperature)) { // перевіряємо чи 'не число'

Serial.print(F("Temperature *C = "));

//Serial.print(F("Температура *C = "));

Serial.println(temperature);

} else {

Serial.println(F("Failed to read temperature"));

//Serial.println(F("Помилка читання температури"));

}

if (! isnan(humidity)) { // перевіряємо чи 'не число'

Serial.print(F("Humidity % = "));

//Serial.print(F("Вологість % = "));

Serial.println(humidity);

} else {

Serial.println(F("Failed to read humidity"));

//Serial.println(F("Помилка читання вологості"));

}

}

void getCO2andTVOC()

{

/*baseLine = CCS811.readBaseLine();

Serial.println(baseLine, HEX);

CCS811.writeBaseLine(baseLine); //0x447B);

*/

/* зчитуємо з давача CCS811 еквівалентний рівень концентрації CO2

діапазон вимірювання eCO2 400...8192 ppm */

eCO2 = CCS811.getCO2PPM();

Serial.print(F("CO2: "));

Serial.print(eCO2);

Serial.print(F(" ppm, TVOC: "));

//eCO2 = 8192; //600

lcd_buffer = "CO2: " + String(eCO2) + " ppm M" + String(mode);

lcd.setCursor(0,0);

lcd.print(lcd_buffer);

/* зчитуємо з давача CCS811 еквівалентний рівень концентрації летких орагнічних сполук TVOC

діапазон вимірювання TVOC 0...1187 ppb */

eTVOC = CCS811.getTVOCPPB();

Serial.print(eTVOC);

Serial.println(F(" ppb"));

//eTVOC = 1187; // 30

lcd_buffer = "TVOC: " + String(eTVOC) + " ppb";

lcd.setCursor(0,1);

lcd.print(lcd_buffer);

}

void loop() {

if (GPIO1TRIG == 1) // перевіряємо чи виставлено прапорець переривання від CCS811

{

if (int_thresh) // переривання INT_THRES

{

Serial.println(F("CO2 range has changed"));

Serial.print(F("CO2: "));

Serial.print(CCS811.getCO2PPM());

Serial.print(F(" ppm, TVOC: "));

Serial.print(CCS811.getTVOCPPB());

Serial.println(F(" ppb"));

delay(1000);

}

else // переривання INT_DATARDY

getCO2andTVOC();

GPIO1TRIG = 0;

}

else if (!int_datardy)

{

if (CCS811.checkDataReady() == true)

getCO2andTVOC();

else

Serial.println(F("Data is not ready!"));

}

/* Вплив концентрації CO2 на організм людини

* <500 нема впливу

* 500-1000 каламутне повітря

* 1000-2500 відчуття сонливості

* 2500-5000 шкідливо для людського організму

* >5000 токсичний

*/

/* Вплив концентрації TVOC на організм людини

* <50 нема впливу

* 50-750 некомфортно, нервозний стан

* 760-6000 некомфортно, нервозний стан, головна біль

* >6000 головна біль, неврологічні проблеми

*/

if ((eCO2 >= 500 && eCO2 < 2500) || (eTVOC >= 50 && eTVOC < 760))

{

digitalWrite(ALARM_LED1_PIN, HIGH);

tone(BUZZER_PIN, 500);

alarm_flag = true;

//delay(1000); // noTone(BUZZER_PIN);

}

else if (eCO2 >= 2500 || eTVOC >= 760)

{

digitalWrite(ALARM_LED2_PIN, HIGH);

tone(BUZZER_PIN, 500);

alarm_flag = true;

delay(1000);

//noTone(BUZZER_PIN);

}

else if (alarm_flag)

{

digitalWrite(ALARM_LED1_PIN, LOW);

digitalWrite(ALARM_LED2_PIN, LOW);

noTone(BUZZER_PIN);

alarm_flag = false;

}

if (mainMenuInvoke)

{

detachInterrupt(digitalPinToInterrupt(MENU_ENTER_BUTTON_PIN));

showMainMenu();

mainMenuInvoke = false;

attachInterrupt(digitalPinToInterrupt(MENU_ENTER_BUTTON_PIN), btn_pressed_interrupt, CHANGE);

lcd.clear();

}

float temp = temperature, humi = humidity;

// зчитуємо температуру і вологість з давача SHT

getTempHum();

if (( (temperature - temp) >= TEMP_HYSTERESIS || (temp - temperature) >= TEMP_HYSTERESIS )

|| ( (humidity - humi) >= HUMI_HYSTERESIS || (humi - humidity) >= HUMI_HYSTERESIS))

{

Serial.println(F("Environmental paramaters have changed"));

CCS811.setInTempHum(temperature, humidity); // змінилися параметри навколишнього середовища

}

//delay cannot be less than measurement cycle

delay(500);

}

void ccs811_interrupt(){

GPIO1TRIG = 1;

}