В этом проекте мы собираемся создать систему обнаружения дыма, в которой за основу будет взять датчик дыма MQ-2. Если сенсор уловит дым зуммер начнет подавать звуковой сигнал и загорится красный светодиод, и на веб-странице будет отображаться предупреждение, которое мы создадим с помощью модуля ESP8266.
Эта веб-страница будет доступна с использованием любого подключенного устройства, такого как мобильный телефон, планшет или ПК.
Что нам нужно и где купить
Как всегда начнем с деталей, которые мы будем использовать в данном проекте. Уже по традиции мы приводим ссылки на комплектующий в Интернет-магазинах АлиЭкспресс и GearBest. Наш проект живет и развивается благодаря покупателям этих магазинов.
Деталь | |
1 | Arduino Uno |
1 | ESP8266 Wi-Fi модуль с адаптером |
1 | MQ-2 сенсор |
1 | Красный и зеленый светодиод |
1 | Зуммер |
1 | 220 Ом резистор |
1 | Макет |
Провода-перемычки |
Как работает дымовая сигнализация?
Датчик дыма MQ-2 имеет выход в форме аналогового сигнала. Мы установили в нашем коде условие, при котором, если выходное значение датчика больше 400 зуммер начнет подавать звуковой сигнал и загорится красный светодиод; и если выходное значение датчика меньше 400, то зуммер будет молчать, а загорится зеленый светодиод.
Используемый здесь ESP8266 создаст веб-страницу по IP-адресу и отправит данные на этотадрес и выведет там данные. После загрузки кода этот IP-адрес можно увидеть на последовательном мониторе, как показано ниже.
Когда вы вводите этот IP-адрес в своем браузере, то увидите страницу как на рисунке ниже:
Принципиальная схема
Прежде всего, подключите модуль 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.
Код для проекта
Ниже приводим код для проекта целиком и дадим ряд пояснений.
#include <SoftwareSerial.h> #define DEBUG true SoftwareSerial wifi_module(2,3); // Подключите вывод TX esp к контакту 2 Arduino и RX esp к контакту 3 Arduino int red_led_pin = 9; int green_led_pin = 8; int buzzer_pin = 10; int smoke_sensor_pin = A0; void setup(){ Serial.begin(9600); wifi_module.begin(9600); // Установите скорость передачи в соответствии с вашим esp8266 pinMode(red_led_pin, OUTPUT); pinMode(green_led_pin, OUTPUT); pinMode(buzzer_pin, OUTPUT); pinMode(smoke_sensor_pin, INPUT); esp8266_command("AT+RST\r\n",2000,DEBUG); // сброс модуля esp8266_command("AT+CWMODE=2\r\n",1000,DEBUG); // настроить точку доступа esp8266_command("AT+CIFSR\r\n",1000,DEBUG); // получить ip адрес esp8266_command("AT+CIPMUX=1\r\n",1000,DEBUG); // настроить для нескольких подключений esp8266_command("AT+CIPSERVER=1,80\r\n",1000,DEBUG); // включить сервер на порту 80 } void loop(){ int analogSensor = analogRead(smoke_sensor_pin); if (analogSensor > 400){ digitalWrite(red_led_pin, HIGH); digitalWrite(green_led_pin, LOW); tone(buzzer_pin, 1000, 200); } else { digitalWrite(red_led_pin, LOW); digitalWrite(green_led_pin, HIGH); noTone(buzzer_pin); } if(wifi_module.available()){ if(wifi_module.find("+IPD,")){ delay(1000); int connectionId = wifi_module.read()-48; String webpage = "<h1>Система обнаружения дыма</h1>"; webpage +="<p>Величина дыма "; webpage += analogSensor; webpage +="</p>"; if (analogSensor > 400){ webpage +="<h5>ОПАСНОСТЬ! Покиньте помещение</h5>"; } else { webpage +="<h4>Всё в порядке</h4>"; } String cipSend = "AT+CIPSEND="; cipSend += connectionId; cipSend += ","; cipSend +=webpage.length(); cipSend +="\r\n"; esp8266_command(cipSend,1000,DEBUG); esp8266_command(webpage,1000,DEBUG); String closeCommand = "AT+CIPCLOSE="; closeCommand+=connectionId; // добавить идентификатор соединения closeCommand+="\r\n"; esp8266_command(closeCommand,3000,DEBUG); } } } String esp8266_command(String command, const int timeout, boolean debug){ String response = ""; wifi_module.print(command); long int time = millis(); while( (time+timeout) > millis()) { while(wifi_module.available()) { char c = wifi_module.read(); response+=c; } } if(debug) { Serial.print(response); } return response; }
Прежде всего, добавьте последовательную библиотеку программного обеспечения. Последовательная библиотека программного обеспечения позволит нам использовать связь TX и RX на других контактах Arduino, а не только с использованием выводов TX и RX по умолчанию. Потом мы определили эти TX и RX-контакты на Arduino.
#include <SoftwareSerial.h> #define DEBUG true SoftwareSerial wifi_module(2,3);
В строках ниже мы объявили контакты для светодиодов, зуммера и датчика дыма.
int red_led_pin = 9; int green_led_pin = 8; int buzzer_pin = 10; int smoke_sensor_pin = A0;
В функции настройки сначала устанавливаем скорость передачи для последовательной связи и для модуля wifi на 9600. Затем мы объявили выводы светодиодов и зуммера в качестве выходных контактов. Наконец, мы объявили контакт датчика дыма как входной, так как на этот контакт будет идти входной сигнал от датчика и затем будет передан в Ардуино.
Serial.begin(9600); wifi_module.begin(9600); pinMode(red_led_pin, OUTPUT); pinMode(green_led_pin, OUTPUT); pinMode(buzzer_pin, OUTPUT); pinMode(smoke_sensor_pin, INPUT);
Строки вызовут функцию и настроят сервер по IP-адресу, предоставленному ESP. Затем ESP отправит данные на этот IP-адрес.
esp8266_command("AT+RST\r\n",2000,DEBUG); esp8266_command("AT+CWMODE=2\r\n",1000,DEBUG); esp8266_command("AT+CIFSR\r\n",1000,DEBUG); esp8266_command("AT+CIPMUX=1\r\n",1000,DEBUG); esp8266_command("AT+CIPSERVER=1,80\r\n",1000,DEBUG);
В функции цикла мы считываем значения от датчика дыма, а затем применяем условие, что если выходное значение больше 400, тогда загорается красный светодиод и зуммер начнет подавать звуковой сигнал. Если выходное значение меньше 400, тогда загорится зеленый светодиод, и зуммер останется молчать.
int analogSensor = analogRead(smoke_sensor_pin); if (analogSensor > 400){ digitalWrite(red_led_pin, HIGH); digitalWrite(green_led_pin, LOW); tone(buzzer_pin, 1000, 200); }
Строки ниже будут печатать данные на веб-странице. Во-первых, мы напечатаем «Система обнаружения дыма» сверху. Затем на второй строке мы напечатаем значение дыма, а на третьей строке мы напечатаем «Все нормально» или «ОПАСНО" в зависимости от состояния.
String webpage = "<h1>Система обнаружения дыма</h1>"; webpage +="<p>Величина дыма "; webpage += analogSensor; webpage +="</p>"; if (analogSensor > 400){ webpage +="<h5>Опасность! Покиньте помещение</h5>"; } else { webpage +="<h4>Всё в порядке</h4>"; }
Приведенный ниже код отправит команды в ESP и выведет выходные данные ESP на последовательном мониторе.
String esp8266_command(String command, const int timeout, boolean debug){ String response = ""; wifi_module.print(command); long int time = millis(); while( (time+timeout) > millis()) { while(wifi_module.available()) { char c = wifi_module.read(); response+=c; } }
Вот и всё! Надеемся, что у вас всё заработало.
23 октября 2022 в 19:00
можно ли без вай фай модуля,, чтобы просто происходил писк?
25 ноября 2022 в 02:53
Можно, подключаешь зуммер к выходу ДО на сенсоре и настраиваешь резистором порог срабатывания. Профит! не нужны и контроллеры)