сигнализация на ардуино

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить
TONNI23
Родился
Сообщения: 2
Зарегистрирован: Пн янв 22, 2018 12:48:16

сигнализация на ардуино

Сообщение TONNI23 »

разрабатываю охранную систему на базе ардуино , и столкнулся со следующими трудностями:

мне нужно чтобы от датчика вибрации одновременно сработало реле (3 раза) и DFPlayer mini воспроизвел один аудиофайл

я написал подобный скетч

#include <SoftwareSerial.h> // библиотека для для обмена данными
#include <DFPlayer_Mini_Mp3.h> // подключаем библиотеку для DFPlayer Mini
#define PIN_REL 4
#define PIN_SENSOR 7 // Пин, ккотормоу присоединен датчик вибрации

void setup() {
Serial.begin(9600);
mp3_set_serial(Serial); // включаем передачу данных с DFPlayer mini mp3
delay(1); // задержка в 1ms для установки громкости
mp3_set_volume(15); // устанавливаем громкость от 0 до 30
mp3_set_EQ(0); // устанавливаем эквалайзер от 0 до 5
pinMode(PIN_REL, OUTPUT);
}
void loop() {
{
digitalWrite(PIN_REL, HIGH);
int val = digitalRead(PIN_SENSOR); // Считваем значение с датчика
int var = 0;
if(val==1){
{mp3_play(1); // проигрываем файл mp3/0001.mp3
delay(0); // задержка
mp3_prev(); // проигрываем предыдущий файл
delay(0); // задержка
}
while(var<3){ var++;
{digitalWrite(PIN_REL, LOW); // реле включено
delay(1000);
digitalWrite(PIN_REL, HIGH); // реле выключено
delay(1000); } }
}}
}



проблема в том что при подаче питания включается только реле 3 раза, а аудиофайл не воспроизводится или воспроизводится редко не понятно от чего. Я догадываюсь что тут нужно решить вопрос с многозадачностью но как? прошу помочь и подсказать.
Реклама
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15575
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Re: сигнализация на ардуино

Сообщение BOB51 »

Функция delay() более 10 миллисекунд практически морозит исполнение программы (одновременно с ней могут работать только аппаратные модули МК и прерывания).
Попытайтесь заменить на millis() или micros().
Как вариант запуск проигрывания позднее тайм-аутов реле (или автономный аппаратный проигрыватель/звукосинтезатор).
:roll:
Реклама
TONNI23
Родился
Сообщения: 2
Зарегистрирован: Пн янв 22, 2018 12:48:16

Re: сигнализация на ардуино

Сообщение TONNI23 »

спасибо!!!! как я понял это относится к многозадачности.
переделал код.
вот что получилось
#include <SoftwareSerial.h> // библиотека для для обмена данными
#include <DFPlayer_Mini_Mp3.h> // подключаем библиотеку для DFPlayer Mini
#define PIN_REL 4
#define PIN_SENSOR 7 // Пин, ккотормоу присоединен датчик вибрации

void setup() {
Serial.begin(9600);
mp3_set_serial(Serial); // включаем передачу данных с DFPlayer mini mp3
mp3_set_volume(30); // устанавливаем громкость от 0 до 30
delay (100);
pinMode(PIN_REL, OUTPUT);
}
void loop() {
{
digitalWrite(PIN_REL, HIGH);
int val = digitalRead(PIN_SENSOR); // Считваем значение с датчика
int var = 0;
if(val==1){
while(var<3){ var++;
{ digitalWrite(PIN_REL, LOW); // реле включено
delay(1000);
digitalWrite(PIN_REL, HIGH); // реле выключено
delay(1000); }
}
mp3_play(1); // проигрываем файл mp3/0001.mp3
delay(0); // задержка 5 секунд
mp3_stop(); // проигрываем предыдущий файл
}
}
}




все работает только аудиосигнал срабатывает через раз не понятно почему
Ответить

Вернуться в «Разные вопросы по МК»