Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить

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

Пн янв 22, 2018 12:54:54

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

мне нужно чтобы от датчика вибрации одновременно сработало реле (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 раза, а аудиофайл не воспроизводится или воспроизводится редко не понятно от чего. Я догадываюсь что тут нужно решить вопрос с многозадачностью но как? прошу помочь и подсказать.

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

Пн янв 22, 2018 14:34:38

Функция delay() более 10 миллисекунд практически морозит исполнение программы (одновременно с ней могут работать только аппаратные модули МК и прерывания).
Попытайтесь заменить на millis() или micros().
Как вариант запуск проигрывания позднее тайм-аутов реле (или автономный аппаратный проигрыватель/звукосинтезатор).
:roll:

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

Пн янв 22, 2018 15:22:59

спасибо!!!! как я понял это относится к многозадачности.
переделал код.
вот что получилось
#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(); // проигрываем предыдущий файл
}
}
}




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