• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Нужна помощь Помогите пжл новичку с программированием детской игрушки на ESP8266

Beerukoff

New member
Только начал знакомится с миром Ардуины.

Обучающим проектом для себя выбрал создание музыкальной игрушки для дочки на базе следующих комплектующих:
- готовый корпус от другой игрушки с одной кнопкой и 4-мя светодиодами
- ESP8266 NodeMCU v3 (работает в среде Ардуино IDE)
- динамик 3W 4R
- DFPlayer Mini

"ТЗ" такое:
- нажатием кнопки проигрывается случайный MP3 трек с microSD карты
- во время проигрывания мигают светодиоды (в случайном порядке)
- при первом нажатии поднимается веб-сервер, коннектится к роутеру и в андроид приложении можно изменять громкость (к примеру, совсем выключить, если родители утомились)
- через 30 секунд после окончания проигрывания трека, если нет нажатия на кнопку, устройство полностью засыпает

Тестовую схему собрал, из нескольких примеров с помощью яндекса и форумов слепил первый драфт скетча (скорее всего он весьма коряв, но т.к. ранее я на этом языке не писал, думаю меня простят):
Код:
#include <DFPlayer_Mini_Mp3.h>
#include <SoftwareSerial.h>
#include <ESP8266WiFi.h>

const char* ssid = "WiFiVillage";
const char* password = "***";
int vol=5;
int i;
char* Ans[]={"Volume +", "Volume -", "Play Next"};

WiFiServer server(80);

SoftwareSerial mp3Serial(D1, D2); // RX, TX

void setup () {
  Serial.begin (115200);
  Serial.println("Setting up software serial");
  mp3Serial.begin (9600);
  Serial.println("Setting up mp3 player");
  mp3_set_serial (mp3Serial);
  // Delay is required before accessing player. From my experience it's ~1 sec
  delay(1000);
  mp3_set_volume (vol);
  Serial.println("play MP3");
  mp3_next ();

  // Connect to WiFi network
  Serial.println();
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);

  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
  delay(500);
  Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected");

  // Start the server
  server.begin();
  Serial.println("Server started");
  // Print the IP address
  Serial.println(WiFi.localIP());
}

void loop () {
  // Check if a client has connected
  WiFiClient client = server.available();
  if (!client) {
  return;
  }

  // Wait until the client sends some data
  Serial.println("new client");
  while(!client.available()){
  delay(1);
  }

  // Read the first line of the request
  String req = client.readStringUntil('\r');
  Serial.println(req);
  client.flush();

  // Match the request
  if (req.indexOf("/BeerukoffaMusicBox/1") != -1)
  {
  i=0;
  vol++;
  mp3_set_volume (vol);
  }
  else if (req.indexOf("/BeerukoffaMusicBox/0") != -1)
  {
  i=1;
  vol--;
  mp3_set_volume (vol);
  }
  else if (req.indexOf("/BeerukoffaMusicBox/2") != -1)
  {
  i=2;
  mp3_next ();
  }
  else {
  Serial.println("invalid request");
  client.stop();
  return;
  }
  Serial.println(Ans[i]);
  client.flush();

  // Prepare the response
  String s = "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n<!DOCTYPE HTML>\r\n<html>\r\ ";
  s += Ans[i];
  s += "</html>\n";
  // Send the response to the client
  client.print(s);
  delay(1);
  Serial.println("Client disonnected");
  }

В итоге сейчас ESP поднимает веб-сервер, играет mp3, громкость регулируется через мобильное приложение или веб-запросы.

Но т.к. на данном языке никогда не писал есть некоторые вопросы с параллельностью задач и их правильной последовательностью. Если у кого есть время и опыт помогите пжл:
1) как сделать чтобы вся активность начиналась только после первого нажатия на кнопку и через 30 секунд после окончания проигрывание трека (это можно понять по ноге Busy у DFPlayer ) устройство отключалось от роутера и засыпало?
2) как в данной среде обрабатывать параллельные процессы (благо проигрывание mp3 происходит автономно и не требует внимания со стороны ESP):
- контроль нажатия на кнопку (для следующего трека)
- контроль запросов на веб-сервер (для регулирования громкости)
- мигание светодиодами
- таймер выключения
3) как грамотно "заснуть" устройство (чтобы остался только контроль нажатия кнопки)?

И один "железячный" вопрос - можно ли каким-то образом запитать устройство от 2-х АА батареек (так в текущем корпусе) или надо думать куда третью батарею разместить?

Спасибо!!!
 
Последнее редактирование:

2007-i

Member
И один "железячный" вопрос - можно ли каким-то образом запитать устройство от 2-х АА батареек (так в текущем корпусе) или надо думать куда третью батарею разместить?

Спасибо!!!
От двух батарей можно питать, но до момента пока напряжение нормальное на батареях (новые по 1,6v*2=3,2v) от 2,7-3,6 v по даташиту памяти например 25Q80A (сам контроллер 2,2-3,6). Потом просто модуль будет себя не предсказуемо вести (если вообще будет запускаться).
Так что наверное лучше потавить либо 3 батареи и ставить стабилизатор напряжения на 3,3 v, либо взять одну батарею типа 18650 на 3,6v (можно и от телефона что бы по размеру подошла) и так использовать. но тут опять же есть "подводные камни", так как при полном заряде литий-ионный аккумулятор будет выдавать около 4,2 вольт, что опять же не подходит для питания памяти. Конечно есть выход, использовать параллельно питанию esp8266 стабилитрон на 3,6 v (параметрический стабилизатор) а между плюсом аккумулятора и катодом стабилитрона поставить резистор 50-200 Ом.

А если использовать готовый стабилизатор напряжения на 3,3 v, то нужно напряжение немного увеличить т.к. на стабилизаторе напряжения будет небольшое падение напряжения около 1 вольта.
 
Сверху Снизу