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

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

  1. Small

    Small Нуб

    СПАСИБО!!!!! ЗАРАБОТАЛО!!!!!!
    Для нашего часового пояса надо +16 ставить?
     
    Последнее редактирование: 29 ноя 2016
  2. MDV

    MDV Гик

    Всегда пожалуйста, для Москвы +3. Если синхронизации с сервером не будет то ЧП не важен
     
  3. Zinch

    Zinch Нуб

    Я разобрался. Спасибо за комментарий.
     
  4. Evgeni_4550

    Evgeni_4550 Нуб

    Всем доброго времени суток! Купил сей девайс GSM Shield SIM 900R. Уж очень хотелось прикрутить его к своей макетной плате на PIC 18F4550 в связке с графическим индикатором WG12864C на контроллере KS0108 фирмы SAMSUNG. В контроллер залиты свои библиотеки по опросу кнопок, работой с графическим индикатором. Все собрал на скорую руку, написал кое-как отрезок кода на работу с serial-портом, и... Не заработало! Исправил прогу работы с портом, и плату шилда и МК запитал от мощного БП. Стал читать про serial-порт. При работе с ARDUINO UNO все работает, а у меня на PIC, нет. Переходник usb-com исправно принимал от моей платы пакеты, а шилд не хотел отвечать. Оказалось перепутаны Rx и Tx на плате шилда. То есть весь мир подключение выполняет по схеме Rx->Tx, Tx->Rx. А на шилде наоборот написано Rx, но это ВЫХОД из платы . Тх - это ВХОД платы. Будьте внимательны!
    Про питание шилда, скажу что все просто. На Vin подаем +5в. Земля - это минус. 3V3 висит в воздухе, он не нужен. Важный пин Ior. Поскольку у меня микроконтроллер запитан на 5 в, то сюда подаем 5 в. Если 3,3 в, то соответственно 3,3 в.
    В настоящий момент МК посылает команду в порт и ждет ответа на своем входе Rx. Шилд присылает ответ. Ответ нужно фильтровать: отсекать ненужные байты в пакете, и искать начало полезных данных. В файле ниже ответ на команду AT по шине. Потом ответ на команду AT+GMM. А потом посылка которую посылает шилд в порт если его выключить не програмно, через AТ-команду, а хардверно. Напомню, полезные данные начинаются и заканчиваются связкой 0x0D 0x0A (\r \n).
     

    Вложения:

    • Ответ.TXT
      Размер файла:
      378 байт
      Просмотров:
      422
  5. sim900r с амперки, и оригинал 2560, почему не подключается сим карта к сети?
    делаю все как показано
    http://wiki.amperka.ru/продукты:gprs-shield#пример_к_arduino_mega_2560

    но не куда дальше Serial.print("Init error\r\n"); не заходим,

    хотя подключал этот же sim на уно и все работало без проблем
     
  6. Пушной звер

    Пушной звер Оракул Модератор

    TX RX местами поменяй
     
  7. не помогает, только ерроры в мониторе, сеть ловит аир мигает раз в 3 сек
     
  8. Evgeni_4550

    Evgeni_4550 Нуб

    Очень помогает переходник usb-com стороннего производителя. Мне на радиорынке попался преобразователь USB-UART на микросхеме FTDI FT232RL. Кажется стоил около 300 р. В особо тяжелых случаях, вешаю его на UART шину между своими устройствами и "слушаю" через вход Rx (вход приемника) что там происходит. Соответственно от управляющей платы к шилду на sim900r или обратно, когда нужно.
    Если аир мигает, значит sim900r включился, вот теперь через другой переходник USB-UART полезно было-бы послушать, что там летит в сторону sim900r.
     
  9. всплыла непонятная особеннность, мега2560 оригинал и sim900r от амперки, все подключаю верно, но при запуске постоянные ошибки, сим карта сама подключается к сети, (мигает аир каждые 3 сек),
    но в логе не отображается подключение, и я в буквальном смысле попробовал прозвонить его со своего телефона, и только после того как я позвоню на сим в модуле он начнет работать, да еще и работать начнет
    только на время пока есть питание, если отсоединять питание на короткое время, и подключать то работать будет, но если питание не подавалось минут 10 то снова будут ошибки и придется звонить со своего телефона на модуль чтоб заработал, вся авторизация в сети холдит все остальные процедуры и поэтому сколько бы у меня не было навешано модулей на меги они все не будут работать пока симка не перейдет в режим работы. в какую сторону капать????
     
  10. Evgeni_4550

    Evgeni_4550 Нуб

    G
    Сим-модуль ВСЕГДА подключается САМ к сети, если есть питание и поступил импульс включения длит 3 сек на пин PK (читаем даташит!). Сим-модулю совершенно все равно что там делает внешний управляющий МК, будь то МЕГА, UNO или что там еще. Сим-модуль имеет на борту свой микроконтроллер, который проходит процедуру инициализации, регистрацию в сети и т.д. А чтобы прочитать в СИМ-модуле как он подключился, и куда, какой оператор, уровень сигнала станции и т.д.., нужно послать ему команду, и корректно прочитать ответ из сим-модуля (читаем даташит).
    ИМХО ошибка сидит в функциях взаимодействия с сим-модулем в самой МЕГЕ, больше сказать трудно, т.к. функции предпочитаю писать самостоятельно.
    Проверь настройки UART в МЕГЕ, в подпрограмме инициализации скорость порта указана 9600? (скорость UART для SIM-900R по умолчанию).
     
  11. не как не могу отловить звонок

    Код (C++):
    String currStr = "";


    void serialGPRSread()
    {
        if (Serial1.available() > 0) {
          // если приходят данные с GPRS Shield
          while (Serial1.available() > 0) {
            // передаём их в USB
            Serial.write(Serial1.read());
           
            currStr=  Serial1.read();
         if (currStr.startsWith("RING")) Serial.println("sdsdsdsdsds");
            currStr= "";
                                                       
                                                       
                                                       
        }
      }
    }
    куда копать?
     
  12. s1984i

    s1984i Нерд

    У кого то получилось запустить gprs shield без компа с использованием dtmf декодером? суть такая если я ардуино и gprs shield за питываю от компа .через Serial смотрю за его поведением, то все работает. и управление работает через дтмф. но если откл комп и за питать от внешнего источника питания. управление дтмф прекращает работать.
     
  13. Код (C++):
    void readcall()
    {


        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);
        if (message == 123){  Serial.println("REALLLLL"); }
          if (message == "123"){  Serial.println("REAL33333LLLL"); }


    ...............
    что не так help
     
  14. Добрый день. Вопрос. нужна консультация. Подскажите как организовать такой проект, реально ли, авторегистратор звуковых сообщений. То есть Я звоню на GSM шилд и звуковое сообщение записывается на носитель. Варианты носитетелей : SD-card, HDD или NAS
     
  15. naz

    naz Нерд

    Друзья, кто решал задачу контроля состояния шилда SIM900?
    У меня на даче стоит смс- розетка уже третий месяц.
    Суть в том, что иногда шилд выключается (а Мега 2560 работает) или теряет сеть, и поэтому перестаёт отвечать на смс запросы. Хочется его перезагрузить, а для этого надо спросить его состояние, и если нет сети или он выключен-то сделать нужное действие. У кого-нибудь есть протестированный кусочек кода?
     
  16. Evgeni_4550

    Evgeni_4550 Нуб

    Есть описание части проблем здесь: https://geektimes.ru/post/286150/
    Я тоже столкнулся с зависанием шилда. Нужно было выводить время и дату на экран. В начале работы с проектом решил брать значение из модуля. И поэтому торпедировал каждую секунду шилд командами запроса времени "AT+CCLK?" Черел неск минут шилд зависал. Поставил доп кварц на 32768 и стал считать время параллельно. А запрос времени отправлял при инициализации, и в 00:00, для синхронизации обоих часов.
    Вопрос с зависанием решил так. Каждую минуту шилду посылаю команду "AT+CSQ". Полученное значение вывожу на экран в виде шкалы уровня сигнала антенны. И тут же запускаю сторожевой счетчик.
    Если в течении 5 секунд не приходит ответ, то выключаю питание на шилд, и перезагружаю его. Отрезок кода привести не могу: для Arduino, Мега и пр. он будет бесполезен, так как работаю с PIC18. И зависимые участки кода разбросаны в программе. Хе-хе-хе, общий код умной розетки для пяти нагрузок(объектов), с записью журнала событий, 5-ти датчиками движения, с контролем размыкателя на дверях, с контролем температуры на каждом из пяти объектов и датчиком температуры на улице, и источником резервного питания (как без него?) в Word 10 шрифтом и с интервалом между строк 1, код занимает 198 страниц:rolleyes:
    И чувствую это не предел, благо память МК использована только на 61 %:D
     
    Последнее редактирование: 26 фев 2017
  17. Добрый день. Помогите разобраться. Sim900R и UNO. Собраны бутербродом, TX с модуля подключен к 11PIN уны, RX к 10 pin. Заливаю скетч стандартный из библиотеки и во всех результатах приходит INIT ERROR. Что делаю не так. Пару дней нормально работало, потом все вот пропало и никак не могу подцепиться. Не отвечает ни на какие команды. По индикации сеть находит и регистрируется.
    Код (C++):
    // она нужна для работы библиотеки GPRS_Shield_Arduino
    #include <SoftwareSerial.h>
    // создаём объект mySerial и передаём номера управляющих пинов RX и TX
    SoftwareSerial mySerial(10, 11);

    // буфер PC Serial
    char bufferPC_Serial[64];
    // буфер GPRS Serial
    char bufferGPRS_Serial[64];
    int i = 0;
    int j = 0;
    void setup()
    {
      // включаем GPRS-шилд
      gprs_OnOff();
      // открываем последовательный порт для мониторинга действий в программе
      Serial.begin(9600);
      // открываем последовательный порт
      // для связи с GPRS-устройством со скоростью 9600 бод
      mySerial.begin(9600);

      while (!Serial) {
        // ждём, пока не откроется монитор последовательного порта
        // для того, чтобы отследить все события в программе
      }
      // пока не установится связь с GPRS-устройством, будем крутиться в теле функции
      gprsTest();
    }
    void loop()
    {
      // считываем данные с компьютера и записываем их в GPRS Shield
      serialPCread();
      // считываем данные с GPRS Shield и выводим их в Serial-порт
      serialGPRSread();
    }
    void serialPCread()
    {
      i = 0;
      // если появились данные с компьютера
      if (Serial.available() > 0) {
        while (Serial.available() > 0) {
          // пока идёт передача данных,
          // записываем каждый байт в символьный массив
          bufferPC_Serial[i++]=(Serial.read());
        }
        // добавляем символ конца строки
        bufferPC_Serial[i] = '\0';
        // записываем данные в GPRS Shield
        mySerial.println(bufferPC_Serial);
        Serial.println("");
        // очищаем буфер PC Serial
        clearBufferPC_Serial();
      }
    }
    void serialGPRSread()
    {
        j = 0;
        // если появились данные с GPRS Shield
        if (mySerial.available() > 0) {
          while (mySerial.available() > 0) {
            // пока идёт передача данных,
            // записываем каждый байт в символьный массив
            bufferGPRS_Serial[j++]=(mySerial.read());
        }
        // добавляем символ конца строки
        bufferGPRS_Serial[j] = '\0';
        // выводим полученные данные с GPRS Shield в Serial-порт
        Serial.write(bufferGPRS_Serial);
        // очищаем буфер GPRS Serial
        clearBufferGPRS_Serial();
      }
    }
    void clearBufferPC_Serial()
    {
      for (int t = 0; t < i; t++) {
        // очищаем буфер,
        // присваивая всем индексам массива значение 0
        bufferPC_Serial[t] = 0;
      }
    }
    void clearBufferGPRS_Serial()
    {
      for (int t = 0; t < j; t++) {
        // очищаем буфер,
        // присваивая всем индексам массива значение 0
        bufferGPRS_Serial[t] = 0;
      }
    }
    void gprsTest()
    {
      // бесконечный цикл
      while (1) {
        // ждём 1 секунду
        delay(1000);
        j = 0;
        // посылаем в GPRS Shield АТ-команду "AT"
        mySerial.println("AT");
        // если появились данные с GPRS Shield
        if (mySerial.available() > 0) {
          while (mySerial.available() > 0) {
            // пока идёт передача данных,
            // записываем каждый байт в символьный массив
            bufferGPRS_Serial[j++] = mySerial.read();
          }
          // добавляем символ конца строки
          bufferGPRS_Serial[j] = '\0';
          // посылаем АТ-команду "AT"; если GPRS Shield исправен,
          // он должен вернуть команду "AT";
          // сравниваем всё что находиться в буфере GPRS Shield
          // со строкой "AT\r\n\r\nOK\r\n"
          if (strcmp(bufferGPRS_Serial, "AT\r\n\r\nOK\r\n") == 0) {
            // если всё верно выводим в Serial порт "State OK"
            // и выходим из бесконечного цикла
            Serial.println("State OK");
            break;
          } else {
            // если строки разные, значит произошла ошибка
            // выводим сообщение об ошибке и продолжаем цикл
            Serial.println("Init ERROR");
          }
        }
        // очищаем буфер GPRS Serial
        clearBufferGPRS_Serial();
      }
    }
    void gprs_OnOff()
    {
      // настраиваем пин №2 в режим выхода
      pinMode(2, OUTPUT);
      // проверяем состояние 3 пина
      if (digitalRead(3) != HIGH) {
        // если на нём «низкий уровень»
        // подаём на пин 2 «высокий уровень»
        digitalWrite(2, HIGH);
        // ждём 3 секунды
        delay(3000);
      }
      // подаём на пин 2 «низкий уровень»
      digitalWrite(2, LOW);
    }
     
  18. artem_

    artem_ Нуб

    Всем добрый день! Скажите, а кто-нибудь решал задачу отправки данных на сервер через POST запрос с помощью этого модуля?
     
  19. AlexAl77

    AlexAl77 Нуб

    Аналогичный вопрос. не могу найти рабочий вариант POST запроса. помогите
     
  20. Код (C++):
    void gprs_init() {
      int d = 500;
      int ATsCount = 7;
      String ATs[] = {
        "AT+SAPBR=3,1,\"CONTYPE\",\"GPRS\"",
        "AT+SAPBR=3,1,\"APN\",\"internet.tele2.ru\"",
        "AT+SAPBR=3,1,\"USER\",\"tele2\"",
        "AT+SAPBR=3,1,\"PWD\",\"tele2\"",
        "AT+SAPBR=1,1",
        "AT+HTTPINIT",
        "AT+HTTPPARA=\"CID\",1"
      };
      int ATsDelays[] = {6, 1, 1, 1, 3, 3, 1};
      Serial.println("GPRG init start");
      for (int i = 0; i < ATsCount; i++) {
        Serial.println(ATs[i]);
        Serial1.println(ATs[i]);
        delay(d * ATsDelays[i]);
        Serial.println(ReadGSM());
        delay(d);
      }
      Serial.println("GPRG init complete");

    gprs_send("*");
    }

     

    void gprs_send(String data) {
    int d = 400;
    String tempstr;
    tempstr = String("AT+HTTPPARA=\"URL\",\"000.ru/gsmcall.php?zam="+statezamok+"&dr="+gerkondoor+"&relay="+relestr+"&gate="+timegate+"&pir="+pirstr+"\"");
    ///tempstr = String("AT+HTTPPARA=\"URL\",\".ru/gps/write.php?a=" + dataa + "&b=" + datab + "&a0=" + String(dataA0) +"&a1=" + String(dataA1) +"\"");
      Serial1.println(tempstr);  
      delay(d * 2);
      Serial.println(ReadGSM());
      delay(d);
      Serial.println("GET url");
      Serial1.println("AT+HTTPACTION=0");
      delay(d * 2);
      Serial.println(ReadGSM());
      delay(d*2);
    // Serial1.println("AT+HTTPREAD\r\n");
    Serial.println("senddd----");
    Serial.println(pirstr);
    pirstr= "pir0";
    ifcommand= true;
    }