Распознавание вызова и команд с сотового при звонке на Cosmo GSM
  • Здравствуйте!
    Приобрели шилд Cosmo GSM, и Arduino UNO. Покупка совершалась под проект создания модуля, управляющего исполнительными устройствами по звонку с сотового телефона.
    Подскажите пожалуйста, каким образом распознать, что происходит вызов или пришла СМС. Если конечно возможно - то и как разобрать на Arduino текст сообщения.
    Подключил шилд к плате по инструкции, с перемычками тоже делал все как сказано, AT команды из Serial Monitor тоже проходят нормально, при работе с микроконтроллером тестовый скетч по отправке СМС сработал (хотя и не сразу).
    При работе шилда с Serial Monitor при звонке на номер шилда в окне отображаются сообщения типа "+CRING". Пробовал в функции loop() написать обработчик, который бы считывал из Serial данные и сравнивал полученную строку с паттерном "+CRING", но ничего не получилось (после заливки этого скетча я не забывал переключить джампера).
    Когда прописывал в loop() вызов команды "АТА", то при звонке на шилд трубка поднимается.
    Пока хотелось бы научиться распознавать сам факт наличия вызова и включения на время вызова светодиода на 13 порту. Могли бы подсказать пример кода?
    Ну, и если можно, то и код для обработки входящего сообщения. Для начала устроит что-нибудь типа такого: пришла СМС с цифрой "1" - включить устройство, с "0" - выключить.
  • xfish said:

    Пока хотелось бы научиться распознавать сам факт наличия вызова и включения на время вызова светодиода на 13 порту. Могли бы подсказать пример кода?


    Добрый день!
    У нас сейчас пишется небольшая либа по работе с GSM-шилдом. Несмотря на то, что это еще бета-версия и некоторые моменты будут обновлены на днях, тем не менее можете в ней глянуть как происходит обработка ответных сообщений от модема. В частности там используется сравнение звонящего номера с тем, который указан в программе. Если номера совпадают - модем отправляет на этот номер сообщение.
    Аналогично можно поступить и с разбором входящим СМС сообщений.

    Скачать либу можно с Github.
  • Благодарю за помощь!

    У меня получилось.
    Вот код, который применял:

    #include GSM.h

    boolean flag = false;
    int LED = 1;
    long previousMillis = 0; // храним время последней попытки подключения
    unsigned long currentMillis=0; // время текущей попытки подключения
    long interval = 600000; // интервал между попытками регистрации в сети

    void setup(){
    pinMode(13, OUTPUT);
    digitalWrite(13, HIGH);
    GSM.begin();
    if (GSM.Init(PSTR("0000")) > 0) flag = true;
    }


    void loop(){
    currentMillis = millis();
    if (flag){
    if (GSM.RingWait_void()){
    GSM.HangUpCall();
    if(LED==1){
    LED=0;
    digitalWrite(13, LOW);
    } else {
    LED=1;
    digitalWrite(13, HIGH);
    }
    }
    } else {
    digitalWrite(13, HIGH);
    delay(100);
    digitalWrite(13, LOW);
    delay(100);
    digitalWrite(13, HIGH);
    delay(100);
    digitalWrite(13, LOW);
    delay(1000);
    }
    //проверяем не прошел ли нужный интервал, если прошел то
    if(currentMillis - previousMillis > interval) {
    previousMillis = currentMillis; // сохраняем время последней попытки
    digitalWrite(7, HIGH);
    delay(1000);
    digitalWrite(7, LOW);
    setup(); //перерегистрируемся
    }
    }


    Правда пришлось подкорректировать библиотеку. Убрал проверку пин-кода в классе Init(const char* PIN): :
    rx_flag=1;
    ...
    //if (strstr_P(RX_LINE1, PSTR("OK")))
    if (rx_flag==1)
    {
    ...

    И дописал метод RingWait_void(), не требующий номера абонента/:
    s8 GSMClass::RingWait_void() {
    FlushRX();
    while (1) {
    //Ждем сообщение "RING"
    GetResponse (RX_LINE1);
    GetResponse (RX_LINE2);
    if (strstr_P(RX_LINE1, PSTR("RING"))) return 1;
    else return 0;
    }
    }

    т.к. тот, который шел в библиотеке почему-то отказывался работать как надо - вызов осуществлялся, годок шел, а код в if (GSM.RingWait(CallerID)) почему-то срабатывал только один раз. При втором звонке вызов идет, а код не работает.

    Хотя и так шилд работает как-то нестабильно. Может быть проблема в пониженном питании, которое подается на него с Arduino? Можно ли решить эту проблему, если это действительно так?
  • xfish said:

    т.к. тот, который шел в библиотеке почему-то отказывался работать как надо - вызов осуществлялся, годок шел, а код в if (GSM.RingWait(CallerID)) почему-то срабатывал только один раз. При втором звонке вызов идет, а код не работает.


    Пример скетча, который дается вместе с библиотекой - тестировался в течение 72 часов непрерывной работы. Из более 150 вызовов, только 4 не были обработаны.
    В вашем случае, возможно, конфликт происходит из-за delay в скетче. Мы сейчас попробуем для большей корректности в библиотеке использовать прерывания. С Ардуино это не совсем просто.

    xfish said:

    Хотя и так шилд работает как-то нестабильно. Может быть проблема в пониженном питании, которое подается на него с Arduino? Можно ли решить эту проблему, если это действительно так?


    Сам модуль M33G очень стабильный в работе.
    Если возникают какие-то проблемы - в первую очередь смотрите питание и логику ПО.

    По питанию - с Ардуино на шилд должно идти 5V. При подаче такого напряжения на модем поступает стабилизированные 3.8V (интервал работы модема 3.3 - 4.2 V). Чтобы Ардуино выдавал эти 5V внешний источник питания должен быть на 7-9 вольт.

    В библиотеку мы еще добавим опцию проверки статуса подключения к сети. Чтобы в случае отсутствия соединения модуль переподключился. Например, было падение напряжения и на шилд шло менее 3.3V - в этом случае модем перестал работать, а вот микроконтроллер продолжал свою работать, т.к. у него минимальный уровень напряжения (по памяти) 2.7V. Или же базовая станция оператора разорвало соединение и нужно заного подключиться к сети.


Привет, незнакомец!

Похоже, вы новенький! Чтобы пообщаться с нами, кликните на одну из кнопок ниже :)

Войти с помощью OpenID

В этом теме: