Arduino + GSM/GPRS/GPS Shield(B) отправка СМС

Тема в разделе "Arduino & Shields", создана пользователем Vitalii_031, 5 мар 2017.

  1. Vitalii_031

    Vitalii_031 Нуб

    Добрый день знатокам, подскажите пожалуйста почему не отправляются СМС при отключении Arduino от COM порта, С подключенным кабелем проблем нет. Использую Arduino UNO и GSM/GPRS/GPS Shield(B).

    Код (Text):
    Настройка Shield
      mySerial.begin(19200);          //Скорость порта для связи Arduino с GSM модулем
      mySerial.println("AT+CLIP=1");       //включаем АОН
      delay(100);
      mySerial.println("AT+CMGF=1");       //режим кодировки СМС - обычный (для англ.)
      delay(100);
      mySerial.println("AT+CSCS=\"GSM\"");  //режим кодировки текста
      delay(100);
      mySerial.println("AT+CMGL=ALL");
      delay(100);
      Serial.setTimeout(20);

    Функция отправки СМС
    void sms(String text, String phone) {
      Serial.println("SMS send started");
      mySerial.println("AT+CMGS=\"" + phone + "\"");
      delay(1000);
      mySerial.print(text);
      delay(300);
      mySerial.print((char)26);
      delay(300);
      Serial.println("SMS send finish");
      delay(2000);
    }

    Отправка СМС по таймеру
    void to_Timer()
    {
       sms(String("Hello Word"), String("+79263333333"));
    }
     
    Последнее редактирование: 5 мар 2017
  2. Vitalii_031

    Vitalii_031 Нуб

    Неужели ни кто ни сталкивался с такой проблемой, помогите пожалуйста или дайте направление куда копать
     
  3. mcureenab

    mcureenab Гуру

    После отключения кабеля откуда электропитание берется?
     
  4. Vitalii_031

    Vitalii_031 Нуб

    Подавал с блока на сам Шилд 12в, ток на блоке до 10А, Пробовал еще подовать одновременно питание на USB, тоже с запасом по току, Еще пробывал 808 шилд, токая же проблемма.
     
  5. Sergei_mss

    Sergei_mss Нуб

    У меня такое случается, когда я для отладки использую монитор последовательного порта и при отключении Ардуино от компьютера забываю закомментировать.

    while (!Serial) {
    }
     
  6. Vitalii_031

    Vitalii_031 Нуб

    То есть ниже приведенные строки надо закоментить?
    Код (Text):
     void loop() {

      if (mySerial.available()) {
          Serial.write(mySerial.read());
          }
      if (Serial.available())  {
         mySerial.write(Serial.read());
       }
    }
     
    Последнее редактирование: 6 мар 2017
  7. Sergei_mss

    Sergei_mss Нуб

    А куска кода с While у Вас скетче нет? Если If-ы закоментите, то не поможет.
     
  8. Vitalii_031

    Vitalii_031 Нуб

    While нет, я так понял, что то что я раньше писал, это прослушивание шилда и порта
     
  9. mcureenab

    mcureenab Гуру

    Выходит, вы сначала выложили код который даже не выполняется. Может у вас еще какие скелеты припрятаны?
     
  10. Vitalii_031

    Vitalii_031 Нуб

    Да нет, у меня код работает, но при отключении кабеля USB, СМС перестают отправлятся
     
  11. mcureenab

    mcureenab Гуру

    Возможно, но не тот который вы здесь нарисовали.
    Если нужна помощь, выкладывайте весь скетч, а не вырезки, которые даже не имеют отношения к делу.
     
  12. Vitalii_031

    Vitalii_031 Нуб

    Код (Text):
    #include <SoftwareSerial.h>
    #include <EEPROM.h>
    #include <MsTimer2.h>
    SoftwareSerial mySerial(2, 3); // RX, TX

    void Setting_Phone();
    void EEPROM_Load();
    void sms(String text, String phone);

    void to_Timer();

    // Переменные

    char TelOut[30];            // переменная для хранения массива до 30 символов (Телефон)
    char TimeOut[30];           // переменная для хранения массива до 30 символов (Время между сеансами)
    char IPOut[30];             // переменная для хранения массива до 30 символов (IP адрес)

    int LOW_INTERVAL = 500;     // сколько времени выдавать LOW
    long HIGH_INTERVAL;         // сколько времени выдавать HIGH
    long HIGH_INT;

    void setup() {
       Setting_Phone();

       MsTimer2::set(HIGH_INTERVAL, to_Timer);  // Здесь задаем период
       MsTimer2::start();                       //Стартуем, теперь таймер запущен
    }

    void loop() {

       if (mySerial.available()) {
          Serial.write(mySerial.read());
          }
       if (Serial.available())   {
          mySerial.write(Serial.read());
          }
    }

    void Setting_Phone() {
      delay(2000);                          //время на инициализацию модуля
      Serial.begin(115200);                 //Скорость порта для связи Arduino с компьютером
     
      mySerial.begin(19200);                //Скорость порта для связи Arduino с GSM модулем
      mySerial.println("AT+CLIP=1");        //включаем АОН
      delay(100);
      mySerial.println("AT+CMGF=1");        //режим кодировки СМС - обычный (для англ.)
      delay(100);
      mySerial.println("AT+CSCS=\"GSM\"");  //режим кодировки текста
      delay(100);
      mySerial.println("AT+CMGL=ALL");
      delay(100);
      Serial.setTimeout(20);                // Время ожидания завершения передачи в порту
      EEPROM_Load();
      HIGH_INT = atol(TimeOut);             // Из String в long(большие числа)
      HIGH_INTERVAL = HIGH_INT * 1000L;
    }

    void EEPROM_Load() {
      // ------------------------ Чтение из EEPROM ------------------------
        EEPROM.get(0, TelOut);   // считываем массив символов по адресу addr 0
        EEPROM.get(30, TimeOut); // считываем массив символов по адресу addr 30
        EEPROM.get(60, IPOut);   // считываем массив символов по адресу addr 60
      // ------------------------------------------------------------------
    }

    void sms(String text, String phone) {
      Serial.println("SMS send started");
      mySerial.println("AT+CMGS=\"" + phone + "\"");
      delay(1000);
      mySerial.print(text);
      delay(300);
      mySerial.print((char)26);
      delay(300);
      Serial.println("SMS send finish");
      delay(2000);
    }

    void to_Timer()//Функция Таймер
    {
       sms(String("Hello Word"), TelOut);
    }
     
    А это то что видит монитор порта
    AT+CLIP=1
    OK
    AT+CMGF=1
    OK
    AT+CSCS="GSM"
    OK
    AT+CMGL=ALLSMS send started
    SMS send finish
    +CMGS: 64
    OK
     
  13. mcureenab

    mcureenab Гуру

    Функция to_Timer это обработчик прерывания, а вы в нее delay насовали. Оставьте в ней только взведение флага, а функцию sms вызывайте из функции loop если флаг поднят. В прочем, можно просто проверять сколько миллисекунд прошло без всяких флагов и прерываний.
     
  14. Vitalii_031

    Vitalii_031 Нуб

    Думаю дело не в этом, ведь с кабелем работает.
    Сделал так как вы посоветовали
    Код (Text):
    boolean flag_time = false; //сделал глобальной
    //Вставил в loop:
    if (flag_time == true) {
          sms(String("Hello Word"), TelOut);
          flag_time = false;
       }
    //Изменил в таймере на
    flag_time = true;
    Результат тот же, без кабеля USB не работает.
     
    Последнее редактирование: 6 мар 2017
  15. Vitalii_031

    Vitalii_031 Нуб

    Всем добрый день, возможно у кого то есть еще идеи по данной теме?
     
  16. mcureenab

    mcureenab Гуру

    Код (C++):
    #define USE_SERIAL

    #ifdef USE_SERIAL
    Serial.print....
    #endif

     
    Похоже на баг. Раз модуль должен работать без USB, закоментируйте строчки со словом Serial.
    Для этого лучше использовать директивы препроцессора
     
    Последнее редактирование: 7 мар 2017
  17. Vitalii_031

    Vitalii_031 Нуб

    То есть исключить все общение с СОМ портом?
     
  18. Vitalii_031

    Vitalii_031 Нуб

    Проблема осталась, засяду за книги, обязательно отпишусь после решения.
     
  19. mcureenab

    mcureenab Гуру

    Выходит Serial тут не причем? Может быть все же питание?
     
  20. Vitalii_031

    Vitalii_031 Нуб

    Решил сделать проверку, так как точки входа невозможно отследить программно (USB кабель отключен), я решил просто подключить светодиод и включением и выключением проверить прохождение выполнения кода. И был в полном восторге, когда он срабатывал идеально. Соответственно пришла в голову следующая мысль, что библиотека SoftwareSerial перестает работать при отключенном порте. Сейчас пробую найти другую библиотеку и запустить с ней.