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

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

  1. Rapidshe

    Rapidshe Нуб

    кстати чуть ли не фундаментальное правило. если чтото питается от разных блоков питания, эти что то должны быть соединены землей (это я про первое фото).

    Лампочка статус на модуле светится?
     
  2. naz

    naz Нерд

    Да, я это предполагал и чувствую, что надо третий проводок проложить- землю. На Меге-то пин Gnd нашёл, а на шилде- нет. Подскажите.
    На шилде светятся три индикатора: 1.подсоединение внешнего БП 5 вольт 2А (зелёный), 2. включение питания на шилд (красный) и 3. индикатор сети- сначала быстро пимигает, потом 1 раз в 3 сек. На фото видно.
    На Меге тоже горят 2 индикатора, а когда отсылаю команду AT вспыхивают 2 индикатора serial порта. Т.е. что-то приходит на Мегу, Но землю надо, конечно.
     
  3. Rapidshe

    Rapidshe Нуб

    на короткой розовой колодке 2и3 пин, если считать от короткой синей колодки
    или например самый правый самый нижний контакт на плате на вашей фотке. с надписью gnd
     
    Последнее редактирование: 2 ноя 2016
  4. naz

    naz Нерд

    Спасибо, вечером попробую
    Землю соединил, попробовал.
    То же самое, шилд не отвечает. Куда ещё копнуть?
    Скетч:
    Код (C++):
    unsigned char buffer[64];  // buffer array for data receive over serial port
    int count=0;               // counter for buffer array

    void setup()
    {
      Serial1.begin(19200);
      Serial.begin(19200);
    }
    [URL=http://i-fotki.info/20/674f8f0b7d48b70e89ca9c3dbb3c4d494dde6d260754247.jpg.html][IMG]http://f20.ifotki.info/thumb/674f8f0b7d48b70e89ca9c3dbb3c4d494dde6d260754247.jpg[/IMG][/URL]

    void loop()
    {
      if (Serial1.available())
      {
        while(Serial1.available())
        {
          buffer[count++]=Serial1.read();
          if(count == 64)break;
        }
        Serial.write(buffer,count);
        clearBufferArray();
        count = 0;
      }
      if (Serial.available())
        Serial1.write(Serial.read());
    }

    void clearBufferArray()
    {
      for (int i=0; i<count;i++)
      {
        buffer[i]=NULL;
      }
    }
     
    [​IMG]
     
    Последнее редактирование: 2 ноя 2016
  5. MDV

    MDV Гик

    Для начала поменяй местами рх и тх потом поиграйся скоростью порта
     
  6. MDV

    MDV Гик

  7. Rapidshe

    Rapidshe Нуб

    как проверить баланс при помощи библиотеки?
     
  8. nkYellOw

    nkYellOw Нерд

    в библиотеке такого функционала нет. Можно АТ-командами это сделать.
    "ATD#100#;\r"
    Правда у меня ответ все время пустым приходит, но это видимо нужно на уровне оператора решать.

    Ребзя, подскажите плз по работе со временем на GPRS-Shield'е. Запись и чтение каким образом происходит?
     
  9. Small

    Small Нуб

    Arduino
     
  10. Rapidshe

    Rapidshe Нуб

    вот попробуй.


    подключать к пинам, которые писал ранее
    Код (C++):
    String val ="";
    void setup() {
      // Open serial communications and wait for port to open:
      Serial.begin(9600);
      while (!Serial) {
        ; // wait for serial port to connect. Needed for native USB port only
      }


      Serial.println("Goodnight moon!");
      Serial1.begin(9600);
    }

    void loop() { // run over and over
      if (Serial1.available()) {
        Serial.write(Serial1.read());
      }
      if (Serial.available()) {
        while (Serial.available()) {
          char ch = Serial.read();
          val +=ch;
          delay(10);
        }
        Serial1.println(val);
        val ="";
      }
    }
     
  11. naz

    naz Нерд

    Cпасибо, Rapidshe, вечером попробую. Вообщем-то у меня сейчас так: убрал все библиотеки и подключился к Serial1, как в твоём примере. Из этого порта чтение нормальное в Serial, получаю сообщения RING и т.п. Проблема пока нерешённая в том, что не получается передать команду в Serial1 одной строкой. Например, в мониторе порта отправляю AT, а передаётся двумя строками:
    A
    T
    Соответственно ожидаемого ответа OK нема. У тебя как, нормально общение между портами получается?
    Ну, а если прямо в скетче прописать команду- то нормально передаётся.. Хорошо, что убедился в целости шилда, а то уж подумал, что он испортился из-за статики (на пакетике предупреждение о чувствительности к статике).
    В твоём примере в переменной val накапливается строка с командой из Serial, так?
    --------------
    Продолжаю, пятница 11.11.2016.
    Получилось нормально общаться с помощью твоего кода. В мониторе отсылаю АТ команду и получаю ответ.
    Не получилось пока послать СМС- как правильно послать завершающий символ из монитора порта, чтобы СМС ушла? В примере есть такой вариант:
    Код (C++):
    Serial1.println((char)26);
    , но не получается..
    Спасибо за внимание:)
    Или это ошибка, и надо char(26)?
     
    Последнее редактирование: 11 ноя 2016
  12. naz

    naz Нерд

    Всё получилось. Вот рабочий скетч:
    Код (C++):
    // буфер GPRS Serial
    char bufferGPRS_Serial[64];
    String val ="";
    int i = 0;
    int j = 0;

    void setup()
    {
      Serial1.begin(9600);
      Serial.begin(9600);
      while (!Serial) {
        ;// wait for serial port to connect. Needed for native USB port only
      }
      // пока не установится связь с GPRS-устройством, будем крутиться в теле функции
      //Serial.println("Start OK");
      gprsTest();
      sendTextMessage();
    }
    void loop()
    {
      // считываем данные с компьютера и записываем их в GPRS Shield
      serialRead();
      // считываем данные с GPRS Shield и выводим их в Serial-порт
      serial1Read();
    }

    void serialRead()
    {
    if (Serial.available()) {
         while (Serial.available()) {
           char ch = Serial.read();
           val +=ch;
           delay(10);
         }
         Serial1.println(val);
         //Serial.println(val);
         val ="";
      }
    }
    void serial1Read()
    {
      if (Serial1.available()) {
         Serial.write(Serial1.read());
       }
    }
    /*
    * Функция отправки SMS-сообщения
    */

    void sendTextMessage() {
        // Устанавливает текстовый режим для SMS-сообщений
        Serial1.print("AT+CMGF=1\r");
        delay(300); // даём время на усваивание команды
        // Устанавливаем адресата: телефонный номер в международном формате
        Serial1.println("AT + CMGS = \"+79999999999\"");
        delay(300);
        // Пишем текст сообщения
        Serial1.println("HELLO!");
        delay(300);
        // Отправляем Ctrl+Z, обозначая, что сообщение готово
        Serial1.println((char)26);
        delay(1000);
    }
    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"
        Serial1.println("AT");
        // если появились данные с GPRS Shield
        if (Serial1.available() > 0) {
          while (Serial1.available() > 0) {
            // пока идёт передача данных,
            // записываем каждый байт в символьный массив
            bufferGPRS_Serial[j++] = Serial1.read();
           //char chh = Serial.read();
           //val +=chh;
           delay(10);
         }
          // добавляем символ конца строки
          bufferGPRS_Serial[j] = '\0';
          //val += '\0';
           delay(10);
          // посылаем АТ-команду "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) {
          //if (val == "AT\r\n\r\nOK\r\n") {
            // если всё верно выводим в Serial порт "State OK"
            // и выходим из бесконечного цикла
            //Serial.println(val);
            Serial.println("State OK");
            break;
          } else {
            // если строки разные, значит произошла ошибка
            // выводим сообщение об ошибке и продолжаем цикл
            Serial.println(val);
            Serial.println("Init ERROR");
          }
        }
        // очищаем буфер GPRS Serial
        clearBufferGPRS_Serial();
        val="";
      }
    }


     
     
  13. Zinch

    Zinch Нуб

    Добрый день!

    Помогите, пожалуйста, по следующему вопросу.

    Есть Arduino Uno (из набора Z)
    Есть GPRS shield (SIM 900R)

    все куплено в амперке

    Соединяю, пытаюсь загрузить простейший скетч.
    Получаю - "avrdude: stk500_getsync() attempt 1 of 10: not in sync: resp=0x00"
    На плате gprs shield ничего не горит, симку вставил, батарейки нет.
    При этом отрабатывает код, загруженный на контроллер ранее.
    Если отключить gprs shield, все загружается.
    Джамера не трогал

    Если кто-то сталкивался с этой проблемой, прошу совета, решения
     
  14. P-A

    P-A Нуб

    У меня МЕГА и если "джампера" не трогать то загрузить не получится, т.к. связь с компом идёт именно по этому RX0/TX0, возможно на УНО тоже самое.
     
  15. Zinch

    Zinch Нуб

    Спасибо. Не подскажите какие настройки джамперов у вас?
     
  16. P-A

    P-A Нуб

    МЕГА позволяет работать совсем без джамперов у RX и TX, т.к. есть возможность бросить перемычки на другой сериал.
    Предположу, что на УНО перед прошивкой надо эти джамперы снять, а после прошивки установить.
     
  17. Small

    Small Нуб

    Подскажите пожалуйста как установить время и дату на шилде? (Arduino mega, shield от Амперки)
     
  18. MDV

    MDV Гик

    Если вопрос по gprs шилду то через терминал с помощью АТ команды
     
  19. Small

    Small Нуб

    Я отправляю команду "AT+CCLK=11/11/11,11:50:00+16" выдает ошибку
     
  20. MDV

    MDV Гик

    Это ты кавычку не там поставил, как то так надо AT+CCLK="11/11/11,11:50:00+16"
     
    Последнее редактирование: 28 ноя 2016