Простой пример воспроизведения случайных чисел с помощью DFPlayer Mini.Идеи для возможного применения: озвучивание температуры, влажности, иных цифровых данных.
Просмотреть на результат работы можно на видео:
Для сборки проекта вам понадобятся следующие комплектующие:
- Аналог Arduino Nano: http://s.click.aliexpress.com/e/MFyzVvj
- Провода для макетных плат: http://s.click.aliexpress.com/e/uRJAAYJ
- Модуль MP3: http://s.click.aliexpress.com/e/rBeqvjY
- Дисплей: http://s.click.aliexpress.com/e/AyjmQvn
Скетч:
#include <SoftwareSerial.h>
#include <TM1637.h>
#include <DFPlayer_Mini_Mp3.h>
#include <Thread.h>
// #define NUMITEMS(arg) ((unsigned int) (sizeof (arg) / sizeof (arg [0]))) -- Хорошая функция, но не применима, т.к. динамическое выделение памяти для массива не рассматривается
#define CLK 6 // Для TM1637
#define DIO 7 // Для TM1637
#define BUSY_MP3 4 // Порт, показывающий, что MP3 занят
SoftwareSerial mp3Serial(3, 2); // RX, TX
int PlayList[20]; // Массив для воспроизведения MP3, статический
int indx = 0; // Индекс размерности массива
// Назначение переменной диспею
TM1637 tm1637(CLK,DIO);
// Создание псевдопотоков
Thread oneThread = Thread();
// Загрузка...
void setup(void) {
// Инициализация ком-портов
Serial.begin(9600);
mp3Serial.begin(9600);
// Инициализация библиотеки работы с сенсорами
pinMode(BUSY_MP3, INPUT);
// Назначение потокам задач и времени
oneThread.onRun(voice);
oneThread.setInterval(15000);
// Инициализация дисплея
tm1637.init();
tm1637.set(BRIGHT_TYPICAL);
// Настройка mp3
mp3_set_serial (mp3Serial); //set Serial for DFPlayer-mini mp3 module
mp3_set_volume (26);
delay(3000);
// Serial.println(digitalRead(BUSY_MP3)); 0 - BUSY, 1 - FALSE
mp3_play (101);
}
// Воспроизвести массив PlayList на mp3
void playPlaylist() {
for (int k = 0; k < indx; k) {
if (digitalRead(BUSY_MP3)) {
mp3_play (PlayList[k]);
delay(60); // Ожидание, среднее "на-глаз" иначе порт не успевает инициализироваться и массив не воспроизводится
k++;
}
}
indx = 0;
}
// Добавить в плейлист дробное число
void addFloatToPlaylist(float num) {
double part1, part2; // Целая и дробная части
boolean isFloat = false;
if (num < 0.0) { PlayList[indx++] = 105; } // Число отрицательное
part2 = modf(num, &part1); // Разобьем на части
Serial.print("Celoe: "); Serial.println(part1);
Serial.print("Drob: "); Serial.println(part2);
if ((int)(part2*10) != 0) { isFloat = true; } // Только десятые доли
addNumberToPlaylist((int)abs(part1),isFloat);
// Если число дробное
if (isFloat) {
if (part1 == 1) {
PlayList[indx++] = 107; // целая
} else {
PlayList[indx++] = 106; // целых
}
addNumberToPlaylist((int)abs(part2*10),isFloat);
if ((int)abs(part2*10) == 1) {
PlayList[indx++] = 108; // десятая
} else {
PlayList[indx++] = 109; // десятых
}
}
}
// Добавить в плейлист целое число
void addNumberToPlaylist(int num, bool ending) {
bool last = false;
int senior;
Serial.print("addNumber Num: "); Serial.println(num);
Serial.print("ending: "); Serial.println(ending);
if (String(num).length() == 1) { last = true; }
while(String(num).length() != 1 or last) {
if (num > 2 && num < 20) {
PlayList[indx++] = num;
break;
} else if (num == 1 or num == 2) {
if (num == 1 and ending) {
PlayList[indx++] = 21; // одна
} else if (num == 2 and ending) {
PlayList[indx++] = 22; // две
} else {
PlayList[indx++] = num;
}
} else if (num >= 20) {
senior = num/10;
senior = senior*pow(10,String(num).length()-1);
PlayList[indx++] = senior;
}
num = num%10;
if (String(num).length() == 1 and last == false) { last = true; } else { last = false; }
}
}
void voice() {
float SoundTemperature = random(-10000, 10000)/100.00;
tm1637.display(SoundTemperature);
Serial.print("Voice Number: "); Serial.println(SoundTemperature);
// PlayList[indx++] = 102;
addFloatToPlaylist(SoundTemperature);
// PlayList[indx++] = 103;
// Воспроизведение
playPlaylist();
}
void loop(void)
{
if (oneThread.shouldRun()) oneThread.run();
}
Скачать скетч и материалы для загрузки на флешку можно скачать по ссылке, пароль для скачивания PJycRAABgh