Кашляющая пепельница

  • Платформы: Arduino Uno
  • Языки программирования: Arduino (C++)
  • Тэги: газоанализатор, сигарета, дым, урна, кашель

Что это?

Дымящаяся урна — достаточно частое явление на улицах любого города. В результате это может привести к пожару. Как говорится в русской пословице «Нет дыма без огня». Причиной такого возгорания часто является безответственное отношение людей, не погасивших свой окурок. Да и в конце концов, такая урна просто воняет.

Бороться с этим может интерактивная урна, которая кашляет каждому, кто кинул в неё непогашенную сигарету.

Что нам понадобится?

  1. NiMH-аккумулятор (подойдёт например от радиоуправляемой игрушки)
  2. Карта памяти microSD
  3. Аудио гнездо 3,5 мм
  4. Миниатюрный активный динамик
  5. Алюминиевая банка из под кваса

Как собрать?

  1. Установите MP3-плеер на breadboard mini. Запишите на microSD 7 композиций разновидности кашля с именами 001.mp3…007.mp3 и вставьте её MP3-модуль. Сделайте рельсы питания и земли на макетной плате, для этого соедините breadboard и Arduino Uno тремя проводами «папа-папа», где:
    • синий подключён к аналоговому входу A0;
    • красный к питанию;
    • чёрный к земле.
  2. Подключите пин VCC плеера к рельсе питания и пин GND к рельсе земли.
  3. Соедините пины RX и TX плеера через резисторы 1 кОм с пинами 11 и 10 Arduino.
  4. Соедините аудио разъём тремя проводами «папа-папа» с MP3-плеером таким образом:
    • «правый канал» — к пину DAC_R;
    • «левый канал» — к пину DAC_L;
    • «общий» — к пину GND.
  5. Подключите датчик газа MQ2 к макетной плате через 3-проводной шлейф и штырьковые соединители, так чтобы красный провод оказался на рельсе питания,чёрный на рельсе земли и выходной сигнал через макетную плату на аналоговом входе Arduino A0. В результате должна получиться схема, как на рисунке ниже.
  6. Так как датчик будет располагаться на некотором расстоянии от Arduino, удлините 3-проводной шлейф с помощью штырьковых соединителей и ещё одного 3-проводного шлейфа. Далее поместите Arduino и breadboard в специальный бокс для Arduino.
  7. Закройте верхнюю крышку бокса, выведя наружу аудио разъём и 3-проводной шлейф вместе с датчиком, и прошейте в Arduino Uno скетч, приведённый ниже.
  8. Теперь соедините NiMH-аккумулятор через штекер питания 2,1 мм и подключите через гнездо для внешнего питания в Arduino. Для защиты электроники от мусора и пепла, поместите бокс со всей электроникой и аккумулятор в алюминиевую банку, перемотайте всю конструкцию изолентой и подключите внешний динамик через аудио разъём. Осталось поместить всю конструкцию во внутрь пепельницы через открывающиеся дно, расположив элементы согласно рисунку приведённому ниже.

Алгоритм

  • Каждую секунду с газоанализатора мы считываем 10 значений и находим их среднее арифметическое (делим на 10).
    • Если этот цикл делался впервые, то записываем полученное значение в переменную previous_mq2.
  • Сравниваем текущее полученное среднее арифметическое с переменной previous_mq2 плюс погрешность 20.
    • Если их разность больше нуля, значит произошёл резкий скачок вредных газов и подаётся сигнал на mp3 плеер, включить трек.
  • Вывод результатов в Serial.
  • Запись текущего значения датчика в переменную previous_mq2.

Исходный код

coughbox.ino
#include <SoftwareSerial.h>
#include <DFPlayer_Mini_Mp3.h>
 
// даём разумное имя для пина к которому подключен датчик
#define MQ2_PIN A0
 
// длительность трека
#define INTERVAL_PLAY 10000
// интервал вывода информации в Serial
#define INTERVAL_SERIAL 1000
// погрешность на случайные наводки датчика
#define DELTA 20
 
// инициализируем новый последовательный порт (RX 10, TX 11)
SoftwareSerial mp3Serial(10, 11);
 
int flag = 0;
int mq2 = 0;
int previous_mq2 = 0;
 
// Массив 10 значений c датчика
int mass_mq2[10] = {0};
 
// переменная для хранения текущего время работы программы в мс
unsigned long currentMillis = 0;
 
// переменная для хранения времени работы программы
// с последнего резкого вверх скачка вредных газов
long previousMillisPlay = 0;
 
// переменная для хранения времени работы программы
// с последнего вывода данных в Serial
long previousMillisSerial = 0;
 
void setup()
{
  // начало связи через HardwareSerial
  Serial.begin(9600);
  // начало связи через SoftwareSerial
  mp3Serial.begin(9600);
 
  // для нормальной работы DFPlayer
  // требуется задержка от 5 до 15 секунд
  delay(5000);
 
  // выбор Serial для упрапвления DFPlayer
  mp3_set_serial(mp3Serial);
 
  // установка громкости и к ней задержка
  mp3_set_volume(30);
  delay(1000);
}
 
void loop()
{
  // обнуляем текущее значение датчика
  mq2 = 0;
 
  // Считывание 10 значений с датчика
  for (int i = 0; i < 10; i++) {
    mass_mq2[i] = analogRead(MQ2_PIN);
    delay(100);
    mq2 = mq2 + mass_mq2[i];
  }
  // считаем среднее арифметическое
  mq2 = mq2 / 10;
 
  // если программа выполняется впервые, то
  // запись текущего значения датчика
  if (flag == 0) {
    previous_mq2 = mq2;
  }
  flag = 1;
 
  // считываем текущее время работы программы
  currentMillis = millis() + INTERVAL_PLAY;
 
  // проверяем прошло ли 10 секунд с момента включения семпла
  if (currentMillis - previousMillisPlay > INTERVAL_PLAY) {
    // если текущее значение датчика
    // больше предыдущего включая погрешность
    // запись текущего времени для Play
    // и включаем случайный трек от 1 до 7
    if (mq2 > previous_mq2 + DELTA) {
       previousMillisPlay = currentMillis;
       mp3_play(random(1, 8));
       Serial.println("Play");
    } else {
      previousMillisPlay = 0;
    }
  }
 
  // Вывод результатов в Serial:
  sensorPrint();
 
  // запись текущего значения датчика
  previous_mq2 = mq2;
}
 
// Функция выводва значений в Serial
void sensorPrint()
{
  // значения будут выводиться каждую секунду
  if (currentMillis - previousMillisSerial > INTERVAL_SERIAL) {
    // запись текущего времени для Serial
    previousMillisSerial = currentMillis;
    Serial.print("Previous MQ2 = ");
    Serial.println(previous_mq2);
    Serial.print("Sensor MQ2 = ");
    Serial.println(mq2);
    Serial.println();
  }
}

Демонстрация работы устройства

Что дальше?

На базе электроники из этой урны, можно не только привлекать внимания прохожих на улице тушить сигареты, также можно вычислить соседа, который курит и дымит на лестничной клетке либо в лифту. А сигнал тревоги можно получать не только MP3-плеером, заменив Arduino Uno на Arduino Yun вы можете получать сигнал в новостной ленте в Facebook, Twitter, сообщением GMail и т.д.