• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе 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 почитайте про массивы, функции и указатели. Так разбираться будет сложно. Ссылки я давал.
 
Сверху Снизу