Подключаем анализатор газов MQ-135 к Raspberry Pi используя PCF8591
Познакомимся с простым датчиком MQ-135, который поможет определить уровень вредных веществ в воздухе. Подключим анализатор газов MQ-135 к Raspberry Pi используя АЦП PCF8591, напишем простую тестовую программу для наблюдения за сигналом из датчика, а также для выполнения определенного действия при достижении установленного критического уровня.
Содержание:
- Анализатор газов MQ-135
- Подключаем датчик MQ-135
- Программа для анализа состояния датчика MQ-135
- Заключение
Анализатор газов MQ-135
MQ-135 - достаточно компактный и недорогой датчик, который умеет анализировать уровень вредных веществ в воздухе. Он поможет определить в воздухе наличие следующих веществ:
- Углекислый газ (в нормальных условиях это бесцветный газ, без запаха, двуоксид углерода - CO2);
- Угарный газ (бесцветный ядовитый газ без вкуса и запаха, монооксид углерода - CO);
- Аммиак (в нормальных условиях это бесцветный газ с резким характерным запахом, нитрид водорода - NH3);
- Бензол (жидкость без цвета со специфическим сладковатым запахом, органическое соединение - C6H6);
- Оксид азота (бесцветный газ который незначительно растворим в воде, монооксид азота - NO);
- Пары спирта (органические соединения, существует целый класс спиртов, спирт содержат алкогольные напитки);
- Дым (газ выдкляющийся при сгорании различных веществ, прохождения химических реакций);
- и другие...
Рис. 1. Внешний вид датчика MQ-135.
Детектор газов MQ-135 может применяться в системах безопасности и контроля, для анализа состояния воздуха в вентиляционных установках, в медицине и других сферах где нужно выполнять контроль за чистотой воздуха и окружающей среды.
Основные технические характеристики и плюсы датчика:
- Высокая чувствительность;
- Высокая скорость реакции;
- Стабильность и долговечность;
- Питание нагревательного элемента от 5В;
- Сопротивление нагревательного элемента - 33 Ом;
- Ток потребляемый нагревателем от источника питания 5В - 150мА (мощность 800 мВт);
- Небольшие размеры (18мм в диаметре, 17мм в высоту + 6мм высота пинов).
Датчик содержит 6 ножек - две из них используются для питания нагревателя, а остальные 4 для снятия сигнала с сенсора.
Рис. 2. Структура и принцип работы датчика газов MQ-135, на рисунке обозначены:
- 1 - чувствительный к газам слой (SnO2);
- 2 - электрод (Au);
- 3 - токопроводящие линии для соединения с электродом (Pt);
- 4 - катушка нагревателя (Ni-Cr);
- 5 - керамическая трубка (Al2O3);
- 6 - сетка из стальных проводников для защиты в случае взрыва внутри датчика;
- 7 - сжимающее кольцо (никелированная медь);
- 8 - резиновая основа;
- 9 - пины для подключения датчика (никелированная медь).
Нагревательный элемент необходим для обеспечения кондиционного режима работы чувствительного слоя, воздух с содержащимися в нем веществами попадая на чувствительный слой и в зависимости от концентрации этих веществ спровоцирует изменение значения электрического потенциала между электродами (смотри схему на рисунке 2).
Этот электрический потенциал мы снимаем с электродов и анализируем его уровень при помощи дополнительных электронных схем.
Подключаем датчик MQ-135
Для экспериментов использован готовый модуль, который содержит датчик MQ-135 и небольшой компаратор, парочку светодиодов и штырьки для подключения.
Рис. 3. Внешний вид модуля с датчиком MQ-135 и схемой сравнения.
Модуль содержит 4 вывода:
- VCC - питание 5В;
- GND - земля (минус);
- AO - аналоговый выход датчика (Analog Output);
- DO - цифровой выход датчика (Digital Output).
Цифровой выход датчика подключен к компаратору, при помощи которого мы можем оценить значение с датчика и получить на выходе низкий (0В) или высокий (5В) уровень. Для регулировки порога срабатывания на платке установлен переменный резистор.
Аналоговый выход датчика предназначен для подключения к самодельным компараторам и анализаторам, а также к АЦП (Аналого-Цифровым Преобразователям).
В эксперименте я буду использовать аналоговый выход датчика MQ-135, подключенный к АЦП на основе PCF8591, работу с которым я описывал в прошлой статье. Анализировать данные работы АЦП будет мини-компьютер Raspberry Pi.
Модуль MQ-135 должен питаться от напряжения +5В, соответственно на его цифровом и аналоговом выходах уровень напряжения может достигать +5В.
Аналоговый выход MQ-135 можно было бы подключить напрямую к аналоговому входу PCF8591 если питать последний также от напряжения +5В, но в таком случае понадобится собирать двунаправленный конвертер уровней напряжения для шины I2C.
Конвертация уровней напряжения здесь нужна, поскольку:
- Пины GPIO в Raspberry Pi (используемые нами здесь для интерфейса I2C) рассчитаны на максимальное входное/выходное напряжение +3,3В;
- При питании PCF8591 от +5В, напряжения +3,3В на выводах шины I2C может быть не достаточно чтобы получить высокий уровень (логическая 1). Обмен данными по шине станет невозможным;
- На модуле PCF8591 установлены подтягивающие (pull-up) резисторы, которые пытаются выставить при логической единице на каждом из выводов шины I2C напряжение +5В (питание PCF8591). Это не безопасно для входов GPIO в Raspberry Pi, расчитанных на +3,3В.
Чтобы не собирать конвертер уровней напряжения здесь все же можно выкрутиться следующим образом: питать модуль PCF8591 от напряжения +3,3В (в даташите указан диапазон питающих напряжений 2,6В-6В), а чтобы не спалить его аналоговый вход (теперь туда можно подавать максимум +3,3В) напряжением с аналогового выхода MQ-135 (достигающее +5В), соединяем эти модули через резистивный делитель напряжения: 5В - в 3В.
Вот такая получилась схема подключения модулей:
Рис. 4. Принципиальная схема подключения модулей MQ-135 и PCF8591 к Raspberry Pi.
Добавлю несколько слов о первом подключении модуля MQ-135. При первом влючении нового, только что распакованного модуля с датчиком, в воздухе кратковременно появится небольшой запах гари, не стоит волноваться - это первый раз раскалился нагревательный элемент датчика.
Перед долговременным применением датчика, для адаптации и стабилизации параметров, его стоит оставить с подключенным к нагревателю напряжением на 24 часа (рекомендация из даташита).
Ток потребления модуля MQ-135 (по большей части нагревателя в нем) составляет примерно 150мА (I=U/R=5В/33Ом=0,151А), поэтому питание можно взять с пина 2 (+5В) на разъеме GPIO.
Важно помнить что линию питания 5В в Raspberry Pi нельзя перегружать, если нужно питать какой-то модуль от 5В и с потребляемым током более 0,3А-0,5А то лучше не пожалеть пару центов и собрать отдельный стабилизатор напряжения, например на микросхеме L7805 (розничная стоимость менее 0,5$).
ВНИМАНИЕ! На показанном ниже фото, ранее в качестве эксперимента, я подключил все модули к питанию +5В, выход датчика соединил с входом АЦП напрямую и не использовал резистивного делителя напряжения. Старайтесь так не делать, а собирать безопасную схему, как на рисунке 4.
Рис. 5. Внешний вид подключенных модулей MQ-135 и PCF8591 к Raspberry Pi.
Думал удалить эту картинку, но оставил ее и решил расписать что происходит при подобном не безопасном подключении. Почему же схема в такой конфигурации работает и Raspberry Pi не выходит из строя? - Давайте с этим разберемся.
Такое подключение работает, но все же есть риск нанесения вреда контроллеру GPIO в Raspberry Pi. Это может случиться если на какой-то из пинов попадет напряжение +5В (явно превышающее +3,3В) и с током достаточным чтобы пожечь внутренние ключи на пинах GPIO.
Дело в том, что на модуле PCF8591 между каждой из двух линий (SCL, SDA) шины I2C и шиной питания стоят подтягивающие резисторы с сопротивлением 4,7кОм (это подключение можно увидеть на схеме модуля).
Генерация сигналов в шине I2C базируется на "прижимании" (подключении через внутренние транзисторы в устройстве) линий данных к земле (логический 0) и их "отпускании" (логическая 1). В последнем случае за установку высокого уровня отвечают как раз те самые подтягивающие резисторы.
Получается, что при логической единице на одной из линий, напряжение питания модуля (+5В) через резистор 4,7кОм идет на вывод GPIO, а знаем что позволенный максимум на нем - 3,3В. Порт не выгорает здесь только потому, что ток через эту цепочку достаточно мал, он гасится на этом же резисторе и порт остается цел.
Что же там за ток может быть, давайте попробуем посчитать:
- При логическом "0" (через внутренний транзистор порт подключил вывод GPIO к земле): I = U/R = 5V/4700R = 0,00106A = 1mA
- При логической "1" (через внутренний транзистор порт подключил вывод GPIO к +3,3В): I = U/R = (5V-3,3V)/4700R = 0,00036A = 0,36mA.
Принцип работы шины I2C таков, что при генерации высокого уровня пин порта не подключается к линии питания ("висит в воздухе"), поэтому пункт 2 в расчетах можно и не учитывать.
В итоге, в самом крайнем случае, мы имеем напряжение +5В при токе 1мА на пине GPIO, чего явно не достаточно чтобы спалить порт на гребенке Raspberry Pi.
А что будет если подтягивающие резисторы в модуле PCF8591 отпаять от +5В и припаять к +3,3В? - скорее всего, передача данных по шине I2C перестанет осуществляться, напряжения +3,3В будет не достаточно для интерпретации модулем PCF8591 (питающимся от +5В) сигнала напряжением +3,3В как высокого уровня (логической "1").
А теперь давайте подумаем что получится если подключить 3-5 разных модулей с питанием +5В к шине I2C Raspberry Pi. В зависимости от сопротивлений подтягивающих резисторов на модулях (если эти резисторы впаяны, их сопротивления просуммируются как при параллельном включении резисторов) ток может достичь 5-10мА при напряжении +5В, что уже может нести более значительную опасность для портов GPIO.
Поэтому, нужно всегда придерживаться правил:
- На пины GPIO в Raspberry Pi нельзя допускать попадания напряжений, превышающих 3,3В!
- При подключении к шине I2C устройств с разными напряжениями питания (2,5В, 3В, 5В...) нужно использовать схему конвертера уровней напряжения!
Программа для анализа состояния датчика MQ-135
Программа написана на языке программирования Python и является модифицированной версией той, которую я приводил в статье где разбирали работу с модулем PCF8591, там же описано как активировать шину I2C.
Суть работы новой версии программы заключается вот в чем:
- Постоянно выводим в консоль текущее значение с датчика газов (числа от 0 до 255, от меньшей концентрации до большой);
- При достижении некоторого установленного значения концентрации газов - зажигаем светодиод D1.
Создадим новый файл для программы на Питоне и откроем его в редакторе nano:
nano /tmp/mq-135-pcf8591-test.py
Скопируем приведенный ниже код в файл:
#!/usr/bin/env python
# Program for gas sensor MQ135 + ADC-DAC PCF8591P
# 2016 http://ph0en1x.net
import os
import time
from smbus import SMBus
DEV_ADDR = 0x48
adc_channel = 0b1000010 # 0x42 (input AIN2 for ADC + use DAC)
dac_channel = 0b1000000 # 0x40
bus = SMBus(1) # 1 - I2C bus address for RPi rev.2
while(1):
os.system('clear')
print("Press Ctrl C to stop...\n")
# read sensor value from ADC
bus.write_byte(DEV_ADDR, adc_channel)
bus.read_byte(DEV_ADDR)
bus.read_byte(DEV_ADDR)
value = bus.read_byte(DEV_ADDR)
print 'AIN value = ' + str(value)
# compare value from ADC and set value in DAC
if value > 120:
bus.write_byte_data(DEV_ADDR, dac_channel, 220)
else:
bus.write_byte_data(DEV_ADDR, dac_channel, 0)
# pause 100 milliseconds
time.sleep(0.1)
Для выхода из редактора (возможно кто-то еще не знает этого): жмем CTRL+X, для подтверждения сохранения файла жмем Y и ЕНТЕР.
Запускаем программу командой в консоли:
python /tmp/mq-135-pcf8591-test.py
Рис. 6. Вывод выполняющейся программы в окне консоли.
Теперь можете поэкспериментировать с датчиком, поднося к нему на разном расстоянии разнообразные вещества - спирт, растворитель, бензин и другие. В консоли можно будет наблюдать как изменяется значение на выходе датчика.
Чтобы изменить числовой порог свечения светодиода, к примеру для значения 70, нужно изменить строчку кода "if value > 120:" на "if value > 70:" - теперь программа будет реагировать на превышение значения 70 на входе AIN2 АЦП свечением светодиода.
Используя мультиметр в режиме измерения напряжения до 20В можно понаблюдать за изменением напряжения на аналоговом выходе датчика MQ-135 при изменении уровня испарений газов около него.
Засветить светодиод - это очень просто, что можно еще придумать? - например, настроить отправку электронного письма (или электронных писем) в случае достижения заданного порога вредных газов в воздухе, включить воспроизведение какого-то MP3-файла на Raspberry Pi и много других вещей.
Заключение
Ниже приведено видео работы модуля с MQ-135, подключенного к малинке и АЦП PCF8591 (старый не безопасный вариант, без делителя напряжения на резисторах).
Для теста срабатывания датчика использован дихлорэтан (клей для пластмассы и оргстекла), вернее его капелька нанесенная на кончик маленькой отвертки, этих испарений вполне достаточно чтобы датчик зафиксировал наличие в воздухе ядовитого вещества.
Полезные материалы:
А как считывать данные с цифрового выхода модуля датчика?
С цифровым выходом все намного проще, его подключаем к любому из свободных входов GPIO через нормализатор напряжения и программно считываем значение:
Установить порог срабатывания датчика (появления 5В на выводе DO) можно используя переменный резистор с обратной стороны датчика.
Очень важно: на выходе DO датчика газов MQ-135 напряжение достигает 5В (напряжение питания датчика), а на вход GPIO в Raspberry Pi можно подавать уровень не выше 3,3В, поэтому нужно рассчитать и собрать простой делитель напряжения на двух резисторах, который из уровня 5В сделает 3В (нормализирует его для GPIO).
Здравствуйте! Очень полезная статья. Всё разложено по полочкам.
Хотелось бы уточнить: по Вашей схеме АЦП запитан от 5В. Но в нём линии SDA и SCL подтянуты к питанию (резисторы R8 и R9). Говорят, это небезопасно для GPIO и советуют при питании от 5В эти резисторы выпаять. Вот здесь подробнее: python-exemplary.com
Midex82, большое спасибо за отзыв и за замечание. С уровнями напряжений здесь действительно не все так просто. Перерисовал принципиальную схему, дополнил ее резистивным делителем напряжения, модуль АЦП теперь питается от +3,3В. Дополнил полезными примечаниями по поводу подключения.
Также дополнил статью по шине I2C, расписал там ситуацию с подключением устройств которые питаются от разных напряжений, привел схемы конвертеров уровней напряжений.