В этой статье мы подробно рассмотрим процесс подключения датчика углекислого газа MH-Z19B к микроконтроллеру MEGA 2560, а также использование платформы VizIoT для мониторинга уровня CO2 в режиме реального времени.
Питание:
VCC
модуля SIM800L от источника питания 4.2V-4.4V. Модуль SIM800L может быть чувствительным к напряжению, поэтому лучше использовать отдельный источник питания.GND
модуля SIM800L подсоедините к GND
источника питания и к GND
Arduino Mega как на фотосхеме:Управление модулем будем осуществлять по следующей схеме подключения:
TX
модуля SIM800L к пину RX2
(#17) на Arduino Mega.RX
модуля SIM800L к пину TX2
(#16) на Arduino Mega подключаем через резистивный делитель (резисторы одинакового номинала в диапазоне 1-10 КОм). Пример кода:
Вот простой пример кода для проверки подключения и отправки 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()
}
Проверка работы:
Если получен ответ "OK", значит модуль успешно подключен и готов к работе.
Подключение датчика 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);
}
Проверка ответа
Если вы получили значение концентрации CO2, значит датчик успешно подключен и работает корректно, как скриншоте.
На данном этапе были рассмотрены основные шаги по подключению датчика углекислого газа MH-Z19B и модуля SIM800L к Arduino Mega 2560. Мы изучили необходимые компоненты, схемы подключения, а также использовали примеры кода для проверки связи с модулем SIM800L и чтения данных с датчика MH-Z19B.
Добавление и настройка устройства: Как подключать новые устройства к серверу Viziot описано в предыдущих статьях. Кратко напомним, как это делается на сегодняшнем примере:
Прошивка Arduino:
#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 к компьютеру и загрузите полученный скетч.
Добавление виджетов:
Осталось указать следующие параметры:
После успешной настройки соединения вы сможете мониторить данные о концентрации CO2 в реальном времени на панели управления VizIoT. Вы также имеете возможность настраивать графики, настройки оповещений и другие элементы для удобного и эффективного мониторинга.
Для более детализированного анализа можно раскрыть виджет, нажав в правом верхнем углу на "Open in full screen", где появится подробный график:
График показывает концентрацию CO2 в помещении с 13 по 15 июля 2024 года. Рассмотрим основные моменты:
Концентрация CO2:
Анализ по времени:
Рекомендации по проветриванию:
Комментарий к графику
График показывает изменения уровня CO2 в течение анализируемого периода. Основные наблюдения включают:
Личное (квартира/дом):
Коммерческое (офис/публичные места):
Для улучшения условий в помещении, рекомендуется следить за уровнем CO2 с помощью датчиков и проветривать помещение, когда концентрация превышает 1000 ppm.
Как управлять уведомлениями, а также подключаться к VizIoT Telegram Bot, рассмотрено в статье VizIoT Уведомления. В этом разделе мы рассмотрим настройку кастомного сообщения о допустимых показателях уровня СО2, а также предупреждения о завышении концентрации углекислого газа.
В конструкторе уведомлений создадим методы получения сообщений с помощью телеграм-бота и сайта VizIoT, как показано на скриншоте:
Примеры полученных сообщений в Telegram-боте выглядят так:
Подключение датчика MH-Z19B и модуля SIM800L к Arduino Mega 2560 с использованием платформы VizIoT представляет собой простое и эффективное решение для мониторинга уровня CO2. Основные преимущества этого подхода включают удалённый мониторинг в реальном времени через GSM-сеть, что делает его идеальным для умных домов, офисов и промышленных помещений. Платформа VizIoT обеспечивает удобное отображение и анализ данных, а также возможности настройки оповещений и графиков для эффективного контроля за качеством воздуха.
Это решение может быть полезным для организаций и частных лиц, стремящихся улучшить условия внутренней среды и обеспечить безопасное и комфортное пребывание людей в помещениях.