GSM Shield SIM 900R от амперки -все вопросы сюда!

Тема в разделе "Arduino & Shields", создана пользователем НКВД, 30 янв 2016.

  1. НКВД

    НКВД Нерд

    image.jpeg Привет всем! подскажите - где на этом шилде ставить перемычку? - что бы не включать программно старое лекарство не подошло так как кнопки тут ваще нет ( - подразумевается, только программное вкючение типа лайт)! Заранее спасибо
     
  2. Airbus

    Airbus Радиохулиган

    Сдаётся мне аппаратно включить нельзя (раз нет включателя?) только программно длительным (1-2) сек подачей +5 вольт на пин 9 хотя можно соединить два провода от пин 9 и +5 вольт и замкнуть их вручную на пару секунд.Пробуйте
     
  3. НКВД

    НКВД Нерд

    Программно я включаю - ставлю перемычку на пин 9 (можно выбрать любой не занятый пин ) и пин 2 ножка RK , вот на эту RK и надо подавать 5 вольт на 3 сек - просто я не понял , нафига столько гемора - даже программно включать с перемычкой - хотел сразу замкнуть и забыть!)
     
  4. Airbus

    Airbus Радиохулиган

    Ну включать кнопкой не есть гут!Зачем когда Ардуино и включит и если надо выключит.У меня на Кетайском шилде и кнопка есть и авто.кнопкой не пользуюсь потому как неудобно.На шилде который паял сам на Sim900 всё в автомате.
     
  5. НКВД

    НКВД Нерд

    Согласен ! выводы сделал - просто первое что пришло в голову , когда включал впервый раз - спасибо !
     
  6. Jungle Cat

    Jungle Cat Нуб

    Всем доброго времени суток!
    Прошу совета у знающих людей. Недавно стал обладателем GPRS-шилда на SIM900R от Амперки. Установил библиотеку, попробовал образцы скетчей. Звонки входящие и исходящие есть (гарнитуру не присоединял, но на телефон звонит и с телефона сигнал принимает). SMS на телефон тоже отправляет влёгкую, а вот с приёмом (чтением) какая-то проблема. В монитор последовательного порта выводятся сообщения об успешной инициализации и предложение послать SMS:

    GPRS init success
    Please send SMS message to me!

    Далее ничего. Никакой реакции на посылаемые SMS. В чём может быть дело?
    Допустил какие-то накладки при связи с монитором последовательного порта. Закомментарил всё, что имело отношение к Serial, а в качестве сигнала о приёме разместил обратный gprs.sendSMS, отсоединил плату с GPRS-шилдом от компьютера, и запитал отдельно от источника 5В 2А. Результат тот же.
    Создалось впечатление, что функция gprs.ifSMSNow() не работает.

    Модуль Iskra Neo (пробовал с тем же результатом Arduino UNO, Arduino Leonardo).
    Библиотека взята отсюда: https://github.com/amperka/gprs-shield
    Оператор МТС.

    В чём может быть дело? У кого-нибудь есть образец скетча, 100%-но работающий на этом шилде? Может, где-то надо номер операторского SMS-шлюза прописать?
     
  7. Airbus

    Airbus Радиохулиган

    Скетч плиз
     
  8. НКВД

    НКВД Нерд

    Добрый ! день у меня была такая же проблема ! ездил с шилдом в службу поддержки- оказалось на последних шилдах прошивка к которой не адаптированы библиотеки! Сейчас заново перепишут и выложат - думаю на днях - переодически узнаю!
     
    Jungle Cat нравится это.
  9. Jungle Cat

    Jungle Cat Нуб

    Airbus, скетч стандартный, "GPRS_ReadSMS.ino" из библиотечной папки. Там, кстати, в комментариях на github'е у трёх файлов указано "fix function readSMS". Т.е. возможно, что подобные проблемы возникали ранее.

    Код (C++):
    // библиотека для работы с GPRS устройством
    #include <GPRS_Shield_Arduino.h>
    // библиотека для эмуляции Serial-порта
    // она нужна для работы библиотеки GPRS_Shield_Arduino
    #include <SoftwareSerial.h>
    // длина сообщения
    #define MESSAGE_LENGTH 160
    // номер сообщения в памяти сим-карты
    int messageIndex = 0;
    // текст сообщения
    char message[MESSAGE_LENGTH];
    // номер, с которого пришло сообщение
    char phone[16];
    // дата отправки сообщения
    char datetime[24];
    // создаём объект класса GPRS. По умолчанию скорость общения с ним 9600 бод
    // с помощью него будем давать команды GPRS шилду
    GPRS gprs;
    void setup()
    {
      // включаем GPRS-шилд
      gprs.powerUpDown();
      // открываем последовательный порт для мониторинга действий в программе
      Serial.begin(9600);
      while (!Serial) {
        // ждём пока не откроется монитор последовательного порта
        // для того, чтобы отследить все события в программе
      }
      // проверяем, есть ли связь с GPRS-устройством
      while (!gprs.init()) {
        // если связи нет, ждём 1 секунду
        // и выводим сообщение об ошибке;
        // процесс повторяется в цикле,
        // пока не появится ответ от GPRS-устройства
        delay(1000);
        Serial.print("Init error\r\n");
      }
      // выводим сообщение об удачной инициализации GPRS Shield
      Serial.println("GPRS init success");
      Serial.println("Please send SMS message to me!");
    }
    void loop()
    {
      // если пришло новое сообщение
      if (gprs.ifSMSNow()) {
        // читаем его
        gprs.readSMS(message, phone, datetime);

        // выводим номер, с которого пришло смс
        Serial.print("From number: ");
        Serial.println(phone);
        // выводим дату, когда пришло смс
        Serial.print("Datetime: ");
        Serial.println(datetime);
        // выводим текст сообщения
        Serial.print("Recieved Message: ");
        Serial.println(message);
      }
    }

    Скетч привёл в первоначальном виде, без каких-либо правок с моей стороны.

    НКВД, хорошо, если выложат. Просто я думал, что кто-то уже победил этот девайс и заставил его правильно работать с входящими SMS.
     
  10. Diogenchik

    Diogenchik Нерд

    Jungle Cat, Дело в настройках оповещения о получение смс самим шилдом (чипом). Скорее всего у Вас команда "AT+CNMI?" даст "CNMI=2,1,0,0,0". Замените вторую цифру на "2" и скетч заработает. (AT+CNMI=2,2,0,0,0)
     
    acos, Alega и Jungle Cat нравится это.
  11. Jungle Cat

    Jungle Cat Нуб

    Diogenchik, спасибо огромное за совет! В самом деле, так и было. Заменил, и скетч заработал! Правда, пока ещё не полностью разобрался с AT-командами и порядком их применения, пришлось модернизировать скетч GPRS_AT_Сommands.ino из Wiki, применить команду "AT+CNMI=2,2,0,0,0" через строку монитора последовательного порта, а уже затем загружать вышеописанный скетч. Наверняка можно было и проще путь найти, со временем в процессе изучения пойму. Но сейчас главное - работает! Насколько я понял, эта команда даётся только один раз и запоминается GPRS-шилдом где-то в энергонезависимой памяти, правильно?
     
  12. Diogenchik

    Diogenchik Нерд

    Jungle Cat, Правильно. Судя по блок-схеме чипа SIM900 флеш память у него присутствует. Но все ли настройки он там хранит?...
     
  13. Alega

    Alega Нуб

    Вставил в сетап скетча "GPRS_ReadSMS.ino"
    строчку
    Serial.print("AT+CNMI=2,2,0,0,0\r");
    получил смс, спасибо
     
    Последнее редактирование: 6 мар 2016
  14. Er1in1

    Er1in1 Нуб

    Добрый день !
    народ, помогите. Как получить номер телефона звонящего с помощью команды
    gprsSerial.println("AT + CLCC") ?
    Я использовал стандартный скетч для входящего звонка и пытался считывать символы в буффер по аналогии как считывается RING, но ничего не вышло.
    Цель состоит в том, чтобы определять номер звонящего, сравнивать с разрешенными номерами в скетче и выполнять\не выполнять какое либо действие.
    В gsm.h я нашел стандартную реализованную функцию retrieveCallingNumber(); но в библиотеке GPRS шилда амперки такого нет (
    Если кто сталкивался с такой бедой, поделитесь плз скетчем
     
  15. s1984i

    s1984i Нерд

    в примерах видел так определяют номер. правда у меня пока не вышло самому определить номер. тоже бьюсь над этой задачей. если найдёшь решение свистни.
    AT+CLIP=1 После его включения при входящем вызове выдает не просто сообщениеRING, а еще добавляет строку типа
    +CLIP: "+7XXXXXXXXXX",145,"",,"",0 или
    +CLIP: "+7XXXXXXXXXX",145,"",,«main»,0

    Где
    • "+7XXXXXXXXXX", номер абонента
     
  16. Er1in1

    Er1in1 Нуб

    Ищу уже довольно долго, но поиски тщетны, AT+CLCC, AT+CLIP=1... различие только в том что AT+CLCC нужно выполнить после получения RING, чтобы разграничивать инфу от модуля (т.е это звонок, или может это смс)
    , что тут даже не важно каким именно образом модуль будет отдавать номер телефона, задача в том как это все считать и сравнить с списком номеров, прописанных в коде. Я не дружу с регулярными выражениями ( Вот как сделать так чтобы при чтении из модуля
    +CLCC: 1,1,4,0,0,"+7XXXXXXXXX",145,"" код вытаскивал "+7XXXXXXXXX" не смотря на другие параметры и сравнивал хоть с массивом телефонов, хоть с константами...
     
  17. s1984i

    s1984i Нерд

    Продолжаю мучать sim 900
    Пример исходящего звонка через SoftwareSerial из примера на сайте почему не работает? что не так?
    Arduino: 1.7.7 (Windows 7), Плата"Arduino Uno"

    Изменена опция сборки, пересобираем все

    sketch_mar26a.ino:14:23: error: no matching function for call to 'GPRS::GPRS(int, int, int, int)'

    sketch_mar26a.ino:14:23: note: candidates are:

    In file included from sketch_mar26a.ino:2:0:

    C:\Users\home\Documents\Arduino\libraries\GPRSShield/GPRS_Shield_Arduino.h:56:5: note: GPRS::GPRS(uint8_t, uint8_t, uint32_t)

    GPRS(uint8_t tx, uint8_t rx, uint32_t baudRate = 9600 );

    ^

    C:\Users\home\Documents\Arduino\libraries\GPRSShield/GPRS_Shield_Arduino.h:56:5: note: candidate expects 3 arguments, 4 provided

    C:\Users\home\Documents\Arduino\libraries\GPRSShield/GPRS_Shield_Arduino.h:54:5: note: GPRS::GPRS(uint32_t)

    GPRS(uint32_t baudRate = 9600);

    ^

    C:\Users\home\Documents\Arduino\libraries\GPRSShield/GPRS_Shield_Arduino.h:54:5: note: candidate expects 1 argument, 4 provided

    C:\Users\home\Documents\Arduino\libraries\GPRSShield/GPRS_Shield_Arduino.h:47:7: note: GPRS::GPRS(const GPRS&)

    class GPRS

    ^

    C:\Users\home\Documents\Arduino\libraries\GPRSShield/GPRS_Shield_Arduino.h:47:7: note: candidate expects 1 argument, 4 provided

    Ошибка компиляции.

    Это сообщение будет содержать больше информации чем
    "Отображать вывод во время компиляции"
    включено в Файл > Настройки



    так же шилда не реагирует на AT команды
     
    Последнее редактирование: 27 мар 2016
  18. BoNzo

    BoNzo Нуб

    Ребят, помогите, запутался полностью.
    Сделал так, как писали, ввел строчку Serial.print("AT+CNMI=2,2,0,0,0\r") в setup. Все работает, сообщения читаются. Но в скетче по управлению розеткой, смс пытаюсь отправить - на телефон ничего не приходит.
    При этом если из библиотеки запускаю просто скетч SenSMS - сообщение на телефон приходит.
    Код (C++):
    // библиотека для работы с GPRS устройством
    #include <GPRS_Shield_Arduino.h>
    // библиотека для эмуляции Serial-порта
    // она нужна для работы библиотеки GPRS_Shield_Arduino
    #include <SoftwareSerial.h>
    // длина сообщения
    #define MESSAGE_LENGTH 160
    // текст сообщения о включении розетки
    #define MESSAGE_ON  "Power is On"
    // текст сообщения о выключении розетки
    #define MESSAGE_OFF  "Power is Off"
    // текст сообщения об ошибке распознавания команды
    #define MESSAGE_ERROR  "Error...unknown command!"

    //контакт реле 1
    #define RELAY 5
    //контакт реле 2
    // номер сообщения в памяти сим-карты
    int messageIndex = 0;
    // текст сообщения
    char message[MESSAGE_LENGTH];
    // номер, с которого пришло сообщение
    char phone[16];
    // дата отправки сообщения
    char datetime[24];

    bool stateRelay = false;
    // создаём объект класса GPRS. По умолчанию скорость общения с ним 9600 бод
    // с помощью него будем давать команды GPRS шилду
    GPRS gprs;
    void setup()
    {
      pinMode (RELAY, OUTPUT);
      digitalWrite (RELAY,LOW);

      // включаем GPRS-шилд
      gprs.powerUpDown();
      // открываем последовательный порт для мониторинга действий в программе
      Serial.begin(9600);
      while (!Serial) {
        // ждём пока не откроется монитор последовательного порта
        // для того, чтобы отследить все события в программе
      }
      // проверяем, есть ли связь с GPRS-устройством
      while (!gprs.init()) {
        // если связи нет, ждём 1 секунду
        // и выводим сообщение об ошибке;
        // процесс повторяется в цикле,
        // пока не появится ответ от GPRS-устройства
        delay(1000);
        Serial.print("Init error\r\n");
      }
      // выводим сообщение об удачной инициализации GPRS Shield
      Serial.print("AT+CNMI=2,2,0,0,0\r");
      Serial.println("GPRS init success");
      Serial.println("Please send SMS message to me!");
    }
    void loop()
    {
      // если пришло новое сообщение
      if (gprs.ifSMSNow()) {
        // читаем его
        gprs.readSMS(message, phone, datetime);

        // выводим номер, с которого пришло смс
        Serial.print("From number: ");
        Serial.println(phone);
        // выводим дату, когда пришло смс
        Serial.print("Datetime: ");
        Serial.println(datetime);
        // выводим текст сообщения
        Serial.print("Recieved Message: ");
        Serial.println(message);
        setRelay(phone, message);
      }
    }

    void setRelay(char f_phone[], char f_message[])
    {
      if (strcmp(f_message, "On") == 0) {
        // если сообщение — с текстом «On»,
        // выводим сообщение в Serial
        // и подаём на замыкаем реле
        Serial.println("OK! Power On");
        digitalWrite(RELAY, HIGH);
        stateRelay = true;
        // на номер, с которого пришёл запрос,
        // отправляем смс с текстом о включении питания
        gprs.sendSMS(f_phone, MESSAGE_ON);
      } else if (strcmp(f_message, "Off") == 0) {
        // если пришло сообщение с текстом «Off»,
        // выводим сообщение в Serial
        // и размыкаем реле
        Serial.println("OK! Power Off");
        digitalWrite(RELAY, LOW);
        stateRelay = false;
        // на номер, с которого пришёл запрос
        // отправляем смс с текстом о выключении питания
        gprs.sendSMS(f_phone, MESSAGE_OFF);
      } else if (strcmp(f_message, "State") == 0) {
        // если пришло сообщение с текстом «State»,
        // отправляем сообщение с состоянием реле
        if (stateRelay) {
          Serial.println("State: Power On");
          gprs.sendSMS("f_message", MESSAGE_ON);
        } else {
          Serial.println("State: Power Off");
         gprs.sendSMS("f_message", MESSAGE_OFF);
        }
      } else {
        // если сообщение содержит неизвестный текст,
        // отправляем сообщение с текстом об ошибке
        Serial.println("Error... unknown command!");
        gprs.sendSMS(f_phone, MESSAGE_ERROR);
      }
    }

    Также прошу объяснить поподробней о AT+CNMI=2,2,0,0,0\r?
     
    Последнее редактирование: 1 апр 2016
  19. Diogenchik

    Diogenchik Нерд

    Вытяжка из справочника по АТ командам :

    Команда производит отбор процедуры индикации о получении нового сообщения.
    Синтаксис команды: AT+CNMI=<режим>,<mt>,<bm>,<ds>,<bfr>
    <режим>: контролирует обработку незапрашиваемых результирующих кодов
    2: буферизовать незапрашиваемые результирующие коды в TA, когда связь TA-TE зарезервирована и направлять их к получающему устройству TE после резервирования. Или же направить их прямо к получающему устройству TE.
    Примечание: поддерживается только <режим>=2.

    <mt>: устанавливает маршрутизацию результирующего кода для индикаций SMS-DELIVER. Значение по умолчанию равно 1.
    0: Индикации SMS-DELIVER не возвращаются.
    1: SMS-DELIVER возвращаются при использовании незапрашиваемого кода: +CMTI:SM,<index>
    2: SMS-DELIVER (кроме сообщений класса 2) возвращаются при использовании незапрашиваемого кода:
    в режиме PDU: +CMT: [<alpha>,] <length> <CR> <LF> <pdu>
    в текстовом режиме: +CMT: <oa>,[<alpha>,] <scts> [,<tooa>, <fo>, <pid>, <dcs>, <sca>, <tosca>, <length>] <CR><LF><data>
    3: SMS-DELIVERS класс 3 возвращаются, с параметром <mt>=2; Сообщения других классов приводят к индикации с параметром <mt>=1

    <bm>: определяет условия сохранения полученных типов сообщений Cell Broadcast. Они зависят также от схемы кодирования (текстовый или PDU) и на-стройки выбора типов сообщений Cell Broadcast (см. команду +CSCB). Значе¬ние по умолчанию равно 0.
    0: индикации сообщений Cell Broadcast не направляются к получающему устройству. Сообщения Cell Broadcast сохраняются.
    1: сообщение Cell Broadcast сохраняется, а индикация направляется приложению пользователя при помощи незапрашиваемого результирующего кода: +CBMI: BM, <index>
    2: новые сообщения Cell Broadcast направляются прямо к клиентскому оборудованию в виде незапрашиваемого результирующего кода.
    В режиме PDU: +CBM : <length><CR><LF><pdu> or
    В текстовом режиме: +CBM :<sn>,<mid>,<dcs>,<page>,<pages> <CR><LF> <data>
    3: сообщение Cell Broadcast класс 3: <bm>=2. сообщение Cell Broadcast другие классы: <bm>=1.

    <ds> для SMS-STATUS-REPORT (отчет о доставке). Значение по умолча¬нию равно 0.
    0: SMS-STATUS-REPORT (отчеты о доставке) не направляются.
    1: SMS-STATUS-REPORT (отчеты о доставке) направляются при помощи незапрашиваемого кода:
    В режиме PDU: +CDS : <length> <CR> <LF> <pdu> (PDU mode) or
    В текстовом режиме: +CDS : <fo>,<mr>,[<ra>],[<tora>],<scts>,<dt>,<st> (Text mode)
    2: SMS-STATUS-REPORT (отчеты о доставке) сохраняются и направляются при помощи незапрашиваемого результирующего кода: +CDSI: SR,<index>

    <bfr> значение по умолчанию равно 0.
    0: TA буфер незапрашиваемых результирующих кодов, определяемых данной командой, передается получающему оборудованию.
    1: TA буфер незапрашиваемых результирующих кодов, определяемых данной командой, очищается.
     
    acos нравится это.
  20. BoNzo

    BoNzo Нуб

    Спасибо. А есть идеи почему сообщение в приведенном скетче до телефона не доходит?
     
    Последнее редактирование: 30 мар 2016