Съдържание:

Arduino CO монитор, използващ сензор MQ-7: 8 стъпки (със снимки)
Arduino CO монитор, използващ сензор MQ-7: 8 стъпки (със снимки)

Видео: Arduino CO монитор, използващ сензор MQ-7: 8 стъпки (със снимки)

Видео: Arduino CO монитор, използващ сензор MQ-7: 8 стъпки (със снимки)
Видео: Самая простая газовая сигнализация. 2024, Юли
Anonim
Arduino CO монитор с помощта на сензор MQ-7
Arduino CO монитор с помощта на сензор MQ-7
Arduino CO монитор с помощта на сензор MQ-7
Arduino CO монитор с помощта на сензор MQ-7

Няколко думи защо е създадена тази инструкция: един ден майката на приятелката ми ни се обади посред нощ, защото се почувства наистина болна - имаше замаяност, тахикардия, гадене, високо кръвно налягане, дори припадна за неизвестно време (вероятно ~ 5 минути, но няма как да се каже), всичко без видима причина. Тя живее в малко селце, далеч от болниците (60 км от нашето място, 30 км до най -близката болница, 10 км без нормален път между тях), затова се втурнахме към нея и стигнахме скоро след линейката. Тя беше хоспитализирана и на сутринта се почувства почти добре, но лекарите не успяха да установят причината за това. На следващия ден имахме идея: може да е било отравяне с CO, тъй като тя има котел с газова вода (на снимката), и седеше близо до него цяла вечер, когато това се случи. Наскоро купихме сензор MQ-7 CO, но никога не съм имал време да събера схеми за него, така че това беше идеалният момент да го направя. След един час търсене в интернет за каквито и да било инструкции, разбрах, че не мога да намеря никакво ръководство, което в същото време да следва инструкциите на производителя на сензора, предоставени в неговия лист с данни и да обяснява изобщо нещо (един пример изглежда имаше доста добър код, но той не беше ясно как да го приложим, други бяха опростени и не работеха добре). Така че прекарахме около 12 часа за разработване на схеми, изработка и отпечатване на 3d корпус, тестване и калибриране на сензора, а на следващия ден отидохме до подозрителния котел. Оказа се, че нивата на CO там са изключително високи и могат да бъдат фатални, ако времето на експозиция на CO е по -дълго. Така че вярвам, че всеки, който има подобна ситуация (като газов котел или друго изгаряне, което се случва в жилищно пространство), трябва да получи такъв сензор, за да предотврати нещо лошо.

Всичко това се случи преди две седмици, оттогава подобрих схемите и програмата доста, а сега изглежда, че е сравнително добър и сравнително прост (не прост от 3 реда код, но все пак). Въпреки че се надявам, че някой с прецизен CO метър ще ми даде някаква обратна връзка относно калибрирането по подразбиране, което съм поставил в скицата - подозирам, че далеч не е добре. Ето едно пълно ръководство с някои експериментални данни.

Стъпка 1: Сметка на материалите

Сметка на материалите
Сметка на материалите

Ще ви трябва: 0. Дъска Arduino. Предпочитам китайския клонинг на Arduino Nano за изключителната му цена от $ 3, но всеки 8-битов arduino ще работи тук. Sketch използва някои усъвършенствани таймери и е тестван само на микроконтролер atmega328 - въпреки че вероятно ще работи добре и на други. MQ-7 CO сензор. Най-често се предлага с този сензорен модул за летяща риба, той трябва да премине през малка модификация, подробности в следващата стъпка, или можете да използвате отделен сензор MQ-7.

2. NPN биполярен транзистор. Почти всеки NPN транзистор, който може да се справи с 300 mA или повече, ще работи тук. PNP транзисторът няма да работи със споменатия модул Flying Fish (тъй като има нагревателен щифт, запоен към изхода на сензора), но може да се използва с дискретен сензор MQ-7.

3. Резистори: 2 x 1k (от 0,5k до 1,2k ще работи добре) и 1 x 10k (този най -добре се поддържа прецизен - въпреки че, ако абсолютно трябва да използвате различна стойност, коригирайте съответно променливата reference_resistor_kOhm в скицата).

4. Кондензатори: 2 x 10uF или повече. Изискват се танталови или керамични такива, електролитите няма да работят добре поради високия ESR (те няма да могат да осигурят достатъчно ток, за да изгладят високотоковите вълни). Зелени и червени светодиоди за обозначаване на текущото ниво на CO (можете да използвате и единичен двуцветен светодиод с 3 извода, както използвахме в прототипа на нашата жълта кутия). Пиезо зумер, който показва високо ниво на CO. Платка и проводници (можете също да запоявате всичко към Nano щифтове или да ги стиснете в гнездата на Uno, но по този начин е лесно да направите грешка).

Стъпка 2: Модификация на модула или дискретно окабеляване на сензора

Модификация на модула или дискретно окабеляване на сензора
Модификация на модула или дискретно окабеляване на сензора

За модула трябва да разтопите резистора и кондензатора, както е показано на снимката. Можете да разлеите основно всичко, ако искате - електрониката на модула е напълно безполезна, ние я използваме само като държач за самия сензор, но тези два компонента ще ви попречат да получите правилни показания, Ако използвате дискретен сензор, свържете щифтовете на нагревателя (H1 и H2) към 5V и колектора на транзистора съответно. Прикрепете една чувствителна страна (всеки от A пиновете) към 5V, друга чувствителна страна (която и да е от B щифтове) към 10k резистор, точно като аналоговия щифт на модула в схемите.

Стъпка 3: Принцип на работа

Принцип на работа
Принцип на работа
Принцип на работа
Принцип на работа

Защо изобщо имаме нужда от всички тези усложнения, защо да не прикачим 5V, земя и просто да получим показания? Е, няма да получите нищо полезно по този начин, за съжаление. Според листа с данни MQ-7, сензорът трябва да премине през високо- и цикли на ниско нагряване, за да получите правилни измервания. По време на нискотемпературната фаза, CO се абсорбира върху плочата, като дава значими данни. По време на фаза с висока температура, абсорбираният CO и други съединения се изпаряват от сензорната плоча, почиствайки я за следващото измерване.

Така че като цяло операцията е проста:

1. Приложете 5V за 60 секунди, не използвайте тези показания за измерване на CO.

2. Приложете 1.4V за 90 секунди, използвайте тези показания за измерване на CO.

3. Преминете към стъпка 1.

Но ето проблема: Arduino не може да осигури достатъчно мощност, за да управлява този сензор от неговите щифтове - нагревателят на сензора изисква 150 mA, докато щифтът на Arduino може да осигури не повече от 40 mA, така че ако е свързан директно, щифтът на Arduino ще изгори и сензорът все още ще спечели не работи. Така че трябва да използваме някакъв токов усилвател, който приема малък входен ток за контрол на голям изходен ток. Друг проблем е получаването на 1.4V. Единственият начин за надеждно получаване на тази стойност без въвеждане на много аналогови компоненти е да се използва PWM (Pulse Width Modulation) подход с обратна връзка, която ще контролира изходното напрежение.

NPN транзисторът решава и двата проблема: когато е постоянно включен, напрежението в сензора е 5V и той се нагрява за високотемпературна фаза. Когато прилагаме ШИМ към неговия вход, токът пулсира, след това се заглажда от кондензатора и средното напрежение се поддържа постоянно. Ако използваме високочестотна ШИМ (в скицата тя има честота 62,5KHz) и средно много аналогови показания (в скицата ние средно над ~ 1000 показания), тогава резултатът е доста надежден.

Важно е да добавите кондензатори според схемите. Изображенията тук илюстрират разликата в сигнала със и без C2 кондензатор: без него PWM вълната е ясно видима и значително изкривява показанията.

Стъпка 4: Схеми и чертеж

Схеми и чертеж
Схеми и чертеж
Схеми и чертеж
Схеми и чертеж
Схеми и чертеж
Схеми и чертеж

Ето схемите и монтажната платка.

ВНИМАНИЕ! Изисква се промяна на стандартен пробивен модул! Без модификация модулът е безполезен. Промяната е описана във втората стъпка

Важно е да използвате щифтове D9 и D10 за светодиоди, тъй като там имаме изходи на хардуерен Timer1, което ще позволи плавно да промените цветовете им. Пиновете D5 и D6 се използват за зумер, тъй като D5 и D6 са изходи на хардуерен таймер0. Ще ги конфигурираме да бъдат обратни едно към друго, така че те да превключват между (5V, 0V) и (0V, 5V) състояния, като по този начин издават звук на зумера. Предупреждение: това засяга основното прекъсване на времето на Arduino, така че всички зависими от времето функции (като millis ()) няма да дадат правилни резултати в тази скица (повече за това по-късно). Pin D3 има свързан хардуерен Timer2 изход (както и D11 - но е по -малко удобно да поставите проводник на D11, отколкото на D3) - затова го използваме за осигуряване на ШИМ за транзистор за управление на напрежението. Резистор R1 се използва за контрол на яркостта на светодиодите. Той може да бъде от 300 до 3000 Ohm, 1k е по -скоро оптимален по отношение на яркостта/консумацията на енергия. Резистор R2 се използва за ограничаване на базовия ток на транзистора. Тя не трябва да бъде по -ниска от 300 ома (за да не претоварвате щифта на Arduino) и не по -висока от 1500 ома. 1k има безопасен избор.

Резистор R3 се използва последователно с плоча на сензора, за да се създаде делител на напрежение. Напрежението на изхода на сензора е равно на R3 / (R3 + Rs) * 5V, където Rs е съпротивлението на токовия сензор. Съпротивлението на сензора зависи от концентрацията на CO, така че напрежението съответно се променя. Кондензаторът C1 се използва за изглаждане на входното ШИМ напрежение на сензора MQ -7, колкото по -висок е неговият капацитет, толкова по -добре, но също така трябва да има нисък ESR - така че керамика (или тантал) кондензаторът е предпочитан тук, електролитен няма да работи добре.

Кондензатор С2 се използва за изглаждане на аналоговия изход на сензора (изходното напрежение зависи от входното напрежение - и тук имаме доста висок ток на ШИМ, което засяга всички схеми, така че имаме нужда от С2). Най -простото решение е да използвате същия кондензатор като транзистора C1. NPN или провежда ток през цялото време, за да осигури висок ток на нагревателя на сензора, или работи в режим PWM, като по този начин намалява нагряващия ток.

Стъпка 5: Програма Arduino

Програма Arduino
Програма Arduino

ВНИМАНИЕ: СЕНЗОРЪТ ИЗИСКВА РЪЧНО КАЛИБРИРАНЕ ЗА ВСЯКА ПРАКТИЧНА УПОТРЕБА. БЕЗ КАЛИБРИРАНЕ, ЗАВИСИМО ОТ ПАРАМЕТРИТЕ НА ВАШИЯТ СЕЧЕТНИК, ТОЗИ СКИЧ МОЖЕ ДА ВКЛЮЧИ АЛАРМАТА В ЧИСТ ВЪЗДУХ ИЛИ НЕ ДЕТЕКЦИРА ЛЕТАЛНА КОНЦЕНТРАЦИЯ ВЪГЛЕВ МОНОКСИД

Калибрирането е описано в следните стъпки. Грубото калибриране е много просто, прецизното е доста сложно.

На общо ниво програмата е доста проста:

Първо калибрираме нашата ШИМ, за да произведем стабилни 1.4V, изисквани от сензора (правилната ширина на ШИМ зависи от много параметри като точни стойности на резистора, съпротивлението на този конкретен сензор, VA кривата на транзистора и т.н. и т.н. - така че най -добрият начин е да опитате различни стойности и използваме този, който е най -подходящ). След това непрекъснато преминаваме през цикъл от 60 секунди нагряване и 90 секунди измерване. При изпълнението става малко сложно. Трябва да използваме хардуерни таймери, защото всичко, което имаме тук, се нуждае от високочестотна стабилна ШИМ, за да функционира правилно. Кодът е прикачен тук и може да бъде изтеглен от нашия github, както и източник на схеми във Fritzing. В програмата има 3 функции, които обработват таймери: setTimer0PWM, setTimer1PWM, setTimer2PWM, Всяка от тях задава таймер в PWM режим с дадени параметри (коментиран в кода), и задава ширината на импулса според входните стойности. Фазите на измерване се превключват с помощта на функции startMeasurementPhase и startHeatingPhase боравят с всичко вътре. и задайте правилни стойности на таймера за превключване между отопление 5V и 1.4V. Състоянието на светодиодите се задава от функциите setLEDs, които приемат зелена и червена яркост на входа си (в линеен мащаб 1-100) и ги преобразуват в съответната настройка на таймера.

Състоянието на зумера се контролира с помощта на функции buzz_on, buzz_off, buzz_beep. Функциите за включване/изключване включват и изключват звука, функцията за звуков сигнал създава специфична звукова последователност с период от 1,5 секунди, ако се извиква периодично (тази функция се връща незабавно, така че да не поставя на пауза основната програма - но трябва да я извиквате отново и отново за създаване на звуков сигнал).

Програмата първо изпълнява функция pwm_adjust, която установява правилната ширина на цикъла на PWM, за да се постигне 1.4V по време на фазата на измерване. След това бипва няколко пъти, за да покаже, че сензорът е готов, превключва във фаза на измерване и стартира основния цикъл.

В основния цикъл програмата проверява дали сме прекарали достатъчно време в текущата фаза (90 секунди за фаза на измерване, 60 секунди за фаза на нагряване) и ако да, тогава променя текущата фаза. Също така постоянно актуализира показанията на сензора, използвайки експоненциално изглаждане: new_value = 0.999*old_value + 0.001*new_reading. При такива параметри и цикъл на измерване, той усреднява сигнала за приблизително последните 300 милисекунди. БЕЗ КАЛИБРИРАНЕ, ЗАВИСИМО ОТ ПАРАМЕТРИТЕ НА ВАШИЯ СЕКЦИОНАР, ТОЗИ СКИЧ МОЖЕ ДА ВКЛЮЧИ АЛАРМАТА В ЧИСТ ВЪЗДУХ ИЛИ НЕ ДЕТЕКЦИРА ЛЕТАЛНА КОНЦЕНТРАЦИЯ ВЪГЛЕВ МОНОКСИД.

Стъпка 6: Първо изпълнение: Какво да очаквате

Първо изпълнение: Какво да очаквате
Първо изпълнение: Какво да очаквате

Ако сте събрали всичко правилно, след стартиране на скица ще видите нещо подобно в серийния монитор:

регулиране на ШИМ w = 0, V = 4.93

регулиране на ШИМ w = 17, V = 3.57 Резултат от ШИМ: ширина 17, напрежение 3.57

и след това серия от числа, представляващи текущи показания на сензора. Тази част е регулиране на ширината на ШИМ, за да се произведе напрежението на нагревателя на сензора възможно най -близо до 1.4V, измереното напрежение се приспада от 5V, така че нашата идеална измерена стойност е 3.6V. Ако този процес никога не приключва или приключва след една стъпка (което води до ширина, равна на 0 или 254) - значи нещо не е наред. Проверете дали вашият транзистор наистина е NPN и дали е правилно свързан (уверете се, че сте използвали база, колектор, излъчвателни щифтове вдясно - основата отива към D3, колектор към MQ -7 и излъчвател към маса, не разчитайте на изглед на Fritzing макет - това е грешка за някои транзистори) и се уверете, че сте свързали входа на сензора към входа A1 на Arduino. Ако всичко е наред, трябва да видите в серийния плотер от Arduino IDE нещо подобно на изображението. Циклите на нагряване и измерване с продължителност 60 и 90 секунди се изпълняват един след друг, като CO ppm се измерва и актуализира в края на всеки цикъл. Можете да вземете малко открит пламък близо до сензора, когато цикълът на измерване е почти завършен и да видите как той ще повлияе на показанията (в зависимост от типа пламък, той може да произвежда до 2000 ppm концентрация на CO на открито - така че въпреки че само малка част от той всъщност влиза в сензора, той все още ще включи алармата и няма да изгасне до края на следващия цикъл). Показах го на изображението, както и реакцията на огън от запалката.

Стъпка 7: Калибриране на сензора

Калибриране на сензора
Калибриране на сензора
Калибриране на сензора
Калибриране на сензора

Според информационния лист на производителя, сензорът трябва да работи цикли на нагряване и охлаждане в продължение на 48 часа подред, преди да може да се калибрира. И трябва да го направите, ако възнамерявате да го използвате дълго време: в моя случай отчитането на сензора в чист въздух се промени за около 30% за 10 часа. Ако не вземете това предвид, можете да получите резултат от 0 ppm, когато действително има 100 ppm CO. Ако не искате да чакате 48 часа, можете да наблюдавате изхода на сензора в края на цикъла на измерване. Когато повече от час няма да се промени за повече от 1-2 точки - можете да спрете отоплението там.

Грубо калибриране:

След като пуснете скица за поне 10 часа на чист въздух, вземете стойността на суровия сензор в края на цикъла на измерване, 2-3 секунди преди началото на фазата на нагряване, и я запишете в променливата sensor_reading_clean_air (ред 100). Това е. Програмата ще оцени други параметри на сензора, те няма да бъдат точни, но трябва да са достатъчни, за да се направи разлика между 10 и 100 ppm концентрация.

Прецизно калибриране:

Силно препоръчвам да намерите калибриран CO метър, да направите 100 ppm CO проба (това може да стане, като вземете малко димни газове в спринцовката - концентрацията на CO може лесно да бъде в диапазона от няколко хиляди ppm - и бавно я поставете в затворен буркан с калибриран измервателен уред и сензор MQ-7), вземете суровото отчитане на сензора при тази концентрация и го поставете в променливата sensor_reading_100_ppm_CO. Без тази стъпка измерването на ppm може да бъде грешно няколко пъти в двете посоки (все още е добре, ако имате нужда от аларма за опасна концентрация на CO у дома, където обикновено въобще не трябва да има CO, но не е добре за всяко промишлено приложение).

Тъй като нямах никакъв CO метър, използвах по -сложен подход. Първо приготвих висока концентрация на CO, използвайки изгаряне в изолиран обем (първа снимка). В тази статия открих най -полезните данни, включително добива на CO за различни видове пламъци - не е на снимката, но последният експеримент използва изгаряне на пропанов газ със същата настройка, което води до ~ 5000 ppm концентрация на CO. След това се разрежда 1:50, за да се постигне 100 ppm, както е показано на втората снимка, и се използва за определяне на референтната точка на сензора.

Стъпка 8: Някои експериментални данни

Някои експериментални данни
Някои експериментални данни

В моя случай сензорът работи доста добре - не е много чувствителен за наистина ниски концентрации, но е достатъчно добър за откриване на нещо по -високо от 50 ppm. Опитах се постепенно да увелича концентрацията, правейки измервания и изградих набор от диаграми. Има два комплекта линии от 0 ppm - чисто зелено преди излагане на CO и жълто зелено след това. Сензорът изглежда леко променя съпротивлението си на чист въздух след излагане, но този ефект е малък. Изглежда, че не може ясно да се прави разлика между 8 и 15, 15 и 26, 26 и 45 ppm концентрации-но тенденцията е много ясна, така че може да разбере дали концентрацията е в диапазона 0-20 или 40-60 ppm. За по -високи концентрации зависимостта е много по -отличителна - когато е изложена на отработени газове, кривата се издига от самото начало, без изобщо да се спуска, а динамиката й е напълно различна. Така че за високи концентрации няма съмнение, че той работи надеждно, въпреки че не мога да потвърдя неговата прецизност, тъй като нямам никакъв номинален CO метър. Също така, този набор от експерименти беше направен с 20k натоварващ резистор - и след това реших за да препоръча 10k като стойност по подразбиране, тя трябва да бъде по -чувствителна по този начин. Ако имате надежден CO метър и ще сте сглобили тази платка, моля споделете отзиви за прецизността на сензорите - би било чудесно да съберете статистика за различни сензори и да подобрите предположенията за скици по подразбиране.

Препоръчано: