Микроконтроллеры Arduino, 

Модули, Комлектующие,

Электронные компоненты

Наши контакты: г. Москва,
ул. Молодогвардейская, д.57с10
Въезд авто только по пропуску!

Датчика газа MQ-7. Сложности измерения уровня угарного газа.

Опубликовано: 08.07.2023

У датчика 4 контакта, 2 из которых это питание 5В (GND и VIN). При подключении питания загорается красный светодиод на плате датчика. Он также помечен как POWER LED. Кстати, на разных партиях надписи могут различаться. Два других контакта – это аналоговый выход A0 и цифровой выход D0.

Подключение датчика газа MQ-7 к Arduino

Найти схему подключения в интернете не сложно. Мы приведем схему подключения к плате UNO, остальные платы подключаются по аналогии. Главное - правильно подключить нужный пин к контроллеру, в нашем случае мы подключаем аналоговый выход датчика A0, к аналоговому пину контроллера А4. Потом, в программном коде необходимо указать режим работы пина А4 (INPUT – режим считывания сигнала).

Подключение датчика газа MQ-7 к Arduino UNO

На рисунке показано, как подключить цифровой и аналоговый выход датчика. Цифровой подключён к пину D8 (зелёный провод), а аналоговый к пину A4 (бирюзовый провод). Питание, соответственно, земля – GND, чёрный провод и 5V – плюс, красный провод.

Разберёмся с цифровым пином датчика D0

Чувствительность срабатывания датчика при снятии сигнала с цифрового пина D0 можно регулировать потенциометром, который расположен на обратной стороне платы. При низком уровне сигнала на цифровом пине D0 (логический ноль) на плате датчика горит зелёный светодиод, при высоком уровне сигнала (логическая единица) светодиод гаснет. Он обозначен как DOUT LED. Другими словами, цифровой пин D0 будет выдавать логический ноль при превышении определённого уровня СО и светодиод DOUT LED будет загораться. Таким образом, чтобы выставить порог чувствительности цифрового пина нам необходим некий эталон содержания угарного газа СО в атмосфере, при котором сработает датчик. Для этого нужен уже откалиброванный прибор и возможность менять концентрацию СО. Фактически нужна лаборатория. Это первый вариант. Второй вариант настроить аналоговый выход датчика и снять с него показания и исходя из них выставить порог чувствительности контакта D0.

Мы будем рассматривать далее только аналоговый выход датчика А0, так как нас интересуют данные, которые мы можем измерить и интерпретировать в некоторые понятные нам значения, не прибегая к лабораторным условиям.

Какие нормы (предельная концентрация) угарного газа СО существуют?

Давайте поймем, что такое норма, или предельная концентрация СО. Для этого посмотрите на таблицу ниже:

Концентрация угарного газа (СО) в PPM

Действие

20 ppm = 0,002%

Чувствуется лёгкое головокружение, при условии вдыхания в течение восьми часов.

40 ppm = 0.004%

Воздействие в течении 6 часов приводит к головной боли. Если такая концентрация влияет круглосуточно, то развивается синдром тяжёлой головы.

100 ppm = 0,01%

Начинается легкая головная боль после 120 минут. Через 6-8 часов появляется тошнота.

200 ppm = 0,02%

Сильная головная боль после 120 мин. воздействия. Тошнота появляется через 180 мин.

400 ppm = 0,04%

Приводит к сильной головной боли после одного часа вдыхания.

Тошнота приходит через 120-150 мин.

1000 ppm = 0,1%.

 

Чувствуется головокружение и последующая тошнота. После 30 минут воздействия начинаются судороги.

1200 ppm = 0.12%

Головокружение через 5-10 мин. Тошнота через 25-30 мин. Потеря сознания через 60 мин.

1600 ppm = 0,16%

После 15 минут – головная боль, головокружение, прыгает пульс, летальный исход за 2 последующих часа.

3200 ppm = 0,32%

Головная боль, головокружение, тошнота после 5 минут вдыхания. Смерть через 30 минут.

 

6000 ppm =0,6%.

Головная боль, головокружение, через 2 минуты – сильное воздействия на нервную систему, остановка дыхания. Летальный исход наступает в течении 15-25 минут.

 

Таким образом норма концентрации СО составляет менее 20 ppm. Учтите, что угарный газ очень ядовит и не путайте его с углекислым газом.

PPM – это единица измерения концентрации газов выражается как 1(одна) часть газа на миллион частей чистого воздуха. 1 ppm = 0,0001% угарного газа в воздухе.

Разбираемся с аналоговым входом А0

Вооружившись вышеописанной информацией о нормах СО и справкой о единицах измерения, теперь можно понять, что показывает нам аналоговый пин А0 датчика угарного газа. А показывает он изменение напряжения в пределах от 0 до 5V, которое зависит от сопротивления чувствительного элемента. При этом режим работы аналогового пина микроконтроллера Arduino, который будет снимать показания, может работать как INPUT (Вход), так и OUTPUT (Выход). В нашем случае пин будет принимать сигнал.

Но видим мы не само значение напряжения на пине, а цифровое значений от 0 до 1023 это зависит от разрядности АЦП аналого-цифрового преобразователя микроконтроллера, потому что иначе мы не сможем это преобразовать в понятные нам значения и запрограммировать микроконтроллер. Таким образом на аналоговом пине мы будем получать цифровые значения, которые необходимо преобразовать в понятные характеристики содержания СО в атмосфере.

Эти значения мы можем прочесть в мониторе порта после написания простой программы и подключения самого датчика, и его калибровке (прогрейте датчик в течении 48 часов, чтобы чувствительная поверхность датчика пришла в рабочее состояние). Например, значение на аналоговом пине датчика А0 равное 1,025V, соответствует примерно 210 единицам, которые мы увидим в мониторе порта.

 Код для теста датчика приведён ниже:

#define MQ7_A A4   // Подключаемый аналоговый пин А4 к аналоговому выходу датчика MQ-7 А0.
 
 void setup() {
   
    Serial.begin(9600);
   
    pinMode(MQ7_A, INPUT); // Устанавливаем режим работы пина А4 на чтение данных
   
}
 
 void loop() {
   
    int CO = analogRead(MQ7_A); // Считываем значение с аналогового пина A4 и записываем в переменную "CO"
   
    Serial.print("Значение А4 = ");
   
    Serial.println(CO);
   
    delay(5000);
   
}

Обратите внимание, что показание выданные в мониторе порта это ещё не значение содержания угарного газа в единицах изменения ppm! Это значение напряжения на выходе датчика в виде цифровых значений от 0 до 1023 в зависимости от содержания СО в атмосфере. Это значение нам нужно привязать к реальности.

Теперь разбираемся с показаниями датчика

Датчик измеряет концентрацию газа по заявленным характеристикам производителя от 20ppm до 2000 ppm. То есть мы можем померить только уже те значения, которые вызывают, как минимум, лёгкое недомогание. Причём показания будут зависеть от влажности и температуры окружающей среды, а также содержания кислорода в атмосфере. Данные значения в 20ppm - 2000 ppm актуальны при температуре 20℃, влажности 65% и концентрации кислорода 21%.

Чтобы правильно измерить показания на датчике MQ-7 вам прежде необходимо обзавестись уже откалиброванным датчиком, который показывает содержание угарного газа, чтобы сопоставить значения с вашим датчиком и сравнить те показания, которые он выдаёт в данный момент. При этом необходимо учитывать значения температуры, влажности и концентрации кислорода. В нашем случае измерения проводились при температуре 23°С, влажность 35%, концентрация кислорода была неизвестна. Значения угарного газа СО на момент измерения мы взяли на сайте https://www.accuweather.com. На 12:53 часов 29.05.23 в Москве показатель СО = 115 мг/м3. Соответственно уровень CO примерно равен 98 ppm. Конечно этот показатель может быть в разных местах Москвы совершенно различным, но давайте просто вникнем в суть процесса снятия показаний датчика, чтобы хоть как-то привязать к реальным данным. При этом желательно сделать измерения с разными концентрациями СО, но сделать это в бытовых условиях не представляется возможным. 

Обратимся к производителю (скачать) и посмотрим на техническую документацию. Ниже показан график зависимости сопротивления и наличия угарного газа.

Зависимость изменения сопротивления датчика при повышении уровня СО

 Тёмно-синяя линия СО – график зависимости Rs/R0 от концентрации СО в единицах ppm.

Где Rs – сопротивление датчика при наличии СО, а R0 – сопротивление датчика в контрольной точке (к этому вернёмся чуть позже).

Чтобы посчитать концентрацию угарного газа в единицах ppm от изменения соотношения значений сопротивления Rs/R0 и привязать эти изменения к напряжению на аналоговом выходе А0, необходимо вычислить наклон этой линии, то есть понять шаг изменения, сколько будет равен Rs/R0 в зависимости от изменения ppm на одну единицу и наоборот. В математике, это можно обозначить функцией F(x), где F – это значение Rs/R0, а x – это значение ppm.

                                       

                                                              График нахождения зависимости F(x)

 На графике показано, как найти расстояние наклона, обозначенного буквой m при известных значениях двух точек на графике, при изменении на 1.

Зная величину изменения, то есть шаг, мы сможем привязать изменение напряжения на контакте A0 к изменению сопротивления и значениям концентрации СО в ppm. То есть, нам нужна формула для расчёта ppm. О логарифмической зависимости и нахождению функции подробно можно почитать здесь.

Формула функции будет выглядеть так:

Здесь F0, x0 и F1, x1 координаты любых двух точек на графике, мы выбрали в пределах измеряемых значений датчика.

Выбранные точки на графике зависимости изменения сопротивления датчика при повышении уровня СО

 Значения выбранных точек будут следующими:

F0 = 1,  x0 = 100

F1 = 0,39,  x1 = 400

Подставив значения в формулу можно получить чему будет равно Rs/R0 или F(x), где x – это величина измерения в ppm.

 

Переведём это на «нормальный язык»:

Rs/R0 = 22,83 * ppm -0,6794

ppm = (( Rs/R0)/ 22.83)-1,4719

Мы нашли формулу, по которой будем рассчитывать показания датчика. Однако использовать её в чистом виде не получится, так как необходимо знать R0 и Rs.

Где взять номиналы сопротивлений Rs и R0

Rs меняется при наличии детектируемого газа (его расчёт будет чуть ниже). R0 сопротивление в контрольной точке. И если внимательно изучить график, то вы увидите линию Air (чистый воздух), которая всегда постоянна, то есть Rs/R0  = 27. Тогда формула приобретёт вид R0 =Rs/27. Только необходимо учесть, что эти данные скорее всего получены в лабораторных условиях при отсутствии СО или хотя бы его наличие не превышающее 20 ppm, так как данный порог чувствительности датчика является минимальным и, следовательно, формула будет иметь смысл. Без контрольного прибора мы не можем определить сколько CO сейчас в воздухе и при каком количестве СО данный график имеет силу. Поэтому использовать его для привязки к реальности получится весьма условно.

Вычислить R0 можно двумя способами.

Способ первый, при котором используем вышеописанную формулу. Сопротивление Rs используется в схеме модуля вместе с резистором R2, который от партии к партии может быть различным. Поэтому необходимо узнать его номинал, установленный на модуле.

 

Резистор R2 на модуле датчика

В нашем случае модуль датчика имеет R2 = 20 кОм – это можно определить по маркировке или измерить тестером.

Резисторы Rs и R2 работают в схеме как делитель напряжения.

Принципиальная схема модуля датчика MQ-7

А зная номиналы напряжения на входе 5V и выходе A0 можно рассчитать значение сопротивления чувствительного элемента датчика Rs в текущий момент.

Формула расчёта резистора в делителе напряжения

То есть:

Rs = ((Uвх * R2)/Uвых) - R2,

где Uвх = 5V, Uвых – значение, которое вы снимите с аналогово пина A4 и пересчитываете в напряжение.

И вот здесь мы приходим в тупик. Чтобы узнать какое же сопротивление в чистом воздухе имеет чувствительный элемент, необходимо протестировать датчик на чистом воздухе с учётом описанных выше условий (содержание СО < 20 ppm, при которых график Air имеет смысл). Если такая возможность существует, то можно воспользоваться следующим кодом, подставив в формулы расчёта R0 и Rs свои значения:

 

Код для определения номинала R0:

float sensor_volt;
 
float RS_gas;
 
float R0;
 
int R2 = 20000; //Ваше значение R2
 
  void setup() {
 
   Serial.begin(9600);
 
}
 
void loop() {
 
    float sensorValue = analogRead(A4);
 
    sensor_volt = (5.0 / 1024) * sensorValue; // Формула расчёта напряжения на выходе А0
 
    RS_gas = ((5.0 * R2) / sensor_volt) - R2; // Формула расчёта RS
 
    R0 = RS_gas / 27; //Формула расчёта R0
 
    Serial.print("R0: ");
 
    Serial.println(R0);
 
}

 

Таким образом, чтобы откалибровать датчик, вам в любом случае предстоит поездка в лес, там насладиться кислородом и желательно захватить с собой точный измеритель угарного газа, тогда вы будете знать концентрацию СО, а точнее ее отсутствие и сможете настроить свой прибор. Только при таких условиях можно вычислить R0. Или… Добро пожаловать в лабораторию.

 

Способ второй.

Формула расчёта сопротивления Rs нам понадобится и здесь. Производители уже дали конкретную контрольную точку. Исходя из документации, при содержании в воздухе угарного газа 100 ppm, Rs и R0 равны (Rs/R0 = 1).

 

Тогда, для выяснения значения R0 достаточно знать концентрацию СО в 100 ppm и с помощью той же формулы вычислить Rs. Код для расчёта приведён ниже:

 

Код для определения номинала R0 при 100 ppm:

float sensor_volt;
 
float RS_gas;
 
float R0;
 
int R2 = 20000; //Ваше значение R2
 
  void setup() {
 
   Serial.begin(9600);
 
}
 
void loop() {
 
    float sensorValue = analogRead(A4);
 
    sensor_volt = (5.0 / 1024) * sensorValue; // Формула расчёта напряжения на выходе А0
 
    RS_gas = ((5.0 * R2) / sensor_volt) - R2; // Формула расчёта RS
 
    R0 = RS_gas;
 
    Serial.print("R0=RS_gas=: ");
 
    Serial.println(R0);
 
}
 

В самом начале статьи, мы взяли данные с сайта о текущей концентрации СО в Москве, которая была равна примерно 100 ppm. Сняв значения в этот момент с модуля датчика MQ-7 можно рассчитать значение R0, которое будет равно значению Rs. Конечно данные не будут точны, но по крайней мере хоть немного, в бытовых условиях, будут привязаны к реальности.

 

Таким образом подставив в формулу значения:

 

ppm = (( Rs/80000)/ 22.83)-1,4719

 

можно рассчитать значения ppm для концентрации угарного газа СО.

 

 

Код для вывода значений датчика в единицах измерения ppm:

 float RS_gas = 0;
 
float ratio = 0;
 
float sensorValue = 0;
 
float sensor_volt = 0;
 
float R0 = 80000; // Значение R0 - сопротивление в контрольной точке.
 
int R2 = 20000;   // Значение R2 на вашем модуле.
 
 void setup() {
 
   Serial.begin(9600);
 
}
 
void loop() {
 
     sensorValue = analogRead(A4);
 
     sensor_volt = (5.0 / 1024) * sensorValue; // Расчёт напряжения на аналоговом выходе датчика
 
     RS_gas = ((5.0 * R2) / sensor_volt) - R2; //Расчёт текущего сопротивления датчика
 
     ratio = RS_gas / R0;
 
     float x = ratio / 22.83;
 
     float ppm = pow(x, -1.4719);
 
     Serial.print("PPM: ");
 
     Serial.println(ppm);
 
     delay(5000);
 
}
 

В принципе, эти два способа равнозначны, просто необходимо знать точную концентрацию СО в воздухе, чтобы правильно рассчитать R0. Однако стоит учесть, что минимальный показатель измерения – это 20 ppm, а максимальный 2000. Следовательно, при превышении этих значений датчик будет вести себя некорректно. Стоит также учесть, что показания датчика зависят от температуры, влажности и других газов в атмосфере, а, следовательно, все расчёты будут неточными без программы пересчёта значений, учитывающих температуру, влажность, содержание кислорода и т.д., которые, кстати, тоже нужно ещё измерить.

Датчик газа MQ-7 можно использовать для мониторинга уровня угарного газа в реальном времени. Хоть точные значения остаются под сомнением, но прибор даст понять, что концентрация СО начинает расти и на это необходимо обратить своё внимание, и принять меры.

Удачных вам изобретений!

 

 

 

 

Комментарии (1)
  • Ярослав
    "На 12:53 часов 29.05.23 в Москве показатель СО = 115 мг/м3. Соответственно уровень CO примерно равен 98 ppm."
    Не мг/м3, а мкг на м3
    12.11.2023 15:42
Вы не представились
Не правильно введен e-mail
Нам интересно Ваше мнение
Все поля обязательны к заполнению
Перед публикацией комментарии проходят модерацию

Главное меню

Каталог

Полезные ссылки

Цена
от
до
0 Корзина: 0 руб.