Выполнение действия 1 раз внутри лупа (нужна помощь)
- Войдите на сайт для отправки комментариев
Добрый день!
очень нужна помощь по одной задаче. Есть проект, состоящий из: фоторезистор, пищалка и модуль воспроизведения mp3 файлов + динамик.
1. if фоторезистор больше 1, то через небольшую паузу пищим пищалкой. тут все предельно понятно и получается.
2. if фоторезистор меньше 1, то запускаем необходимый файл на модуле. Это реализуется с помощью собственно библиотеки модуля, все просто, команда play(#файла). Это команда запускает файл и он играет, пока не закончится.
проблема в том, что файл должным образом не воспроизводится, потому что, как я понимаю, он постоянно тригируется каждые миллисекунды опроса фоторезистора. т.е. находится в постоянном лупе. что для пищалки это гуд, то тут совсем не применимо. мне нужно чтобы при значениях меньше 1 файл запустился только один раз, сколько бы времени фоторезистор не был бы значениях меньше 1. при больше 1 приходит команда стоп воспроизведение и начало пищаний. когда снова фоторезистор меньше 1, файл вновь должен запустится с самого начала...
#include "GyverTimer.h" #include "DFRobotDFPlayerMini.h" #include "Arduino.h" #include "SoftwareSerial.h" SoftwareSerial mySoftwareSerial(10, 11); // RX, TX DFRobotDFPlayerMini myDFPlayer; void printDetail(uint8_t type, int value); int photocellPin = 0; int photocellReading; GTimer Timer1(MS, 1000); GTimer Timer3(MS); const int buzzer = 6; const int c = 1047; const int e = 1397; void beep(int ton, int time) { tone(buzzer, ton, time); delay(time + 20); } void setup() { mySoftwareSerial.begin(9600); Serial.begin(9600); Serial.println(); Serial.println(F("DFRobot DFPlayer Mini Demo")); Serial.println(F("Initializing DFPlayer ... (May take 3~5 seconds)")); if (!myDFPlayer.begin(mySoftwareSerial)) { //Use softwareSerial to communicate with mp3. Serial.println(F("Unable to begin:")); Serial.println(F("1.Please recheck the connection!")); Serial.println(F("2.Please insert the SD card!")); while (true); } Serial.println(F("DFPlayer Mini online.")); myDFPlayer.volume(10); } void loop() { photocellReading = analogRead(photocellPin); if (Timer1.isReady()) Serial.println(photocellReading); if (photocellReading < 1) { myDFPlayer.stop(); } if (photocellReading > 1) { myDFPlayer.play(3); } if (photocellReading < 1) { Timer3.setTimeout(3000); } if (Timer3.isReady()) { do { beep(c, 20); beep(e, 20); beep(c, 20); beep(e, 20); beep(c, 20); beep(e, 20); beep(c, 20); beep(e, 20); beep(c, 20); beep(e, 20); beep(c, 20); beep(e, 20); beep(c, 20); beep(e, 20); beep(c, 20); beep(e, 20); beep(c, 20); beep(e, 20); noTone(buzzer); delay(1200); beep(c, 20); beep(e, 20); beep(c, 20); beep(e, 20); beep(c, 20); beep(e, 20); beep(c, 20); beep(e, 20); beep(c, 20); beep(e, 20); beep(c, 20); beep(e, 20); beep(c, 20); beep(e, 20); beep(c, 20); beep(e, 20); beep(c, 20); beep(e, 20); noTone(buzzer); delay(5000); } while (analogRead(photocellPin) < 1); } }
Буду очень благодарен за помощь с решением этой задачи!
Добрый день!
очень нужна помощь по одной задаче. Есть проект,
А что автор проекта по этому поводу говорит?
он, т.е. я, не знает как решить эту задачу :)
и сразу могу сказать, что в примерах из библиотеки к модулю это решается с помощью
play
delay(сколько длится файл)
но этот метод мне не подходит, потому что из-за него стопорится считывание значений фоторезистора и соотвественно реакция не прерывание .
danikanik - подсказка, запускайте файл не просто когда "фоторезистор < 1", а когда на этом шаге фоторезистор < 1, а на прошлом шаге он был > 1
хотя посмотрел код - вряд ли это вам поможет, у вас такая каша в скетче.
Зачем вы пользуетесь одновременно таймерами, делеями и циклом while? - чтобы всех запутать. в первую очередь себя?
я пока только учусь, собственно этот проект - один из моих первых попыток самостоятельно что-то собрать. Поэтому да, извиняюсь за такую кашицу) буду благодарен за предложения по реализации нужной задачи.
буду благодарен за предложения по реализации нужной задачи.
я выше дал подсказку в сообщении #4
Только цикл do..while в строке 69 необходимо выкинуть, он абсолютно несовместим с таймерами и нормальным опросом фоторезистора
спасибо! доберусь до дома попробую.
а на что do...while менять? на просто while (photocellreading > 1) ?
Ставьте флаг при сработке фоторезистора и воспроизводите, далее, пока он в состоянии сработки и флаг стоит дальнейшие действия игнорируете. Когда фоторезистор "отпускает" - опускаете флаг. В принципе все.
я пока только учусь, собственно этот проект - один из моих первых попыток самостоятельно что-то собрать. Поэтому да, извиняюсь за такую кашицу) буду благодарен за предложения по реализации нужной задачи.
Во-вторых, переписать всё в стиле блинк без делей, что ли.
потом разбираться с плеером.