#include #include // даём разумное имя для пина к которому подключен датчик #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(); } }