ESP, IoT [BigClock] Большие часы на WS2812, ESP8266, Народный мониторинг

Какой вариант датчика используется у вас? Интересно, использует ли кто BME280, как у меня?)

  • BMP280

    Голосов: 23 29.1%
  • BME280

    Голосов: 56 70.9%

  • Всего проголосовало
    79
[BigClock] Большие часы на WS2812, ESP8266, Народный мониторинг
Создаю отдельную тему по разработке прошивки на базе NodeMCU.

Мой проект сделан на ДВП, на нее наклеил ленту, объем цифрам сделал из сэндвич панели, поверх белый лист бумаги.
Корпус из дерева, покрашен акриловой краской, смесь белой и коричневой.

Данная прошивка проверяет время по NTP, часы RTC теоретически не нужны.
Барометр на базе BME280.
Имеется датчик освещенности и датчик DS18B20
Clock_схема.pngсхема пайки.jpgClock_схема3.jpg
Плата: NodeMCU 1.0 (ESP 12-E Module)
Если в качестве микроконтроллера вы используете Wemos D1 - в менеджере плат для компиляции все равно выбирайте "NodeMCU v1.0 (ESP-12E)", в противном случае, если выберете плату Wemos D1 (xxxx), - будет работать нестабильно.
Выбирайте ядро ESP версии 2.7.4.

ESP8266 (SDK v2.7+)

Необходимые библиотеки находим в репозитории программы IDE.
Настраиваем прошивку под себя, если нужно, меняем пароли для точки и OTA, WiFi можно не задавать.

Если не задавали настройки WiFi, то стартует точка, адрес стандартный 192.168.4.1 пароль по умолчанию administrator, задавать не менее 8 символов, иначе название точки не отобразится, а будет ее внутреннее имя, типа ESP12345.
Адрес портала http://clock.local/ или по IP адресу, выданному роутером.
Данные для OTA: имя: admin пароль: pass

Для подключения к сервису "Народный мониторинг" MAC адрес отображается на соответствующей странице, вводите этот адрес при регистрации устройства.

Новая версия на гитхаб, последние изменения и публикация свежих версий будет там)

Версия от 16.04.2023 CLOCK_ESP_2.0:
  • оптимизация под новый портал
  • переделано давление с инт на флоат для мониторинга
  • переделан интерфейс на UI
  • добавлена ручная синхронизация времени
  • заменена библиотека rtc на microDS3231
  • багфиксы)
  • добавлена в код точка, для десятичного знака уличной температуры
  • добавлена строка с версией прошивки
  • исправление даты
  • добавление DFPlayer, спасибо: @Maxx1200 и @Romshteks
  • добавлен режим с датой (номер 5)
  • обновлена библиотека EEManager (сбросятся настройки!!!)
  • добавлен режим с показом первого нуля в часах
  • добавлена возможность устанавливать цветовое оформление в настройках прошивки, визуальные правки
  • fix GMT
  • заменены библиотеки датчиков
  • визуальные правки
  • может что-то еще))
Проект на гитхаб со всеми библиотеками и mp3
  • Дофига изменений))
  • Появилась web страничка с настройками на базе GyverPortal.
  • Изменены библиотеки.
  • Переписан код, распределил по вкладкам.
исправлено:
  • баг со сменой цвета на последней цифре
добавлен
  • символ давления, включать в настройках
исправлено:
  • переделан вывод сегментов
  • переделана функция показа точек
добавлено:
  • выбор режима мигания секунд 1 и 2 раза в сек
  • можно вручную задать порядок отображения датчиков и время показа каждого датчика
  • откл. WiFi без мониторинга
  • корректировка показания датчиков
внедрение датчика BME280, добавлен режим влажности с возможностью включить символ проценты
[*]багфиксы
багфиксы
незначительные изменения кода (настройки под себя и комментарии)
  • все настройки вынесены в Constants, вроде:)
  • добавлен web сервер, для обновления через браузер, изначально прошить через кабель, потом можете вносить изменения под себя и обновляться через бинарный файл
  • добавлены библиотеки
  • изменение в коде, из-за выноса настроек:)
  • добавлен НГ режим :)
  • возможно исправлена анимация, про которую писали, с точками и цифрами :)
  • теперь при запуске часов идет проверка с датчика времени, и если все ОК, то запускаются часы без синхронизации
  • исправлена функция освещенности заменой switch на if/else
  • подправлен код с switch в других местах
Увидел в коде небольшую ошибку с НГ режимом, не важно, включен он или нет, все равно будет) только разными методами)
leds[cursor] = (digit & mask) ? CHSV(random(0, 255), random(0, 255), random(0, 255)) : CRGB (0, 0, 0);
leds[cursor] = (digit & mask) ? ledColor : CRGB (0, 0, 0);
  • исправлен НГ режим
  • отключена точка доступа за ненадобностью
  • оптимизирован код
  • выбор в настройках кол-во разделительных точек
  • можно запускать с RTC модулем и без него
  • изменена библиотека NTP
  • поправлен код :)
Внимание: у кого мигает первый светодиод, необходимо изменить ядро ESP на 2.7.4 (инструменты/Плата/Менеджер плат).
Новые версии нестабильные на октябрь 2021г.
 

Вложения

Изменено:

Комментарии

ASM

★★★★★✩✩
26 Окт 2018
1,602
311
Удивительно, откуда такое появляется) Походу надо себе точку впаивать)
 

Romshteks

✩✩✩✩✩✩✩
13 Май 2020
43
4
@Romshteks, аудио модуль нужен) уже как-то обсуждали)
Это понятно,что сама esp куковать не будет.)
Кукушку надо сделать опционально,кому нужна будет,тот заморочится с выводом звука.
Будет время посмотри мои наработки.
Пошаманил над интерлицом
Кукуха в портале кукует.)
Как бы теперь это всё с eeprom связать.
 

Вложения

ASM

★★★★★✩✩
26 Окт 2018
1,602
311
Логику понял. С еепром не сложно, по идее три переменных надо: статус, час старт, час стоп. Можешь аналогично закинуть в структуру, памяти много не займет)
 

Romshteks

✩✩✩✩✩✩✩
13 Май 2020
43
4
Спасибо.Разобрался.Создал мем6 и там всё сохраняется.
ASM а можно ли добавить в режимы отображения дату?
 

Romshteks

✩✩✩✩✩✩✩
13 Май 2020
43
4
ASM а можешь подробно прокомментировать каждую строчку этого кода,а то я что-то не догоняю.
 

Вложения

ASM

★★★★★✩✩
26 Окт 2018
1,602
311
@Romshteks,
C++:
void DataToArray() {  // вывод влажности с датчика BME280 на экран

  bmp280.beginI2C(); // чтение датчика

  if (DOT_TEMP == 1) { // если выбран режим с точкой

    leds[NUM_LEDS] = 0x000000; // то выключить принудительно

  }

  hum = (bmp280.readFloatHumidity()) + o.cor_hum; // измерение значений, корректировка при надобности

  Serial.println(hum); // вывести в сериал результат

  Dots(!Dot); // выключить часовые точки принудительно

  if (c.hmd) { // если включен символ влажности

    Digit(digits[16], segment_4);  // символ % включен

    Digit(digits[15], segment_3);  // символ % включен

  } else { иначе выключен

    Digit(digits[12], segment_4);  // символ % выключен

    Digit(digits[12], segment_3);  // символ % выключен

  }

  int digit = hum % 10; // остаток от деления на 10, единичные числа

  Digit(digits[digit], segment_2);  // 2 сегмент

  digit = hum / 10; // деление на 10, числа десятки

  Digit(digits[digit], segment_1);  // 1 сегмент

};
 
  • Лойс +1
Реакции: Romshteks

Maxx1200

★✩✩✩✩✩✩
11 Фев 2022
94
18
Я экспериментировал и написал этот код
code + files + lib

файл: DFplayer_speak_v0.2.ino нужно поместить в папку "NEW_CLOCK_ESP_2_beta_2"

кстати, после прошивки нужно переподключить питание
UPD –
Заменил D3 на D0 и решил проблему с переподключением питания.
теперь модуль DFplayer инициализируется после прошивки
UPD 6 –
добавил будильник!, есть только один НО, если, скажем, в 10:59:59 будет запущен опрос датчиков, то, возможно, будильник не сработает, и с этим нужно что-то делать!
и много текста в порт для отладки!
добавлены, звуки! и переименован файл звуков и папок, для правильной работы
PS, исправить проблему с 24 часа поставил в case 0: вместо case 24:
UPD 6.1 –
сделал удобным включение выключение модуля DFPlayer

DFplayer_speak_v0.3.ino:
//////////// Функция DFPlayer_setup и DFPlayer_loop
  //  DFPlayer_setup();  //нужно поместить в setup
  //  DFPlayer_loop();   //нужно поместить в loop

/*
[LIST]
[*]автор Maxx1200
[*]Каждый час будет говорить время!
[*]есть только один НО, если, скажем, в 22:59:59 будет запущен опрос датчиков, то, возможно, звука "23 часа" не будет и с этим нужно что-то делать!
[/LIST]
*/

/***************************************************************************************************/
/*
   исходный код: https://github.com/enjoyneering/DFPlayer

   Возможности DFPlayer Mini:
    - 3,2В..5,0В, обычно 4,2В
    - microSD-карта до 32 ГБ (FAT16, FAT32)
    - USB-диск до 32 ГБ (FAT16, FAT32)
    - поддерживает частоту дискретизации mp3 8кГц, 11,025кГц, 12кГц, 16кГц, 22,05кГц, 24кГц, 32кГц, 44,1кГц, 48кГц
    - поддерживает до 100 папок, каждая папка может быть назначена на 001..255 песен
    - встроенный моноусилитель мощностью 3 Вт, NS8002 AB-класса с функцией ожидания
    - UART для связи, 9600 бит/с (четность: нет, биты данных: 8, стоповые биты: 1, управление потоком: нет)

    ПРИМЕЧАНИЕ:
    - добавьте резистор 1K последовательно с выводом DFPlayer TX

   Фреймворки и библиотеки:
   ESP8266 Core      -  https://github.com/esp8266/Arduino
   EspSoftwareSerial -  https://github.com/plerup/espsoftwareserial
*/
/***************************************************************************************************/

//Библиотеки
#include <SoftwareSerial.h>
#include <DFPlayer.h>

//Настройки можно поместить в - Constants.h
//В проекте контакты D4 D0 свободны можно их использовать проверено!
#define MP3_RX_PIN              2    //GPIO2/D4 к DFPlayer Mini TX
#define MP3_TX_PIN              16   //GPIO16/D0 к DFPlayer Mini RX
#define MP3_SERIAL_SPEED        9600  //DFPlayer Mini поддерживает только 9600 бод
#define MP3_SERIAL_BUFFER_SIZE  32    //размер последовательного буфера программного обеспечения в байтах, для отправки 8 байтов вам нужен 11-байтовый буфер (стартовый байт + 8 битов данных + байт четности + стоп-байт = 11 байтов)
#define MP3_SERIAL_TIMEOUT      350   //среднее время ожидания ответа DFPlayer для чипа GD3200B 350 мс..400 мс



SoftwareSerial mp3Serial;
DFPlayer       mp3;

  //Переменные
  int Hor, Min, Sec;
  //unsigned long timing2; // Переменная для хранения точки отсчета

/*********************здесь мы выбираем тип модуля*********************/
/*
    DFPlayer_setup()

    Main setup

    ПРИМЕЧАНИЕ:
    - тип модуля:
      - DFPLAYER_MINI:
        - DFPlayer Mini module
        - MP3-TF-16P module
        - FN-M16P module
        - YX5200 chip
        - YX5300 chip
        - JL AAxxxx chip
      - DFPLAYER_FN_X10P:
        - FN-M10P module
        - FN-S10P module
        - FN6100 chip
      - DFPLAYER_HW_247A:
        - HW-247A module
        - GD3200B chip
        - MH2024K-24SS
      - DFPLAYER_NO_CHECKSUM:
        - нет вычисления контрольной суммы (не рекомендуется для MCU без внешнего кварцевого генератора)
*/
/**************************************************************************/
  //  DFPlayer_setup(); //нужно поместить в setup
void DFPlayer_setup() {

  Serial.println("Инициализация DFPlayer... (может занять 3~5 секунд)"); //для отладки

  mp3Serial.begin(MP3_SERIAL_SPEED, SWSERIAL_8N1, MP3_RX_PIN, MP3_TX_PIN, false, MP3_SERIAL_BUFFER_SIZE, 0); //false=сигнал не инвертирован, 0=размер буфера ISR/RX (общий с последовательным буфером TX)

  mp3.begin(mp3Serial, MP3_SERIAL_TIMEOUT, DFPLAYER_HW_247A, false); //"DFPLAYER_HW_247A" см. ПРИМЕЧАНИЕ, false = нет обратной связи от модуля после команды

  mp3.stop();                             //если плеер работал во время перезагрузки ESP8266

  mp3.reset();                            //сбросить все настройки по умолчанию

  mp3.setSource(2);                       //1=USB-диск, 2=TF-карта, 3=Aux, 4=спящий режим, 5=NOR Flash

  mp3.setEQ(0);                           //0=Выкл., 1=Поп, 2=Рок, 3=Джаз, 4=Классика, 5=Бас
  mp3.setVolume(20);                      //0..30, модуль сохраняет громкость при сбое питания

  mp3.sleep();                            //переход в спящий режим, 24 мА

  mp3.wakeup(2);                          //выйти из спящего режима и инициализировать источник 1=USB-диск, 2=TF-карта, 3=Aux, 5=NOR Flash

  mp3Serial.enableRx(true);               //включить прерывания на выводе RX для лучшего обнаружения ответа, меньше накладных расходов, чем mp3Serial.listen()

  Serial.println(mp3.getStatus());        //0=стоп, 1=воспроизведение, 2=пауза, 3=спящий режим или режим ожидания, 4=ошибка связи, 5=неизвестное состояние
  Serial.println(mp3.getVolume());        //0..30
  Serial.println(mp3.getCommandStatus()); //1=модуль занят, 2=модуль в спящем режиме, 3=запрос получен не полностью, 4=не совпадает контрольная сумма
                                          //5=запрошенная папка/трек вне допустимого диапазона, 6=запрошенная папка/трек не найдена
                                          //7=реклама доступна во время воспроизведения трека, 8=SD-карта не найдена, 9=???, 10=спящий модуль
                                          //11=ОК команда принята, 12=ОК воспроизведение завершено, 13=ОК модуль готов после перезагрузки

  mp3Serial.enableRx(false);              //отключить прерывания на RX-контакте, меньше накладных расходов, чем mp3Serial.listen()

    //Чтобы при включении был звук как пример звук! 3 часы
     mp3.playMP3Folder(3); // проигрываем файл mp3/0003.mp3
     delay(2000); // задержка с секунд
     mp3.pause(); // пауза
}



  //  DFPlayer_loop(); //нужно поместить в loop
void DFPlayer_loop() {


  Hor = ntp.hour();
  Min = ntp.minute();
  Sec = ntp.second();

  if(Min == 0 && Sec == 0) {
    switch (Hor) { // Каждый час будет говорить время
     case 0:
     mp3.playMP3Folder(24); // проигрываем файл mp3/0024.mp3
     Serial.println ("track: 24"); //для отладки
     break;
     case 1:
     mp3.playMP3Folder(1); // проигрываем файл mp3/0001.mp3
     Serial.println ("track: 1"); //для отладки
     break;
     case 2:
     mp3.playMP3Folder(2); // проигрываем файл mp3/0002.mp3
     Serial.println ("track: 2"); //для отладки
     break;
     case 3:
     mp3.playMP3Folder(3); // проигрываем файл mp3/0003.mp3
     Serial.println ("track: 3"); //для отладки
     break;
     case 4:
     mp3.playMP3Folder(4); // проигрываем файл mp3/0004.mp3
     Serial.println ("track: 4"); //для отладки
     break;
     case 5:
     mp3.playMP3Folder(5); // проигрываем файл mp3/0005.mp3
     Serial.println ("track: 5"); //для отладки
     break;
     case 6:
     mp3.playMP3Folder(6); // проигрываем файл mp3/0006.mp3
     Serial.println ("track: 6"); //для отладки
     break;
     case 7:
     mp3.playMP3Folder(7); // проигрываем файл mp3/0007.mp3
     Serial.println ("track: 7"); //для отладки
     break;
     case 8:
     mp3.playMP3Folder(8); // проигрываем файл mp3/0008.mp3
     Serial.println ("track: 8"); //для отладки
     break;
     case 9:
     mp3.playMP3Folder(9); // проигрываем файл mp3/0009.mp3
     Serial.println ("track: 9"); //для отладки
     break;
     case 10:
     mp3.playMP3Folder(10); // проигрываем файл mp3/0010.mp3
     Serial.println ("track: 10"); //для отладки
     break;
     case 11:
     mp3.playMP3Folder(11); // проигрываем файл mp3/0011.mp3
     Serial.println ("track: 11"); //для отладки
     break;
     case 12:
     mp3.playMP3Folder(12); // проигрываем файл mp3/0012.mp3
     Serial.println ("track: 12"); //для отладки
     break;
     case 13:
     mp3.playMP3Folder(13); // проигрываем файл mp3/0013.mp3
     Serial.println ("track: 13"); //для отладки
     break;
     case 14:
     mp3.playMP3Folder(14); // проигрываем файл mp3/0014.mp3
     Serial.println ("track: 14"); //для отладки
     break;
     case 15:
     mp3.playMP3Folder(15); // проигрываем файл mp3/0015.mp3
     Serial.println ("track: 15"); //для отладки
     break;
     case 16:
     mp3.playMP3Folder(16); // проигрываем файл mp3/0016.mp3
     Serial.println ("track: 16"); //для отладки
     break;
     case 17:
     mp3.playMP3Folder(17); // проигрываем файл mp3/0017.mp3
     Serial.println ("track: 17"); //для отладки
     break;
     case 18:
     mp3.playMP3Folder(18); // проигрываем файл mp3/0018.mp3
     Serial.println ("track: 18"); //для отладки
     break;
     case 19:
     mp3.playMP3Folder(19); // проигрываем файл mp3/0019.mp3
     Serial.println ("track: 19"); //для отладки
     break;
     case 20:
     mp3.playMP3Folder(20); // проигрываем файл mp3/0020.mp3
     Serial.println ("track: 20"); //для отладки
     break;
     case 21:
     mp3.playMP3Folder(21); // проигрываем файл mp3/0021.mp3
     Serial.println ("track: 21"); //для отладки
     break;
     case 22:
     mp3.playMP3Folder(22); // проигрываем файл mp3/0022.mp3
     Serial.println ("track: 22"); //для отладки
     break;
     case 23:
     mp3.playMP3Folder(23); // проигрываем файл mp3/0023.mp3
     Serial.println ("track: 23"); //для отладки
     break;

    }


    delay(2000); // задержку лучше заменить на миллис
    mp3.pause(); // пауза
    //Serial.println ("track"); //для отладки


    /*аналог задержки
    if (millis() - timing2 > 3000){ // Вместо 3000 подставьте нужное вам значение паузы
     timing2 = millis();
     Serial.println ("3 seconds");
    }

     mp3.pause(); // пауза
    */

  }

}
DFplayer_speak_v0.6.1.ino:
//////////// Функция DFPlayer_setup и DFPlayer_loop
/*
  //Подключен ли модуль DFPlayer?, может быть привинчен к веб-интерфейсу!
  bool DFPlayer_check = 1; // 1 - есть модуль DFPlayer, 0 - нет

  // выполняется, если DFPlayer_check - 1
  if (DFPlayer_check) { DFPlayer_setup(); } //нужно поместить в setup 

  // выполняется, если DFPlayer_check - 1
  if (DFPlayer_check) { DFPlayer_loop(); } //нужно поместить в loop 
*/

/*
[*]автор Maxx1200
[*]Каждый час будет говорить время!
[*]есть только один НО, если, скажем, в 22:59:59 будет запущен опрос датчиков, то, возможно, звука "23 часа" не будет и с этим нужно что-то делать!
[*]добавил будильник!, есть только один НО, если, скажем, в 10:59:59 будет запущен опрос датчиков, то, возможно, будильник не сработает, и с этим нужно что-то делать!
[*]и много текста в порт для отладки!
*/

/***************************************************************************************************/
/*
   исходный код: https://github.com/enjoyneering/DFPlayer

   Возможности DFPlayer Mini:
    - 3,2В..5,0В, обычно 4,2В
    - microSD-карта до 32 ГБ (FAT16, FAT32)
    - USB-диск до 32 ГБ (FAT16, FAT32)
    - поддерживает частоту дискретизации mp3 8кГц, 11,025кГц, 12кГц, 16кГц, 22,05кГц, 24кГц, 32кГц, 44,1кГц, 48кГц
    - поддерживает до 100 папок, каждая папка может быть назначена на 001..255 песен
    - встроенный моноусилитель мощностью 3 Вт, NS8002 AB-класса с функцией ожидания
    - UART для связи, 9600 бит/с (четность: нет, биты данных: 8, стоповые биты: 1, управление потоком: нет)

    ПРИМЕЧАНИЕ:
    - добавьте резистор 1K последовательно с выводом DFPlayer TX

   Фреймворки и библиотеки:
   ESP8266 Core      -  https://github.com/esp8266/Arduino
   EspSoftwareSerial -  https://github.com/plerup/espsoftwareserial
*/
/***************************************************************************************************/

//Библиотеки
#include <SoftwareSerial.h>
#include <DFPlayer.h>

//Настройки можно поместить в - Constants.h
//В проекте контакты D4 D0 свободны можно их использовать проверено!
#define MP3_RX_PIN              2    //GPIO2/D4 к DFPlayer Mini TX
#define MP3_TX_PIN              16   //GPIO16/D0 к DFPlayer Mini RX
#define MP3_SERIAL_SPEED        9600  //DFPlayer Mini поддерживает только 9600 бод
#define MP3_SERIAL_BUFFER_SIZE  32    //размер последовательного буфера программного обеспечения в байтах, для отправки 8 байтов вам нужен 11-байтовый буфер (стартовый байт + 8 битов данных + байт четности + стоп-байт = 11 байтов)
#define MP3_SERIAL_TIMEOUT      350   //среднее время ожидания ответа DFPlayer для чипа GD3200B 350 мс..400 мс

// Установка будильника!
#define  alarm_clock_hours 23   //час   //без "0" 1 час
#define  alarm_clock_minutes 48 //минут //без "0" 9 минут

SoftwareSerial mp3Serial;
DFPlayer       mp3;

  //Переменные
  int Hor, Min, Sec;
  //unsigned long timing2; // Переменная для хранения точки отсчета

/*********************здесь мы выбираем тип модуля*********************/
/*
    DFPlayer_setup()

    Main setup

    ПРИМЕЧАНИЕ:
    - тип модуля:
      - DFPLAYER_MINI:
        - DFPlayer Mini module
        - MP3-TF-16P module
        - FN-M16P module
        - YX5200 chip
        - YX5300 chip
        - JL AAxxxx chip
      - DFPLAYER_FN_X10P:
        - FN-M10P module
        - FN-S10P module
        - FN6100 chip
      - DFPLAYER_HW_247A:
        - HW-247A module
        - GD3200B chip
        - MH2024K-24SS
      - DFPLAYER_NO_CHECKSUM:
        - нет вычисления контрольной суммы (не рекомендуется для MCU без внешнего кварцевого генератора)
*/
/**************************************************************************/
  //  DFPlayer_setup(); //нужно поместить в setup
void DFPlayer_setup() {

  Serial.println("Инициализация DFPlayer... (может занять 3~5 секунд)"); //для отладки

  mp3Serial.begin(MP3_SERIAL_SPEED, SWSERIAL_8N1, MP3_RX_PIN, MP3_TX_PIN, false, MP3_SERIAL_BUFFER_SIZE, 0); //false=сигнал не инвертирован, 0=размер буфера ISR/RX (общий с последовательным буфером TX)

  mp3.begin(mp3Serial, MP3_SERIAL_TIMEOUT, DFPLAYER_HW_247A, false); //"DFPLAYER_HW_247A" см. ПРИМЕЧАНИЕ, false = нет обратной связи от модуля после команды

  mp3.stop();                             //если плеер работал во время перезагрузки ESP8266

  mp3.reset();                            //сбросить все настройки по умолчанию

  mp3.setSource(2);                       //1=USB-диск, 2=TF-карта, 3=Aux, 4=спящий режим, 5=NOR Flash

  mp3.setEQ(0);                           //0=Выкл., 1=Поп, 2=Рок, 3=Джаз, 4=Классика, 5=Бас
  mp3.setVolume(20);                      //0..30, модуль сохраняет громкость при сбое питания

  mp3.sleep();                            //переход в спящий режим, 24 мА

  mp3.wakeup(2);                          //выйти из спящего режима и инициализировать источник 1=USB-диск, 2=TF-карта, 3=Aux, 5=NOR Flash

  mp3Serial.enableRx(true);               //включить прерывания на выводе RX для лучшего обнаружения ответа, меньше накладных расходов, чем mp3Serial.listen()

  Serial.print("getStatus: ");  //для отладки, Получить статус
  Serial.println(mp3.getStatus());        //0=стоп, 1=воспроизведение, 2=пауза, 3=спящий режим или режим ожидания, 4=ошибка связи, 5=неизвестное состояние
  Serial.print("getVolume: ");  //для отладки, Получить громкость
  Serial.println(mp3.getVolume());        //0..30
  Serial.print("getCommandStatus: ");  //для отладки, Получить статус команд
  Serial.println(mp3.getCommandStatus()); //1=модуль занят, 2=модуль в спящем режиме, 3=запрос получен не полностью, 4=не совпадает контрольная сумма
                                          //5=запрошенная папка/трек вне допустимого диапазона, 6=запрошенная папка/трек не найдена
                                          //7=реклама доступна во время воспроизведения трека, 8=SD-карта не найдена, 9=???, 10=спящий модуль
                                          //11=ОК команда принята, 12=ОК воспроизведение завершено, 13=ОК модуль готов после перезагрузки

  mp3Serial.enableRx(false);              //отключить прерывания на RX-контакте, меньше накладных расходов, чем mp3Serial.listen()

    //Чтобы при включении был звук как пример звук! 005.mp3
     mp3.playFolder(2, 5); //2=папка/5=дорожка, имя папки должно быть 01..99, а файлы в папке должны начинаться с 3 десятичных цифр с ведущими нулями // проигрываем файл 02/005.mp3
     Serial.println ("track_Folder2: 5"); //для отладки
     delay(2000); // задержку лучше заменить на миллис
       mp3.pause(); // пауза
     Serial.print("getStatus: ");  //для отладки, Получить статус
     Serial.println(mp3.getStatus());  //0=стоп, 1=воспроизведение, 2=пауза, 3=спящий режим или режим ожидания, 4=ошибка связи, 5=неизвестное состояние
}



  //  DFPlayer_loop(); //нужно поместить в loop
void DFPlayer_loop() {


  Hor = ntp.hour();
  Min = ntp.minute();
  Sec = ntp.second();

  if(Min == 0 && Sec == 0) {
    switch (Hor) { // Каждый час будет говорить время
     case 0:
     mp3.playMP3Folder(24); // проигрываем файл mp3/0024.mp3
     Serial.println ("track: 24"); //для отладки
     break;
     case 1:
     mp3.playMP3Folder(1); // проигрываем файл mp3/0001.mp3
     Serial.println ("track: 1"); //для отладки
     break;
     case 2:
     mp3.playMP3Folder(2); // проигрываем файл mp3/0002.mp3
     Serial.println ("track: 2"); //для отладки
     break;
     case 3:
     mp3.playMP3Folder(3); // проигрываем файл mp3/0003.mp3
     Serial.println ("track: 3"); //для отладки
     break;
     case 4:
     mp3.playMP3Folder(4); // проигрываем файл mp3/0004.mp3
     Serial.println ("track: 4"); //для отладки
     break;
     case 5:
     mp3.playMP3Folder(5); // проигрываем файл mp3/0005.mp3
     Serial.println ("track: 5"); //для отладки
     break;
     case 6:
     mp3.playMP3Folder(6); // проигрываем файл mp3/0006.mp3
     Serial.println ("track: 6"); //для отладки
     break;
     case 7:
     mp3.playMP3Folder(7); // проигрываем файл mp3/0007.mp3
     Serial.println ("track: 7"); //для отладки
     break;
     case 8:
     mp3.playMP3Folder(8); // проигрываем файл mp3/0008.mp3
     Serial.println ("track: 8"); //для отладки
     break;
     case 9:
     mp3.playMP3Folder(9); // проигрываем файл mp3/0009.mp3
     Serial.println ("track: 9"); //для отладки
     break;
     case 10:
     mp3.playMP3Folder(10); // проигрываем файл mp3/0010.mp3
     Serial.println ("track: 10"); //для отладки
     break;
     case 11:
     mp3.playMP3Folder(11); // проигрываем файл mp3/0011.mp3
     Serial.println ("track: 11"); //для отладки
     break;
     case 12:
     mp3.playMP3Folder(12); // проигрываем файл mp3/0012.mp3
     Serial.println ("track: 12"); //для отладки
     break;
     case 13:
     mp3.playMP3Folder(13); // проигрываем файл mp3/0013.mp3
     Serial.println ("track: 13"); //для отладки
     break;
     case 14:
     mp3.playMP3Folder(14); // проигрываем файл mp3/0014.mp3
     Serial.println ("track: 14"); //для отладки
     break;
     case 15:
     mp3.playMP3Folder(15); // проигрываем файл mp3/0015.mp3
     Serial.println ("track: 15"); //для отладки
     break;
     case 16:
     mp3.playMP3Folder(16); // проигрываем файл mp3/0016.mp3
     Serial.println ("track: 16"); //для отладки
     break;
     case 17:
     mp3.playMP3Folder(17); // проигрываем файл mp3/0017.mp3
     Serial.println ("track: 17"); //для отладки
     break;
     case 18:
     mp3.playMP3Folder(18); // проигрываем файл mp3/0018.mp3
     Serial.println ("track: 18"); //для отладки
     break;
     case 19:
     mp3.playMP3Folder(19); // проигрываем файл mp3/0019.mp3
     Serial.println ("track: 19"); //для отладки
     break;
     case 20:
     mp3.playMP3Folder(20); // проигрываем файл mp3/0020.mp3
     Serial.println ("track: 20"); //для отладки
     break;
     case 21:
     mp3.playMP3Folder(21); // проигрываем файл mp3/0021.mp3
     Serial.println ("track: 21"); //для отладки
     break;
     case 22:
     mp3.playMP3Folder(22); // проигрываем файл mp3/0022.mp3
     Serial.println ("track: 22"); //для отладки
     break;
     case 23:
     mp3.playMP3Folder(23); // проигрываем файл mp3/0023.mp3
     Serial.println ("track: 23"); //для отладки
     break;

    }


    delay(2000); // задержку лучше заменить на миллис
    mp3.pause(); // пауза 
    Serial.print("getStatus: ");  //для отладки, Получить статус
    Serial.println(mp3.getStatus());  //0=стоп, 1=воспроизведение, 2=пауза, 3=спящий режим или режим ожидания, 4=ошибка связи, 5=неизвестное состояние


    /*аналог задержки
    if (millis() - timing2 > 3000){ // Вместо 3000 подставьте нужное вам значение паузы
     timing2 = millis();
     Serial.println ("3 seconds");
    }

     mp3.pause(); // пауза
    */

  }


//Будильник, длительность воспроизведения звука составит 60 секунд
if(Hor == alarm_clock_hours && Min == alarm_clock_minutes) {
  mp3.playFolder(2, 2); //2=папка/2=дорожка, имя папки должно быть 01..99, а файлы в папке должны начинаться с 3 десятичных цифр с ведущими нулями // проигрываем файл 02/002.mp3
  Serial.println ("alarm_track_Folder2: 2"); //для отладки

  Serial.print("getCommandStatus: ");  //для отладки, Получить статус команд
  Serial.println(mp3.getCommandStatus()); //1=модуль занят, 2=модуль в спящем режиме, 3=запрос получен не полностью, 4=не совпадает контрольная сумма
                                          //5=запрошенная папка/трек вне допустимого диапазона, 6=запрошенная папка/трек не найдена
                                          //7=реклама доступна во время воспроизведения трека, 8=SD-карта не найдена, 9=???, 10=спящий модуль
                                          //11=ОК команда принята, 12=ОК воспроизведение завершено, 13=ОК модуль готов после перезагрузки

  delay(60000); // задержку лучше заменить на миллис
  mp3.pause(); // пауза
  Serial.print("getStatus: ");  //для отладки, Получить статус
  Serial.println(mp3.getStatus());  //0=стоп, 1=воспроизведение, 2=пауза, 3=спящий режим или режим ожидания, 4=ошибка связи, 5=неизвестное состояние
  }




}
 
Изменено:
  • Лойс +1
Реакции: Romshteks и ASM

Romshteks

✩✩✩✩✩✩✩
13 Май 2020
43
4
ASM Спасибо разобрался.Кормим void Digit() тем что хотим получить.)
Дата:
  //  Для сериала
  String days;
  if (day < 10) days += '0';
  days += day;
  String months;
  if (month < 10) months += '0';
  months += month;
  String years;
  years = year / 10;
  Serial.println((String)days + "." + months + "." + years);
  // Serial.println(ntp.dateString());
  // Serial.println(year);

  //  Вывод даты на дисплей
  int digit_month = month % 10;
  Digit(digits[digit_month], segment_4);  // Выводим единицы месяца 4 сегмент
  digit_month = month / 10;
  Digit(digits[digit_month], segment_3);  // Выводим десятки месяца 3 сегмент
  int digit_day = day % 10;
  Digit(digits[digit_day], segment_2);  // Выводим единицы дней 2 сегмент
  digit_day = day / 10;
  Digit(digits[digit_day], segment_1);  // Выводим десятки дней 1 сегмент
Maxx1200 Спасибо, пригодится,сэкономил мне кучу времени.
Буду всё собирать в единое целое.)

Serial.println(year);
Ребят у всех выдаёт в порт "231" ?
 

ASM

★★★★★✩✩
26 Окт 2018
1,602
311

Romshteks

✩✩✩✩✩✩✩
13 Май 2020
43
4
видно где-то не так считывается, гляну)
Библиотека походу так написана.

Вот такая штуковина у меня получилась.)
В порте работает всё чётко,а цифер пока нет.(
Проверьте кто с цифрами.)
 

Вложения

  • Лойс +1
Реакции: Maxx1200

Romshteks

✩✩✩✩✩✩✩
13 Май 2020
43
4
Понял,)
В ночные часы кукушка выключена,вот и не заметил.)
Спасибо.
DFPlayer.ino::
        case 0:
          mp3.playMP3Folder(24);         // проигрываем файл mp3/0024.mp3
          Serial.println(" ♫ 0 часов");  //для отладки
          break;
Исправлено
 
Изменено:

ASM

★★★★★✩✩
26 Окт 2018
1,602
311
Изменено:

kym13

★★✩✩✩✩✩
14 Ноя 2020
472
70
У меня есть звуковые файлы озвучки "Мужской", "Женский", "Куранты", "Каминные часы", если нужно могу сюда скинуть
 

Romshteks

✩✩✩✩✩✩✩
13 Май 2020
43
4
kym13
Конечно выкладывай,пригодится.
Можно будет в настройках сделать выбор кем озвучивать.
 

ASM

★★★★★✩✩
26 Окт 2018
1,602
311
Подправил код.
Добавил дату 5 режимом.
Внес код для DFP, надо определиться что делать) а то тут два варианта @Maxx1200 и @Romshteks запутался))
 

Maxx1200

★✩✩✩✩✩✩
11 Фев 2022
94
18
@ASM, да

необходимо только внести такие изменения
NEW_CLOCK_ESP_2_beta_2_2:
  if (DFPlayer_check) { DFPlayer_setup(); } //В void setup()

  if (DFPlayer_check) { kuku_tick(); } //В void loop()
DFPlayer.ino изменений!
DFPlayer.ino:
//////////// Функция DFPlayer
/*
[*]автор Maxx1200
[*]Каждый час будет говорить время!
*/
//========ВЫБОР-ТИПА-МОДУЛЯ========
//#define DFPlayer_type DFPLAYER_MINI         // Раскоментируйте эту строчку, если такой, DFPlayer Mini module, MP3-TF-16P module, FN-M16P module, YX5200 chip, YX5300 chip, JL AAxxxx chip
//#define DFPlayer_type DFPLAYER_FN_X10P      // Раскоментируйте эту строчку, если такой, FN-M10P module, FN-S10P module, FN6100 chip
  #define DFPlayer_type DFPLAYER_HW_247A      // Закомментируйте эту строку,  если используеися плеер с чипом, отличным от, HW-247A module, GD3200B chip, MH2024K-24SS
//#define DFPlayer_type DFPLAYER_NO_CHECKSUM  // Раскоментируйте эту строчку, если такой, нет вычисления контрольной суммы (не рекомендуется)
//=================================
/***************************************************************************************************/
/*
   Возможности DFPlayer Mini:
    - 3,2В..5,0В, обычно 4,2В
    - microSD-карта до 32 ГБ (FAT16, FAT32)
    - USB-диск до 32 ГБ (FAT16, FAT32)
    - поддерживает частоту дискретизации mp3 8кГц, 11,025кГц, 12кГц, 16кГц, 22,05кГц, 24кГц, 32кГц, 44,1кГц, 48кГц
    - поддерживает до 100 папок, каждая папка может быть назначена на 001..255 песен
    - встроенный моноусилитель мощностью 3 Вт, NS8002 AB-класса с функцией ожидания
    - UART для связи, 9600 бит/с (четность: нет, биты данных: 8, стоповые биты: 1, управление потоком: нет)

    ПРИМЕЧАНИЕ:
    - добавьте резистор 1K последовательно с выводом DFPlayer TX

   Фреймворки и библиотеки:
   DFPlayer          -  https://github.com/enjoyneering/DFPlayer
   ESP8266 Core      -  https://github.com/esp8266/Arduino
   EspSoftwareSerial -  https://github.com/plerup/espsoftwareserial
*/
/***************************************************************************************************/
void DFPlayer_setup() {

  Serial.println("Инициализация DFPlayer... (может занять 3~5 секунд)");                                      //для отладки
  mp3Serial.begin(MP3_SERIAL_SPEED, SWSERIAL_8N1, MP3_RX_PIN, MP3_TX_PIN, false, MP3_SERIAL_BUFFER_SIZE, 0);  //false=сигнал не инвертирован, 0=размер буфера ISR/RX (общий с последовательным буфером TX)
  mp3.begin(mp3Serial, MP3_SERIAL_TIMEOUT, DFPlayer_type, false);                                          //"DFPLAYER_HW_247A" см. ПРИМЕЧАНИЕ, false = нет обратной связи от модуля после команды
  mp3.stop();                                                                                                 //если плеер работал во время перезагрузки ESP8266
  mp3.reset();                                                                                                //сбросить все настройки по умолчанию
  mp3.setSource(2);                                                                                           //1=USB-диск, 2=TF-карта, 3=Aux, 4=спящий режим, 5=NOR Flash
  mp3.setEQ(0);                                                                                               //0=Выкл., 1=Поп, 2=Рок, 3=Джаз, 4=Классика, 5=Бас
  mp3.setVolume(r.grom_mp3);                                                                                  //0..30, модуль сохраняет громкость при сбое питания

  Serial.print(" ♫ Громкость: ");   //для отладки, Получить громкость
  Serial.println(mp3.getVolume());  //0..30

  mp3Serial.enableRx(false);  //отключить прерывания на RX-контакте, меньше накладных расходов, чем mp3Serial.listen()

  mp3.playMP3Folder(26);
  Serial.println(" ♫ Приветствие");  // Музыкальное приветствие
}

void DFPlayer() {            // Функция срабатывающая раз в час
  if (r.status_kuku) {       // Если кукушка включена(проверка второй раз для корректной работы портала)
    if (r.kuku_mp3_check) {  // Если включено воспроизведение кукушки
      Serial.println(" ♫ Ку-Ку");
      mp3.playMP3Folder(25);  // проигрываем файл c кукушкой
    }
    if (r.kuku_mp3_check && r.vrem_mp3_check) delay(2500);
    if (r.vrem_mp3_check) {  // Если включено воспроизведение времени
      switch (hour) {        // Взависимости от часа будет говорить время
        case 0:
          mp3.playMP3Folder(24);         // проигрываем файл mp3/0024.mp3
          Serial.println(" ♫ 0 часов");  //для отладки
          break;
        case 1:
          mp3.playMP3Folder(1);        // проигрываем файл mp3/0001.mp3
          Serial.println(" ♫ 1 час");  //для отладки
          break;
        case 2:
          mp3.playMP3Folder(2);         // проигрываем файл mp3/0002.mp3
          Serial.println(" ♫ 2 часа");  //для отладки
          break;
        case 3:
          mp3.playMP3Folder(3);         // проигрываем файл mp3/0003.mp3
          Serial.println(" ♫ 3 часа");  //для отладки
          break;
        case 4:
          mp3.playMP3Folder(4);         // проигрываем файл mp3/0004.mp3
          Serial.println(" ♫ 4 часа");  //для отладки
          break;
        case 5:
          mp3.playMP3Folder(5);          // проигрываем файл mp3/0005.mp3
          Serial.println(" ♫ 5 часов");  //для отладки
          break;
        case 6:
          mp3.playMP3Folder(6);          // проигрываем файл mp3/0006.mp3
          Serial.println(" ♫ 6 часов");  //для отладки
          break;
        case 7:
          mp3.playMP3Folder(7);          // проигрываем файл mp3/0007.mp3
          Serial.println(" ♫ 7 часов");  //для отладки
          break;
        case 8:
          mp3.playMP3Folder(8);          // проигрываем файл mp3/0008.mp3
          Serial.println(" ♫ 8 часов");  //для отладки
          break;
        case 9:
          mp3.playMP3Folder(9);          // проигрываем файл mp3/0009.mp3
          Serial.println(" ♫ 9 часов");  //для отладки
          break;
        case 10:
          mp3.playMP3Folder(10);          // проигрываем файл mp3/0010.mp3
          Serial.println(" ♫ 10 часов");  //для отладки
          break;
        case 11:
          mp3.playMP3Folder(11);          // проигрываем файл mp3/0011.mp3
          Serial.println(" ♫ 11 часов");  //для отладки
          break;
        case 12:
          mp3.playMP3Folder(12);          // проигрываем файл mp3/0012.mp3
          Serial.println(" ♫ 12 часов");  //для отладки
          break;
        case 13:
          mp3.playMP3Folder(13);          // проигрываем файл mp3/0013.mp3
          Serial.println(" ♫ 13 часов");  //для отладки
          break;
        case 14:
          mp3.playMP3Folder(14);          // проигрываем файл mp3/0014.mp3
          Serial.println(" ♫ 14 часов");  //для отладки
          break;
        case 15:
          mp3.playMP3Folder(15);          // проигрываем файл mp3/0015.mp3
          Serial.println(" ♫ 15 часов");  //для отладки
          break;
        case 16:
          mp3.playMP3Folder(16);          // проигрываем файл mp3/0016.mp3
          Serial.println(" ♫ 16 часов");  //для отладки
          break;
        case 17:
          mp3.playMP3Folder(17);          // проигрываем файл mp3/0017.mp3
          Serial.println(" ♫ 17 часов");  //для отладки
          break;
        case 18:
          mp3.playMP3Folder(18);          // проигрываем файл mp3/0018.mp3
          Serial.println(" ♫ 18 часов");  //для отладки
          break;
        case 19:
          mp3.playMP3Folder(19);          // проигрываем файл mp3/0019.mp3
          Serial.println(" ♫ 19 часов");  //для отладки
          break;
        case 20:
          mp3.playMP3Folder(20);          // проигрываем файл mp3/0020.mp3
          Serial.println(" ♫ 20 часов");  //для отладки
          break;
        case 21:
          mp3.playMP3Folder(21);        // проигрываем файл mp3/0021.mp3
          Serial.println(" ♫ 21 час");  //для отладки
          break;
        case 22:
          mp3.playMP3Folder(22);         // проигрываем файл mp3/0022.mp3
          Serial.println(" ♫ 22 часа");  //для отладки
          break;
        case 23:
          mp3.playMP3Folder(23);         // проигрываем файл mp3/0023.mp3
          Serial.println(" ♫ 23 часа");  //для отладки
          break;
      }
    }
  }
}
 
Изменено:

Maxx1200

★✩✩✩✩✩✩
11 Фев 2022
94
18
@Maxx1200,
внес необходимые изменения

ps. схема подключения dfplayer к esp8266
Wemos+DFplayer.png
 
Изменено: