Вот пример скетча Код (C++): #include <SoftwareSerial.h> #include <DFPlayer_Mini_Mp3.h> const int relPin = 3; //реле в пин 2 цифровой const int photoPin = A0; //датчик в пин A0 аналоговый SoftwareSerial mySerial(10, 11); // RX, TX unsigned long timing; // void setup () { Serial.begin (9600); pinMode(relPin, OUTPUT); pinMode(photoPin, INPUT); mySerial.begin (9600); mp3_set_serial (mySerial); //set softwareSerial for DFPlayer-mini mp3 module mp3_set_volume (1); } // void loop () { if( analogRead(photoPin) > 650 ) digitalWrite(relPin, HIGH); if( analogRead(photoPin) > 650 ) mp3_play (); if (millis() - timing > 60000){ // Вместо 60000 подставьте нужное значение паузы timing = millis(); Serial.println ("Готово"); digitalWrite(relPin, LOW); mp3_stop (); }} /* mp3_play (); //start play mp3_play (5); //play "mp3/0005.mp3" mp3_next (); //play next mp3_prev (); //play previous mp3_set_volume (uint16_t volume); //0~30 mp3_set_EQ (); //0~5 mp3_pause (); mp3_stop (); void mp3_get_state (); //send get state command void mp3_get_volume (); void mp3_get_u_sum (); void mp3_get_tf_sum (); void mp3_get_flash_sum (); void mp3_get_tf_current (); void mp3_get_u_current (); void mp3_get_flash_current (); void mp3_single_loop (boolean state); //set single loop void mp3_DAC (boolean state); void mp3_random_play (); */ Суть проблемы , нужно что бы включение реле и музыки происходило если на датчике холла показания больше 650, включение происходит , но каждый раз на разный период времени. А нужно что бы поднес магнит датчик и музыка включилась на 60 секунд, далее выключилась и все заново.
вот так вроде должно работать Код (C++): void loop () { if( analogRead(photoPin) > 650 ){ //сработал датчик digitalWrite(relPin, HIGH); //включаем реле mp3_play (); //включаем музычку timing = millis(); //засекаем момент включения } if (millis() - timing > 60000){ // если с момента включения прошло 60 сек. Serial.println ("Готово"); digitalWrite(relPin, LOW); //выключаем всё mp3_stop (); } }
Код (C++): #include <SoftwareSerial.h> #include <DFPlayer_Mini_Mp3.h> const int relPin = 3; //реле в пин 2 цифровой const int photoPin = A0; //датчик в пин A0 аналоговый SoftwareSerial mySerial(10, 11); // RX, TX int count = 0; byte state = 0; void setup () { pinMode(relPin, OUTPUT); pinMode(photoPin, INPUT); Serial.begin (9600); mySerial.begin (9600); mp3_set_serial (mySerial); mp3_set_volume (1); } void loop () { if(state == 0 && analogRead(photoPin) > 650) { state = 1; } if(state == 1) { digitalWrite(relPin, HIGH); mp3_play (); static unsigned long timing = 0; if (millis() - timing > 1000) { count ++; timing = millis(); } if(count >= 60) { Serial.println ("Готово"); digitalWrite(relPin, LOW); mp3_stop (); count = 0; state = 0; } } }
этот вариант (у vvr) отличается тем, что в нем музычка не будет продляться если датчик срабатывает во время ее проигрывания - 60 секунд проиграет и только после этого ее можно перезапустить. я бы вообще сделал чтобы при повторном срабатывании датчика можно было отключать музычку (естественно надо будет ограничить "дребезг"). Но думаю ТС и сам это легко сделает, если как следует сначала продумает алгоритм, нарисует его на бумажке и только после этого воплотит его в си но в любом случае, лучше так или иначе запретить вызов функции mp3_play() когда проигрывание уже запущено, т.к. непонятно что она сделает будучи вызвана два раза подряд - перекинет на следующий трек, или по новой запустит текущий - это нехорошо.