Подключение датчика MH-Z19B на базе Arduino Mega 2560 для мониторинга CO2 с помощью VizIoT

В этой статье мы подробно рассмотрим процесс подключения датчика углекислого газа MH-Z19B к микроконтроллеру MEGA 2560, а также использование платформы VizIoT для мониторинга уровня CO2 в режиме реального времени.

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

  • Arduino Mega 2560
    Arduino_Mega_2560
  • Датчик MH-Z19B
    MH_Z19B CO2 Sensor
  • Модуль SIM800L + SIM-карта с активным тарифным планом для передачи данных
    SIM800L Module
  • Соединительные провода
  • Блок питания для модуля SIM800L (рекомендуется 4V-5V)
  • Компьютер с установленным Arduino IDE
  • Платформа VizIoT для визуализации данных

Схема подключения:

Подключение модуля SIM800L к Arduino Mega 2560 достаточно просто, если следовать следующим шагам:

Питание:

  • Подключите питание "+" источника питания к пину 5V модуля MEGA 2560
    pin_5v_mega2560
  • Запитайте VCC модуля SIM800L от источника питания 4.2V-4.4V. Модуль SIM800L может быть чувствительным к напряжению, поэтому лучше использовать отдельный источник питания.
  • GND модуля SIM800L подсоедините к GND источника питания и к GND Arduino Mega как на фотосхеме:
    module_GND

Управление модулем будем осуществлять по следующей схеме подключения:

  • пин TX модуля SIM800L к пину RX2 (#17) на Arduino Mega.
  • пин RX модуля SIM800L к пину TX2 (#16) на Arduino Mega подключаем через резистивный делитель (резисторы одинакового номинала в диапазоне 1-10 КОм).
  • Схема подключения:
    resistive_divider

Пример кода:

Вот простой пример кода для проверки подключения и отправки AT-команд к модулю SIM800L:

void setup() {
  // Start communication with Serial Monitor
  Serial.begin(9600);
  // Start communication with SIM800L using Serial2
  Serial2.begin(9600);

  // Pause to allow the module to initialize
  delay(1000);

  Serial.println("Sending AT command...");
  Serial2.println("AT");

  // Wait for a response
  delay(1000);

  // Check if data is available
  if (Serial2.available()) {
    while (Serial2.available()) {
      char c = Serial2.read();
      Serial.print(c);
    }
  } else {
    Serial.println("No response from SIM800L.");
  }
}
void loop() {
  // Empty loop as all the work is done in setup()
}

Проверка работы:

  • Подключите Arduino к компьютеру и откройте Serial Monitor (Монитор Порта) в Arduino IDE.
  • Установите скорость порта 9600 бод.
  • Загрузите скетч на Arduino MEGA 2560.
  • В Serial Monitor вы должны увидеть сообщение "Sending AT command..." и затем ответ от модуля.

Если получен ответ "OK", значит модуль успешно подключен и готов к работе.
checking_the_response_sim800l

Подключение датчика MH-Z19B к Arduino Mega 2560.

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

  • Датчик MH-Z19B
  • Arduino Mega 2560
  • Соединительные провода

Схема подключения:

  • Питание:
    • Подключите VCC датчика MH-Z19B к 5V на Arduino Mega 2560.
    • Подключите GND модуля MH-Z19B к GND источника питания и к GND Arduino Mega.
  • Сигнальные линии:
    • Подключите TX датчика MH-Z19B к RX3 (пин 15) на Arduino Mega 2560.
    • Подключите RX датчика MH-Z19B к TX3 (пин 14) на Arduino Mega 2560.

Пример кода для чтения данных с датчика MH-Z19B:

void setup() {
  // Start communication with Serial Monitor
  Serial.begin(9600);
  // Start communication with MH-Z19B using Serial3
  Serial3.begin(9600);

  // Pause to allow the module to initialize
  delay(1000);

  Serial.println("Requesting data from MH-Z19B...");
}

void loop() {
  // Send command to request data
  byte cmd[9] = {0xFF, 0x01, 0x86, 0x00, 0x00, 0x00, 0x00, 0x00, 0x79};
  Serial3.write(cmd, 9);

  // Pause to receive data
  delay(1000);

  // Check if data is available
  if (Serial3.available()) {
    byte response[9];
    for (int i = 0; i < 9; i++) {
      response[i] = Serial3.read();
    }

    if (response[0] == 0xFF && response[1] == 0x86) {
      int co2 = response[2] * 256 + response[3];
      Serial.print("CO2 Concentration: ");
      Serial.print(co2);
      Serial.println(" ppm");
    } else {
      Serial.println("Invalid response from MH-Z19B.");
    }
  } else {
    Serial.println("No response from MH-Z19B.");
  }

  // Pause before next request
  delay(5000);
}

Проверка ответа

  • Подключите Arduino к компьютеру и откройте Serial Monitor в Arduino IDE.
  • Установите скорость порта на 9600 бод.
  • Загрузите скетч на Arduino MEGA 2560.

Если вы получили значение концентрации CO2, значит датчик успешно подключен и работает корректно, как скриншоте.
checking_the_response_MH-Z19B

На данном этапе были рассмотрены основные шаги по подключению датчика углекислого газа MH-Z19B и модуля SIM800L к Arduino Mega 2560. Мы изучили необходимые компоненты, схемы подключения, а также использовали примеры кода для проверки связи с модулем SIM800L и чтения данных с датчика MH-Z19B.

Пример отправки показаний концентрации CO2 в квартире каждые 5 минут.

Добавление и настройка устройства: Как подключать новые устройства к серверу Viziot описано в предыдущих статьях. Кратко напомним, как это делается на сегодняшнем примере:

  • Добавим новое устройство в VizIoT с именем «CO2»
  • Настроим параметры устройства, добавив параметр: Ключ co2 с типом «Углекислый газ, ppm»
  • В «Основных настройках» устройства скопируем Ключ доступа и Пароль доступа.

Прошивка Arduino:

  • Создайте новый проект в Arduino IDE.
  • Скопируйте указанный ниже пример в созданный проект.
#define TINY_GSM_MODEM_SIM800
#define USED_MH_Z19B true

#include <TinyGsmClient.h>
#include <ArduinoHttpClient.h>
#include <Wire.h>

#define SerialMon Serial
// Use the physical Serial port for Mega, Leonardo, Micro
#define SerialAT Serial2

//access point settings which is required to connect the GSM module to the GPRS network
const char apn[] = "www.kyivstar.net";
const char user[] = "";
const char pass[] = "";

// VizIoT Device access key and password (can be found in the device settings)
String VizIoT_Device_key = "XXXX";
String VizIoT_Device_pass = "XXXX";

// Server address and port
const char server[] = "VizIoT.com";
const int port = 80;

TinyGsm modem(SerialAT);
TinyGsmClient client(modem);
HttpClient http(client, server, port);

void setup() {
  // Set baud rate for Serial Monitor
  SerialMon.begin(9600);
  Serial3.begin(9600); // Serial3 port for communication with the MH-Z19B sensor
  Serial.println("MH-Z19B CO2 Sensor Test");

  delay(10);

  // Set baud rate for GSM module
  SerialAT.begin(9600);
  delay(3000);

  SerialMon.println(F("Initializing modem..."));
  modem.restart();

  String modemInfo = modem.getModemInfo();
  SerialMon.print(F("Modem: "));
  SerialMon.println(modemInfo);
}

void loop() {
  SerialMon.print(F("Waiting for network..."));
  if (!modem.waitForNetwork()) {
    SerialMon.println(" fail");
    delay(10000);
    return;
  }

  SerialMon.println(" OK");

  SerialMon.print(F("Connecting to access point "));
  SerialMon.print(apn);

  if (!modem.gprsConnect(apn, user, pass)) {
    SerialMon.println(" failed");
    delay(10000);
    return;
  }

  SerialMon.println(" OK");
  SerialMon.print(F("Sending HTTP GET request... "));

  int err = http.get(getResource().c_str());

  if (err != 0) {
    SerialMon.println(F("connection error"));
    delay(10000);
    return;
  }

  // Reading and displaying the response
  int statusCode = http.responseStatusCode();
  SerialMon.print(F("HTTP "));
  SerialMon.println(statusCode);

  if (statusCode == 200) {
    String response = http.responseBody();
    SerialMon.print(F("Response: "));
    SerialMon.println(response);
  }

  http.stop();
  SerialMon.println(F("Disconnected from server"));

  modem.gprsDisconnect();
  SerialMon.println(F("GPRS disconnected"));

  // Sleep for 5 minutes
  //delay(0.3 * 60 * 1000);
  delay(5.0 * 60 * 1000);
}

String getResource() {
  // Reading data from the MH-Z19B sensor
  int CO2 = readCO2();

  String resource = String("/update?key=") + VizIoT_Device_key + "&" + "pass=" + VizIoT_Device_pass;
  resource += String("&co2=") + CO2;

  return resource;
}

int readCO2() {
  byte cmd[9] = {0xFF, 0x01, 0x86, 0, 0, 0, 0, 0, 0x79};
  byte response[9];

  // Clear the serial port buffer before sending the command to avoid reading old data
  while (Serial3.available()) {
    Serial3.read();
  }

  Serial3.write(cmd, 9);

  // Waiting for data with timeout
  unsigned long startTime = millis();
  while (Serial3.available() < 9) {
    if (millis() - startTime > 1000) { // 1000 ms = 1 second timeout, waiting for data (1 second) to prevent the program from getting stuck if there is no response
      SerialMon.println("Error: CO2 read timeout");
      return -1;
    }
  }

  // Reading data, checking the number of bytes read before processing
  Serial3.readBytes(response, 9);

  // Check the response header
  if (response[0] != 0xFF || response[1] != 0x86) {
    SerialMon.println("Error reading CO2");
    return -1;
  }

  // Calculate CO2 value
  int CO2 = (response[2] << 8) + response[3];
  // Output the CO2 value to the monitor
  SerialMon.print("CO2: ");
  SerialMon.println(CO2);

  return CO2;
}

Установите следующие библиотеки:

Для корректной работы кода необходимо указать значения переменных:

  • apn – Имя точки доступа GSM. В данном контексте, apn используется для хранения имени точки доступа (Access Point Name), которая необходима для подключения GSM-модуля к сети GPRS.
  • VizIoT_Device_key – скопированный Ключ доступа к устройству
  • VizIoT_Device_pass – скопированный Пароль доступа к устройству

Подключите Arduino к компьютеру и загрузите полученный скетч.

Добавление виджетов:

  1. Зайдите на сайт VizIoT и создайте новую панель с названием, например, "CO2".
  2. Добавьте виджет с названием "CO2 widget".

Осталось указать следующие параметры:

  • Тип: "График";
  • Устройство: "CO2";
  • Параметр: co2;

Визуализация данных

После успешной настройки соединения вы сможете мониторить данные о концентрации CO2 в реальном времени на панели управления VizIoT. Вы также имеете возможность настраивать графики, настройки оповещений и другие элементы для удобного и эффективного мониторинга.
dashboard_widget_CO2
Для более детализированного анализа можно раскрыть виджет, нажав в правом верхнем углу на "Open in full screen", где появится подробный график:
CO2_widget_full_screen

Описание графика

График показывает концентрацию CO2 в помещении с 13 по 15 июля 2024 года. Рассмотрим основные моменты:

Концентрация CO2:

  • Максимальное значение: 3239 ppm
  • Среднее значение: 1192 ppm
  • Текущее значение: 499 ppm

Анализ по времени:

  • Пики концентрации (примерно 1500-3200 ppm) указывают на время, когда в помещении находилось 3-5 человек при закрытых окнах. Это наблюдается ночью и вечером 13 и 14 июля.
  • Спады концентрации (ниже 500 ppm) могут указывать на моменты, когда помещение проветривалось или в нем было меньше людей.

Рекомендации по проветриванию:

  • Когда проветривать: Основываясь на графике, проветривание необходимо проводить в утренние и вечерние часы, когда концентрация CO2 резко возрастает.
  • Почему проветривать: Высокие уровни CO2 (более 1000 ppm) могут вызывать усталость, снижение концентрации и другие негативные эффекты на здоровье. Регулярное проветривание помогает поддерживать оптимальный уровень качества воздуха.

Комментарий к графику

График показывает изменения уровня CO2 в течение анализируемого периода. Основные наблюдения включают:

  • Максимальные пики уровня CO2 достигали более 3000 ppm, что указывает на периоды с высокой активностью или плохой вентиляцией.
  • Среднее значение CO2 за период составляет около 1192 ppm, что немного выше рекомендуемого уровня для жилых помещений.
  • Анализ изменений показывает, что уровень CO2 наиболее высок в вечерние и ночные часы, что, вероятно, связано с большим количеством людей в помещении и закрытыми окнами.
  • Текущее значение CO2 на момент последнего измерения составляет 499 ppm, что не превышает рекомендуемые нормы.

Применение:

Личное (квартира/дом):

  • Проветривание утром и вечером: Начните день с бодрящего глотка свежего воздуха! Откройте окна утром, чтобы зарядиться энергией перед началом активного дня. А вечером, проветривание поможет снять усталость и подготовить помещение к спокойной ночи. В моменты, когда вся семья собирается дома, это особенно важно для поддержания хорошего самочувствия.
  • Создание комфортного микроклимата: Регулярное проветривание помогает избежать накопления излишней влаги и неприятных запахов, улучшая качество воздуха и создавая приятную атмосферу в доме.

Коммерческое (офис/публичные места):

  • Регулярное проветривание в рабочее время: Свежий воздух способствует повышению продуктивности и улучшению концентрации сотрудников. Проветривание в течение рабочего дня поможет избежать накопления углекислого газа и создаст комфортные условия для работы.
  • Автоматическая вентиляция: Установите системы автоматической вентиляции, которые будут поддерживать оптимальный уровень CO2 без необходимости постоянного контроля. Это особенно важно в помещениях с высокой проходимостью, таких как офисы, кафе и другие публичные места.
  • Создание здоровой рабочей среды: Поддержание хорошего качества воздуха в офисе не только улучшает самочувствие сотрудников, но и снижает риск заболеваний, повышая общую эффективность и настроение коллектива.

Для улучшения условий в помещении, рекомендуется следить за уровнем CO2 с помощью датчиков и проветривать помещение, когда концентрация превышает 1000 ppm.

Уведомления

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

В конструкторе уведомлений создадим методы получения сообщений с помощью телеграм-бота и сайта VizIoT, как показано на скриншоте:
constructor_notifications_co2_en

Примеры полученных сообщений в Telegram-боте выглядят так:
tg_bot_notifications_co2

Заключение

Подключение датчика MH-Z19B и модуля SIM800L к Arduino Mega 2560 с использованием платформы VizIoT представляет собой простое и эффективное решение для мониторинга уровня CO2. Основные преимущества этого подхода включают удалённый мониторинг в реальном времени через GSM-сеть, что делает его идеальным для умных домов, офисов и промышленных помещений. Платформа VizIoT обеспечивает удобное отображение и анализ данных, а также возможности настройки оповещений и графиков для эффективного контроля за качеством воздуха.

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