GPRS-Shield не звонит при нажатии на кнопку

R3al
Offline
Зарегистрирован: 29.10.2015

Привет! Помогите, пожалуйста! Имею Arduino UNO и GPRS-Shield (оба на алиэкспрессе купил). Уже какой день мучаюсь и не могу понять почему беда такая происходит: при однократном нажатии на кнопку не звонит шилд, при многократном, т.е. если я буду сидеть и тыкать в неё, в какой-то момент он всё же совершает звонок. Как сократить эти нажатия до 1го? Что бы я включил ардуину и шилд, шилд зарегистрировался в сети оператора и после этого я жму кнопку и он звонит.. Вроде просто всё, но не выходит. Код скетча:

#include <SoftwareSerial.h>
SoftwareSerial GPRS(7, 8);

String currStr = "";
String phoneNumber = "";

int updateTime = 0;
int btnPin = 2;

bool calling = false;
bool iPh = false;
bool setOpt = false;

void setup()
{
  GPRS.begin(19200);
  Serial.begin(19200);
  Serial.println("I'm loaded!");
}

void loop()
{
  touch();

  if (!GPRS.available())
    return;

  if ( !setOpt )
  {
    setOpt = true;
    delay(200);
    GPRS.println("AT+CLCC");
    delay(100);
    GPRS.println("AT+CLIP=1");
    delay(100);
  }

  char currSymb = GPRS.read();

  if ( digitalRead(btnPin) == HIGH )
  {
    if ( !calling )
    {
      Serial.println("Start calling to +7961xxxxxxx");
      GPRS.println("ATD+7961xxxxxxx;");
      calling = true;
    }
  }

  if ('\r' == currSymb) {
    if (!currStr.compareTo("RING"))
    {
      if ( iPh )
      {
        Serial.println("Ring from " + phoneNumber);
      }
    }
    else if ( !currStr.compareTo("AT") || !currStr.compareTo("OK") )
    {
      return;
    }
    else if ( currStr.compareTo("+CLIP:") && !iPh )
    {
      if ( currStr.indexOf("+CLIP:") == 0 )
      {
        currStr = currStr.substring(currStr.indexOf("\""), currStr.length());
        currStr = currStr.substring(1, currStr.indexOf(",") - 1);
        iPh = true;
        phoneNumber = currStr; // set phone number
      }
    }
    else
    {
      Serial.println(currStr);
    }

    currStr = "";
  }
  else if (currSymb != '\n')
  {
    currStr += String(currSymb);
  }
}

void touch()
{
  if (millis() >= updateTime) {
    GPRS.println("AT");
    updateTime += 3600;
  }
}

 

Valera19701
Valera19701 аватар
Offline
Зарегистрирован: 18.10.2015

строка 40 попробуйте использовать switch вместо if как в примере

http://www.seeedstudio.com/wiki/GPRS_Shield_V1.0

R3al
Offline
Зарегистрирован: 29.10.2015

Я попробую конечно, спасибо, но вот что я сделал: закоментировал 25 и 26 строки, где стоит проверка доступности шилда, поставил задержку 3сек при загрузке ардуины, что бы дать шилду прогрузиться, теперь всё работает как хотелось. Но вопрос остался, почему он выдает Not available при простое? Чудо прям... =(

R3al
Offline
Зарегистрирован: 29.10.2015

Теперь другая беда)) Чтение с GPRS шилда перестало реагировать.. Но тут я уже попробую переписать цикл.

Andrey-S
Offline
Зарегистрирован: 02.01.2015
R3al
Offline
Зарегистрирован: 29.10.2015

Андрей, я изначально оттуда и брал пример, я же говорю из-за вот этого кусочка: 

if (!gprsSerial.available())
        return;

Нажатие не срабатывает когда мне нужно, теперь стало срабатывать, вот сейчас переписываю чтение с шилда данных, а то я не номер не могу определить и вообще понять что там у них происходит))

Andrey-S
Offline
Зарегистрирован: 02.01.2015

R3al пишет:

Андрей, я изначально оттуда и брал пример, я же говорю из-за вот этого кусочка: 

if (!gprsSerial.available())
        return;

Нажатие не срабатывает когда мне нужно, теперь стало срабатывать, вот сейчас переписываю чтение с шилда данных, а то я не номер не могу определить и вообще понять что там у них происходит))

Вам бы знаете как поступить если планируете дальше ковыряться с шилдом... По своему опыту чисто советую... Необходимо изучить либо посимвольный разбор строк, либо методом substring() к примеру... Я для себя выбрал второй ибо он проще поначалу оказался. Я лично произвожу чтение с шилда через while и заношу все в строку, которую затем просто разбираю... Функция touch по мне так вообще лишняя оказалась и я ее выкинул.

R3al
Offline
Зарегистрирован: 29.10.2015

Andrey-S пишет:

R3al пишет:

Андрей, я изначально оттуда и брал пример, я же говорю из-за вот этого кусочка: 

if (!gprsSerial.available())
        return;

Нажатие не срабатывает когда мне нужно, теперь стало срабатывать, вот сейчас переписываю чтение с шилда данных, а то я не номер не могу определить и вообще понять что там у них происходит))

Вам бы знаете как поступить если планируете дальше ковыряться с шилдом... По своему опыту чисто советую... Необходимо изучить либо посимвольный разбор строк, либо методом substring() к примеру... Я для себя выбрал второй ибо он проще поначалу оказался. Я лично произвожу чтение с шилда через while и заношу все в строку, которую затем просто разбираю... Функция touch по мне так вообще лишняя оказалась и я ее выкинул.

А я по этому поводу и спорить не собираюсь и даже благодарю за совет, я просто никак не могу понять этот чудо язык)) Я знаю C++ и C# немного, но вот тут половина из языков не работает, поэтому для меня это прям велосипед какой-то)) Я touch тоже убрал - он работает не корректно, его задача опрашивать каждые n-секунд, но он проходит 7-8 итераций и больше не работает. 

Andrey-S
Offline
Зарегистрирован: 02.01.2015

Ну я вообще никакие языки не знаю кроме этого... Да и этот то далеко не 100%... Вот всех функций в разделе "Программирование" вполне хватает на все. 

R3al
Offline
Зарегистрирован: 29.10.2015

Последний вопрос: парсю я значит побуквенно дату с шилда и всё классно, но вот иногда при звонке проскакивает в консоли буквы "я" русские, которых там и быть то не должно. Это чего за данные такие? Кто-то в курсе?

AT

Oяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяя
RING

+CLIP: "+7961ххххххх",145,"",,"",0
яяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяя
NO CARRIER

 

Andrey-S
Offline
Зарегистрирован: 02.01.2015

Был у меня косяк но немного другой...'я' это отсутствие данных... Только почему вместо "ничего" приходит "я" скажут опытные программеры

Valera19701
Valera19701 аватар
Offline
Зарегистрирован: 18.10.2015

такая же бяка, переодически проскакивают  "я"

R3al
Offline
Зарегистрирован: 29.10.2015

Забил я пока на эти "я". Опять вопрос.. Как различать что идет гудок либо что шилду говорят что я "абонент не абонент" либо что бы когда трубку снимает голосовая почта, что это не я, а голосовая почта? Никак походу? Последнее пока опустим, основной вопрос: "Как определить гудок?")

Yarik.Yar
Offline
Зарегистрирован: 07.09.2014

При звонке на модуль он будет отправлять в сериал слово RING

Andrey-S
Offline
Зарегистрирован: 02.01.2015

Что то я нифига нормально не понял)))) "абанент не абонент" это всмысле недоступен сам шилд при звонке?)

R3al
Offline
Зарегистрирован: 29.10.2015

Слово RING это понятно, я вообще АТ'шкой включил AT+MORING=1 и отслеживаю "MO RING", "MO CONNECTED" и ещё там какая-то, ещё я отлавливаю BISY и т.д. Но вот у меня оператор Теле2 и подключена голосовая почта, если ардуина мне звонит и я вне зоны действия сети, т.е. "абонент не абонент", автоматом поднимает трубку голосовая почта и ардуина думает что трубку снял я и вот собственно в этом проблема. В голосовой почте через 4 секунды проносится тоновый высокий сигнал, мол записывайте сообщение, так вот можно ли как-то этот сигнал ардуиной определить?

Andrey-S
Offline
Зарегистрирован: 02.01.2015

А че просто паузой его не сдвинуть? Ловишь момент когда взяли трубку и через 4 секунды шлешь че надо, а точнее с запасом небольшим - 5секунд к примеру

R3al
Offline
Зарегистрирован: 29.10.2015

Теперь я не понял)) Мне нужно что бы ардуина точно знала что она не попала на голосовую почту, что бы бабки впустую не тратила на симке. Т.е. если она мне не дозвонилась, она попробует это ещё раз сделать. Но вот голосовая почта снимает трубку и ардуина думает что она дозвонилась и вот связь у них вот так и висит, пока голосовая почта вызов не отобьет) Так понятнее?