Ви не увійшли.
Сторінки 1
Вже готові вироби є. Там без Arduino, до компа по USB підключив, замість низу принтера дошка, шо рухається і погнав друкувати.
Мене колись з пантелику збили, просили зробити харчовий, я думав так і харчі прям з сопел мають видалюватися на півбатона :-)
Та який там HIEND в бюджетному авто, справа у тім що Si4703 і DFPlayer живиться від одного блоку живлення, під'єднано до одного попереднього підсилювача (NE5532) який свою чергу йде в кінцевий (PA2003A), в обох платах Si4703/DFPlayer не має свого підсилювача, по ідеї шуми/наводки мали б проявлятися по лінії радіо, але ніт.
MP3/FLAC це для всеядності магнітоли, закинув на флеш скопом і слухаєш по порядку, чи як скетч запрограмував. Пріоритет зробити mp3 не гірше звичайної FM-трансляції.
Ну прям напряму керувати кнопками плеєра з ардуїно. Самі плеєри ж можуть грати FLAC. На укран магнітоли виводиться тільки гучність і номер треку, обидва параметра змінюються двома енкодарими, принаймні у мну так.
Зробив собі автомагнітолу, все наче норм, але якість звуку з DFPlayer не дуже, радіо на Si4703 грає краще і шумів менше.
Чимось можна замінити DFPlayer, щоб покращити MP3 і додати FLAC? Розглядаю поки як варіант розібрати якийсь маленький MP3-плеєр типу Sony/Philips і нутро якось приладнати до пінів ардуїни, але то якось не правильно :-)
Вивід на монітор пристуній. Але проблема сильно плаваюча, на даний момент грає 120 трек по порядку, без проблем. Ймовірно таки є якийсь нюанс з визначенням стану піна BUSY, принаймі такі вігдуки зустрічаються стосовно роботи DFplayer.
Використовуючи код:
if(play_state == HIGH) // читання стану піна BUSY
{
number++;
Track:
if (number>count_mp3){number=0;}
EEPROM.update(11,number);
LCD.clear();
LCD.setCursor(7, 0);LCD.print("Track:");LCD.print(number);
LCD.setCursor(0, 0);LCD.print ("Vol:"); LCD.print (volume);
if (number<=array_size_nameTrack)
{
LCD.setCursor(0, 1);
LCD.print (nameTrack[number-1]);
}
if (number>array_size_nameTrack)
{
LCD.setCursor(3, 1);
LCD.print ("MP3 Player");
}
myDFPlayer.play(number);
delay(700);
}
if (millis() - tmignore > 500)
{
tmignore = millis();
// Наступна пісня
if (enc2.isRight())
{
number++;
if (number>count_mp3){number=1;}
goto Track;
}
// Попередня пісня
if (enc2.isLeft())
{
number--;
if (number<1){number=count_mp3;}
goto Track;
}
// Швидка перемотка на 10 треків у перед
if (enc2.isFastR())
{
number=number+10;
if (number>count_mp3){number=1;}
goto Track;
}
// Швидка перемотка на 10 треків назад
if (enc2.isFastL())
{
number=number-10;
if (number<1){number=count_mp3;}
goto Track;
}
}
Є проблема.
Програвач грає треки по порядку, інколи програвач зациклюється на одному треку, енкодером перемонтую на наступний і далі нормально грає по порядку, до наступного, рандомного, повтору проблеми.Може хто підкаже по вирішенні цієї проблемі?
Бібліотека DFRobotDFPlayerMini.h
Попробую ще з флагом змінної (правда поки не дуже з цим).
З'ясував, що датчик не особливо то регулює чуттєвість, або потрібно норм так приложитися, щоб спрацював, або трошки зачепи щоб була дія.
Ще думаю спробувати приєднати такий https://fastdrive.com.ua/62290-dvuhzonovyy_datchik_udara_analogovyy_convoy_fss-2.html, тут нормальне регулювання чутливості і є два виходи, зона попередження і тривоги. Правда не відомі параметри виходу.
Попробував:
val = digitalRead(2);
if (val != oldval)
{
oldval = val;
if (millis() - tmignore > 5000)
{
tmignore = millis();
Serial.println("SMS");
}
}
Пару разів (ударів) спрацьовує нормально, далі "пачка" в Serial SMS-ок.
Проблема схоже з тим, що датчик може зупинитися на любому рівні LOW/HIGH (якщо судити по індикації світлодіоду на датчику 801S).
P.S. Згодом...
Спочатку у даному коді дав, автоматом, визначення змінної tmignore як int, що було помилкою, замінивши на uint32_t поки все норм працює.
Дякую Honey за допомогу.
Дякую, через годинку-півтори попробую, напишу результат.
Датчик удару/вібрації https://arduino.ua/prod3603-modyl-datchika-ydara-801s використовуючи код
if (digitalRead(2)!= digitalRead(2))
{
Serial.println("Тест");
}
дає декілька записів в монітор. Яким чином визначити лише одну реакцію на удар.
Замість Serial.println("Тест"); пишу рядок відправки SMS, але так як значень дії датчика декілька, то відповідно SMS-ок, приходить декілька.
Як зробити, щоб на удар пішла лише одна SMS і при першому проходженні умови не приходила SMS, а лише тільки тоді коли відбулася дія по датчику?
P.S. на датчику встановлено максимальну чуттєвість.
GyverEncoder.h
Зараз код має вигляд:
void loop()
{
//enc2.tick();
enc2.setTickMode(AUTO);
if (enc2.isLeft()&&state=="Radio")
{
LCD.clear();LCD.setCursor(0, 0);LCD.print (k);
k++;
s="MP3";
}
if (enc2.isRight()&&state=="Radio")
{
LCD.clear();LCD.setCursor(0, 0);LCD.print (k);
k--;
s="MP3";
}
if (enc2.isLeft()&&state=="MP3")
{
LCD.clear();LCD.setCursor(0, 1);LCD.print (z);
z++;
s="Radio";
}
if (enc2.isRight()&&state=="MP3")
{
LCD.clear();LCD.setCursor(0, 1);LCD.print (z);
z--;
s="Radio";
}
if (enc2.isClick())
{
state=s;
if (state=="Radio"){LCD.clear();LCD.setCursor(0, 0);LCD.print (k);}
if (state=="MP3"){LCD.clear();LCD.setCursor(0, 1);LCD.print (z);}
}
}
Перемикання працює якщо enc2.setTickMode(AUTO), але в цьому варіанті коли крутиш енкодер, то наявні пропуски, тобто на якийсь градус повернув і не завжди змінює число на екрані.
Якщо ставити enc2.tick(), то чітко змінюються дані на екрані, без пропусків. Але при натисканні на енкодер наявне перемикання як має бути і все, більше реакції на енкодер не має...
Доповнення. Таки запрацювало як потрібно. Потрібно було винести умову &&state== з перевірки події на енкодері в окрему умову IF, а вже в ній робити enc2.isRight()/enc2.isLeft().
Хоча мабуть є кращий спосіб...
Чи можлива коректна робота такого варіанту?
if (enc2.isClick())
{
if (enc2.isLeft())
{
k++;
LCD.setCursor(0, 0);LCD.print (k);
}
}
Натискаючи на енкодер можна крутилкою змінювати значення.
Сторінки 1