Урок по созданию детектора газа на ардуино

Содержание:

What is MQ2 Gas Sensor?

MQ2 is one of the commonly used gas sensors in MQ sensor series. It is a Metal Oxide Semiconductor (MOS) type Gas Sensor also known as Chemiresistors as the detection is based upon change of resistance of the sensing material when the Gas comes in contact with the material. Using a simple voltage divider network, concentrations of gas can be detected.

MQ2 Gas sensor works on 5V DC and draws around 800mW. It can detect LPG, Smoke, Alcohol, Propane, Hydrogen, Methane and Carbon Monoxide concentrations anywhere from 200 to 10000ppm.

Here are the complete specifications

Operating voltage 5V
Load resistance 20 KΩ
Heater resistance 33Ω ± 5%
Heating consumption <800mw
Sensing Resistance 10 KΩ – 60 KΩ
Concentration Scope 200 – 10000ppm
Preheat Time Over 24 hour

What is 1 ppm equal to?

When measuring gases like carbon dioxide, oxygen, or methane, the term concentration is used to describe the amount of gas by volume in the air. The 2 most common units of measurement are parts-per-million, and percent concentration.

Parts-per-million (abbreviated ppm) is the ratio of one gas to another. For example, 1,000ppm of CO means that if you could count a million gas molecules, 1,000 of them would be of carbon monoxide and 999,000 molecules would be some other gases.

Изготовление растворов[править | править код]

Раствор изготавливается путем всыпания в тарированную емкость расчетного веса соли с точностью до 0.01 грамма (потребуются соответствующие весы). Наиболее точно процедуру можно выполнять так:

  1. Ставим на весы тару с некоторым количеством соли.
  2. Сбрасываем весы на 0
  3. Сухой мелкой ложечкой или лопаткой берем из тары соль и пересыпаем мелкими порциями в калибровочную тару, весы будут показывать, какое количество соли уже выбрано из тары и продолжаем, пока не будет отвешен точный вес.
  4. Вливаем дистиллированную воду в калибровочную тару до половины объема и тщательно перемешиваем соль
  5. Доводим уровень до метки 1 литр.

Подключение датчиков газа и дыма серии MQ к Arduino

2015-04-14 в 00:18

Продолжаю изучать основы программирования микроконтроллеров. Кто-то скажет что Arduino для школьников, но тут все очень наглядно и понятно, а трудности все же возникают. Простота реализации проектов впечатляет.

Можно сделать прототип устройства, потом для удешевления конструкции зашить код в другой микроконтроллер будь то tiny13 либо Mega8. Кстати в эти микроконтроллеры можно загрузить код Arduino. Но об этом немного не сейчас.

Сейчас же я покажу как подключить датчик углеводородных газов (пропан, метан, бутан), спирта и дыма MQ-2. Можно таким образом подключить любой из серии MQ.

Для начала схема подключения светодиодов и динамика. Можно использовать резисторы даже 220 Ом. Так они не будут слишком тусклые. Динамик подойдет любой без внутреннего генератора.

А вот так подключаем сам датчик к Arduino.

Код

  }

Шаг 1. Комплектующие и инструменты

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

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

Инструменты:

  1. пистолет для горячего клея
  2. острый нож
  3. металлическая линейка
  4. некоторые инструменты рисования (в зависимости от ваших личных предпочтений)

Комплектующие:

  1. Arduino Nano
  2. USB-кабель
  3. Датчик газа MQ-4
  4. Дисплей (семисегментный индикатор)
  5. Картон или другой материал для корпуса (вы можете использовать прилагаемый чертеж и распечатать его на толстой бумаге) или заказать трехмерный

Internal structure of MQ2 Gas Sensor

The sensor is actually enclosed in two layers of fine stainless steel mesh called Anti-explosion network. It ensures that heater element inside the sensor will not cause an explosion, as we are sensing flammable gases.

It also provides protection for the sensor and filters out suspended particles so that only gaseous elements are able to pass inside the chamber. The mesh is bound to rest of the body via a copper plated clamping ring.

This is how the sensor looks like when outer mesh is removed. The star-shaped structure is formed by the sensing element and six connecting legs that extend beyond the Bakelite base. Out of six, two leads (H) are responsible for heating the sensing element and are connected through Nickel-Chromium coil, well known conductive alloy.

The remaining four leads (A & B) responsible for output signals are connected using Platinum Wires. These wires are connected to the body of the sensing element and convey small changes in the current that passes through the sensing element.

The tubular sensing element is made up of Aluminum Oxide (AL2O3) based ceramic and has a coating of Tin Dioxide (SnO2). The Tin Dioxide is the most important material being sensitive towards combustible gases. However, the ceramic substrate merely increases heating efficiency and ensures the sensor area is heated to a working temperature constantly.

So, the Nickel-Chromium coil and Aluminum Oxide based ceramic forms a Heating System; while Platinum wires and coating of Tin Dioxide forms a Sensing System.

Датчик утечки газа MQ2 на Ардуино

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

При измерении газов, термин «концентрация» используется для описания количества газа в воздухе по объему. Наиболее распространенными единицами измерения являются доли на миллион и процентная концентрация. Доли на миллион (ppm) — это отношение одного газа к другому. Например, концентрация 1000 ppm CO означает, что на 999 000 молекул газа, 1000 из них будут относится к углекислому газу.

Характеристики датчика MQ2 Ардуино

  • Питание: 5 Вольт;
  • Потребляемый ток: 180мА;
  • Чувствительность: 300-10000 ppm;
  • Рабочая температура: от -10 до +50 °C;
  • Влажность воздуха: не более 95%;
  • Интерфейс: аналоговый и цифровой.

Схема и распиновка датчика газа MQ2


Распиновка сенсора утечки газа MQ2 на Ардуино

Напряжение аналогового выхода изменяется пропорционально концентрации дыма или газа. Чем выше концентрация газа, тем выше выходное напряжение. Логический сигнал можно откалибровать, держа датчик рядом с дымом, который вы хотите обнаружить. Далее вращайте потенциометр по часовой стрелке (для увеличения чувствительности сенсора), пока не загорится красный светодиод на модуле.

Программа для расчета PPM аммиака с использованием датчика серии MQ

Полный текст программы приведен в конце статьи, здесь же мы рассмотрим ее наиболее важные фрагменты.

Перед тем как начинать писать программу мы должны узнать значения сопротивления нагрузки датчика (RL), наклон кривой (m), значение коэффициента b (точка пересечения) и значение сопротивления Ro в чистом воздухе. Все эти вопросы уже были рассмотрены выше в статье, поэтому подробно останавливаться снова на этих вопросах здесь не будем.

Arduino

#define RL 47 //сопротивление резистора RL 47 кОм
#define m -0.263 //здесь вводим рассчитанный коэффициент наклона кривой
#define b 0.42 //здесь вводим рассчитанный коэффициент для точки пересечения
#define Ro 30 //здесь вводим найденное значение Ro

1
2
3
4

#define RL 47  //сопротивление резистора RL 47 кОм
#define m -0.263 //здесь вводим рассчитанный коэффициент наклона кривой
#define b 0.42 //здесь вводим рассчитанный коэффициент для точки пересечения
#define Ro 30 //здесь вводим найденное значение Ro

Затем мы считываем падение напряжение на датчике (VRL) и конвертируем его в значение напряжения от 0 до 5 В, поскольку на выходе АЦП аналогового входа Arduino возможный диапазон значений составляет от 0 до 1024.

Arduino

VRL = analogRead(MQ_sensor)*(5.0/1023.0); //измеряем падение напряжения и конвертируем его в диапазон 0-5V

1 VRL=analogRead(MQ_sensor)*(5.01023.0);//измеряем падение напряжения и конвертируем его в диапазон 0-5V

Теперь, когда мы знаем значение VRL, используем выше приведенную формулу для расчета значения Rs, а также отношения (Rs/Ro).

Arduino

ratio = Rs/Ro; // находим отношение Rs/Ro

1 ratio=RsRo;// находим отношение Rs/Ro

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

Arduino

double ppm = pow(10, ((log10(ratio)-b)/m)); //формула для расчета ppm
Serial.print(ppm); //отображаем ppm

1
2

doubleppm=pow(10,((log10(ratio)-b)m));//формула для расчета ppm

Serial.print(ppm);//отображаем ppm

Барометр на Ардуино своими руками

#include <Wire.h>
#include <SFE_BMP180.h>

SFE_BMP180 pressure; // создаем объект pressure
#define ALTITUDE 1655.0 // высота офиса SparkFun, штат Колорадо, в метрах

void setup(){
   Serial.begin(9600);  // запускаем монитор порта
   pressure.begin();     // запускаем датчик давления
}

void loop(){
   char status;
   double T,P,p0,a;

   // для точного измерения, следует знать высоту, на которой производятся замеры
   // в этом примере используется константа ALTITUDE
   Serial.println();
   Serial.print("provided altitude: ");
   Serial.print(ALTITUDE,0);
   Serial.println(" meters");
  
   // перед измерением давления, следует узнать температуру
   // если запрос успешен, то возвращается время ожидания в миллисекундах
   // если запрос на измерение температуры не успешен, то возвращается 0
   status = pressure.startTemperature();
   if (status != 0){
      delay(status);

      // результат измерения температуры сохраняется в переменной T
      status = pressure.getTemperature(T);
      if (status != 0){
         Serial.print("temperature: ");
         Serial.print(T,2);
         Serial.println(" deg C");

         // запускаем измерение давления
         // если запрос успешен, возвращается время ожидания в миллисекундах
         // если запрос на измерение давления не успешен, возвращается 0
         status = pressure.startPressure(3);
         if (status != 0){
            delay(status);

            status = pressure.getPressure(P,T);
            if (status != 0){
               Serial.print("absolute pressure: ");
               Serial.print(P,2);
               Serial.print(" mb, ");
               Serial.print(P*0.0295333727,2);
               Serial.println(" inHg");

              // датчик bmp180 возвращает абсолютное давление, которое зависит от высоты
              // параметры: P = абсолютное давление в мб, ALTITUDE = текущая высота в м.
              // результат: p0 = давление с компенсацией на уровне моря в мбар
              p0 = pressure.sealevel(P,ALTITUDE);
              Serial.print("relative (sea-level) pressure: ");
              Serial.print(p0,2);
              Serial.print(" mb, ");
              Serial.print(p0*0.0295333727,2);
              Serial.println(" inHg");
           }
        else Serial.println("error retrieving pressure measurement\n");
      }
      else Serial.println("error starting pressure measurement\n");
    }
    else Serial.println("error retrieving temperature measurement\n");
  }
  else Serial.println("error starting temperature measurement\n");

  delay(5000);
}

Пояснения к коду:

  1. чтобы убрать влияние высоты при измерении атмосферного давления, используйте функцию уровня моря и текущую высоту;
  2. скачать библиотеку SFE_BMP180.h для работы с датчиком атмосферного давления BMP180 Arduino можно на нашем сайте здесь.

Код проекта

Код для нашего анализатора уровня пыли Arduino вы можете скопировать ниже:

#include <Arduino.h>
#include <U8g2lib.h>
#include <SPI.h>
#include <Wire.h>

U8G2_SSD1306_128X32_UNIVISION_F_HW_I2C u8g2(U8G2_R0); 
int measurePin = A0;
int ledPower = 12;

unsigned int samplingTime = 280;
unsigned int deltaTime = 40;
unsigned int sleepTime = 9680;

float voMeasured = 0;
float calcVoltage = 0;
float dustDensity = 0;

void setup(){
  Serial.begin(9600);
  u8g2.begin();
  pinMode(ledPower,OUTPUT);
  u8g2.clearBuffer();          // clear the internal memory
   u8g2.setFont(u8g2_font_logisoso24_tr);  // choose a suitable font at https://github.com/olikraus/u8g2/wiki/fntlistall
   u8g2.drawStr(8,29,"Welcome");  // write something to the internal memory
   u8g2.sendBuffer();         // transfer internal memory to the display
   delay(800);

   u8g2.clearBuffer();         // clear the internal memory
   u8g2.setFont(u8g2_font_logisoso24_tr);  // choose a suitable font at https://github.com/olikraus/u8g2/wiki/fntlistall
   u8g2.drawStr(40,26,"TO");  // write something to the internal memory
   u8g2.sendBuffer();         // transfer internal memory to the display
   delay(800);
   u8g2.clearBuffer();         // clear the internal memory
   u8g2.setFont(u8g2_font_logisoso20_tr);  // choose a suitable font at https://github.com/olikraus/u8g2/wiki/fntlistall
   u8g2.drawStr(16,26,"Maker.Pro");  // write something to the internal memory
   u8g2.sendBuffer();         // transfer internal memory to the display
   delay(2000);
}

void loop(){
  
  
  digitalWrite(ledPower,LOW);
  delayMicroseconds(samplingTime);

  voMeasured = analogRead(measurePin);

  delayMicroseconds(deltaTime);
  digitalWrite(ledPower,HIGH);
  delayMicroseconds(sleepTime);

  calcVoltage = voMeasured*(5.0/1024);
  dustDensity = 0.17*calcVoltage-0.1;

  if ( dustDensity < 0)
  {
    dustDensity = 0.00;
  }

  Serial.println("Raw Signal Value (0-1023):");
  Serial.println(voMeasured);

  Serial.println("Voltage:");
  Serial.println(calcVoltage);

  Serial.println("Dust Density:");
  Serial.println(dustDensity);
   u8g2.clearBuffer();         // clear the internal memory
   u8g2.setFont(u8g2_font_pxplusibmvga9_tr);  // choose a suitable font at https://github.com/olikraus/u8g2/wiki/fntlistall
   u8g2.drawStr(0,15,"Dust Density ");  // write something to the internal memory
   u8g2.setCursor(0, 31);
   u8g2.print(dustDensity); 
  // u8g2.drawStr(0,31,"AHHH123");  // write something to the internal memory
   
//   u8g.print("Hello World!")
   u8g2.sendBuffer();         // transfer internal memory to the display

  delay(1000);
}

В начале кода мы подключаем необходимые библиотеки. После загрузки кода на экране дисплея вы увидите показания вашего устройста.

Необходимые компоненты

  1. Макетная плата.
  2. Батарейка на 9 В.
  3. Соединительные провода.

Модуль обнаружения утечки газа

Этот модуль содержит датчик MQ3, который способен обнаруживать сжиженный нефтяной газ, и компаратор (LM393) для сравнения выходного напряжения датчика MQ3 с опорным напряжением. Потенциометр используется для управления чувствительностью модуля. Этот модуль достаточно легко подсоединить к плате Arduino, а в иностранных интернет магазинах его также достаточно легко приобрести введя там в строке поиска запрос “LPG Gas Sensor Module”. Его также можно сконструировать самостоятельно используя датчик MQ3 и компаратор LM358 или LM393.

Калибровка модуля датчика газа MQ-2

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

Рисунок 10 – Потенциометр регулировки чувствительности модуля датчика газа MQ-2

Компаратор на модуле постоянно проверяет, достиг ли аналоговый выходной сигнал (A0) порогового значения, установленного потенциометром. Когда он пересекает пороговое значение, цифровой выход (D0) выдаст высокий логический уровень, и загорится светодиодный индикатор. Эта настройка очень полезна, когда вам нужно при достижении определенного порога запустить какое-то действие. Например, когда концентрация дыма пересекает пороговое значение, вы можете включить или выключить реле или дать команду включить вентиляцию или спринклерную систему пожаротушения.

Датчик давления Ардуино BMP180 (GY-68)

Барометр — это устройство, измеряющее атмосферное давление. Современные электронные барометры GY-68 и BMP180 основаны на пьезорезистивном или тензометрическом методе, т.е. в датчиках происходит изменение сопротивления материала под действием деформирующих сил

Обратите внимание, что датчик атмосферного давления GY-68 подключается к питанию 3,3 Вольт Arduino


Распиновка датчиков давления GY 68 и BMP 180

Технические характеристики BMP180

  • Напряжение питания: 5 Вольт
  • Рабочий ток: 0.5 мАмпер
  • Диапазон измерения: 300 гПа – 1100 гПа
  • Интерфейс подключения: I2C
  • Время срабатывания: 4.5 мс.
  • Точность измерения давления: 0,1 гПа.

Принципиальная схема

Прежде всего, подключите модуль ESP8266 к Ардуино. Чтобы правильно подключить ESP8266 к Arduino, мы использовали модуль адаптера ESP-01, который сделает соединение очень простым. Этот адаптерный модуль имеет встроенный регулятор 5В на 3,3 В, что означает, что вам не придется использовать резисторы.

Подключите контакт VCC адаптера ESP-01 к выходу 5V на Arduino и Землю (GND) на ESP-01 к GND на Arduino. Затем подключите вывод TX от адаптера к пину 2 на Ардуино и RX от адаптера к выходу 3 на Arduino.

Дальше подключите датчик MQ-2 к Ардуино. Подключите VCC и GND к датчику к контактам 5V и GND на Arduino. Затем подключите контакт A0 на MQ-2 к A0 на Arduino.

После этого подключите Зуммер и светодиоды к Arduino. Подключите положительный сигнал к зуммеру с контактом 10 на Arduino и отрицательный сигнал на зуммере с GND на Arduino. Затем подключите отрицательную сторону светодиодов к заземлению через резистор 220 Ом и положительную сторону к контактам 8 и 9 на Arduino.

Как подключить датчик MQ2 к Ардуино

Для этого занятия нам потребуется:

  • плата Arduino Uno / Arduino Nano / Arduino Mega;
  • датчик газа MQ2;
  • макетная плата;
  • светодиод;
  • резистор 220 Ом;
  • провода «папа-папа», «папа-мама».


Схема подключения датчика MQ2 к Ардуино Уно

MQ2 Arduino Uno Arduino Nano Arduino Mega
GND GND GND GND
VCC 5V 5V 5V
OUT A1 A1 A1

Рассмотрим несколько вариантов кода для сенсора. Первый вариант — без библиотеки и еще два примера с библиотеками MQ2.h и TroykaMQ.h от Амперки. Обе библиотеки можно скачать на нашем сайте здесь

Обратите внимание, что при установке сразу двух библиотек будет происходить конфликт и Arduino IDE выдаст ошибку при компиляции. Загрузите первый пример, после сборки схемы, представленной на картинке выше

Скетч. Применяем датчик MQ2 без библиотеки

#define PIN_MQ2  A1    // имя пина для подключения MQ2
#define LED       13   // имя пина для подключения светодиода

int value;

void setup() {
  Serial.begin(9600);
  pinMode(LED, OUTPUT);
  pinMode(PIN_MQ2, INPUT);
}

void loop() {
   // записываем полученные данные с датчика
   value = analogRead(PIN_MQ2);

   // выводим информацию на монитор порта
   Serial.println("VALUE - " + String(value));
   Serial.println(" ");

   // включаем светодиод при превышении определенного значения
   if (value > 200) { digitalWrite(LED, HIGH); }
   else { digitalWrite(LED, LOW); }

   delay(200);
}

Пояснения к коду:

  1. в этом примере необходимо будет откалибровать датчик, т.е. настроить включение светодиода при заданном пороге концентрации газа. При этом датчик не распознает газы, поэтому лучше использовать библиотеки для MQ2.


Датчик широкого спектра газов MQ-2 и Ардуино

Для следующего примера следует переключить пин A1 на логический порт сенсора газа (цифровой сигнал). Если вы используете датчик широкого спектра газов MQ-2 от компании Амперка, то подключите его к микроконтроллеру, согласно схеме. При этом у сенсора должен быть включен нагрев (замкнута перемычка на плате датчика). После подключения датчика к Arduino, загрузите следующую программу в плату.

Скетч. Подключение датчика с библиотекой MQ2.h

#include <MQ2.h>  // библиотека для датчика

#define PIN_MQ2  A1    // имя пина для подключения MQ2
#define LED       13   // имя пина для подключения светодиода
MQ2 mq2(PIN_MQ2);   // создаём объект для работы с датчиком

int lpg, co, smoke;

void setup() {
  Serial.begin(9600);
  mq2.begin();
  pinMode(LED, OUTPUT);
}

void loop() {
   float* values = mq2.read(true);

   // получаем информацию с датчика
   // выводим данные на монитор порта
   lpg = mq2.readLPG();
   co = mq2.readCO();
   smoke = mq2.readSmoke();
  
   // включаем светодиод при превышении концентрации CO
   if (co > 1000) { digitalWrite(LED, HIGH); }
   else { digitalWrite(LED, LOW); }

   delay(200);
}

Пояснения к коду:

  1. информация с датчика выводится на монитор порта Arduino IDE;
  2. порог включения светодиода можно изменить в операторе if и настроить программу на определение концентрации другого газа (в примере указан CO).

Скетч. MQ2 от Амперки с библиотекой TroykaMQ.h

#include <TroykaMQ.h>  // библиотека для датчика

#define PIN_MQ2  A1     // имя пина для подключения датчика
MQ2 mq2(PIN_MQ2);    // создаём объект для работы с датчиком

void setup() {
   Serial.begin(9600);
   // выполняем калибровку датчика
   mq2.calibrate();
   // выводим сопротивление датчика в чистом воздухе (Ro)
   Serial.println("Ro = " + String(mq2.getRo()));
}

void loop() {
   // выводим значения газов в ppm
   Serial.println("LPG: " + String(mq2.readLPG()) + " ppm");
   Serial.println("Methane: " + String(mq2.readMethane()) + " ppm");
   Serial.println("Smoke: " + String(mq2.readSmoke()) + " ppm");
   Serial.println("Hydrogen: " + String(mq2.readHydrogen()) + " ppm");

   Serial.println(" ");
   delay(200);
}

Пояснения к коду:

  1. в представленном примере информация по концентрации газов выводится в последовательный порт, без включения светодиода;
  2. сенсор должен находится в режиме постоянного нагрева (перемычка замкнута).

Структура слова

Основное, на что нужно обратить внимание при проектировании систем распознавания звука – сама фонетика языка. В русском, есть гласные и согласные буквы

Последние еще и бывают шипящего, звонкого и глухого произношения. Устройства улавливающие звуковые волны, наиболее слышат, как раз, первые, вторые и третьи, а вот к последним «глуховаты». Поэтому, собственно и программировать конечный аппарат требуется именно на их определение, а не слова в целом. Опять же. Каждый человек обладает определенной дикцией и высотой тона голоса. Посудите сами, послушав, как одно и то же слово произносится мужчиной или женщиной. К тому же некоторые люди быстро проговаривают текст, другие медленнее. Все названые факторы требуется учесть при написании скетча обработки.

Еще одно ограничение, накладываемое платам KY-037 и KY-038 – падение уровня улавливаемого сигнала в зависимости от расстояния до его источника. То есть, нужно предусмотреть сравнение именно разниц поступающих пиков, а не конкретных значений.

Hardware Overview – MQ2 Gas Sensor Module

Since MQ2 Gas Sensor is not breadboard compatible, we do recommend this handy little breakout board. It’s very easy to use and comes with two different outputs. It not only provides a binary indication of the presence of combustible gases but also an analog representation of their concentration in air.

The analog output voltage provided by the sensor changes in proportional to the concentration of smoke/gas. The greater the gas concentration, the higher is the output voltage; while lesser gas concentration results in low output voltage. The following animation illustrates the relationship between gas concentration and output voltage.

The analog signal from MQ2 Gas sensor is further fed to LM393 High Precision Comparator (soldered on the bottom of the module), of course to digitize the signal. Along with the comparator is a little potentiometer you can turn to adjust the sensitivity of the sensor. You can use it to adjust the concentration of gas at which the sensor detects it.

The sensor is sensitive to multiple gasses – but cannot tell which it is! That’s normal; most gas sensors are like that. So, it is best for measuring changes in a known gas density, not detecting which is changing.

Исходный код программы (скетча)

Arduino

/*
* Interfacing MQ135 Gas Senor with Arduino
* Author: Ashish
* Website: www.circuitdigest.com
* Date: 11-11-2020
*/
// сопротивление нагрузочного резистора на плате датчика
#define RLOAD 22.0
#include «MQ135.h»
#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128 // ширина OLED дисплея в пикселах
#define SCREEN_HEIGHT 64 // высота OLED дисплея в пикселах
// Declaration for SSD1306 display connected using software SPI (default case):
#define OLED_MOSI 9
#define OLED_CLK 10
#define OLED_DC 11
#define OLED_CS 12
#define OLED_RESET 13
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT,
OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);
MQ135 gasSensor = MQ135(A0);
int val;
int sensorPin = A0;
int sensorValue = 0;
void setup() {
Serial.begin(9600);
pinMode(sensorPin, INPUT);
display.begin(SSD1306_SWITCHCAPVCC);
display.clearDisplay();
display.display();
}
void loop() {
val = analogRead(A0);
Serial.print («raw = «);
Serial.println (val);
// float zero = gasSensor.getRZero();
// Serial.print («rzero: «);
//Serial.println (zero);
float ppm = gasSensor.getPPM();
Serial.print («ppm: «);
Serial.println (ppm);
display.setTextSize(2);
display.setTextColor(WHITE);
display.setCursor(18,43);
display.println(«CO2»);
display.setCursor(63,43);
display.println(«(PPM)»);
display.setTextSize(2);
display.setCursor(28,5);
display.println(ppm);
display.display();
display.clearDisplay();
delay(2000);
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56

/*
* Interfacing MQ135 Gas Senor with Arduino
* Author: Ashish
* Website: www.circuitdigest.com
* Date: 11-11-2020
*/
// сопротивление нагрузочного резистора на плате датчика
#define RLOAD 22.0
#include «MQ135.h»
#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128 // ширина OLED дисплея в пикселах
#define SCREEN_HEIGHT 64 // высота OLED дисплея в пикселах
// Declaration for SSD1306 display connected using software SPI (default case):
#define OLED_MOSI   9
#define OLED_CLK   10
#define OLED_DC    11
#define OLED_CS    12
#define OLED_RESET 13

Adafruit_SSD1306display(SCREEN_WIDTH,SCREEN_HEIGHT,

OLED_MOSI,OLED_CLK,OLED_DC,OLED_RESET,OLED_CS);

MQ135gasSensor=MQ135(A0);

intval;

intsensorPin=A0;

intsensorValue=;

voidsetup(){

Serial.begin(9600);

pinMode(sensorPin,INPUT);

display.begin(SSD1306_SWITCHCAPVCC);

display.clearDisplay();

display.display();

}

voidloop(){

val=analogRead(A0);

Serial.print(«raw = «);

Serial.println(val);

// float zero = gasSensor.getRZero();

// Serial.print («rzero: «);

//Serial.println (zero);

floatppm=gasSensor.getPPM();

Serial.print(«ppm: «);

Serial.println(ppm);

display.setTextSize(2);

display.setTextColor(WHITE);

display.setCursor(18,43);

display.println(«CO2»);

display.setCursor(63,43);

display.println(«(PPM)»);

display.setTextSize(2);

display.setCursor(28,5);

display.println(ppm);

display.display();

display.clearDisplay();

delay(2000);

}

Расчет сопротивления Ro в чистом воздухе

Из приведенного графика видно, что отношение сопротивлений Rs/Ro является константой для воздуха (жирная синяя линия на графике), поэтому мы можем использовать это и сделать допущение что при работе в свежем воздухе отношение этих сопротивлений равно 3.6 как показано на следующем рисунке.

Rs/Ro = 3.6

Из даташита на датчик нам также известна формула для расчета значения Rs, показанная на рисунке ниже. Если вас интересует откуда взялась данная формула, то вы можете почитать руководство от jay con systems (на английском языке) — весьма подробное руководство, очень полезно изучить если вы детально хотите разобраться в этой теме.

В этой формуле значение Vc – это значение нашего питающего напряжения (+5V), а значение RL, как мы уже определились, в нашем случае будет равно 47 кОм. Если мы напишем небольшую программу для Arduino, мы также сможем найти значение VRL и после этого окончательно рассчитать значение Rs. Далее представлен код этой программы для Arduino, которая считывает аналоговое напряжение VRL с датчика, рассчитывает значение Rs по приведенной формуле и затем отображает его в окне монитора последовательной связи (serial monitor).

Arduino

/*
* Program to measure the value of R0 for a know RL at fresh air condition
* Program by: B.Aswinth Raj
* Website: www.circuitdigest.com
* Dated: 28-12-2017
*/
//эта программа лучше всего работает в чистом воздухе при температуре в комнате 20℃, влажности 65%, концентрации кислорода 21% и при сопротивлении резистора Rl 47 кОм

#define RL 47 //сопротивление резистора RL 47 кОм
void setup() //испольняется один раз
{
Serial.begin(9600); //инициализируем последовательный порт для дальнейшего отображения значений в окне монитора последовательной связи
}

void loop() {
float analog_value;
float VRL;
float Rs;
float Ro;
for(int test_cycle = 1 ; test_cycle <= 500 ; test_cycle++) //считываем значение с аналогового выхода датчика 500 раз
{
analog_value = analog_value + analogRead(A0);
}
analog_value = analog_value/500.0; //вычисляем среднее
VRL = analog_value*(5.0/1023.0); //конвертируем значение с выхода АЦП в значение напряжения
//RS = ((Vc/VRL)-1)*RL – формула, которую мы получили из даташита
Rs = ((5.0/VRL)-1) * RL;
// отношение RS/RO равно 3.6 – это мы получили из графика в даташите
Ro = Rs/3.6;
Serial.print(«Ro at fresh air = «);
Serial.println(Ro); //отображаем рассчитанное значение Ro
delay(1000); //задержка на 1 секунду
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33

/*
* Program to measure the value of R0 for a know RL at fresh air condition
* Program by: B.Aswinth Raj
* Website: www.circuitdigest.com                                      
* Dated: 28-12-2017
*/
//эта программа лучше всего работает в чистом воздухе при температуре в комнате 20℃, влажности 65%, концентрации кислорода 21% и при сопротивлении резистора Rl 47 кОм
 
#define RL 47  //сопротивление резистора RL 47 кОм

voidsetup()//испольняется один раз

{

Serial.begin(9600);//инициализируем последовательный порт для дальнейшего отображения значений в окне монитора последовательной связи

}
 

voidloop(){

floatanalog_value;

floatVRL;

floatRs;

floatRo;

for(inttest_cycle=1;test_cycle<=500;test_cycle++)//считываем значение с аналогового выхода датчика 500 раз

{

analog_value=analog_value+analogRead(A0);

}

analog_value=analog_value500.0;//вычисляем среднее

VRL=analog_value*(5.01023.0);//конвертируем значение с выхода АЦП в значение напряжения

//RS = ((Vc/VRL)-1)*RL – формула, которую мы получили из даташита

Rs=((5.0VRL)-1)*RL;

// отношение RS/RO равно 3.6 – это мы получили из графика в даташите

Ro=Rs3.6;

Serial.print(«Ro at fresh air = «);

Serial.println(Ro);//отображаем рассчитанное значение Ro

delay(1000);//задержка на 1 секунду

}

Примечание: значение Ro может изменяться, поэтому чтобы определить его максимально точно, дайте датчику прогреться в течение, по меньшей мере, 10 часов, и после этого определяйте значение Ro.

Для нашего датчика у нас получилось значение Ro приблизительно 30 кОм (когда значение RL равно 47 кОм). Для используемого вами датчика значение Ro может немного отличаться.

Объяснение работы программы

С помощью данной библиотеки вы напрямую (без всяких вычислений) можете получить значение PPM с выхода датчика, используя следующие две строки:

Но перед этим нужно откалибровать датчик, для этого скачайте приведенный после этого абзаца код программы, запустите его на выполнение на промежуток от 12 до 24 часов и после этого получите значение RZERO.

После того как вы в результате выполнения этой программы получите значение RZERO, запишите его в файл скачанной библиотеки «MQ135.h»: #define RZERO 494.63. (здесь нужно будет подставить свое значение RZERO).

После этого можно приступать к написанию кода для основной программы нашего проекта. Сначала необходимо подключить все библиотеки, которые мы будем использовать, и инициализировать необходимые переменные. При помощи использования библиотеки Software Serial Library (библиотеки для последовательной связи) мы можем задействовать последовательный порт на любых цифровых контактах Arduino, в данном случае у нас это будут контакты 9 (RX) и 10 (TX) – к ним мы подключили модуль ESP8266. Также необходимо подключить библиотеку для работы с ЖК дисплеем и сообщить плате Arduino, к каким ее контактам мы подключили ЖК дисплей. Также мы инициализировали две дополнительные переменные: одну для аналогового контакта датчика и вторую для хранения значения качества воздуха.

После этого мы зададим режим работы для контакта 8 на вывод данных – к нему подключен зуммер. Команда lcd.begin(16,2) переведет ЖК дисплей в режим приема данных, после этого мы переведем курсор на первую строку и напечатаем сообщение ‘circuitdigest’. После этого мы переведем курсор на 2-ю строку и выведем сообщение: ‘Sensor Warming’ (датчик нагревается).

Затем установим скорость (в бодах) для последовательной связи. Разные модули ESP поддерживают различные скорости передачи данных – это надо учитывать при установке скорости работы нашего последовательного порта. После этого мы установим связь с модулем ESP и покажем IP в окне монитора последовательной связи (serial monitor).

Для вывода сообщения на веб-страницу используем HTML программирование. Для этого мы создадим переменную с именем webpage и сохраним в ней строку, которую нам нужно будет выводить на веб-страницу. Необходимо будет вычесть 48 из выходного значения поскольку функция read() возвращает десятичное значение ASCII, а первая десятичная цифра (в нем) 0 начинается с позиции 48.

Далее в функции sendData мы будем передавать на веб-страницу необходимые данные и сообщения.

В следующем участке кода мы будем выводить сообщения на ЖК дисплей. Мы будем использовать несколько условий для проверки качества воздуха и в соответствии с ними выводить сообщения на ЖК дисплей и включать/выключать зуммер. Зуммер будет включаться когда уровень загрязнения воздуха будет превышать 1000 PPM.

Наконец, в следующей функции мы будем передавать и показывать данные на веб-странице. Данные, которые мы хранили в переменной (строке) под именем ‘webpage’ будут сохранены в строке под именем ‘command’. Затем модуль ESP будет последовательно, по одному символу, считывать данные из строки ‘command’ и печатать их на веб-странице.

Модуль OLED дисплея (0.96’ OLED Display Module)

OLED (Organic Light-Emitting Diodes, органический светоизлучающий диод) – это светоизлучающая технология, которая применяется в большинстве современных телевизоров. В OLED дисплеях используется тот же принцип формирования изображения, что и в современных телевизорах, только количество пикселей в них значительно меньше.

Для нашего проекта мы использовали монохромный 7-ми контактный OLED дисплей SSD1306 с диагональю 0.96”. Он может использовать 3 различных коммуникационных протокола: 3-х проводный SPI, 4-х проводный SPI и I2C.

Назначение его контактов (распиновка) приведены в следующей таблице.

Номер контакта Название контакта Альтернативное название контакта Назначение контакта
1 Gnd Ground земля (общий провод)
2 Vdd Vcc, 5V напряжение питания (в диапазоне 3-5 В)
3 SCK D0, SCL, CLK контакт синхронизации (clock pin). Применяется в интерфейсах I2C и SPI
4 SDA D1, MOSI контакт данных. Применяется в интерфейсах I2C и SPI
5 RES RST, RESET контакт сброса модуля. Применяется в интерфейсе SPI
6 DC A0 контакт команд (Data Command pin). Применяется в интерфейсе SPI
7 CS Chip Select (выбор чипа) используется когда несколько устройств взаимодействуют по интерфейсу SPI

Технические характеристики OLED дисплея SSD1306:

  • драйвер микросхемы OLED: SSD1306;
  • разрешение: 128 x 64;
  • угол зрения: >160°;
  • входное напряжение: 3.3V ~ 6V;
  • цвет пикселов: синий;
  • диапазон рабочих температур: -30°C ~ 70°C.
Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Adblock
detector