Простой пример воспроизведения случайных чисел с помощью 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

DFPlayer Mini - воспроизведение дробных чисел на Arduino