МП3 плеер с управлением через смс
- Войдите на сайт для отправки комментариев
Втр, 19/11/2019 - 15:57
Доброго времени форумчане! Заинтересовал проект мп3 плеера с управлением через gsm модуль смсками. Скетч готовый есть, собрал все вроде по фэншую, и не работает( Помогите, подскажите, что сделано не так!!!
Moderator : пожалуйста, вставьте код правильно (возможно, новым сообщением в тему), как описано в http://arduino.ru/forum/obshchii/vstavka-programmnogo-koda-v-temukommentarii
что сделано не так!!!
1. не так опубликован код.
Дальше не смотрел, сначала опубликуйте как положено.
#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 }Проверьте 38 строку и 121 не нравиться.
#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 }Доброго времени суток! Подскажите, установил библиотеку, но она похоже не работает, не подсвечивается цветом как другие библиотеки. Что нужно сделать?
не подсвечивается цветом как другие библиотеки
А должна? Подсвечиваются ключевые слова тех библиотек, у которых есть файл "keywords.txt". У этой есть? С ним всё в порядке?
Что нужно сделать?
Можно забить, а можно сделать/поправить ей файл "keywords.txt"