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

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

  1. Я их пробовал, но почему-то не заработали.

    Вот код.
    Код (C++):
    #include <SoftwareSerial.h>
    #include <GPRS_Shield_Arduino.h>
    SoftwareSerial gprsSerial(4, 5);

    GPRS gprs(2, 3, 4, 5);

    void setup()
    {
     
      Serial.begin(9600);  
      delay(500);
     
       gprs.powerUpDown();
     
      while (!gprs.init())
       {
        delay(1000);
        Serial.println("Error");
       }
       Serial.println("Ready!");


      Serial.println("Sending Text...");
      gprsSerial.print("AT+CMGF=1\r");
      delay(100);
      gprsSerial.println("AT+CMGS = \"+7XXXXXXXXXX\"");
      delay(100);
      gprsSerial.println("Hello!");
      delay(100);
      gprsSerial.print((char)26);
      delay(100);
      gprsSerial.println();
      Serial.println("Text Sent.");
    }
    void loop()
    {

    }
     
     
  2. значит пробуй напрямую АТ команды отправлять и смотреть чего за ошибки пишет
     
  3. Отправлял. Пишет вот что:
    Capture.PNG
     
  4. Добрый день!
    Провел эксперименты на Leonardo.
    Установил соединение с GPRS Shield на Serial1. Начал отправлять команды. Вот что получилось:
    Capture.PNG

    После этого нужно вставить (char)26 или ctrl+z. Я не знаю как это сделать в Serial. Отправил (char)26 с помощью
    Код (C++):
    Serial1.println((char)26);
    После этих действий сообщение пришло.

    Далее я решил написать код, с помощью которого и будут отсылаться сообщения.
    Вот код.
    Код (C++):

    void setup()
    {
    gprs_OnOff();

    Serial.begin(9600);
    Serial1.begin(9600);

    while(!Serial)
    {
    }

    Serial.println("I'm ready");

    delay(3000);
    sendTextMessage();

    }

    void loop()
    {
     
    }


    void sendTextMessage()
    {
        Serial1.print("AT+CMGF = 1\r");
        delay(100);
        Serial1.println("AT+CMGS= \"+7XXXXXXXXXX\"");
        delay(100);
        Serial1.println("ALARM!");
        delay(100);
        Serial1.println((char)26);
        Serial.println("SMS sent!");
    }

    void gprs_OnOff()
    {
      // настраиваем пин №2 в режим выхода
      pinMode(2, OUTPUT);
      // проверяем состояние 3 пина
      if (digitalRead(3) != HIGH) {
        // если на нём «низкий уровень»
        // подаём на пин 2 «высокий уровень»
        digitalWrite(2, HIGH);
        // ждём 3 секунды
        delay(3000);
      }
      // подаём на пин 2 «низкий уровень»
      digitalWrite(2, LOW);
    }


    Ничего не отправляется. Где ошибка? Подскажите, пожалуйста.
     
  5. Airbus

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

    Вот кусок рабочего кода всё отправляется и работает
    Код (C++):
    // отправляем смс в текстовом режиме v2
    int buttonPin = 12; // номер входа, подключенный к кнопке
    int power = 9 ; // подача питания пин 9
    void setup (){
    // инициализируем пин, подключенный к кнопке, как вход
    // пин 9 для включения шилда
    pinMode(buttonPin, INPUT);
    pinMode(power, OUTPUT);
    digitalWrite(power,HIGH); //подали питание
    delay(1000); //на 1 сек
    digitalWrite(power,LOW); //сняли питание
    Serial.begin(9600);
    Serial.print("AT+CMGF=1\r");
    delay(500);
    }
    void loop()
    {
        if (digitalRead(buttonPin) == HIGH) {
        Serial.println("AT + CMGS = \"+79121542496\"");
        delay(300);
        // Пишем текст сообщения
        Serial.println("ALARM!");
        delay(300);
        // Отправляем Ctrl+Z, обозначая, что сообщение готово
        Serial.println((char)26);
        delay(1000);
           }
        }
    Могу только предположить что дело в этой строчке Serial.print("AT+CMGF=1\r"); она у Вас в Loop и каждый раз перед отправкой СМС вы передёргиваете модем в режим Text и он просто не успевает установиться.Уберите эту строку в Setup как у меня и будет Вам Щастье!Одного раза в Setup достаточно если в дальнейшем Вы не будете переводить его в режим PDU
     
    Последнее редактирование: 12 сен 2016
  6. Спасибо большое! Заработало, думаю проблема была в недостаточной задержке после
    Код (C++):
    Serial.print("AT+CMGF=1\r");
     
  7. Подскажите пожалуйста, есть ли нормальная схема GPRS шилда? Не могу подключиться к нему обычным Usb-uart. Начитался в документации, что нужно притянуть DTR модуля к Gnd через 10к , не могу понять выведен ли он где-то на плате или нет. При этом все работает, если напялить его на Iskra Neo, а напрямую через преобразователь - никак. Может, кто знающий подскажет, в чем может быть дело: подключаю питание к шилду отдельно, с usb-uart подключаю землю и tx rx(разумеется rx->tx и тд).
     
  8. nkYellOw

    nkYellOw Нерд

    Всем привет, закупил себе набор GPRS и есть вопрос =)

    Когда я звоню, каким образом проверить номер звонящего что бы отсекать всех кроме себя?

    Звонки на оборудование проходят но смс не читает. Есть какое то уникальное состояние оборудования, что бы он принимал входящие вызовы и принимал, отправлял и удалял смс?

    Либо подскажите как мне работать с АТ командами и открыть порт для общения с gprs шилдом?
     
    Последнее редактирование: 17 сен 2016
  9. s1984i

    s1984i Нерд

    http://wiki.amperka.ru/projects:gsmbear
     
  10. nkYellOw

    nkYellOw Нерд

    спс! еще вопрос =) заливаю скетч, приходит смс на телефон что GPRS связь установилась, ардуино принимает звонки, все ОК. когда ставлю на питание 5в 1А от розетки, ничего не приходит, звонки не работают. Так же пробовал на 12В 1А ( в описании написано что искра нео сама выпрямляет напряжение до 5В)

    P.S. на ардуино мега перед прошивкой необходимо снять джамперы RX TX и прошивать. На Iskra NEO как ни крути, все равно от розетки отказывается работать =(((

    Скетч:
    Код (C++):


    // библиотека для работы с GPRS устройством
    #include <GPRS_Shield_Arduino.h>

    // библиотека для эмуляции Serial-порта
    // она нужна для работы библиотеки GPRS_Shield_Arduino
    #include <SoftwareSerial.h>

    // длина сообщения
    #define MESSAGE_LENGTH 160
    #define PHONE_NUMBER "+7**********"

    // номер сообщения в памяти сим-карты
    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!");
    gprs.sendSMS(PHONE_NUMBER, "Arduino Power is ON and rdy to work!");
    }

    void loop()
    {
    // если пришло новое сообщение
    if (gprs.ifSMSNow()) {
    // читаем его
    gprs.readSMS(message, phone, datetime);

    // выводим номер, с которого пришло смс
    // Serial.print("From number: ");
    // Serial.println(phone);
    if (String(PHONE_NUMBER) == phone) {
    gprs.callUp(PHONE_NUMBER);
    }

    // выводим дату, когда пришло смс
    // Serial.print("Datetime: ");
    // Serial.println(datetime);

    // выводим текст сообщения
    // Serial.print("Recieved Message: ");
    // Serial.println(message);
    }
    }
     
     
    Последнее редактирование: 19 сен 2016
  11. nkYellOw

    nkYellOw Нерд

    скидываю код на анализ телефона при входящем звонке на оборудование. В кратце
    1) Поступает сообщение RING
    мы помечаем что это звонок (isCall=true)
    2) далее получаем +CLIP и получаем номер с которого идет звонок.
    P.S. если это смс то уже будет не RING а +CMT а в ринге крутится входящий звонок

    Код (C++):
    char currSymb = gprsSerial.read();

      if ('\r' == currSymb) {

        if (!currStr.compareTo("RING")) {
          //текущая строка содержит ринг, это звонок, отмечаем звонок
          isCall = true;
        }

        else

        {
          // ОПРЕДЕЛЕНИЕ НОМЕРА ЗВОНЯЩЕГО
         if (currStr.startsWith("+CLIP: \"" + String(PHONE_NUMBER) + "\"")) {
            // если текущая строка начинается с "+CLIP" + номер нужного телефона,
            // значит проходил звонок, делаем анализ по номеру, если это нужный номер то берем трубку
            // то что это звонок анализируется в начале loop() с условием RING

              if (isCall) {
                //посылаем команду на поднятие трубки
                gprsSerial.println("ATA");
              }
              else
              {
                gprsSerial.println("ATH0\r"); // отбой соединения
                //gprsSerial.println("ATH");
              }
              isCall = false;
          }
        }

        currStr = "";
      }

      else

        if ('\n' != currSymb) {
          currStr += String(currSymb);
        }
     
  12. s1984i

    s1984i Нерд

     
  13. s1984i

    s1984i Нерд

    подскажите пожалуйста как сделать. вот позвонили , проверили совпадение номера, подняли трубку, выбрали что то вкл или выкл нагрузку. положили трубку. а как проверить закончен разговор или нет.
     
  14. nkYellOw

    nkYellOw Нерд

    Код (C++):
    // ожидание звонка (поступил звонок)
      if (gprs.ifcallNow()) {
        delay(3000);

    // берем трубку
        gprs.answer();
    delay(500);
    // ждем пока не положит трубку
        while (!gprs.ifcallEnd()) {
        }

       // конец разговора
      }
    P.S. если хочешь сделать через АТ команды то копать нужно в эту сторону:
    AT+CPAS — информация о текущем состоянии телефона.
    Может вернуть +CPAS: 0
    • 0, — готов к труду и обороне
    • 2, — не известно что делает. Ответ и выполнение команд не гарантируется.
    • 3, — идет входящий звонок.
    • 4, — есть голосовое соединение.
     
  15. s1984i

    s1984i Нерд

    Спс. Попробую. А можно, не Ат командами запустить dtmf декодер?
     
  16. nkYellOw

    nkYellOw Нерд

    не встречал нигде такого. А зачем тебе это надо?
     
  17. P-A

    P-A Нуб

    Мастерю контроль на даче: влажность, тепло, температуры, освещение... отдельно многое работает, но встал вопрос получить время для расчётов и для вывода на экранчик. Имеется мега и данный шилд от амперки + датчики и пр. Основная идея: получить по GSM или GPRS или... (дату? и) время, далее синхронизировать раз в день или месяц встроенные часы (ЧРВ) в шилде и получать из них время по запросу (например выводить раз в минуту на экран). Покопался в инете, но прямого решения так и не нашёл.
    Подскажите как решить задачку. Может это уже где-то было?
     
  18. ATishchenko

    ATishchenko Нерд

    Для себя нашел пока один вариант - есть батарейка на щите Sim900r и она совсем не сильно убегает, в первый раз руками ставлю дату/время (скетч с консолью), а потом, если прошло достаточно времени (3-4 месяца), то sms комманда коррекции с телефона с обычной строкой вида "2016-09-29T22:16:00...". Вам же до микросекунд точность не нужна? Геморрно - да, но без ntp - удобоваримо.
     
  19. s1984i

    s1984i Нерд

    Для управления нагрузками с помошью телефона.
     
  20. s1984i

    s1984i Нерд

    Насколько сильно убегает за 3-4 месяца?