Оглавление:

Монитор Arduino CO с использованием датчика MQ-7: 8 шагов (с изображениями)
Монитор Arduino CO с использованием датчика MQ-7: 8 шагов (с изображениями)

Видео: Монитор Arduino CO с использованием датчика MQ-7: 8 шагов (с изображениями)

Видео: Монитор Arduino CO с использованием датчика MQ-7: 8 шагов (с изображениями)
Видео: Проверка китайца на безопасность #blondinkadrive 2024, Июль
Anonim
Монитор Arduino CO с использованием датчика MQ-7
Монитор Arduino CO с использованием датчика MQ-7
Монитор Arduino CO с использованием датчика MQ-7
Монитор Arduino CO с использованием датчика MQ-7

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

Все это произошло две недели назад, с тех пор я довольно сильно улучшил схемы и программу, и теперь это кажется достаточно хорошим и относительно простым (не просто из трех строк кода, но все же). Хотя я надеюсь, что кто-то, у кого есть точный измеритель CO, предоставит мне отзывы о калибровке по умолчанию, которую я поместил в эскиз - я подозреваю, что это далеко не так. Вот полное руководство с некоторыми экспериментальными данными.

Шаг 1. Спецификация материалов

Ведомость материалов
Ведомость материалов

Вам потребуется: 0. Плата Arduino. Я предпочитаю китайский клон Arduino Nano за его выдающуюся цену в 3 доллара, но здесь подойдет любой 8-битный Arduino. Sketch использует некоторые расширенные операции таймеров и был протестирован только на микроконтроллере atmega328 - хотя, вероятно, он будет хорошо работать и на других. Датчик CO MQ-7. Чаще всего доступен с этим модулем датчика Flying Fish, он должен пройти небольшую модификацию, детали на следующем шаге, или вы можете использовать отдельный датчик MQ-7.

2. Биполярный транзистор NPN. Здесь будет работать практически любой транзистор NPN, способный выдерживать ток 300 мА и более. Транзистор PNP не будет работать с упомянутым модулем Flying Fish (потому что он имеет контакт нагревателя, припаянный к выходу датчика), но может использоваться с дискретным датчиком MQ-7.

3. Резисторы: 2 x 1 кОм (от 0,5 кОм до 1,2 кОм будет работать нормально) и 1 x 10 кОм (этот резистор лучше всего поддерживать точным - хотя, если вам абсолютно необходимо использовать другое значение, соответственно отрегулируйте переменную reference_resistor_kOhm в скетче).

4. Конденсаторы: 2 x 10 мкФ или больше. Требуются танталовые или керамические, электролитические не будут работать из-за высокого ESR (они не смогут обеспечить достаточный ток для сглаживания сильноточных пульсаций).5. Зеленый и красный светодиоды для индикации текущего уровня CO (вы также можете использовать один двухцветный светодиод с 3 выводами, как мы использовали в нашем прототипе желтого ящика).6. Пьезо-зуммер для индикации высокого уровня CO 7. Макетная плата и провода (тоже можно все припаять к пинам Nano или втиснуть в разъемы Uno, но так легко ошибиться).

Шаг 2: Модификация модуля или разводка дискретного датчика

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

Для модуля вы должны отпаять резистор и конденсатор, как показано на фото. Вы можете распаять практически все, если хотите - электроника модуля совершенно бесполезна, мы используем ее только в качестве держателя для самого датчика, но эти два компонента не позволят вам получить правильные показания, Если вы используете дискретный датчик, подключите контакты нагревателя (H1 и H2) к 5V и коллектору транзистора соответственно. Подключите одну сторону датчика (любой из контактов A) к 5 В, а другую сторону измерения (любой из контактов B) к резистору 10 кОм, точно так же, как аналоговый контакт модуля на схемах.

Шаг 3: Принцип работы

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

Зачем вообще нужны все эти сложности, почему бы не подключить 5В, заземлить и просто снимать показания? Ну, к сожалению, ничего полезного вы не получите. Согласно даташиту MQ-7, датчик должен проходить через высокие и циклы низкого нагрева, чтобы получить правильные измерения. Во время низкотемпературной фазы CO поглощается пластиной, что дает значимые данные. Во время фазы высокой температуры абсорбированный CO и другие соединения испаряются с сенсорной пластины, очищая ее для следующего измерения.

В общем, операция проста:

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

2. Подайте 1,4 В на 90 секунд, используйте эти показания для измерения CO.

3. Переходите к шагу 1.

Но вот проблема: Arduino не может обеспечить достаточную мощность для запуска этого датчика со своих выводов - нагревателю датчика требуется 150 мА, в то время как вывод Arduino может обеспечить не более 40 мА, поэтому при прямом подключении вывод Arduino будет гореть, а датчик все равно выиграет. не работает. Поэтому мы должны использовать какой-то усилитель тока, который потребляет небольшой входной ток для управления большим выходным током. Другая проблема - получение 1,4 В. Единственный способ надежно получить это значение без использования большого количества аналоговых компонентов - это использовать метод ШИМ (широтно-импульсной модуляции) с обратной связью, которая будет контролировать выходное напряжение.

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

Очень важно добавлять конденсаторы согласно схемам. На изображениях показана разница в сигнале с конденсатором C2 и без него: без него хорошо видна пульсация ШИМ, которая значительно искажает показания.

Шаг 4: Схема и макетная плата

Схема и макетная плата
Схема и макетная плата
Схема и макетная плата
Схема и макетная плата
Схема и макетная плата
Схема и макетная плата

Вот схема и макет в сборе.

ПРЕДУПРЕЖДЕНИЕ! Требуется доработка стандартного коммутационного модуля! Без модификации модуль бесполезен. Модификация описана на втором этапе

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

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

Конденсатор C2 используется для сглаживания аналогового выхода датчика (выходное напряжение зависит от входного напряжения - и у нас здесь довольно сильноточная ШИМ, которая влияет на все схемы, поэтому нам нужен C2). Самое простое решение - использовать тот же конденсатор, что и транзистор C1. NPN, либо постоянно проводит ток, чтобы обеспечить высокий ток на нагревателе датчика, либо работает в режиме ШИМ, уменьшая ток нагрева.

Шаг 5: программа Arduino

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

ПРЕДУПРЕЖДЕНИЕ: ДАТЧИК ТРЕБУЕТ РУЧНОЙ КАЛИБРОВКИ ДЛЯ ЛЮБОГО ПРАКТИЧЕСКОГО ИСПОЛЬЗОВАНИЯ. БЕЗ КАЛИБРОВКИ, В ЗАВИСИМОСТИ ОТ ПАРАМЕТРОВ ВАШЕГО КОНКРЕТНОГО ДАТЧИКА, НА ЭТОМ Эскизе МОЖЕТ БЫТЬ ВКЛЮЧЕНО СИГНАЛИЗАЦИЯ В ЧИСТОМ ВОЗДУХЕ ИЛИ НЕ ОБНАРУЖИТЬ КОНЦЕНТРАЦИЮ СМЕРТЕЛЬНОГО УГЛЕРОДА

Калибровка описана в следующих шагах. Грубая калибровка очень проста, точная - довольно сложная.

В общем, программа довольно проста:

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

Состояние зуммера контролируется с помощью функций buzz_on, buzz_off, buzz_beep. Функции включения / выключения включают и выключают звук, функция звукового сигнала производит определенную последовательность звуковых сигналов с периодом 1,5 секунды, если она периодически вызывается (эта функция немедленно возвращается, поэтому она не приостанавливает основную программу, но вы должны вызывать ее снова и снова для воспроизведения звукового сигнала).

Программа сначала запускает функцию pwm_adjust, которая определяет правильную ширину цикла ШИМ для достижения 1,4 В во время фазы измерения. Затем он издает несколько звуковых сигналов, показывая, что датчик готов, переходит в фазу измерения и запускает основной цикл.

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

Шаг 6. Первый запуск: чего ожидать

Первый запуск: чего ожидать
Первый запуск: чего ожидать

Если вы все собрали правильно, после запуска скетча вы увидите что-то вроде этого в Serial monitor:

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

регулировка ШИМ w = 17, V = 3,57 Результат ШИМ: ширина 17, напряжение 3,57

а затем ряд чисел, представляющих показания датчика тока. Эта часть регулирует ширину ШИМ, чтобы обеспечить напряжение нагревателя датчика как можно ближе к 1,4 В, измеренное напряжение вычитается из 5 В, поэтому наше идеальное измеренное значение составляет 3,6 В. Если этот процесс никогда не заканчивается или заканчивается после одного шага (в результате ширина равна 0 или 254), значит, что-то не так. Проверьте, действительно ли ваш транзистор NPN и правильно ли он подключен (убедитесь, что вы правильно использовали базу, коллектор, контакты эмиттера - база идет на D3, коллектор на MQ-7, а эмиттер на землю, не рассчитывайте на вид макета Fritzing - это так. неправильно для некоторых транзисторов) и убедитесь, что вы подключили вход датчика ко входу A1 Arduino. Если все в порядке, вы должны увидеть в Serial Plotter из Arduino IDE что-то похожее на изображение. Циклы нагрева и измерения продолжительностью 60 и 90 секунд выполняются один за другим, при этом содержание CO измеряется и обновляется в конце каждого цикла. Вы можете взять немного открытого пламени рядом с датчиком, когда цикл измерения почти закончен, и посмотреть, как это повлияет на показания (в зависимости от типа пламени, оно может производить до 2000 ppm концентрации CO на открытом воздухе - так что даже если только небольшая часть он действительно попадает в датчик, он все равно включит будильник, и он не сработает до конца следующего цикла). Я показал это на изображении, а также реакцию на огонь от зажигалки.

Шаг 7: Калибровка датчика

Калибровка сенсора
Калибровка сенсора
Калибровка сенсора
Калибровка сенсора

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

Грубая калибровка:

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

Точная калибровка:

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

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

Шаг 8: некоторые экспериментальные данные

Некоторые экспериментальные данные
Некоторые экспериментальные данные

В моем случае датчик работал достаточно хорошо - он не очень чувствителен для действительно низких концентраций, но достаточно хорош для обнаружения всего, что выше 50 ppm. Я пытался постепенно повышать концентрацию, делая замеры и строил графики. Есть два набора линий с 0 ppm - чисто-зеленые до воздействия CO и желто-зеленые после. Датчик, кажется, немного изменил свое сопротивление чистому воздуху после экспонирования, но этот эффект невелик. Кажется, что он не может четко различать концентрации 8 и 15, 15 и 26, 26 и 45 ppm, но тенденция очень четкая, поэтому он может определить, находится ли концентрация в диапазоне 0-20 или 40-60 ppm.. Для более высоких концентраций зависимость гораздо более отчетливая - при истечении открытого пламени кривая с самого начала идет вверх, не снижаясь вообще, и ее динамика совершенно иная. Таким образом, для высоких концентраций нет никаких сомнений в том, что он работает надежно, хотя я не могу подтвердить его точность, так как у меня нет номинального измерителя CO. Кроме того, этот набор экспериментов был проведен с использованием нагрузочного резистора 20 кОм - и после этого я решил чтобы рекомендовать 10k в качестве значения по умолчанию, он должен быть более чувствительным. Если у вас есть надежный измеритель CO и вы собираете эту плату, поделитесь некоторыми отзывами о точности датчиков - было бы здорово собрать статистику по различным датчикам и улучшить предположения эскиза по умолчанию.

Рекомендуемые: