сигнализация на ардуино нужна помощь

TONNI23
Offline
Зарегистрирован: 22.01.2018

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

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

Во-первых, вставьте код правильно - есть кнопочка такая на панели редактора. Во-вторых - вы просите плеер 

mp3_play(1); // проигрываем файл mp3/0001.mp3

И тут же, следом

 mp3_prev();  // проигрываем предыдущий файл

Т.е. вы не даёте ему шансов даже начать проигрывать запрошенный файл, собственно.

TONNI23
Offline
Зарегистрирован: 22.01.2018
#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
Offline
Зарегистрирован: 22.01.2018

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

b707
Offline
Зарегистрирован: 26.05.2017

TONNI23 - а с чего вы взяли, что оператор delay(0) дает задержку в 5 секунд?

И второе - если вы делает охранную систему, которая должна отрабатывать датчики и нажатие кнопок - в коде вообще не должно быть операторов delay, во всяком случае, не больше, чем на 0.05 - 0.1 сек суммарно на всю программу. А у вас в коде уже 7 секунд задержек - не удивительно, что что-то уже "срабатывает через раз".

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

TONNI23 пишет:

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

Ну потому что вы опять делаете дичь: вы сначала просите проиграть файл, и ТУТ ЖЕ останавливаете проигрывание.

Mouflon
Offline
Зарегистрирован: 17.01.2018

Извините, а одновременно сработало реле (3 раза) - это как?

TONNI23
Offline
Зарегистрирован: 22.01.2018

ну так и нужно один раз от играть трек и остановиться,это комментарий неправильный.  Спасибо буду стараться писатьбез delay.

TONNI23
Offline
Зарегистрирован: 22.01.2018
 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
  }

 

Mouflon
Offline
Зарегистрирован: 17.01.2018

Мне кажется что то подобное похоже на требуемое, но непонятно что делать с плейером.

//#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;
		}
	}
}

 

TONNI23
Offline
Зарегистрирован: 22.01.2018

ого благодарю))) буду разбираться)

fake
fake аватар
Offline
Зарегистрирован: 18.08.2017

А зачем вам это вообще? Чтоб не украли? Или процесс рабочий контролить?