Взаимодействие с GSM/GPRS Shield для работы с SMS

Тема в разделе "Arduino & Shields", создана пользователем artur87ch, 31 янв 2014.

  1. artur87ch

    artur87ch Нуб

    Доброго времени суток! Помогите запустить третий пример "Управление светодиодами с помощью SMS" http://wiki.amperka.ru/беспроводная-связь:gprs-shield . Использую GPRS/GSM Shield на чипе AT139 http://linksprite.com/wiki/index.php5?title=ATWIN_Qua.. . В скетче поменял только пины подключения на 0, 1 и скорость 9600. (первые 2 примера работают)
     
  2. Unrimah

    Unrimah Нерд

    Доброго. =)

    Какой ардуиной "раскачиваете" шилд? У Yun, например, ноги 0, 1 заняты внутренней коммуникацией с AR9331, там, можно сказать, ничего другого не вешается.
     
  3. artur87ch

    artur87ch Нуб

    Arduino UNO + ATWIN Quad-band GPRS/GSM shield + блок питания на 2А.
     
  4. artur87ch

    artur87ch Нуб

    Как выяснилось, что работает только, когда открываешь сериал монитор порта в ардуино оболочке, или любую другую программу терминал. Можно ли сделать, чтобы работало автономно, не подключая USB к компьютеру? Подскажите...


    #include <SoftwareSerial.h>

    SoftwareSerial gprsSerial(1, 0); // RX, TX

    int greenPin = 2;
    int bluePin = 3;
    void setup()
    {
    gprsSerial.begin(38400);
    pinMode(greenPin, OUTPUT);
    pinMode(bluePin, 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("Blue on")) {
    digitalWrite(bluePin, HIGH);
    } else if (!currStr.compareTo("Blue off")) {
    digitalWrite(bluePin, LOW);
    }
    isStringMessage = false;
    } else {
    if (currStr.startsWith("+CMT")) {
    //если текущая строка начинается с "+CMT",
    //то следующая строка является сообщением
    isStringMessage = true;
    }
    }
    currStr = "";
    } else if ('\n' != currSymb) {
    currStr += String(currSymb);
    }
    }
     
  5. geher

    geher Гуру

    Может быть от того, что на аппаратный Serial настроен SoftwareSerial?
    Если общение с шилдом осуществляется по пинам 0 и 1, то, как мне кажется, следует использовать просто Serial для общения с шилдом.
    А если необходим SoftwareSerial, то нужно настроить шилд и почитать, через какие пины в этом случае осуществляется обмен. Насколько я понимаю, на этом шилде, как и на аналогичных, имеются перемычки, переключающие режим. Соответственно, для настройки шилда нужно установить перемычки в нужное положение согласно его описанию.
     
  6. artur87ch

    artur87ch Нуб

    Пробовал менять в скетче SoftwareSerial на Serial, конечный результат получился тот же. Перемычки установлены правильно, в положении замыкая rx-mtx, tx-mrx.
     
  7. lerik2703

    lerik2703 Гик

    перезаключите на другие пины (2,3 7,8) а на аппаратный сериал не надо вешать программный не логично :)
     
  8. artur87ch

    artur87ch Нуб

    подключал и через другие пины, толка нету.
     
  9. -Mark-

    -Mark- Гик