SMS модуль

Тема в разделе "Посоветуйте детальки", создана пользователем DrProg, 2 авг 2015.

  1. a1000

    a1000 Гуру

    Полистав справочник АТ команд и выудил команду AT+CMGD=1,4 которая удаляет все сообщения из памяти. Теперь надо придумать как привязать эту команду к функции millis() , что-бы раз в сутки очищать память СМС.
     
  2. Onkel

    Onkel Гуру

    остановится. нужно стирать старые смс.
     
  3. Onkel

    Onkel Гуру

    это не обязательно. я делаю так - запрашиваю к-во смс, и когда к-во смс больше 0,8 максимума, тру самые старые.
    пы сы симки у меня не самые последние, 1-2 годовой давности, в разных симках от 20 до 30 смс может храниться. поэтому я запрашиваю макс. емкость и тру половину когда у меня 0.8 емкости заполнено, так что постоянно заполнено от 0,3 до 0,8 емкости.
     
    Последнее редактирование: 5 окт 2015
  4. DrProg

    DrProg Вечный нерд

    Да можно сразу после приема СМС стирать его. Зачем хранить? Приняли, распознали и выполнили
    AT+CMGD=1
     
    ИгорьК нравится это.
  5. Onkel

    Onkel Гуру

    я так не делаю. может еще пригодится, для разборок каких. Пусть будут.
     
  6. DrProg

    DrProg Вечный нерд

    AT+CMGD=20
    пусть хранится 20 штук )
     
    ИгорьК нравится это.
  7. Onkel

    Onkel Гуру

    у меня одна мегафонская симка только 10 умеет помнить.
     
  8. a1000

    a1000 Гуру

    Возникла одна проблемка. Пробую подружить этот модуль с ПК. Подключаю к USB через переходник USB-UART. Через гипертерминал всё идёт на ура. Принимает и отправляет СМС, совершает исходящие звонки, реагирует на входящие. Вообщем всё ОК! Решил с помощью процессинга создать графический интерфейс. И тут засада. Вот часть кода:
    Код (C++):
    port.write("AT");         // отправляем команду в COM-порт.
        delay (100);

    if (port.available() > 0){  // проверяем есть-ли что на СОМ порту
        println(port.readString());   // печатаем данные с СОМ порта
      }

    Вместо ожидаемого "ОК" получаю "АТ". При попытке совершить исходящий звонок командой "ATD+38хххххххххх;" в ответ опять получаю то, что и отправлял "ATD+38хххххххххх;". Звонок, соответственно не совершается. Команды не доходят до модуля, "застряют" в СОМ порту и при выполнении port.readString() считываются обратно. При этом полностью адекватная реакция на входящие звонки и СМС. в консоли печатается всё так как и должно быть. Направление "от модуля а ПК" работает нормально. Кто может подсказать где засада?

    PS: Чуть не забыл - изменение задержки не помогает. Пробовал разные варианты от 0 до 5 секунд. Результат тот-же, за исключением того, что на задержках близких к 0 возникают сбои.
     
  9. Onkel

    Onkel Гуру

    команда должна завершаться \D или \С (конец / перенос строки), терминал видимо вставляет конец строки автоматически. Посмотрите, какой у вас должен быть терминатор строки.
     
  10. a1000

    a1000 Гуру

    Заработало. Только здесь пришлось добавить \r. Осталось, правда одно недоразумение - в консоли печатается и команда и ответ модуля. Это можно как-то вылечить? Хочется получать только ответ модуля.
     
  11. Onkel

    Onkel Гуру

    echo off в консоли не помогает?
    если нет, то смотрите команды модуля echo off
     
  12. a1000

    a1000 Гуру

    Тут немного не так. Консоль встроена в IDE. На неё возможен только вывод. Команду echo off применить нельзя. Да и вывод в консоль не является конечным результатом. Я туда вывожу промежуточные результаты в процессе написания и отладки. Просто не хотелось потом исхитряться и сортировать где повтор команды, а где ответ модуля. Ну ничего, поэксперементируем. Спасибо за помощь!
     
  13. Onkel

    Onkel Гуру

    у меня точно эха нет, я правда уже и не помню, какой параметр я выставлял и не помню, как там по умолчанию.
     
  14. Airbus

    Airbus Радиохулиган Модератор

    Круто!Я тоже играюсь с ГПРС шилдами надо малыша прикупить для экспериментов
     
  15. stensilart

    stensilart Нуб

    Постоянно горит LED2, при этом команды и звонки принимаются? Что может быть?
     
  16. DrProg

    DrProg Вечный нерд

    Питание наверное? )
     
    ИгорьК нравится это.
  17. KAA-Lab

    KAA-Lab Нерд

    Как показала практика почти все модули которые мы заказывали были настроены на скорость 57600. Но на этой скорости подружить их с Ардуиной не получилось. Лечил я их так:
    Код (C++):
    SoftwareSerial gsm_uart(GSM_RX_PIN, GSM_TX_PIN);
    //...
    gsm_uart.begin(57600);
    sendAtCmd("AT+IPR=19200");
    gsm_uart.begin(19200);
    sendAtCmd("AT+IPR?");
    sendAtCmd("AT&W");
    А вот и простенькая функция в помощь:
    Код (C++):
    bool sendAtCmd(String at_send, String ok_answer="OK", String err_answer = "", uint16_t wait_sec = 1) {
        uint32_t exit_ms = millis() + wait_sec * 1000;
        String answer;

        Serial.println(at_send);
        if (at_send != "") gsm_uart.println(at_send);

        while (millis() < exit_ms) {
            if (gsm_uart.available()) {
                answer = gsm_uart.readString();
                if (err_answer != "" && (answer.indexOf(err_answer) > -1 || err_answer.indexOf(answer))) {
                    Serial.println(answer);
                    Serial.println("AT_ERR");
                    return false;
                }
                else if (answer.indexOf(ok_answer) > -1) {
                    Serial.println(answer);
                    Serial.println("AT_OK");
                    return true;
                }
            }
        }
        Serial.println("AT_TIMEOUT");

        return false;
    }
     
    Последнее редактирование: 15 окт 2015
  18. esa

    esa Нуб

    Добрый день.
    Подскажите в чем может быть проблема? Постоянно ардуина пишет "MODEM:STARTUP"
    Менял симки (3 шт), правда оператор один - Мегафон

    Код (C++):

    AT+IPR=19200
    AT_TIMEOUT
    AT+IPR?
    AT+IPR?

    +IPR: 19200

    OK

    AT_OK
    AT&W
    AT&W

    OK

    AT_OK
    GSM Neoway M590 example
    ATI

    NEOWAY
    M590
    REVISION 01.30d

    OK
    AT+CSQ

    +CSQ: 30,0

    ATI

    NEOWAY
    M590
    REVISION 01.30d

    OK
    AT+CSQ

    +CSQ: 30,0

    MODEM:STARTUP

    ATI

    NEOWAY
    M590
    REVISION 01.30d

    OK
    AT+CSQ

    +CSQ: 30,0

    MODEM:STARTUP

    MODEM:STARTUP

    ATI

    NEOWAY
    M590
    REVISION 01.30d

    OK
    AT+CSQ

    +CSQ: 30,0

    MODEM:STARTUP

    MODEM:STARTUP

    MODEM:STARTUP

    ATI

    NEOWAY
    M590
    REVISION 01.30d

    OK
    AT+CSQ

    +CSQ: 30,0

    MODEM:STARTUP

    MODEM:STARTUP

    MODEM:STARTUP

    MODEM:STARTUP

    ATI

    NEOWAY
    M590
    REVISION 01.30d

    OK
    AT+CSQ

    +CSQ: 30,0

    MODEM:STARTUP

    MODEM:STARTUP

    MODEM:STARTUP

    MODEM:STARTUP

    MODEM:STARTUP

    ATI

    NEOWAY
    M590
    REVISION 01.30d

    OK
    AT+CSQ

    +CSQ: 30,0

    MODEM:STARTUP

    MODEM:STARTUP

    MODEM:STARTUP

    MODEM:STARTUP

    MODEM:STARTUP

    +PBREADY

     
    Мой скетч
    Код (C++):
    #include <SoftwareSerial.h>
    SoftwareSerial mySerial(2, 3);          // RX, TX
    int ch = 0;
    String val = "";
    #define MASTER "+7123456789"          //укажите  телефон хозяина

    //------------------------------------------------------------------------------------------------------------
    bool sendAtCmd(String at_send, String ok_answer="OK", String err_answer = "", uint16_t wait_sec = 1) {
        uint32_t exit_ms = millis() + wait_sec * 1000;
        String answer;

        Serial.println(at_send);
        if (at_send != "") mySerial.println(at_send);

        while (millis() < exit_ms) {
            if (mySerial.available()) {
                answer = mySerial.readString();
                if (err_answer != "" && (answer.indexOf(err_answer) > -1 || err_answer.indexOf(answer))) {
                    Serial.println(answer);
                    Serial.println("AT_ERR");
                    return false;
                }
                else if (answer.indexOf(ok_answer) > -1) {
                    Serial.println(answer);
                    Serial.println("AT_OK");
                    return true;
                }
            }
        }
        Serial.println("AT_TIMEOUT");

        return false;
    }
    //------------------------------------------------------------------------------------------
    void setup()
    {
      Serial.begin(19200);                  //подключаем порт компьютера

      mySerial.begin(57600);                //подключаем порт модема (при других скоростях не отвечает)
      sendAtCmd("AT+IPR=19200");
      mySerial.begin(19200);
      sendAtCmd("AT+IPR?");
      sendAtCmd("AT&W");

      Serial.println("GSM Neoway M590 example");
      mySerial.println("ATI");              //вывести в терминал иноформацию о модеме
      delay(100);
      mySerial.println("AT+CSQ");          //вывести в терминал уровень сигнала (если 99, то связи нет)
      delay(100);
      mySerial.println("AT+CLIP=1");        //включаем АОН
      delay(100);
      mySerial.println("AT+CMGF=1");        //режим кодировки СМС - обычный (для англ.)
      delay(100);
      mySerial.println("AT+CSCS=\"GSM\"");  //режим кодировки текста
      delay(100);
      mySerial.println("AT+CNMI=2,2");      //отображение смс в терминале сразу после приема (без этого сообщения молча падают в память)
    }

    void loop()
    {
      if (mySerial.available()) {          //есть данные от GSM модуля
        delay(200);                        //выждем, чтобы строка успела попасть в порт целиком раньше чем будет считана
        while (mySerial.available()) {      //сохраняем входную строку в переменную val
          ch = mySerial.read();
          val += char(ch);
          delay(10);
        }
        Serial.println(val);                    // дублируем сообщение в терминал

        //----------------------- определение факта приема СМС и сравнение номера(ов) с заданным(и)
        if (val.indexOf("+CMT") > -1) {          //если обнаружен СМС (для определения звонка вместо "+CMT" вписать "RING", трубку он не берет, но реагировать на факт звонка можно)
          if (val.indexOf(MASTER) > -1) {        //если СМС от хозяина
            Serial.println("--- MASTER SMS DETECTED ---");
          } else {
            Serial.println("NO MASTER SMS");
          }

          //----------------------- поиск кодового слова в СМС (вообще эту часть надо поместить внутрь предыдущей, но если использовать кодовое слово не совпадающее с сообщениями модема, то не обязательно)
          if (val.indexOf("sendme") > -1) {      // если обнаружено кодовое слово
            Serial.println("send you ok");      // сообщаем об этом в терминал (если нужно)
            sms("yes sir!", MASTER);            // отвечаем смской
          } else {                              // если другое слово или вообще пустое сообщение
            Serial.println("no send you");
            sms("no sir!", MASTER);
          }
          val = "";
        }
      }
    }

    void sms(String text, String phone)  //процедура отправки СМС
    {
      Serial.println("SMS send started");
      mySerial.println("AT+CMGS=\"" + phone + "\"");
      delay(500);
      mySerial.print(text);
      delay(500);
      mySerial.print((char)26);
      delay(500);
      Serial.println("SMS send complete");
      delay(2000);
    }
     
     
  19. KAA-Lab

    KAA-Lab Нерд

    Проблемы с питанием. Я в своем блоге указывал, что не стоит подключать данный модуль к питанию Ардуины - не потянет. В документации на модуль сказано, что в пике он может потреблять до двух ампер. Если подавать питание от USB-TTL конвертера то модуль работает довольно стабильно. Я его запитываю от 6В аккума через два диода.

    Блок команд:
    Нужно выполнить только один раз, после этого модем перенастроится на скорость 19200 и сохранит эти настройки. Потом в коде нужно просто устанавливать скорость порта mySerial.begin(19200).

    Выполняйте все AT команды через функцию sendAtCmd - это упростит контроль результата.
     
    Последнее редактирование: 16 окт 2015
    esa нравится это.
  20. esa

    esa Нуб

    А не подскажите где этот блог находится?. На форуме вы писали только о смене скорости модема. Больше ваших сообщений я не нашел.
    Спасибо