сигнализация на ардуино нужна помощь
- Войдите на сайт для отправки комментариев
Пнд, 22/01/2018 - 03:19
разрабатываю охранную систему на базе ардуино , и столкнулся со следующими трудностями:
мне нужно чтобы от датчика вибрации одновременно сработало реле (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 раза, а аудиофайл не воспроизводится или воспроизводится редко не понятно от чего. Я догадываюсь что тут нужно решить вопрос с многозадачностью но как? прошу помочь и подсказать.
Во-первых, вставьте код правильно - есть кнопочка такая на панели редактора. Во-вторых - вы просите плеер
И тут же, следом
Т.е. вы не даёте ему шансов даже начать проигрывать запрошенный файл, собственно.
#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(); // проигрываем предыдущий файл } } }спасибо переделал код, но непонятно почему через раз срабатывает аудиосигнал
TONNI23 - а с чего вы взяли, что оператор delay(0) дает задержку в 5 секунд?
И второе - если вы делает охранную систему, которая должна отрабатывать датчики и нажатие кнопок - в коде вообще не должно быть операторов delay, во всяком случае, не больше, чем на 0.05 - 0.1 сек суммарно на всю программу. А у вас в коде уже 7 секунд задержек - не удивительно, что что-то уже "срабатывает через раз".
спасибо переделал код, но непонятно почему через раз срабатывает аудиосигнал
Ну потому что вы опять делаете дичь: вы сначала просите проиграть файл, и ТУТ ЖЕ останавливаете проигрывание.
Извините, а одновременно сработало реле (3 раза) - это как?
ну так и нужно один раз от играть трек и остановиться,это комментарий неправильный. Спасибо буду стараться писатьбез delay.
int var = 0; 18 if(val==1){ 19 while(var<3){ var++; 20 { digitalWrite(PIN_REL, LOW); // реле включено 21 delay(1000); 22 digitalWrite(PIN_REL, HIGH); // реле выключено 23 delay(1000); } 24 }Мне кажется что то подобное похоже на требуемое, но непонятно что делать с плейером.
//#include <SoftwareSerial.h> // библиотека для для обмена данными //#include <DFPlayer_Mini_Mp3.h> // подключаем библиотеку для DFPlayer Mini #define PIN_REL 4 #define PIN_SENSOR 7 // Пин, ккотормоу присоединен датчик вибрации #define C_MODE_SLEEP 0 #define C_MODE_ALARM 1 uint8_t current_mode = C_MODE_SLEEP; uint8_t buzzer_count = 0; uint8_t buzzer_mode = 0; uint32_t currentMillis = 0; uint32_t startMillis = 0; void setup() { Serial.begin(9600); // mp3_set_serial(Serial); // включаем передачу данных с DFPlayer mini mp3 // mp3_set_volume(30); // устанавливаем громкость от 0 до 30 pinMode(PIN_REL, OUTPUT); } void SetBuzzer( uint8_t value ) { buzzer_mode = value; startMillis = currentMillis; digitalWrite(PIN_REL, value); } void loop() { // Так ли надо PIN_REL подтягивать к питанию в цикле? // Может быть достаточно будет это сделать в setup? digitalWrite(PIN_REL, HIGH); if( current_mode == C_MODE_SLEEP){ current_mode = (digitalRead(PIN_SENSOR) == LOW ? C_MODE_SLEEP : C_MODE_ALARM); // Считваем значение с датчика if(current_mode == C_MODE_ALARM) { buzzer_count = 3; // Количество повторов сирены startMillis = millis(); SetBuzzer( HIGH ); } } else { currentMillis = millis(); if( currentMillis - startMillis > 10000 ) { if(buzzer_mode == HIGH) { if( buzzer_count-- > 0) { SetBuzzer( LOW ); } } else { SetBuzzer( HIGH ); } } if((buzzer_count == 0) && (buzzer_mode == LOW)) { current_mode = C_MODE_SLEEP; } } }ого благодарю))) буду разбираться)
А зачем вам это вообще? Чтоб не украли? Или процесс рабочий контролить?