В этом проекте мы узнаем как сделать детектор утечки газа на основе платы ESP32 с системой оповещения по электронной почте. Для обнаружения газа LPG в воздухе мы будем использовать газовый датчик MQ2/MQ5. Газовый датчик MQ5 подходит для обнаружения H2, LPG, CH4, CO и алкоголя . Благодаря своей большей чувствительности и быстрому отклику, оповещение о безопасности может быть отправлено быстро. Ранее на нашем сайте мы уже рассматривали проект детектора утечки газа на Arduino и датчике MQ3, но в нем не было оповещений по электронной почте.
Мы будем использовать библиотеку почтового клиента ESP32 и отправлять электронные письма на любой адрес электронной почты с помощью сервера SMTP. Электронное письмо отправляется автоматически при обнаружении любой утечки газа/сжиженного нефтяного газа выше определенного порогового значения. Таким образом, эта система уведомлений по электронной почте будет оповещать пользователей о необходимости закрыть клапан или немедленно предпринять какие-либо действия. Систему можно активировать или деактивировать через локальный веб-сервер. Если мы выберем деактивацию, мы не будем получать уведомления по электронной почте при превышении уровня газа. Мы можем использовать эту систему в качестве системы безопасности в промышленности или дома.
Необходимые компоненты
- Модуль ESP32 (купить на AliExpress).
- Датчик газа MQ2/MQ5 (купить на AliExpress).
- Кабель передачи данных Micro USB 5 В.
- Макетная плата.
- Соединительные провода.
Реклама: ООО "АЛИБАБА.КОМ (РУ)" ИНН: 7703380158
Датчик газа MQ5
Наиболее популярным аналоговым газовым датчиком является газовый датчик MQ5. Газовый датчик MQ5 определяет наличие различных газов, таких как водород, оксид углерода, метан и сжиженный нефтяной газ. Датчик взаимодействует с газом для измерения его концентрации в диапазоне от 100 ppm до 3000 ppm.
Когда газ взаимодействует с этим датчиком, он сначала ионизируется на свои составляющие, а затем адсорбируется чувствительным элементом. Эта адсорбция создает разность потенциалов в элементе, которая передается в блок контроллера через выходной аналоговый контакт в виде тока. Таким образом, мы измеряем аналоговый ток как выход, который увеличивается при увеличении уровня газа.
Датчик работает от 3 В-5 В и имеет как аналоговый, так и цифровой выход. Он имеет 4 контакта: VCC, GND, D0 и A0. Чтобы узнать больше об этом датчике, проверьте его техническое описание здесь: MQ5 Datasheet.
Схема проекта
Мы можем сделать небольшое устройство, которое может работать от батареи. В моем случае я использовал макетную плату для сборки и тестирования устройства. Схема детектора утечки газа на ESP32 и датчике MQ5 приведена на следующем рисунке.
Вы можете подключить контакт VCC датчика к контакту 3,3 В/5 В платы ESP32. Мы не используем цифровой выход датчика, поэтому подключаем аналоговый выход датчика к контакту GPIO35 платы ESP32.
Настройка адреса электронной почты отправителя
Создайте новую учетную запись Gmail здесь: https://www.google.com/gmail/about /. Лучше не использовать личный аккаунт Gmail для этой цели.
Теперь вам нужно разрешить менее безопасным приложениям получать доступ к этой новой учетной записи Gmail через ESP32. Если вы не разрешите эту опцию, то ваш ESP32 не сможет отправлять письма через данную почту. Перейдите по этой ссылке и включите опцию «allow less secure» («разрешить менее безопасные»).
Примечание: для доступа к этой функции отключите двухэтапную аутентификацию.
Установка необходимых библиотек
1. Библиотека почтового клиента ESP32
Для отправки писем с помощью ESP32 мы будем использовать библиотеку ESP32 Mail Client . Библиотека разработана Mobizt и может быть установлена через менеджер библиотек (Library Manager). Вы можете загрузить библиотеку здесь.
2. Библиотеки асинхронного веб-сервера
Для создания асинхронного веб-сервера нам понадобятся две библиотеки: библиотека ESPAsyncWebServer и библиотека Async TCP.
Исходный код программы
В коде программы сначала добавьте все библиотеки, описанные выше. Скопируйте код, указанный ниже, и перед загрузкой его на плату ESP32 внесите некоторые изменения в код, описанные далее.
Внесите изменения в SSID и пароль Wi-Fi здесь.
1 2 |
const char* ssid = "***********"; //SSID of Wifi network const char* password = "***********"; // Password of wifi network |
Измените адрес электронной почты отправителя здесь и введите адрес электронной почты и пароль, созданные ранее.
1 2 |
#define emailSenderAccount "examplesender@gmail.com" // Sender email address #define emailSenderPassword "***********" // Sender email password |
Введите здесь адрес получателя, на который вы хотите отправить оповещение по электронной почте.
1 |
String inputMessage = "examplereceiver@gmail.com"; //Reciepent email alert. |
Измените пороговое значение газа здесь. Когда уровень газа пересекает это значение, отправляется оповещение по электронной почте.
1 2 |
// Default Threshold Value String inputMessage3 = "40.0"; // Default gas_value |
Вот и все изменения, которые вам нужно сделать в коде перед загрузкой его на плату ESP32. Полный код программы выглядит следующим образом.
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 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 |
#include <WiFi.h> #include <AsyncTCP.h> #include <ESPAsyncWebServer.h> #include "ESP32_MailClient.h" const char* ssid = "***********"; //SSID of Wifi network const char* password = "***********"; // Password of wifi network #define emailSenderAccount "examplesender@gmail.com" // Sender email address #define emailSenderPassword "***********" // Sender email password #define smtpServer "smtp.gmail.com" #define smtpServerPort 465 #define emailSubject "ALERT! Gas Leak Detected" // Email subject String inputMessage = "examplereceiver@gmail.com"; //Reciepent email alert. String enableEmailChecked = "checked"; String inputMessage2 = "true"; // Default Threshold Value String inputMessage3 = "40.0"; // Default gas_value String lastgaslevel; // HTML web page to handle 3 input fields (email_input, enable_email_input, threshold_input) const char index_html[] PROGMEM = R"rawliteral( <!DOCTYPE HTML><html><head> <title>Email Notification with Gas Level</title> <meta name="viewport" content="width=device-width, initial-scale=1"> </head><body> <h2>Gas Level Detection</h2> <h3>%GASVALUE%</h3> <h2>ESP Email Alert</h2> <form action="/get"> Email Address <input type="email" name="email_input" value="%EMAIL_INPUT%" required><br> Enable Email Notification <input type="checkbox" name="enable_email_input" value="true" %ENABLE_EMAIL%><br> Gas Level Threshold <input type="number" step="0.1" name="threshold_input" value="%THRESHOLD%" required><br> <input type="submit" value="Submit"> </form> </body></html>)rawliteral"; void notFound(AsyncWebServerRequest *request) { request->send(404, "text/plain", "Not found"); } AsyncWebServer server(80); String processor(const String& var) { if(var == "GASVALUE") { return lastgaslevel; } else if(var == "EMAIL_INPUT") { return inputMessage; } else if(var == "ENABLE_EMAIL") { return enableEmailChecked; } else if(var == "THRESHOLD") { return inputMessage3; } return String(); } // Flag variable to keep track if email notification was sent or not bool emailSent = false; const char* PARAM_INPUT_1 = "email_input"; const char* PARAM_INPUT_2 = "enable_email_input"; const char* PARAM_INPUT_3 = "threshold_input"; // Interval between sensor readings. unsigned long previousMillis = 0; const long interval = 5000; SMTPData smtpData; void setup() { Serial.begin(115200); WiFi.mode(WIFI_STA); WiFi.begin(ssid, password); if (WiFi.waitForConnectResult() != WL_CONNECTED) { Serial.println("WiFi Failed!"); return; } Serial.println(); Serial.print("ESP IP Address: http://"); Serial.println(WiFi.localIP()); // Send web page to client server.on("/", HTTP_GET, [](AsyncWebServerRequest *request){ request->send_P(200, "text/html", index_html, processor); }); // Receive an HTTP GET request at <ESP_IP>/get?email_input=<inputMessage>&enable_email_input=<inputMessage2>&threshold_input=<inputMessage3> server.on("/get", HTTP_GET, [] (AsyncWebServerRequest *request) { // GET email_input value on <ESP_IP>/get?email_input=<inputMessage> if (request->hasParam(PARAM_INPUT_1)) { inputMessage = request->getParam(PARAM_INPUT_1)->value(); // GET enable_email_input value on <ESP_IP>/get?enable_email_input=<inputMessage2> if (request->hasParam(PARAM_INPUT_2)) { inputMessage2 = request->getParam(PARAM_INPUT_2)->value(); enableEmailChecked = "checked"; } else { inputMessage2 = "false"; enableEmailChecked = ""; } // GET threshold_input value on <ESP_IP>/get?threshold_input=<inputMessage3> if (request->hasParam(PARAM_INPUT_3)) { inputMessage3 = request->getParam(PARAM_INPUT_3)->value(); } } else { inputMessage = "No message sent"; } Serial.println(inputMessage); Serial.println(inputMessage2); Serial.println(inputMessage3); request->send(200, "text/html", "HTTP GET request sent to your ESP.<br><a href=\"/\">Return to Home Page</a>"); }); server.onNotFound(notFound); server.begin(); } void loop() { unsigned long currentMillis = millis(); if (currentMillis - previousMillis >= interval) { previousMillis = currentMillis; float gas_analog_value = analogRead(35); float gas_value = ((gas_analog_value/1023)*100); Serial.print(gas_analog_value); Serial.print(", "); Serial.println(gas_value); lastgaslevel = String(gas_value); // Check if gas_value is above threshold and if it needs to send the Email alert if(gas_value > inputMessage3.toFloat() && inputMessage2 == "true" && !emailSent){ String emailMessage = String("Gas Level above threshold. Current Gas Level: ") + String(gas_value)); if(sendEmailNotification(emailMessage)) { Serial.println(emailMessage); emailSent = true; } else { Serial.println("Email failed to send"); } } // Check if gas_value is below threshold and if it needs to send the Email alert else if((gas_value < inputMessage3.toFloat()) && inputMessage2 == "true" && emailSent) { String emailMessage = String("Gas Level below threshold. Current gas_value: ") + String(gas_value) + String(" C"); if(sendEmailNotification(emailMessage)) { Serial.println(emailMessage); emailSent = false; } else { Serial.println("Email failed to send"); } } } } bool sendEmailNotification(String emailMessage) { // Set the SMTP Server Email host, port, account and password smtpData.setLogin(smtpServer, smtpServerPort, emailSenderAccount, emailSenderPassword); smtpData.setSender("ESP32_Gas_Alert_Mail", emailSenderAccount); // Set Email priority or importance High, Normal, Low or 1 to 5 (1 is highest) smtpData.setPriority("High"); // Set the subject smtpData.setSubject(emailSubject); // Set the message with HTML format smtpData.setMessage(emailMessage, true); // Add recipients smtpData.addRecipient(inputMessage); smtpData.setSendCallback(sendCallback); if (!MailClient.sendMail(smtpData)) { Serial.println("Error sending Email, " + MailClient.smtpErrorReason()); return false; } smtpData.empty(); return true; } void sendCallback(SendStatus msg) { // Print the current status Serial.println(msg.info()); // Do something when complete if (msg.success()) { Serial.println("----------------"); } } |
Тестирование работы проекта
После загрузки кода на плату ESP32 вы можете открыть Serial Monitor (последовательный монитор), в котором отобразится IP-адрес платы ESP32. Также там отобразится весь процесс от начала до конца, включая запуск почтового сервера и отправку электронной почты, если порог превышен.
Он также отобразит уровень газа вместе с аналоговым значением.
Теперь скопируйте IP-адрес и вставьте его в любой веб-браузер, например Chrome, а затем нажмите «Enter». Веб-браузер отобразит значение газа вместе с установленным пороговым значением.
Вы можете включить или отключить форму оповещения по электронной почте здесь, просто отметив/сняв отметку с опции. Аналогично вы можете изменить адрес электронной почты, а также пороговое значение газа. Все, что вам нужно, это ввести значение и нажать кнопку «Отправить» .
Теперь откройте свой почтовый ящик Gmail, вы можете увидеть оповещение о сообщении электронной почты через ESP32, используя почтовый сервер SMTP.