Arduino и MP3 плеер. Нужна помощь

carlosson
Offline
Зарегистрирован: 18.03.2018

Доброго всем дня!

Прошу помощи!

Есть такая задача, есть МП3 плеер и ардуино

В общем надо сделать так, что бы при включении ардуины она давала команду плееру включится (включается он кнопкой PLAY), о том, что он включился можно понять по напряжению на подсветке дисплея,

включается он нажатием на кнопку PLAY 1-2 сек., затем нужно подождать 5-6 секунд и подать еще одну короткую команду на кнопку PLAY (0,1 сек), что б перевести его в режим

плеера. затем при замыкании кнопки S2 (коротком, длинном, должно все равно каким) на кнопку PLAY подаётся короткий сигнал 0,1 сек от чего плеер начинает воспроизводить музыку

и пока он ее воспроизводит (определенное время, скажем пусть будет 15 сек) состояние кнопки S2 никак не должно влиять на работу плеера в течении этого времени, по

истечению 15 секунд она должна вернуться к ожиданию нажатия на кнопку.

 

Пожалуйста, помогите со стетчем, наставьте на пусть истинный))

Всем огромное человеческое спасибо!

sadman41
Offline
Зарегистрирован: 19.10.2016

Не наблюдаю скетча, с которым нужно помочь.

carlosson
Offline
Зарегистрирован: 18.03.2018

Вот с ним и надо помочь, его как бы вообще нету у меня))

Прям совсем не умею, но я обязательно научусь!

 

Спасибо!

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

carlosson пишет:
наставьте на пусть истинный))
Направляю вот сюда.

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

carlosson пишет:

Вот с ним и надо помочь, его как бы вообще нету у меня))

Это называется написать скетч за тебя, а не помочь. Помогают только с уже имеющимся скетчем, чтобы исправить в нём ошибки. Поэтому либо учись, либо в платный раздел (ссылку на который дал ЕвгенийП).

 

carlosson
Offline
Зарегистрирован: 18.03.2018

За совет конечно спасибо! Вот что у меня получилось,

Та часть, что void setup, в принцепе работает как надо и меня устраивает, то что в loop не совсем получается, не как не могу понять логику работы.

Суть такая, что после срабатывания датчика на sensor_pin (будет HIGH на время от 1 до 20 сек), тем временем на выходе play_pin должен появится сигнал HIGH на 100 мс, а после он не должен ни как реагировать на sensor_pin в течении 15 сек., через 15 секунд он должен опять ждать HIGH, что бы снова подать сигнал HIGH на play_pin 100 мс.

Или вот есть какой вариант, у сенсора группа контактов на переключение, может ее как то задействовать?

Есть мысли какие?

Спасибо!


int play_pin = 2; // выбрать контакт для  команды "play" для плеера(100мс)
int sensor_pin = 3; // контакт для датчика
int detect_player_pin = 4; // пока не используется
int block = 5; // пин для блокировки срабатывания датчика на время воспроизведения
int val = 0; 

void setup() {
  pinMode (block, OUTPUT);
  pinMode(play_pin, OUTPUT); // установить play_pin как выход
  pinMode(sensor_pin, INPUT); // установить sensor_pin как вход
  digitalWrite (play_pin, HIGH);  // команда включить плеер
  delay(2000); // пауза на  загрузку плера 2
  digitalWrite (play_pin, LOW); // отпустить кнопку
  delay(1000); // пауза на переход в режим  play
  digitalWrite (play_pin, HIGH); //в режим воспр
  delay(200); //пауза 0,2
  digitalWrite (play_pin, LOW);
  
}

void loop(){
val = digitalRead(sensor_pin); 
if (val == HIGH) { 

digitalWrite(play_pin, HIGH);
delay (100);
digitalWrite(play_pin, LOW); 
digitalWrite(block, HIGH); delay (15000);
} else {
digitalWrite(play_pin, LOW); delay (1000);
}
}

 

carlosson
Offline
Зарегистрирован: 18.03.2018

Та часть, что void setup, в принцепе работает как надо и меня устраивает, то что в loop не совсем получается, не как не могу понять логику работы. Суть такая, что после срабатывания датчика на sensor_pin (будет HIGH на время от 1 до 20 сек), тем временем на выходе play_pin должен появится сигнал HIGH на 100 мс, а после он не должен ни как реагировать на sensor_pin в течении 15 сек., через 15 секунд он должен опять ждать HIGH, что бы снова подать сигнал HIGH на play_pin 100 мс. Или вот есть какой вариант, у сенсора группа контактов на переключение, может ее как то задействовать? Есть мысли какие? Спасибо!


int play_pin = 2; // выбрать контакт для  команды "play" для плеера(100мс)
int sensor_pin = 3; // контакт для датчика
int detect_player_pin = 4; 
int block = 5; 
int val = 0; 

void setup() {
  pinMode (block, OUTPUT);
  pinMode (13, OUTPUT);
  pinMode (switch_pin, INPUT); // key
  pinMode(play_pin, OUTPUT); // установить play_pin как выход
  pinMode(sensor_pin, INPUT); // установить sensor_pin как вход
  digitalWrite (play_pin, HIGH);  // команда включить плеер
  delay(2000); // пауза на  загрузку плера 2
  digitalWrite (play_pin, LOW); // отпустить кнопку
  delay(1000); // пауза на переход в режим  play
  digitalWrite (play_pin, HIGH); //в режим воспр
  delay(200); //пауза 0,2
  digitalWrite (play_pin, LOW);
  
}

void loop(){
val = digitalRead(sensor_pin); 
if (val == HIGH) { 

digitalWrite(play_pin, HIGH); delay (100);
digitalWrite(play_pin, LOW); 
digitalWrite(block, HIGH); delay (15000);
} else {
digitalWrite(play_pin, LOW); delay (1000);
}
}

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

carlosson пишет:
не как не могу понять логику работы

А зачем тогда пишете программу? Если Вы не понимаете логику работы системы, программу писать рано.

Сядьте с листом бумаги и распишите логику от начала и до конца. И только когда Вы будете её чётко понимать, только тогда можно приступать к разработке программы.

carlosson
Offline
Зарегистрирован: 18.03.2018

Логика работы того, что я хочу сделать, мне ясна и понятна, а вот как это сделать программно, мне не ясно.

Поэтому я тут и  прошу помощи.

А советы типа " в платный раздел"  "сядь с листком" "иди учи"  мне к сожалению не помогут.

Я специалист не много в другой сфере и учавствую в форумах и конферециях и не когда не кого не куда не отправлял, если у кого то были вопросы и просьбы о помощи в моей сфере.

А вот тут попросили меня сделать сеё устройтво, ну просить больше не кого, я взялся помочь, прошу заметить, не на платной основе, а совершенно безвозмездно, те даром))!

Евгений, спасибо за совет и помощь.

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

carlosson пишет:

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

Это Вам так кажется.

Давайте разбираться что Вы тут написали:

carlosson пишет:
после срабатывания датчика на sensor_pin (будет HIGH на время от 1 до 20 сек), тем временем на выходе play_pin должен появится сигнал HIGH на 100 мс, а после он не должен ни как реагировать на sensor_pin в течении 15 сек., через 15 секунд он должен опять ждать HIGH, что бы снова подать сигнал HIGH на play_pin 100 мс

Итак,

1.
факт срабатывания датчика мы фикируем по появлению HIGH на sensor_pin на период времени  от 1 до 20 сек. Сразу вопрос - факт того, того, что датчик сработал мы фиксируем в момент появления HIGH? Через 1 сек после появления HIGH (если он ещё не исчез), через 20 секунд? Или может быть "после исчезновения HIGH, при условии что он там был от 1 до 20 секунд"? В какой конкретно момент времени мы принимаем решение, что датчик сработал?

2.
"тем временем на выходе play_pin должен появится сигнал HIGH на 100 мс"
Каким "тем" временем? В момент появления HIGH на sensor_pin? В моент его исчезновения? В общем, смотрите перечисление в п. 1 выше, и разберитесь таки каким именно "тем временем".

3.
"после он не должен ни как реагировать на sensor_pin в течении 15 сек., через 15 секунд он должен опять ждать HIGH"
А если HIGH c sensor_pin всё ещё не исчез? Ведь 15 сек меньше 20, которые от там может торчать. Тогда что?

Вот и думайте насколько Вы хорошо понимаете задачу.

А без ответов на все приведённые вопросы программировать невозможно - компьютер не понимает выражений типа "тем временем", нужно всё определить точно. И пока Вы этого не сделаете, даже не приступайте к программированию.

carlosson пишет:

А советы типа " в платный раздел"  "сядь с листком" "иди учи"  мне к сожалению не помогут.

А что Вам может помочь? Если самостоятельно "сесть с листком" Вы не желаете, заплатить тому, кто сядет за Вас, тоже не хотите. Что же Вам может помочь? Какой именно помощи Вы ожидаете?

carlosson
Offline
Зарегистрирован: 18.03.2018

факт срабатывания датчика мы фикируем по появлению HIGH на sensor_pin на период времени  от 1 до 20 сек. - Именно так, для полноты картины, этот датчик- Геркон на двери, когда дверь откывается на sensor_pin приходит значение HIGH которое в свю очередь формирует 1 сигнал HIGH длительностью 100 мс   на play_pin (это то, что я назвал "тем временем), это нужно для того, что бы плеер начал воспроизводить файл, вот и пока он воспроизводится состояние входа sensor_pin должно игнорироваться или блокироваться чем либо.

Вот, по сути, тот код, что я показал,  так работает, но хотельсь бы сделать кое что еще т.к. при постоянно открытой двери получается, что play_pin через каждые 15 сек HIGH и это ведет к повтору воспроизведения файла, желательно сделать так, что бы повторное воспроизвдение было только после прохода sensor_pin через LOW (дверь закрыли-открыли) , но при этом если файл воспроизводится, то открытие-закртытие ни как не влияло.

 

Спасибо 

sadman41
Offline
Зарегистрирован: 19.10.2016

Сделайте переменную playEnable, которая будет превращаться в true. когда play_pin == LOW. И играйте музыку только тогда, когда playEnable == true (т.е. когда-то до этого момента случилось закрытие двери) и play_pin == HIGH (дверь в этот момент открыта) . Как отыграли - playEnable переводите в false.

Так понятно?

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

carlosson пишет:

Логика работы того, что я хочу сделать, мне ясна и понятна, а вот как это сделать программно, мне не ясно.

Так не бывает.

Если Вам ясна и понятна логика, то написать программу очень просто:

1. Подробно описываете по-русски логику работы (это творческий процесс).

2. Переводите написанное с одного языка (русского) на другой (С++) - это процесс чисто механический.

carlosson
Offline
Зарегистрирован: 18.03.2018

Суть понятно, не сложно ли будет Вам отобразить в виде части кода?

Спасибо!

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

carlosson пишет:

Суть понятно, не сложно ли будет Вам отобразить в виде части кода?

Сложно.

Коллега Вам написал тоже самое, что и я раньше - Вы не проработали логику работы системы. Ваше "факт срабатывания датчика мы фиксируем по появлению HIGH на sensor_pin на период времени от 1 до 20 сек" это не описание логики, а эмоции и разведение руками. Вы же так и не ответили на мои вопросы из поста #9.

А до тех пор, пока логика работы не вполне ясна, писать код не просто сложно, а настолько сложно, что бесполезно, ибо вероятность успеха исчезающе мала.

Ощущение, что Вы просто не понимаете, что Вам говорят. Давайте я попробую объяснить ещё раз по-другому (на примере). Если останутся непоянтки, то ... либо просите другого объяснять, либо смиритесь, что эта деятельность не для Вас - у людей разные стили мышления, для этой работы нужно быть изрядным занудой, а если Вы по стилю мышления – художник, то это не для Вас.

carlosson пишет:

факт срабатывания датчика мы фикируем по появлению HIGH на sensor_pin на период времени  от 1 до 20 сек. - Именно так

Итак, ещё раз. В ответ на мои вопросы о конкретике, Вы, по сути, повторили своё прежний тезис:

Отлично поехали определять.

1. Начали. На пине LOW - ждём.

..... появился HIGH. С этого момента начинаем отсчёт времени ....

2. Время 0с. На пине появилось HIGH. Пока мы не можем считать это срабатыванием, т.к. не знаем на сколько веремени появился этот HIGH.

.... прошла 1 секунда, на пине по-прежнему HIGH ....

3. Время 1с. Пока мы не можем считать это срабатыванием. Первая часть условия (от 1 сек) выполнилась, но вторая (до 20 сек) пока нет. Может HIGH там все 40 сек продержится и Ваше условие таким образом нарушится, откуда нам знать.

Далее возможны два варианта.

Вариант 1

.... прошло 15 секунд, на пине появился LOW ....

4. Время 16с. Вот теперь мы можем сказать, что сигнал сработал, т.к. длительность HIGH была 16 сек, что укладывается в условие "от 1 до 20 сек"

или Вариант 2

.... прошло 19 секунд, на пине по-прежнему HIGH ....

4. Время 20с. Всё, игнорируем этот HIGH, т.к. он не удовлетворяет условию "от 1 до 20 сек". Ждём ближайшего LOW, а потом начинаем всё сначала.

Вот как-то так. Теперь думайте, Вы действительно хотите, чтобы факт сигнала фиксировался только тогда, когда дверь уже закроют? Боюсь, что нет. А по-другому, при Вашем описании, никак!

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

Пока не распишете логику, ни о каком коде даже не думайте - рано!