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

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

  1. -Mark-

    -Mark- Гик

    Заканчиваю отлаживать автомат для полива (контроля за освещением,температурой) теплицы и столкнулся со странным поведением GSM модуля.
    Он корректно откликается на код:
    Код (Text):
     void sendTextMessage()

      {
        // Устанавливает текстовый режим для SMS-сообщений
        gprsSerial.print("AT+CMGF=1\r");
        delay(100); // даём время на усваивание команды
        // Устанавливаем адресата: телефонный номер в международном формате
        gprsSerial.println("AT + CMGS = \"+79274048169\"");
        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,0);
        gprsSerial.print("mm.pct");
     
        delay(100);
        // Отправляем Ctrl+Z, обозначая, что сообщение готово
        gprsSerial.println((char)26);
    }
    Но абсолютно не хочет реагировать на пример из вики Амперки :
    Код (Text):
    #include <SoftwareSerial.h>
    SoftwareSerial gprsSerial(7, 8);
    //для зелёного светодиода будем использовать второй цифровой вход,
    //а для жёлтого - третий
    int greenPin = 2;
    int yellowPin = 3;
    void setup()
    {
        gprsSerial.begin(19200);
        pinMode(greenPin, OUTPUT);
        pinMode(yellowPin, OUTPUT);
        // Настраиваем приём сообщений с других устройств
        // Между командами даём время на их обработку
        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);
    }
    String currStr = "";
    // Переменная принимает значение True, если текущая строка является сообщением
    boolean isStringMessage = false;
    void loop()
    {
        if (!gprsSerial.available())
            return;
        char currSymb = gprsSerial.read();  
        if ('\r' == currSymb) {
            if (isStringMessage) {
                //если текущая строка - 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;
                }
            }
            currStr = "";
        } else if ('\n' != currSymb) {
            currStr += String(currSymb);
        }
    }
    СМС-ки не проходят, так как если вынуть симку из модуля и вставить в обычный телефон, то они приходят сразу пачками.
    Питание Меги и самого модуля - внешнее (9 вольт до 3 А)


    Возможно эта проблема как-то связана с тем, что я использую МЕГУ а не УНО?

    Вот тут что-то написано по этому поводу :

    http://devicter.blogspot.ru/2012/03/icomsat-grps-shield.html
     
    Последнее редактирование: 30 окт 2013
  2. -Mark-

    -Mark- Гик

    Воткнул шилду в Уно. Не работает (((
     
  3. nailxx

    nailxx Официальный Нерд Администратор

    Почему-то дело не доходит до конца. Стоит проверить несколько мест по ходу течения программы, вставив отладочные сообщения и посмотреть что выводится в Serial Monitor:

    Код (C++):

    #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.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);
    }
    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);
        }
    }
     
    Загрузите это и пришлите вывод из Serial Monitor при получении SMS
     
  4. -Mark-

    -Mark- Гик

    В момент загрузки высветилось это: http://clip2net.com/s/649H9O

    после отправки ничего не изменилось
     
  5. nailxx

    nailxx Официальный Нерд Администратор

    В приведённом выводе видно, что вы получили

    "K AT+CNMI=1,"

    «K» похоже на конец «ОК», на скриншоте не видно скроллбара и непонятно был ли до этого какой-то вывод. Вы можете скинуть данные не скриншотом, а текстом и полностью?

    Вторая часть строки, которую вы приняли похожа на то, что вы посылали в setup’е. Такое ощущение, что RX замкнут на TX. Пришлите, пожалуйста фотку того как вы установили джамперы на GPRS Shield, отвечающие за выбор пинов. Есть подозрение, что вы их просто перпендикулярно поставили, замкнув тем самым RX на TX и в итоге общаетесь сами с собой, а не с GPRS Shield’ом.
     
  6. -Mark-

    -Mark- Гик

    Код (Text):

    Data available
    A
    Data available
    T
    Data available
    +
    Data available
    C
    Data available
    M
    Data available
    G
    Data available
    F
    Data available
    =
    Data available
    1
    Data available


    Data available


    Data available


    Data available
    O
    Data available
    K
    Data available


    Data available


    Data available
    A
    Data available
    T
    Data available
    +
    Data available
    I
    Data available
    F
    Data available
    C
    Data available
    =
    Data available
    1
    Data available
    ,
    Data available

    Data available
    1
    Data available


    Data available


    Data available


    Data available
    O
    Data available
    K
    Data available


    Data available


    Data available
    A
    Data available
    T
    Data available
    +
    Data available
    C
    Data available
    P
    Data available
    B
    Data available
    S
    Data available
    =
    Data available
    "
    Data available
    S
    Data available
    M
    Data available
    "
    Data available


    Data available


    Data available


    Data available
    O
    Data available
    K
    Data available


    Data available


    Data available
    A
    Data available
    T
    Data available
    +
    Data available
    C
    Data available
    N
    Data available
    M
    Data available
    I
    Data available
    =
    Data available
    1
    Data available
    ,
    Data available
    A
    Data available
    T
    Data available
    +
    Data available
    C
    Data available
    M
    Data available
    G
    Data available
    F
    Data available
    =
    Data available
    1
    Data available


    Data available


    Data available


    Data available
    O
    Data available
    K
    Data available


    Data available


    Data available
    A
    Data available
    T
    Data available
    +
    Data available
    I
    Data available
    F
    Data available
    C
    Data available
    =
    Data available
    1
    Data available
    ,
    Data available

    Data available
    1
    Data available


    Data available


    Data available


    Data available
    O
    Data available
    K
    Data available


    Data available


    Data available
    A
    Data available
    T
    Data available
    +
    Data available
    C
    Data available
    P
    Data available
    B
    Data available
    S
    Data available
    =
    Data available
    "
    Data available
    S
    Data available
    M
    Data available
    "
    Data available


    Data available


    Data available


    Data available
    O
    Data available
    K
    Data available


    Data available


    Data available
    A
    Data available
    T
    Data available
    +
    Data available
    C
    Data available
    N
    Data available
    M
    Data available
    I
    Data available
    =
    Data available
    1
    Data available
    ,
     
     
    Последнее редактирование модератором: 30 окт 2013
  7. -Mark-

    -Mark- Гик

    Как телефон с платой УНО (режим автоматического ответа на вх звонок) работает идеально...в заданные (программой) промежутки времени отправляет смс-ки...входящие не читает ((
     
  8. Megakoteyka

    Megakoteyka Оракул Модератор

    Вы, когда в следующий раз будете в монитор порта данные выводить, убирайте строчку Serial.println("Data available");, глаза же можно сломать :) Полезной информации она не несет, только мешает восприятию.
     
  9. nailxx

    nailxx Официальный Нерд Администратор

    Странная история. В выводе видны вкрапления «ОК». Стало быть плата отвечала. Но почему в буфере оказываются исходящие данные?! Похоже на какие-то премудрости SoftwareSerial.

    Какую версию IDE вы используете?

    Попробуйте в `setup` после каждого delay `добавить`:

    Код (C++):

    while (gprsSerial.available()) gprsSerial.read();
     
    …так, эксперимента ради. Если не сработает, стоит попробовать HardwareSerial.[/CODE]
     
  10. lerik2703

    lerik2703 Гик

    интересно а зачем мучат библиотеку SoftwareSerial если у меги и так 4 аппаратных порта [​IMG] !а что касается премудростей библиотеки у меня были проблемы с возвращенными байтами!т.е. из стандартного (160 знаков) смс я получал только меньше половины!
     
  11. -Mark-

    -Mark- Гик

    Перешел на новую версию 1.0.5 И до вставки
    Код (Text):
    while (gprsSerial.available()) gprsSerial.read();
    и после нее в порт выдавалось следующее:


    Data available

    Data available
    ÿ
    Data available
    ÿ
    Data available
    ÿ
    Data available
    ÿ
    Data available
    ÿ
    Data available
    ÿ
    Data available
    ÿ
    Data available
    ÿ
     
  12. -Mark-

    -Mark- Гик

    после каждой отправленной смс-ки появляется новая строка :

    Data available
    ÿ
     
  13. nailxx

    nailxx Официальный Нерд Администратор

    ÿ — это 0xFF. Чип SIM900 что-то хочет этим сказать, но пока не понимаю что.

    [​IMG]

    Давайте попробуем аппаратный Serial?!
    1. Поставьте GPRS Shield на Mega 2560
    2. Снимите с GPRS Shield джамперы
    3. Верхний средний пин, где были джамперы соедините проводом с пином 19 Arduino
    4. Нижний средний пин, где были джамперы соедините проводом с пином 18 Arduino
    5. Замените в коде:
    SoftwareSerial gprsSerial(7, 8);

    на

    HardwareSerial& gprsSerial = Serial1;

    и пробуйте
     
  14. lerik2703

    lerik2703 Гик

    дополню ответ ))ещё так называемые кракозя́бры печатаются когда не верно установлена скорость Serial порта!
     
  15. nailxx

    nailxx Официальный Нерд Администратор

    Кстати, да. В Serial Monitor у вас 9600, как и в скетче?
     
  16. -Mark-

    -Mark- Гик

    да 9600
     
  17. -Mark-

    -Mark- Гик

    а пины в HardwareSerial& gprsSerial = Serial1; не надо прописывать? HardwareSerial& gprsSerial = Serial1(19,18); ??
     
  18. lerik2703

    lerik2703 Гик

    строка Data available говорит о том что скорость порта Ардуино -Компьютер(Serial Monitor) установлена правильно!а вот Ардуино - GPRS Shield возможно не правильно (gprsSerial.begin(19200)!?
     
    Последнее редактирование: 31 окт 2013
  19. nailxx

    nailxx Официальный Нерд Администратор

    Не нужно

    Вариант… Должен 19200 быть по докам, но может что-то не так на практике?! Хотя, помните, он отвечал ОК? Стао быть он нас слышит
     
  20. Megakoteyka

    Megakoteyka Оракул Модератор

    HardwareSerial - аппаратный порт, который уже присутствует в Меге. Их там 4 штуки. Каждый заведен на свои ножки, изменить это нельзя. Serial1 - это второй порт, заведенный на ноги 18 и 19.
    Выберете Serial, Serial2 или Serial3 - и ноги будут другими, их номера в даташите смотрите.
    SoftwareSerial - программная имитация последовательного порта, реализованная на обычных цифровых пинах, поэтому ему можно назначить любые ноги.
     
    -Mark- и nailxx нравится это.