Проблемы с GPRS Shield v2

Тема в разделе "Arduino & Shields", создана пользователем -Mark-, 30 окт 2013.

  1. -Mark-

    -Mark- Гик


    доступно пояснил...спасибо! утром буду мучить Мегу...отпишусь как и что
     
  2. -Mark-

    -Mark- Гик

    В данном подключении не дышит (((( Выдает:

    Data available
    ï
    На приход смс-ок вообще никак не реагирует.

    При загрузке скетча Обычного звонка в наушниках слышен звонок но команда на поднятие трубку не проходит.

    Но я еще вставил строчку: #include <HardwareSerial.h>
     
    Последнее редактирование: 1 ноя 2013
  3. -Mark-

    -Mark- Гик

    Еще одна особенность платы:
    Переделал все по старому (под софтваре сериал) и загрузил звонилку. Трубку снимает не всегда. Через 5-6 раз.
     
  4. lerik2703

    lerik2703 Гик

    Вот как раз для Меги не совсем любые [​IMG]
    Источник

    Да помню!мало-ли случайно проскочила команда AT+IPR [​IMG]

    вот рабочий код смски отправляет за одно показывает ответ модема !проверен на UNO

    следующие ошибки были исправлены
    gprsSerial.print("AT+CMGF=1\r");\\ на эту строку модем отвечает ошибкой возможно русская буква проскочила :)
    gprsSerial.println("AT + CMGS = \"+79274048169\""); \\ не добавлен знак возврата каретки "\r"


    PHP:
    #include <SoftwareSerial.h>

    SoftwareSerial gprsSerial(7, 8);

    #define t 50
    #define h 75
    #define sensorGround 800
    #define pressure 678.1
    unsigned char buffer[50];
    int count = 0;
    void setup()
    {

      Serial.begin(9600);
      gprsSerial.begin(9600);//устонавить скорость согласно установленной в модеме

    }

    void loop()
    {

      if (Serial.available() > 0)
        if (Serial.read()== '1')
          sendTextMessage();


    }
    void sendTextMessage()

    {
      Serial.println("Poexali");

      // Устанавливает текстовый режим для SMS-сообщений
      gprsSerial.print("AT+CMGF=1 \r");
      delay(200);
      answer_modema ();


      // Устанавливаем адресата: телефонный номер в международном формате
      gprsSerial.print("AT + CMGS = \"+79121234567\"  \r" );
      delay(200);
      answer_modema ();


      delay(100);
      // Пишем текст сообщения
      gprsSerial.print("T=");
      gprsSerial.print(t);
      gprsSerial.print("C");
      gprsSerial.print(" ");
      gprsSerial.print("H=");
      gprsSerial.print(h);
      gprsSerial.print("%");
      gprsSerial.print(" ");
      gprsSerial.print("Hp=");
      gprsSerial.print(sensorGround);
      gprsSerial.print("%");
      gprsSerial.print(" ");
      gprsSerial.print("P=");
      gprsSerial.print(pressure/133.33);
      gprsSerial.print("mm.pct");

      delay(100);
      // Отправляем Ctrl+Z, обозначая, что сообщение готово
      gprsSerial.print((char)26);
    delay(3500);
    answer_modema ();

    }


    void clearBufferArray()    
    {
      for (int i=0; i<count;i++)
      {
        buffer[i]=NULL;
      }            
    }

    void  answer_modema () {
      while(gprsSerial.available())    
      {
        buffer[count++]=gprsSerial.read();
        if(count == 50)
          break;

      }
      Serial.write(buffer,count);
      clearBufferArray();        
      count = 0;
    }
     
    Последнее редактирование: 2 ноя 2013
    Megakoteyka и -Mark- нравится это.
  5. -Mark-

    -Mark- Гик

    Продолжаю эксперименты с шилдом. Мучаю пока UNO и HardwareSerial.
    Устойчивой работы платы (скетч по поднятию трубки на входящий звонок) удалось добиться на скорости соединения 9600. При скорости 19200 снимает трубку не всегда.
    А вот со скетчем по отправке смс сообщений другая беда. Если установить 9600 то смс-ки не отправляются а в мониторе порта прописываются сами АТ команды и само сообщение.
    При скорости 19200 сообщения отправляются нормально но в мониторе появляется какая-то абракадабра.
    На входящие смс на любых скоростях выдает всегда букву У (странно что забывает напечатать еще 2 буквы) и на этом все затихает.
    Продолжу мучать шилд на МЕГЕ.....
     
  6. lerik2703

    lerik2703 Гик

    а зачем его мучить?определите начало скорость обмена с SIM 900 !лучше всего это сделать сторонней программой !например sscom32E
     
  7. -Mark-

    -Mark- Гик


    Вы знаете,я уже начинаю задумываться о другом...вот Вам предлагают пылесос и говорят, что он всасывает если следовать инструкции по эксплуатации...на деле же он не реагирует никак на кнопку включения в сеть...что Вы сделаете?

    Судя по форуму (да и по интернету) с шилдом этим не все так просто. Считаю что надо либо решить эту проблему раз и навсегда либо перестать вообще продавать этот продукт.
     
  8. lerik2703

    lerik2703 Гик

    у меня лично проблем с шилдом не возникало ни когда ,даже несмотря что питаю его от USB...
     
  9. -Mark-

    -Mark- Гик


    Тогда может Вам подсказать начинающему? )))
     
  10. lerik2703

    lerik2703 Гик

    вы мой скетч загружали?
     
  11. -Mark-

    -Mark- Гик

    хотелось бы понять что в скетче )))
     
  12. lerik2703

    lerik2703 Гик

    что именно не понятно?
     
  13. -Mark-

    -Mark- Гик

    После набора 1 выдало:

    Poexali
    ÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿAT+CMGF=1
    OK
    AT + CMGS = "+79274048169"
    > T=50C H=75% Hp=800% P=5.09mm.pct
    +CMGS: 102


    0


    смс-ку отправила

    При повторных наборах 1-ки буквы У пропали. А непонятна нижняя часть скетча :
    Код (Text):
    void clearBufferArray()  
    {
      for (int i=0; i<count;i++)
      {
        buffer[i]=NULL;
      }          
    }

    void  answer_modema () {
      while(gprsSerial.available())  
      {
        buffer[count++]=gprsSerial.read();
        if(count == 50)
          break;

      }
      Serial.write(buffer,count);
      clearBufferArray();      
      count = 0;
    }
     
    Последнее редактирование: 3 ноя 2013
  14. -Mark-

    -Mark- Гик

    Отправку сообщений я вроде и так настроил. Проблема то в другом...на входящие сообщения она некорректно реагирует (((

    Вот только что я удалил из сетапа весь код настройки модема:
    Код (Text):
        // Настраиваем приём сообщений с других устройств
        // Между командами даём время на их обработку
        gprsSerial.print("AT+CMGF=1\r");
        delay(300);
        gprsSerial.print("AT+IFC=1, 1\r");
        delay(300);
        gprsSerial.print("AT+CPBS=\"SM\"\r");
        delay(300);
        gprsSerial.print("AT+CNMI=1,2,2,1,0\r");
        delay(500);
    И ничего не изменилось!!!! В мониторе попрежнему появляется запись:

    Data available

    ÿ

    Которая повторяется с каждым новым смс.
     
    Последнее редактирование: 3 ноя 2013
  15. lerik2703

    lerik2703 Гик

    похоже модем у вас настроен на автовыбор скорости Serial соединения !отправите команду AT+IPR=19200 обязательно получите ответ от модема!
    Код (Text):
    void clearBufferArray()  //функция очистки  буфера
    {
      for (int i=0; i<count;i++)
      {
        buffer[i]=NULL;
      }        
    }

    void  answer_modema () {// функция получения ответа от модема
      while(gprsSerial.available()) // крутимся пока есть доступные байты для приема
      {
        buffer[count++]=gprsSerial.read(); // читаем следующий доступный байт записываем в массив
        if(count == 50) // если количество принятых байт рано объявленному размеру массива
          break; // выходим из оператора while

      }
      Serial.write(buffer,count); // выводим buffer в Seial Monitor с указанием размера таблицы
      clearBufferArray();    //очищаем буфер  
      count = 0; // очищаем переменную текущего  размера массива
    }
     
  16. -Mark-

    -Mark- Гик


    Я видоизменил Ваш скетч, дабы посмотреть как проходят команды для модема:

    Код (Text):
    #include <SoftwareSerial.h>

    SoftwareSerial gprsSerial(7, 8);


    unsigned char buffer[50];
    int count = 0;
    void setup()
    {

      Serial.begin(9600);
      gprsSerial.begin(19200);//устонавить скорость согласно установленной в модеме

    }

    void loop()
    {

      if (Serial.available() > 0)
        if (Serial.read()== '1')
          sendTextMessage();


    }
    void sendTextMessage()

    {
      Serial.println("Poexali");

        gprsSerial.println("AT+IPR=19200 ");
        delay(300);
        answer_modema ();
        gprsSerial.print("AT+CMGF=1\r");
        delay(300);
        answer_modema ();
        gprsSerial.print("AT+IFC=1, 1\r");
        delay(300);
        answer_modema ();
        gprsSerial.print("AT+CPBS=\"SM\"\r");
        delay(300);
        answer_modema ();
        gprsSerial.print("AT+CNMI=1,2,2,1,0\r");
        delay(500);
        answer_modema ();

    }


    void clearBufferArray()  
    {
      for (int i=0; i<count;i++)
      {
        buffer[i]=NULL;
      }          
    }

    void  answer_modema () {
      while(gprsSerial.available())  
      {
        buffer[count++]=gprsSerial.read();
        if(count == 50)
          break;

      }
      Serial.write(buffer,count);
      clearBufferArray();      
      count = 0;
    }

    Выяснилось что при первом цикле записи AT команд они всегда!!!! проходят криво:

    NORMAL POWER DOWN
    ÿÿÿÿÿÿÿÿ
    RDY
    +CFUN: 1
    +CPIN: READYAT+CMGF=1
    OK

    Либо:

    NORMAL POWER DOWN
    Poexali
    ÿÿÿÿÿÿÿÿ
    RDY
    +CFUN: 1
    +CPIN: READY
    Call Ready
    AT+IPAT+CMGF=1
    OK
    AT+IFC=1, 1
    OK
    AT+CPBS="SM"
    OK
    AT+CNMI=1,2,2,1,0
    OK

    Повторная запись проходит нормально и на каждую команду он отвечает ОК
     
  17. -Mark-

    -Mark- Гик

    В общем программа заработала только после второй записи АТ команд в сетапе.

    Код (Text):
    #include <SoftwareSerial.h>
    SoftwareSerial gprsSerial(7, 8);
    //для зелёного светодиода будем использовать второй цифровой вход,
    //а для жёлтого - третий
    int greenPin = 2;
    int yellowPin = 3;
    void setup()
    {
        Serial.begin(9600);
        gprsSerial.begin(19200);
        pinMode(greenPin, OUTPUT);
        pinMode(yellowPin, OUTPUT);
        // Настраиваем приём сообщений с других устройств
        // Между командами даём время на их обработку
        gprsSerial.println("AT+IPR=19200 ");
        delay(300);
        gprsSerial.print("AT+CMGF=1\r");
        delay(300);
        gprsSerial.print("AT+IFC=1, 1\r");
        delay(300);
        gprsSerial.print("AT+CPBS=\"SM\"\r");
        delay(300);
        gprsSerial.print("AT+CNMI=1,2,2,1,0\r");
        delay(3000);
       
       
        // Ждем пару секунд и повторяем запись
       
       
        gprsSerial.println("AT+IPR=19200 ");
        delay(300);
        gprsSerial.print("AT+CMGF=1\r");
        delay(300);
        gprsSerial.print("AT+IFC=1, 1\r");
        delay(300);
        gprsSerial.print("AT+CPBS=\"SM\"\r");
        delay(300);
        gprsSerial.print("AT+CNMI=1,2,2,1,0\r");
        delay(3000);
    }
    String currStr = "";
    // Переменная принимает значение True, если текущая строка является сообщением
    boolean isStringMessage = false;
    void loop()
    {
        if (!gprsSerial.available())
            return;

        Serial.println("Data available");

        char currSymb = gprsSerial.read();
        Serial.println(currSymb);

        if ('\r' == currSymb) {
            if (isStringMessage) {
                Serial.println(currStr);
                //если текущая строка - SMS-сообщение,
                //отреагируем на него соответствующим образом
                if (!currStr.compareTo("Green on")) {
                    digitalWrite(greenPin, HIGH);
                } else if (!currStr.compareTo("Green off")) {
                    digitalWrite(greenPin, LOW);
                } else if (!currStr.compareTo("Yellow on")) {
                    digitalWrite(yellowPin, HIGH);
                } else if (!currStr.compareTo("Yellow off")) {
                    digitalWrite(yellowPin, LOW);
                }
                isStringMessage = false;
            } else {
                if (currStr.startsWith("+CMT")) {
                    //если текущая строка начинается с "+CMT",
                    //то следующая строка является сообщением
                    isStringMessage = true;
                    Serial.println("Got string message");
                }
            }
            currStr = "";
        } else if ('\n' != currSymb) {
            currStr += String(currSymb);
        }
    }
     
  18. lerik2703

    lerik2703 Гик

    gprsSerial.println("AT+IPR=19200\r "); перевод каретки обязателен таким образом модем определяет завершение команды!
    это не правильно все таки!давайте все же со скоростью разберемся!
    gprsSerial.println("AT+IPR?\r ");
    пауза;
    ответ модема;

    что касаться ÿÿÿÿÿÿÿÿ при включении питания это нормальный ответ от модема!

    интересно как на эту команду AT+IPAT+CMGF=1 модем может ок ответить :eek:
     
  19. -Mark-

    -Mark- Гик


    Вы меня простите за нупство, но почитав вики производителя я решил, что или мы вставляем "возврат каретки" или пишем println...я так понял, что это одно и то же.

    Код (Text):
    mySerial.print ("AT + CMGF = 1 \ R") / / Потому что мы хотим, чтобы отправить SMS в текстовом режиме
      задержка (100);
      mySerial.println ("AT + CMGS = \" +86186 ***** 308 \ "") ;/ / отправить смс сообщение, будьте осторожны необходимости добавлять код страны перед мобильного телефона
      задержка (100);
      mySerial.println ("Как дела?") ;/ / содержание сообщения
      задержка (100);
      mySerial.println ((символ) 26) ;/ / ASCII код Ctrl + Z на 26
      задержка (100);
      mySerial.println ();
     
    тут я вижу или принтлайн или возврат коретки )))

    А что касается "Это не правильно все таки!" (с) то тут с Вами полностью согласен и несмотря на то, что программа работает я удовлетворения не получил. Хочется понять где косяк )))

    PS. На счет момента включения питания!!!! Смотрим Ваш скетч который я немного переделал...там питание уже подано...и только потом (я могу и через час набрать 1-ку) я вызываю подпрограмму прошивки модема...
     
    Последнее редактирование: 4 ноя 2013
  20. -Mark-

    -Mark- Гик

    интересно другое...как эта команда в него попала!!!