• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Нужна помощь Как упростить скетч

Demonstrius

New member
@Demonstrius глянул мельком, назначение var# не понял. Но дырку во флэш вы протрете очень скоро, судя по коду.
Вечером посмотрю подробнее если время будет.
Я хотел обнулять значения var по достижении конца списка мелодий. Назначение var - защита от повторного проигрывания одной и той же мелодии (реализовано возможно глупо).
Спасибо за помощь.
 

Сергей_Ф

Moderator
Команда форума
@Demonstrius и ещё раз прошу описать что должна делать ваша музыкальная шкатулка на обычном языке.
1. Что при включении
2. Что по нажатию кнопки
3. Что после проигрывания мелодии
4. И так далее

Вот обнулите вы все var# что дальше? У вас будет тишина, так и должно быть?
 

Demonstrius

New member
@Demonstrius и ещё раз прошу описать что должна делать ваша музыкальная шкатулка на обычном языке.
1. Что при включении
2. Что по нажатию кнопки
3. Что после проигрывания мелодии
4. И так далее

Вот обнулите вы все var# что дальше? У вас будет тишина, так и должно быть?
1. При включении - тишина
2. По нажатию кнопки - проигрывание очередной мелодии
3. После проигрывания - тишина.
Все как в этом скетче.
 

Сергей_Ф

Moderator
Команда форума
@Demonstrius я не знаю что должен делать скетч и прошу вас написать. Вы этого не делаете.
В скетче есть уход esp в сон, вы об этом не пишите. Почему? Вы сами его писали или откуда то скопировали?
В скетче есть запись в одну и туже ячейку eeprom - я уже писал что будет дырка во флеше. Вы опять об этом не говорите. Что вы там храните и зачем?
То вы говорите про разные мелодии, то нет. Что значит очередная мелодия? Как задается очередь? По порядку или ещё как?
Ну и как вам помочь?
 

Demonstrius

New member
@Demonstrius я не знаю что должен делать скетч и прошу вас написать. Вы этого не делаете.
В скетче есть уход esp в сон, вы об этом не пишите. Почему? Вы сами его писали или откуда то скопировали?
В скетче есть запись в одну и туже ячейку eeprom - я уже писал что будет дырка во флеше. Вы опять об этом не говорите. Что вы там храните и зачем?
То вы говорите про разные мелодии, то нет. Что значит очередная мелодия? Как задается очередь? По порядку или ещё как?
Ну и как вам помочь?
Уход esp в сон реализован из-за неадекватного поведения esp8266 после команды ESP.reset - пришлось ребутить esp по ESP.deepSleep.
Запись в одну и ту же ячейку сделано в рабочем варианте скетча. В готовом - тоже хотел значение ячейки менять.
В скетче пока 18 мелодий (вы же этот скетч смотрели) - вот поэтому и очередная. Играют по порядку. По достижении конца списка esp перезагружается и после очередного срабатывания сенсорной кнопки - алгоритм продолжается. Как-то так.
 

Сергей_Ф

Moderator
Команда форума
Уход esp в сон реализован из-за неадекватного поведения esp8266 после команды ESP.reset
в чём это выражается? Вроде проблем не было никогда, всегда адекватно реагировало.
А зачем вы пишите в ячейку EEPROM? Я бы понял если бы вы там мелодии хранили, что бы память не занимать.
Какое питание будет у шкатулки? Батарея? Сетевой адаптер? После пропадания питания очередность сбиваться не должна или допустимо начать сначала?
Мелодии должны идти по порядку? Тогда зачем var# вообще не понятно. У вас же есть счетчик, зачем проверка var?
 

Demonstrius

New member
в чём это выражается? Вроде проблем не было никогда, всегда адекватно реагировало.
А зачем вы пишите в ячейку EEPROM? Я бы понял если бы вы там мелодии хранили, что бы память не занимать.
Какое питание будет у шкатулки? Батарея? Сетевой адаптер? После пропадания питания очередность сбиваться не должна или допустимо начать сначала?
Мелодии должны идти по порядку? Тогда зачем var# вообще не понятно. У вас же есть счетчик, зачем проверка var?
Выражается это в том, что после ESP.reset esp8266 перезагружается и висит до тех пор пока его не ребутнуть кнопкой Reset.
Питание будет от аккумулятора.
После пропадания питания - с какого трека начнется неважно. Главное чтобы не повторялись.
"У вас же есть счетчик, зачем проверка var?" - проверку var делал для того чтобы не было двойного проигрывания мелодии и после перезагрузки шкатулка оставалась в режиме тишины. Иначе получалось так что после перезагрузки сразу начиналось проигрывание первой мелодии.
"А зачем вы пишите в ячейку EEPROM?" - изначально я хотел чтобы переключение мелодий было по кнопке Reset, но позже я прикрутил сенсорную кнопку - а в коде это так и осталось.
 

Сергей_Ф

Moderator
Команда форума
пробуйте так

Код:
#include "pitches.h"
#include "play.h"
#include <EEPROM.h>

const int buttonPin = 14;  // пин кнопки
int count;                // счетчик нажатий на кнопку

// раскоментировать нужное
char *songs[] = {
"Indiana:d=4,o=5,b=250:e,8p,8f,8g,8p,1c6,8p.,d,8p,8e,1f,p.,g,8p,8a,8b,8p,1f6,p,a,8p,8b,2c6,2d6,2e6,e,8p,8f,8g,8p,1c6,p,d6,8p,8e6,1f.6,g,8p,8g,e.6,8p,d6,8p,8g,e.6,8p,d6,8p,8g,f.6,8p,e6,8p,8d6,2c6",
"TakeOnMe:d=4,o=4,b=160:8f#5,8f#5,8f#5,8d5,8p,8b,8p,8e5,8p,8e5,8p,8e5,8g#5,8g#5,8a5,8b5,8a5,8a5,8a5,8e5,8p,8d5,8p,8f#5,8p,8f#5,8p,8f#5,8e5,8e5,8f#5,8e5,8f#5,8f#5,8f#5,8d5,8p,8b,8p,8e5,8p,8e5,8p,8e5,8g#5,8g#5,8a5,8b5,8a5,8a5,8a5,8e5,8p,8d5,8p,8f#5,8p,8f#5,8p,8f#5,8e5,8e5",
"Entertainer:d=4,o=5,b=140:8d,8d#,8e,c6,8e,c6,8e,2c.6,8c6,8d6,8d#6,8e6,8c6,8d6,e6,8b,d6,2c6,p,8d,8d#,8e,c6,8e,c6,8e,2c.6,8p,8a,8g,8f#,8a,8c6,e6,8d6,8c6,8a,2d6",
"Looney:d=4,o=5,b=140:32p,c6,8f6,8e6,8d6,8c6,a.,8c6,8f6,8e6,8d6,8d#6,e.6,8e6,8e6,8c6,8d6,8c6,8e6,8c6,8d6,8a,8c6,8g,8a#,8a,8f",
"20thCenFox:d=16,o=5,b=140:b,8p,b,b,2b,p,c6,32p,b,32p,c6,32p,b,32p,c6,32p,b,8p,b,b,b,32p,b,32p,b,32p,b,32p,b,32p,b,32p,b,32p,g#,32p,a,32p,b,8p,b,b,2b,4p,8e,8g#,8b,1c#6,8f#,8a,8c#6,1e6,8a,8c#6,8e6,1e6,8b,8g#,8a,2b",
"Bond:d=4,o=5,b=80:32p,16c#6,32d#6,32d#6,16d#6,8d#6,16c#6,16c#6,16c#6,16c#6,32e6,32e6,16e6,8e6,16d#6,16d#6,16d#6,16c#6,32d#6,32d#6,16d#6,8d#6,16c#6,16c#6,16c#6,16c#6,32e6,32e6,16e6,8e6,16d#6,16d6,16c#6,16c#7,c.7,16g#6,16f#6,g#.6",
"StarWars:d=4,o=5,b=45:32p,32f#,32f#,32f#,8b.,8f#.6,32e6,32d#6,32c#6,8b.6,16f#.6,32e6,32d#6,32c#6,8b.6,16f#.6,32e6,32d#6,32e6,8c#.6,32f#,32f#,32f#,8b.,8f#.6,32e6,32d#6,32c#6,8b.6,16f#.6,32e6,32d#6,32c#6,8b.6,16f#.6,32e6,32d#6,32e6,8c#6",
"GoodBad:d=4,o=5,b=56:32p,32a#,32d#6,32a#,32d#6,8a#.,16f#.,16g#.,d#,32a#,32d#6,32a#,32d#6,8a#.,16f#.,16g#.,c#6,32a#,32d#6,32a#,32d#6,8a#.,16f#.,32f.,32d#.,c#,32a#,32d#6,32a#,32d#6,8a#.,16g#.,d#",
"TopGun:d=4,o=4,b=31:32p,16c#,16g#,16g#,32f#,32f,32f#,32f,16d#,16d#,32c#,32d#,16f,32d#,32f,16f#,32f,32c#,16f,d#,16c#,16g#,16g#,32f#,32f,32f#,32f,16d#,16d#,32c#,32d#,16f,32d#,32f,16f#,32f,32c#,g#",
"A-Team:d=8,o=5,b=125:4d#6,a#,2d#6,16p,g#,4a#,4d#.,p,16g,16a#,d#6,a#,f6,2d#6,16p,c#.6,16c6,16a#,g#.,2a#"
};

void setup(void)
{
  EEPROM.begin(512);
  Serial.begin(115200);
  pinMode(buttonPin, INPUT); // Открываем порт для считывания
}

#define isdigit(n) (n >= '0' && n <= '9')


void loop(void)
{
  int buttonState = digitalRead(buttonPin); // Считываем статус кнопки (нажата / не нажата)
  unsigned int len_songs = sizeof(songs)/sizeof(char*);
  if (buttonState == 1) {
    count = EEPROM.read(0);

    if (count >= len_songs ) {EEPROM.write(0, 0);}                     // Если > числа песен, Обнуляем ячейку EEPROM №0.
      else {EEPROM.write(0, count = EEPROM.read(0) + 1);}    // Увеличиваем значение ячейки EEPROM №0 на 1
   
    EEPROM.commit();                                         // немедленная запись данных в EEPROM
    count = EEPROM.read(0);
    Serial.println(); Serial.print("count: "); Serial.println(count);
  }

  while (digitalRead(buttonPin)) {delay(5);}                // пауза для ожидания, пока пользователь отпустит кнопку
   
//--------------------------------
    play_rtttl(songs[count]);
 
//-------------------------------
}
но рекомендую count хранить в RTC памяти, она не стирается пока есть питание.
 

Сергей_Ф

Moderator
Команда форума
Выражается это в том, что после ESP.reset esp8266 перезагружается и висит до тех пор пока его не ребутнуть кнопкой Reset.
значит что то сделали не так со схемой. Поставили подтяжку на пины CH_PD, 0 и 2 ? Пин 15 притянут к земле?
Давайте схему в студию.
 

Demonstrius

New member
пробуйте так

Код:
#include "pitches.h"
#include "play.h"
#include <EEPROM.h>

const int buttonPin = 14;  // пин кнопки
int count;                // счетчик нажатий на кнопку

// раскоментировать нужное
char *songs[] = {
"Indiana:d=4,o=5,b=250:e,8p,8f,8g,8p,1c6,8p.,d,8p,8e,1f,p.,g,8p,8a,8b,8p,1f6,p,a,8p,8b,2c6,2d6,2e6,e,8p,8f,8g,8p,1c6,p,d6,8p,8e6,1f.6,g,8p,8g,e.6,8p,d6,8p,8g,e.6,8p,d6,8p,8g,f.6,8p,e6,8p,8d6,2c6",
"TakeOnMe:d=4,o=4,b=160:8f#5,8f#5,8f#5,8d5,8p,8b,8p,8e5,8p,8e5,8p,8e5,8g#5,8g#5,8a5,8b5,8a5,8a5,8a5,8e5,8p,8d5,8p,8f#5,8p,8f#5,8p,8f#5,8e5,8e5,8f#5,8e5,8f#5,8f#5,8f#5,8d5,8p,8b,8p,8e5,8p,8e5,8p,8e5,8g#5,8g#5,8a5,8b5,8a5,8a5,8a5,8e5,8p,8d5,8p,8f#5,8p,8f#5,8p,8f#5,8e5,8e5",
"Entertainer:d=4,o=5,b=140:8d,8d#,8e,c6,8e,c6,8e,2c.6,8c6,8d6,8d#6,8e6,8c6,8d6,e6,8b,d6,2c6,p,8d,8d#,8e,c6,8e,c6,8e,2c.6,8p,8a,8g,8f#,8a,8c6,e6,8d6,8c6,8a,2d6",
"Looney:d=4,o=5,b=140:32p,c6,8f6,8e6,8d6,8c6,a.,8c6,8f6,8e6,8d6,8d#6,e.6,8e6,8e6,8c6,8d6,8c6,8e6,8c6,8d6,8a,8c6,8g,8a#,8a,8f",
"20thCenFox:d=16,o=5,b=140:b,8p,b,b,2b,p,c6,32p,b,32p,c6,32p,b,32p,c6,32p,b,8p,b,b,b,32p,b,32p,b,32p,b,32p,b,32p,b,32p,b,32p,g#,32p,a,32p,b,8p,b,b,2b,4p,8e,8g#,8b,1c#6,8f#,8a,8c#6,1e6,8a,8c#6,8e6,1e6,8b,8g#,8a,2b",
"Bond:d=4,o=5,b=80:32p,16c#6,32d#6,32d#6,16d#6,8d#6,16c#6,16c#6,16c#6,16c#6,32e6,32e6,16e6,8e6,16d#6,16d#6,16d#6,16c#6,32d#6,32d#6,16d#6,8d#6,16c#6,16c#6,16c#6,16c#6,32e6,32e6,16e6,8e6,16d#6,16d6,16c#6,16c#7,c.7,16g#6,16f#6,g#.6",
"StarWars:d=4,o=5,b=45:32p,32f#,32f#,32f#,8b.,8f#.6,32e6,32d#6,32c#6,8b.6,16f#.6,32e6,32d#6,32c#6,8b.6,16f#.6,32e6,32d#6,32e6,8c#.6,32f#,32f#,32f#,8b.,8f#.6,32e6,32d#6,32c#6,8b.6,16f#.6,32e6,32d#6,32c#6,8b.6,16f#.6,32e6,32d#6,32e6,8c#6",
"GoodBad:d=4,o=5,b=56:32p,32a#,32d#6,32a#,32d#6,8a#.,16f#.,16g#.,d#,32a#,32d#6,32a#,32d#6,8a#.,16f#.,16g#.,c#6,32a#,32d#6,32a#,32d#6,8a#.,16f#.,32f.,32d#.,c#,32a#,32d#6,32a#,32d#6,8a#.,16g#.,d#",
"TopGun:d=4,o=4,b=31:32p,16c#,16g#,16g#,32f#,32f,32f#,32f,16d#,16d#,32c#,32d#,16f,32d#,32f,16f#,32f,32c#,16f,d#,16c#,16g#,16g#,32f#,32f,32f#,32f,16d#,16d#,32c#,32d#,16f,32d#,32f,16f#,32f,32c#,g#",
"A-Team:d=8,o=5,b=125:4d#6,a#,2d#6,16p,g#,4a#,4d#.,p,16g,16a#,d#6,a#,f6,2d#6,16p,c#.6,16c6,16a#,g#.,2a#"
};

void setup(void)
{
  EEPROM.begin(512);
  Serial.begin(115200);
  pinMode(buttonPin, INPUT); // Открываем порт для считывания
}

#define isdigit(n) (n >= '0' && n <= '9')


void loop(void)
{
  int buttonState = digitalRead(buttonPin); // Считываем статус кнопки (нажата / не нажата)
  unsigned int len_songs = sizeof(songs)/sizeof(char*);
  if (buttonState == 1) {
    count = EEPROM.read(0);

    if (count >= len_songs ) {EEPROM.write(0, 0);}                     // Если > числа песен, Обнуляем ячейку EEPROM №0.
      else {EEPROM.write(0, count = EEPROM.read(0) + 1);}    // Увеличиваем значение ячейки EEPROM №0 на 1
 
    EEPROM.commit();                                         // немедленная запись данных в EEPROM
    count = EEPROM.read(0);
    Serial.println(); Serial.print("count: "); Serial.println(count);
  }

  while (digitalRead(buttonPin)) {delay(5);}                // пауза для ожидания, пока пользователь отпустит кнопку
 
//--------------------------------
    play_rtttl(songs[count]);
 
//-------------------------------
}
но рекомендую count хранить в RTC памяти, она не стирается пока есть питание.
Бесконечно играет первую мелодию. Вот из-за этого я и вводил в скетч переменную var.
 

Сергей_Ф

Moderator
Команда форума
Бесконечно играет первую мелодию.
Ну правильно, вы же кнопку не ждете пока нажмут, а ждете пока отпустят.
Тут надо всё переделывать и уводить esp в сон, при не нажатой кнопке. Кнопка должна выводить esp из сна (на RESET её). И условия все убрать. Не нужны они :).
Если сложно, ждите как сделаю, но... проверять мне не на чём сейчас :)

А вот и причина глюков ресета
TONE_PIN 15
 

Demonstrius

New member
Ну правильно, вы же кнопку не ждете пока нажмут, а ждете пока отпустят.
Тут надо всё переделывать и уводить esp в сон, при не нажатой кнопке. Кнопка должна выводить esp из сна (на RESET её). И условия все убрать. Не нужны они :).
Если сложно, ждите как сделаю, но... проверять мне не на чём сейчас :)

А вот и причина глюков ресета
TONE_PIN 15
Я подожду - чтобы затем по вашему скетчу осмысливать в чем я был не прав.
"А вот и причина глюков ресета TONE_PIN 15 " - на wi-fi часах у меня на этом пине вообще ничего не сидит - но проблема была та же.
 

Сергей_Ф

Moderator
Команда форума
пробуйте
кнопка на RESET+GND, пин 15 не использовать, поставьте например 2. Заодно будет видно как светодиод моргает.
EEPROM заменен на RTC. Везде есть сон для снижения потребления, но... надо отключать wifi и т.п. этого я не делал.
Мелодий можете добавлять, сколько влезет в память. Просто в массив в конец новую строки через запятые.

P.S. Если будет играть при включении, то попробуйте поставить конденсатор 0,1мкф между CH_PD и землёй. Должно перестать.

Код:
#include "pitches.h"
#include "play.h"
extern "C" {
  #include "user_interface.h"
}

//const int buttonPin = 14;  // пин кнопки
// кнопку на RESET
// резистор между RESET и pin16 НЕ СТАВИТЬ!!!
uint32_t count;                // счетчик нажатий на кнопку

// раскоментировать нужное
char *songs[] = {
"Indiana:d=4,o=5,b=250:e,8p,8f,8g,8p,1c6,8p.,d,8p,8e,1f,p.,g,8p,8a,8b,8p,1f6,p,a,8p,8b,2c6,2d6,2e6,e,8p,8f,8g,8p,1c6,p,d6,8p,8e6,1f.6,g,8p,8g,e.6,8p,d6,8p,8g,e.6,8p,d6,8p,8g,f.6,8p,e6,8p,8d6,2c6",
"TakeOnMe:d=4,o=4,b=160:8f#5,8f#5,8f#5,8d5,8p,8b,8p,8e5,8p,8e5,8p,8e5,8g#5,8g#5,8a5,8b5,8a5,8a5,8a5,8e5,8p,8d5,8p,8f#5,8p,8f#5,8p,8f#5,8e5,8e5,8f#5,8e5,8f#5,8f#5,8f#5,8d5,8p,8b,8p,8e5,8p,8e5,8p,8e5,8g#5,8g#5,8a5,8b5,8a5,8a5,8a5,8e5,8p,8d5,8p,8f#5,8p,8f#5,8p,8f#5,8e5,8e5",
"Entertainer:d=4,o=5,b=140:8d,8d#,8e,c6,8e,c6,8e,2c.6,8c6,8d6,8d#6,8e6,8c6,8d6,e6,8b,d6,2c6,p,8d,8d#,8e,c6,8e,c6,8e,2c.6,8p,8a,8g,8f#,8a,8c6,e6,8d6,8c6,8a,2d6",
"Looney:d=4,o=5,b=140:32p,c6,8f6,8e6,8d6,8c6,a.,8c6,8f6,8e6,8d6,8d#6,e.6,8e6,8e6,8c6,8d6,8c6,8e6,8c6,8d6,8a,8c6,8g,8a#,8a,8f",
"20thCenFox:d=16,o=5,b=140:b,8p,b,b,2b,p,c6,32p,b,32p,c6,32p,b,32p,c6,32p,b,8p,b,b,b,32p,b,32p,b,32p,b,32p,b,32p,b,32p,b,32p,g#,32p,a,32p,b,8p,b,b,2b,4p,8e,8g#,8b,1c#6,8f#,8a,8c#6,1e6,8a,8c#6,8e6,1e6,8b,8g#,8a,2b",
"Bond:d=4,o=5,b=80:32p,16c#6,32d#6,32d#6,16d#6,8d#6,16c#6,16c#6,16c#6,16c#6,32e6,32e6,16e6,8e6,16d#6,16d#6,16d#6,16c#6,32d#6,32d#6,16d#6,8d#6,16c#6,16c#6,16c#6,16c#6,32e6,32e6,16e6,8e6,16d#6,16d6,16c#6,16c#7,c.7,16g#6,16f#6,g#.6",
"StarWars:d=4,o=5,b=45:32p,32f#,32f#,32f#,8b.,8f#.6,32e6,32d#6,32c#6,8b.6,16f#.6,32e6,32d#6,32c#6,8b.6,16f#.6,32e6,32d#6,32e6,8c#.6,32f#,32f#,32f#,8b.,8f#.6,32e6,32d#6,32c#6,8b.6,16f#.6,32e6,32d#6,32c#6,8b.6,16f#.6,32e6,32d#6,32e6,8c#6",
"GoodBad:d=4,o=5,b=56:32p,32a#,32d#6,32a#,32d#6,8a#.,16f#.,16g#.,d#,32a#,32d#6,32a#,32d#6,8a#.,16f#.,16g#.,c#6,32a#,32d#6,32a#,32d#6,8a#.,16f#.,32f.,32d#.,c#,32a#,32d#6,32a#,32d#6,8a#.,16g#.,d#",
"TopGun:d=4,o=4,b=31:32p,16c#,16g#,16g#,32f#,32f,32f#,32f,16d#,16d#,32c#,32d#,16f,32d#,32f,16f#,32f,32c#,16f,d#,16c#,16g#,16g#,32f#,32f,32f#,32f,16d#,16d#,32c#,32d#,16f,32d#,32f,16f#,32f,32c#,g#",
"A-Team:d=8,o=5,b=125:4d#6,a#,2d#6,16p,g#,4a#,4d#.,p,16g,16a#,d#6,a#,f6,2d#6,16p,c#.6,16c6,16a#,g#.,2a#"
};

uint32_t len_songs;

void setup(void)
{
  Serial.begin(74880);
  len_songs = sizeof(songs)/sizeof(char*);
 
     rst_info *rstInfo = system_get_rst_info();
     Serial.print ("Resone: "); Serial.println( rstInfo->reason );
 if ( rstInfo->reason != rst_reason(REASON_DEEP_SLEEP_AWAKE) && rstInfo->reason != rst_reason(REASON_EXT_SYS_RST) ) { Serial.println("Power on. Go to sleep"); ESP.deepSleep(0); }
  else {
  ESP.rtcUserMemoryRead(0, &count, sizeof(count)); // Увеличиваем значение ячейки RTC №0 на 1
  count++;
  if (count >= len_songs ) { count = 0;}                     // Если > числа песен, Обнуляем ячейку RTC №0.
 
   ESP.rtcUserMemoryWrite(0, &count, sizeof(count));
   Serial.print("Play song: "); Serial.println( count);
//--------------------------------
  play_rtttl(songs[count]);
  Serial.println("and sleep"); ESP.deepSleep(0);
//--------------------------------
  }
}

void loop(void)
{


}
 
Последнее редактирование:

Demonstrius

New member
пробуйте
кнопка на RESET+GND, пин 15 не использовать, поставьте например 2. Заодно будет видно как светодиод моргает.
EEPROM заменен на RTC. Везде есть сон для снижения потребления, но... надо отключать wifi и т.п. этого я не делал.
Мелодий можете добавлять, сколько влезет в память. Просто в массив в конец новую строки через запятые.

Код:
#include "pitches.h"
#include "play.h"
extern "C" {
  #include "user_interface.h"
}

//const int buttonPin = 14;  // пин кнопки
// кнопку на RESET
// резистор между RESET и pin16 НЕ СТАВИТЬ!!!
uint32_t count;                // счетчик нажатий на кнопку

// раскоментировать нужное
char *songs[] = {
"Indiana:d=4,o=5,b=250:e,8p,8f,8g,8p,1c6,8p.,d,8p,8e,1f,p.,g,8p,8a,8b,8p,1f6,p,a,8p,8b,2c6,2d6,2e6,e,8p,8f,8g,8p,1c6,p,d6,8p,8e6,1f.6,g,8p,8g,e.6,8p,d6,8p,8g,e.6,8p,d6,8p,8g,f.6,8p,e6,8p,8d6,2c6",
"TakeOnMe:d=4,o=4,b=160:8f#5,8f#5,8f#5,8d5,8p,8b,8p,8e5,8p,8e5,8p,8e5,8g#5,8g#5,8a5,8b5,8a5,8a5,8a5,8e5,8p,8d5,8p,8f#5,8p,8f#5,8p,8f#5,8e5,8e5,8f#5,8e5,8f#5,8f#5,8f#5,8d5,8p,8b,8p,8e5,8p,8e5,8p,8e5,8g#5,8g#5,8a5,8b5,8a5,8a5,8a5,8e5,8p,8d5,8p,8f#5,8p,8f#5,8p,8f#5,8e5,8e5",
"Entertainer:d=4,o=5,b=140:8d,8d#,8e,c6,8e,c6,8e,2c.6,8c6,8d6,8d#6,8e6,8c6,8d6,e6,8b,d6,2c6,p,8d,8d#,8e,c6,8e,c6,8e,2c.6,8p,8a,8g,8f#,8a,8c6,e6,8d6,8c6,8a,2d6",
"Looney:d=4,o=5,b=140:32p,c6,8f6,8e6,8d6,8c6,a.,8c6,8f6,8e6,8d6,8d#6,e.6,8e6,8e6,8c6,8d6,8c6,8e6,8c6,8d6,8a,8c6,8g,8a#,8a,8f",
"20thCenFox:d=16,o=5,b=140:b,8p,b,b,2b,p,c6,32p,b,32p,c6,32p,b,32p,c6,32p,b,8p,b,b,b,32p,b,32p,b,32p,b,32p,b,32p,b,32p,b,32p,g#,32p,a,32p,b,8p,b,b,2b,4p,8e,8g#,8b,1c#6,8f#,8a,8c#6,1e6,8a,8c#6,8e6,1e6,8b,8g#,8a,2b",
"Bond:d=4,o=5,b=80:32p,16c#6,32d#6,32d#6,16d#6,8d#6,16c#6,16c#6,16c#6,16c#6,32e6,32e6,16e6,8e6,16d#6,16d#6,16d#6,16c#6,32d#6,32d#6,16d#6,8d#6,16c#6,16c#6,16c#6,16c#6,32e6,32e6,16e6,8e6,16d#6,16d6,16c#6,16c#7,c.7,16g#6,16f#6,g#.6",
"StarWars:d=4,o=5,b=45:32p,32f#,32f#,32f#,8b.,8f#.6,32e6,32d#6,32c#6,8b.6,16f#.6,32e6,32d#6,32c#6,8b.6,16f#.6,32e6,32d#6,32e6,8c#.6,32f#,32f#,32f#,8b.,8f#.6,32e6,32d#6,32c#6,8b.6,16f#.6,32e6,32d#6,32c#6,8b.6,16f#.6,32e6,32d#6,32e6,8c#6",
"GoodBad:d=4,o=5,b=56:32p,32a#,32d#6,32a#,32d#6,8a#.,16f#.,16g#.,d#,32a#,32d#6,32a#,32d#6,8a#.,16f#.,16g#.,c#6,32a#,32d#6,32a#,32d#6,8a#.,16f#.,32f.,32d#.,c#,32a#,32d#6,32a#,32d#6,8a#.,16g#.,d#",
"TopGun:d=4,o=4,b=31:32p,16c#,16g#,16g#,32f#,32f,32f#,32f,16d#,16d#,32c#,32d#,16f,32d#,32f,16f#,32f,32c#,16f,d#,16c#,16g#,16g#,32f#,32f,32f#,32f,16d#,16d#,32c#,32d#,16f,32d#,32f,16f#,32f,32c#,g#",
"A-Team:d=8,o=5,b=125:4d#6,a#,2d#6,16p,g#,4a#,4d#.,p,16g,16a#,d#6,a#,f6,2d#6,16p,c#.6,16c6,16a#,g#.,2a#"
};

uint32_t len_songs;

void setup(void)
{
  Serial.begin(74880);
  len_songs = sizeof(songs)/sizeof(char*);
 
  //ESP.rtcUserMemoryWrite(0, &count, sizeof(count));
     rst_info *rstInfo = system_get_rst_info();
     Serial.print ("Resone: "); Serial.println( rstInfo->reason );
 if ( rstInfo->reason != rst_reason(REASON_DEEP_SLEEP_AWAKE) && rstInfo->reason != rst_reason(REASON_EXT_SYS_RST) ) { Serial.println("Power on. Go to sleep"); ESP.deepSleep(0); }
  else {
  ESP.rtcUserMemoryRead(0, &count, sizeof(count)); // Увеличиваем значение ячейки RTC №0 на 1
  count++;
  if (count >= len_songs ) { count = 0;}                     // Если > числа песен, Обнуляем ячейку RTC №0.
 
   ESP.rtcUserMemoryWrite(0, &count, sizeof(count));
   Serial.print("Play song: "); Serial.println( count);
//--------------------------------
  play_rtttl(songs[count]);
  Serial.println("and sleep"); ESP.deepSleep(0);
//--------------------------------
  }
}

#define isdigit(n) (n >= '0' && n <= '9')


void loop(void)
{


}
Все работает. Огромное вам спасибо. Буду разбираться в вашем коде.
 

Сергей_Ф

Moderator
Команда форума
@Demonstrius почитайте про массивы, функции и указатели. Так разбираться будет сложно. Ссылки я давал.
 
Сверху Снизу