Дымовая сигнализация с Ардуино, ESP8266 и датчиком дыма

В этом проекте мы собираемся создать систему обнаружения дыма, в которой за основу будет взять датчик дыма 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;
    }  
}

Вот и всё! Надеемся, что у вас всё заработало.

Ардуино+