МП3 плеер с управлением через смс

Clubbars79
Offline
Зарегистрирован: 19.11.2019

Доброго времени форумчане! Заинтересовал проект мп3 плеера с управлением через gsm модуль смсками. Скетч готовый есть, собрал все вроде по фэншую, и не работает( Помогите, подскажите, что сделано не так!!!

Clubbars79
Offline
Зарегистрирован: 19.11.2019

Moderator : пожалуйста, вставьте код правильно (возможно, новым сообщением в тему), как описано в http://arduino.ru/forum/obshchii/vstavka-programmnogo-koda-v-temukommentarii

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Clubbars79 пишет:

что сделано не так!!!

1. не так опубликован код.

Дальше не смотрел, сначала опубликуйте как положено.

Clubbars79
Offline
Зарегистрирован: 19.11.2019
#include <SoftwareSerial.h>                     // Библиотека програмной реализации обмена по UART-протоколу
#include <SoftwareSerial.h>
#include <Wire.h>
#include <DFMiniMp3.h>

//! Макроопределения
#define SIM800_TX_PIN    2   //7
#define SIM800_RX_PIN    3   //8
#define SIM800_BAUDRATE  9600

#define MP3_TX_PIN    10
#define MP3_RX_PIN    11
#define MP3_BAUDRATE  9600

#define MESSAGE_LENGTH 50
#define MP3_VOLUME     20

//! Типы данных
class Mp3Notify
{
public:
  static void OnError(uint16_t errorCode)
  {
    // see DfMp3_Error for code meaning
    Serial.println();
    Serial.print("Com Error ");
    Serial.println(errorCode);
  }

  static void OnPlayFinished(uint16_t globalTrack)
  {
    Serial.println();
    Serial.print("Play finished for #");
    Serial.println(globalTrack);  
  }

  static void OnCardOnline(uint16_t code)
  {
    Serial.println();
    Serial.print("Card online ");
    Serial.println(code);     
  }

  static void OnUsbOnline(uint16_t code)
  {
    Serial.println();
    Serial.print("USB Disk online ");
    Serial.println(code);     
  }

  static void OnCardInserted(uint16_t code)
  {
    Serial.println();
    Serial.print("Card inserted ");
    Serial.println(code); 
  }

  static void OnUsbInserted(uint16_t code)
  {
    Serial.println();
    Serial.print("USB Disk inserted ");
    Serial.println(code); 
  }

  static void OnCardRemoved(uint16_t code)
  {
    Serial.println();
    Serial.print("Card removed ");
    Serial.println(code);  
  }

  static void OnUsbRemoved(uint16_t code)
  {
    Serial.println();
    Serial.print("USB Disk removed ");
    Serial.println(code);  
  }
};

//! Локальные данные
char message[MESSAGE_LENGTH];
int messageIndex = 0;

char phone[16];
char datetime[24];

String sms_text_1 = "1";
String sms_text_2 = "2";
String sms_text_3 = "3";

SoftwareSerial SIM800(2, 3);                    // RX, TX
SoftwareSerial mp3_serial(MP3_TX_PIN, MP3_RX_PIN); // RX, TX
DFMiniMp3<SoftwareSerial, Mp3Notify> mp3(mp3_serial);

String _response = "";                          // Переменная для хранения ответа модуля
void setup() 
{
  Serial.begin(9600);                           // Скорость обмена данными с компьютером
  SIM800.begin(9600);                           // Скорость обмена данными с модемом
  Serial.println("Start!");

  sendATCommand("AT", true);                    // Отправили AT для настройки скорости обмена данными

  // Команды настройки модема при каждом запуске
  //_response = sendATCommand("AT+CLIP=1", true);  // Включаем АОН
  //_response = sendATCommand("AT+DDET=1", true);  // Включаем DTMF
  _response = sendATCommand("AT+CMGF=1;&W", true); // Включаем текстовый режима SMS (Text mode) и сразу сохраняем значение (AT&W)!

  delay(3000);  

  mp3.begin();

  uint16_t volume = mp3.getVolume();
  Serial.print("volume ");
  Serial.println(volume);
  mp3.setVolume(MP3_VOLUME);
  
  uint16_t count = mp3.getTotalTrackCount();
  Serial.print("files ");
  Serial.println(count);
  
  Serial.println("starting...");

}

String sendATCommand(String cmd, bool waiting) 
{
  String _resp = "";                            // Переменная для хранения результата
  Serial.println(cmd);                          // Дублируем команду в монитор порта
  SIM800.println(cmd);                          // Отправляем команду модулю
  if (waiting) {                                // Если необходимо дождаться ответа...
    _resp = waitResponse();                     // ... ждем, когда будет передан ответ
    // Если Echo Mode выключен (ATE0), то эти 3 строки можно закомментировать
    if (_resp.startsWith(cmd))  // Убираем из ответа дублирующуюся команду
    {               
      _resp = _resp.substring(_resp.indexOf("\r", cmd.length()) + 2);
    }
    Serial.println(_resp);                      // Дублируем ответ в монитор порта
  }
  return _resp;                                 // Возвращаем результат. Пусто, если проблема
}

String waitResponse() {                         // Функция ожидания ответа и возврата полученного результата
  String _resp = "";                            // Переменная для хранения результата
  long _timeout = millis() + 10000;             // Переменная для отслеживания таймаута (10 секунд)
  while (!SIM800.available() && millis() < _timeout)  {}; // Ждем ответа 10 секунд, если пришел ответ или наступил таймаут, то...
  if (SIM800.available()) {                     // Если есть, что считывать...
    _resp = SIM800.readString();                // ... считываем и запоминаем
  }
  else {                                        // Если пришел таймаут, то...
    Serial.println("Timeout...");               // ... оповещаем об этом и...
  }
  return _resp;                                 // ... возвращаем результат. Пусто, если проблема
}

void loop() 
{
  //if (SIM800.available())   
  //{                   // Если модем, что-то отправил...
    _response = waitResponse();                 // Получаем ответ от модема для анализа
    _response.trim();                           // Убираем лишние пробелы в начале и конце
    Serial.println(_response);                  // Если нужно выводим в монитор порта
    //....
    if (_response.startsWith("+CMTI:")) 
    {       // Пришло сообщение об отправке SMS
      int index = _response.lastIndexOf(",");   // Находим последнюю запятую, перед индексом
      String result = _response.substring(index + 1, _response.length()); // Получаем индекс
      result.trim();                            // Убираем пробельные символы в начале/конце
      _response=sendATCommand("AT+CMGR="+result, true); // Получить содержимое SMS
      parseSMS(_response);                      // Распарсить SMS на элементы
      sendATCommand("AT+CMGDA=\"DEL ALL\"", true); // Удалить все сообщения, чтобы не забивали память модуля
    }
  //}
  if (Serial.available()) // Ожидаем команды по Serial... 
  {                    
    SIM800.write(Serial.read());                // ...и отправляем полученную команду модему
  };
}


void parseSMS(String msg) 
{
  String msgheader  = "";
  String msgbody    = "";
  String msgphone    = "";

  msg = msg.substring(msg.indexOf("+CMGR: "));
  msgheader = msg.substring(0, msg.indexOf("\r"));

  msgbody = msg.substring(msgheader.length() + 2);
  msgbody = msgbody.substring(0, msgbody.lastIndexOf("OK"));
  msgbody.trim();

  int firstIndex = msgheader.indexOf("\",\"") + 3;
  int secondIndex = msgheader.indexOf("\",\"", firstIndex);
  msgphone = msgheader.substring(firstIndex, secondIndex);

  Serial.println("Phone: "+msgphone);
  Serial.println("Message: "+msgbody);

  String message_temp = String(msgbody);
  if (message_temp.equals(sms_text_1))
  {
      Serial.println("track 1"); 
      mp3.playMp3FolderTrack(1);  // sd:/mp3/0001.mp3
  }
  else if (message_temp.equals(sms_text_2))
  {
      Serial.println("track 2"); 
      mp3.playMp3FolderTrack(2);  // sd:/mp3/0002.mp3
  }
  else if (message_temp.equals(sms_text_3))
  {
      Serial.println("track 3"); 
      mp3.playMp3FolderTrack(3);  // sd:/mp3/0003.mp3
  }
  else
  {
      Serial.println("track no - STOP");
      mp3.stop();
  }
}


void sendSMS(String phone, String message)
{
  sendATCommand("AT+CMGS=\"" + phone + "\"", true);             // Переходим в режим ввода текстового сообщения
  sendATCommand(message + "\r\n" + (String)((char)26), true);   // После текста отправляем перенос строки и Ctrl+Z
}

 

bwn
Offline
Зарегистрирован: 25.08.2014

Проверьте 38 строку и 121 не нравиться.

Clubbars79
Offline
Зарегистрирован: 19.11.2019


#include <SoftwareSerial.h>                     // Библиотека програмной реализации обмена по UART-протоколу
#include <SoftwareSerial.h>
#include <Wire.h>
#include <DFMiniMp3.h>

//! Макроопределения
#define SIM800_TX_PIN    2   //7
#define SIM800_RX_PIN    3   //8
#define SIM800_BAUDRATE  9600

#define MP3_TX_PIN    10
#define MP3_RX_PIN    11
#define MP3_BAUDRATE  9600

#define MESSAGE_LENGTH 50
#define MP3_VOLUME     20

//! Типы данных
class Mp3Notify
{
public:
  static void OnError(uint16_t errorCode)
  {
    // see DfMp3_Error for code meaning
    Serial.println();
    Serial.print("Com Error ");
    Serial.println(errorCode);
  }

  static void OnPlayFinished(uint16_t globalTrack)
  {
    Serial.println();
    Serial.print("Play finished for #");
    Serial.println(globalTrack);  
  }

  static void OnCardOnline(uint16_t code)
  {
    Serial.println();
    Serial.print("Card online ");
    Serial.println(code);     
  }

  static void OnUsbOnline(uint16_t code)
  {
    Serial.println();
    Serial.print("USB Disk online ");
    Serial.println(code);     
  }

  static void OnCardInserted(uint16_t code)
  {
    Serial.println();
    Serial.print("Card inserted ");
    Serial.println(code); 
  }

  static void OnUsbInserted(uint16_t code)
  {
    Serial.println();
    Serial.print("USB Disk inserted ");
    Serial.println(code); 
  }

  static void OnCardRemoved(uint16_t code)
  {
    Serial.println();
    Serial.print("Card removed ");
    Serial.println(code);  
  }

  static void OnUsbRemoved(uint16_t code)
  {
    Serial.println();
    Serial.print("USB Disk removed ");
    Serial.println(code);  
  }
};

//! Локальные данные
char message[MESSAGE_LENGTH];
int messageIndex = 0;

char phone[16];
char datetime[24];

String sms_text_1 = "1";
String sms_text_2 = "2";
String sms_text_3 = "3";

SoftwareSerial SIM800(2, 3);                    // RX, TX
SoftwareSerial mp3_serial(MP3_TX_PIN, MP3_RX_PIN); // RX, TX
DFMiniMp3<SoftwareSerial, Mp3Notify> mp3(mp3_serial);

String _response = "";                          // Переменная для хранения ответа модуля
void setup() 
{
  Serial.begin(9600);                           // Скорость обмена данными с компьютером
  SIM800.begin(9600);                           // Скорость обмена данными с модемом
  Serial.println("Start!");

  sendATCommand("AT", true);                    // Отправили AT для настройки скорости обмена данными

  // Команды настройки модема при каждом запуске
  //_response = sendATCommand("AT+CLIP=1", true);  // Включаем АОН
  //_response = sendATCommand("AT+DDET=1", true);  // Включаем DTMF
  _response = sendATCommand("AT+CMGF=1;&W", true); // Включаем текстовый режима SMS (Text mode) и сразу сохраняем значение (AT&W)!

  delay(3000);  

  mp3.begin();

  uint16_t volume = mp3.getVolume();
  Serial.print("volume ");
  Serial.println(volume);
  mp3.setVolume(MP3_VOLUME);
  
  uint16_t count = mp3.getTotalTrackCount();
  Serial.print("files ");
  Serial.println(count);
  
  Serial.println("starting...");

}

String sendATCommand(String cmd, bool waiting) 
{
  String _resp = "";                            // Переменная для хранения результата
  Serial.println(cmd);                          // Дублируем команду в монитор порта
  SIM800.println(cmd);                          // Отправляем команду модулю
  if (waiting) {                                // Если необходимо дождаться ответа...
    _resp = waitResponse();                     // ... ждем, когда будет передан ответ
    // Если Echo Mode выключен (ATE0), то эти 3 строки можно закомментировать
    if (_resp.startsWith(cmd))  // Убираем из ответа дублирующуюся команду
    {               
      _resp = _resp.substring(_resp.indexOf("\r", cmd.length()) + 2);
    }
    Serial.println(_resp);                      // Дублируем ответ в монитор порта
  }
  return _resp;                                 // Возвращаем результат. Пусто, если проблема
}

String waitResponse() {                         // Функция ожидания ответа и возврата полученного результата
  String _resp = "";                            // Переменная для хранения результата
  long _timeout = millis() + 10000;             // Переменная для отслеживания таймаута (10 секунд)
  while (!SIM800.available() && millis() < _timeout)  {}; // Ждем ответа 10 секунд, если пришел ответ или наступил таймаут, то...
  if (SIM800.available()) {                     // Если есть, что считывать...
    _resp = SIM800.readString();                // ... считываем и запоминаем
  }
  else {                                        // Если пришел таймаут, то...
    Serial.println("Timeout...");               // ... оповещаем об этом и...
  }
  return _resp;                                 // ... возвращаем результат. Пусто, если проблема
}

void loop() 
{
  //if (SIM800.available())   
  //{                   // Если модем, что-то отправил...
    _response = waitResponse();                 // Получаем ответ от модема для анализа
    _response.trim();                           // Убираем лишние пробелы в начале и конце
    Serial.println(_response);                  // Если нужно выводим в монитор порта
    //....
    if (_response.startsWith("+CMTI:")) 
    {       // Пришло сообщение об отправке SMS
      int index = _response.lastIndexOf(",");   // Находим последнюю запятую, перед индексом
      String result = _response.substring(index + 1, _response.length()); // Получаем индекс
      result.trim();                            // Убираем пробельные символы в начале/конце
      _response=sendATCommand("AT+CMGR="+result, true); // Получить содержимое SMS
      parseSMS(_response);                      // Распарсить SMS на элементы
      sendATCommand("AT+CMGDA=\"DEL ALL\"", true); // Удалить все сообщения, чтобы не забивали память модуля
    }
  //}
  if (Serial.available()) // Ожидаем команды по Serial... 
  {                    
    SIM800.write(Serial.read());                // ...и отправляем полученную команду модему
  };
}


void parseSMS(String msg) 
{
  String msgheader  = "";
  String msgbody    = "";
  String msgphone    = "";

  msg = msg.substring(msg.indexOf("+CMGR: "));
  msgheader = msg.substring(0, msg.indexOf("\r"));

  msgbody = msg.substring(msgheader.length() + 2);
  msgbody = msgbody.substring(0, msgbody.lastIndexOf("OK"));
  msgbody.trim();

  int firstIndex = msgheader.indexOf("\",\"") + 3;
  int secondIndex = msgheader.indexOf("\",\"", firstIndex);
  msgphone = msgheader.substring(firstIndex, secondIndex);

  Serial.println("Phone: "+msgphone);
  Serial.println("Message: "+msgbody);

  String message_temp = String(msgbody);
  if (message_temp.equals(sms_text_1))
  {
      Serial.println("track 1"); 
      mp3.playMp3FolderTrack(1);  // sd:/mp3/0001.mp3
  }
  else if (message_temp.equals(sms_text_2))
  {
      Serial.println("track 2"); 
      mp3.playMp3FolderTrack(2);  // sd:/mp3/0002.mp3
  }
  else if (message_temp.equals(sms_text_3))
  {
      Serial.println("track 3"); 
      mp3.playMp3FolderTrack(3);  // sd:/mp3/0003.mp3
  }
  else
  {
      Serial.println("track no - STOP");
      mp3.stop();
  }
}


void sendSMS(String phone, String message)
{
  sendATCommand("AT+CMGS=\"" + phone + "\"", true);             // Переходим в режим ввода текстового сообщения
  sendATCommand(message + "\r\n" + (String)((char)26), true);   // После текста отправляем перенос строки и Ctrl+Z
}

 

Clubbars79
Offline
Зарегистрирован: 19.11.2019

Доброго времени суток! Подскажите, установил библиотеку, но она похоже не работает, не подсвечивается цветом как другие библиотеки. Что нужно сделать?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Clubbars79 пишет:

не подсвечивается цветом как другие библиотеки

А должна? Подсвечиваются ключевые слова тех библиотек, у которых есть файл "keywords.txt". У этой есть? С ним всё в порядке?

Clubbars79 пишет:

Что нужно сделать?

Можно забить, а можно сделать/поправить ей файл "keywords.txt"