Помогите разобраться (GSM)
  • Добрый день!
    Помогите разобраться с такой ситуацией:
    Взял код из примеров к GSM либе для реакции на СМС сообщение.
    Скажу сразу - не измененный код работает нормально.
    В моем коде я добавил цикл ожидания изменения состояния датчика, а уже после него отправляется подтверждение об изменении. Цикл этот длится от нескольких секунд до одной - двух минут.
    И вот в моем случае появилось непонятное зависание до нескольких минут перед отправкой СМС.

    Вопрос:
    Может ли цикл ожидания как-то повлиять на работу GSM модуля (таймауты какие-нибудь и т.д.)
    Буду признателен за помощь.

    ниже привел урезанную процедуру проверки СМС, так как все остальное стандартно из примера к GSM либе.




    void loop()
    {
    int i;
    int bState = digitalRead(pushButton); //bState - состояние датчика (HIGH/LOW)

    if (GSM.CheckSMS()== 1) //новое СМС
    {
    GSM.ReadSMS(NewSMS_index, (char*) SMStxt);
    GSM.DeleteAllSMS();
    strSMS = String(SMStxt);
    if(strSMS == "1" && bState==HIGH)
    {
    digitalWrite(relayPin,HIGH); //
    delay(1000); // включение реле на 1 сек
    digitalWrite(relayPin,LOW); //

    while(bState!=LOW) // здесь происходит ожидание изменения состояния датчика
    { // после чего посылается СМС о подтверждении.
    bState = digitalRead(pushButton); // Вопрос как раз в этом участке кода!!!
    }

    while(GSM.SendSMS(RemoteID, "DEAD") < 0); //СМС
    }

    GSM.WaitCall();
    GSM.WaitSMS();
    currentMillis = previousMillis = millis();
    }

    if(currentMillis - previousMillis > interval)
    {
    if ((GSM.CheckStatus() != 1)) // GPRS соединение не установлено!
    {
    while (GSM.Init(PIN)<0); // Делаем инициализацию
    }

    //Ждём звонка
    GSM.WaitCall();
    GSM.WaitSMS();
    // Начало отсчёта 60 сек.
    currentMillis = previousMillis = millis();
    }
  • Тема закрыта - все дело в слабом сигнале скорее всего ))
  • vinipux said:

    Тема закрыта - все дело в слабом сигнале )))


    А какие характеристики у вашей антенны?
    Или у вас базовая станция далеко?
  • Я смог купить только кабель с переходником на конце, а самой антенны нет)))
    Просто не посмотрел и купил переходник с разъемом RP-SMA, а для него антенн не было в наличии, ну вроде нашли сейчас, на следующей неделе купим.
    Команда AT+CSQ выдает 9,99 - что, как пишут, не очень хорошо.
  • vinipux said:

    Я смог купить только кабель с переходником на конце, а самой антенны нет)))
    Просто не посмотрел и купил переходник с разъемом RP-SMA, а для него антенн не было в наличии, ну вроде нашли сейчас, на следующей неделе купим.
    Команда AT+CSQ выдает 9,99 - что, как пишут, не очень хорошо.


    Кабельную сборку лучше было брать SMA-UFl
    GSM-антенны в основном идут под SMA-разъем.

  • Сегодня обновили GSM.cpp
    Также выложен пример работы с температурным датчиком.
  • Здравствуйте. Подскажите пожалуйста, в чем может быть проблема.
    Пишу скетч вида:

    действие1
    действие2
    поиск максимума в двумерном массиве
    действие3
    действие4

    Все нормально компилится, все работает.

    Подключаю Cosmo GSM Shield, который будет принимать СМС и в зависимости от их содержимого выполнять различные действия. Пишу:

    Если пришла единица, то
    {
    действие1
    }
    Если пришла двойка, то
    {
    действие2
    поиск максимума в двумерном массиве
    действие3
    действие4
    }

    Программа компилируется без ошибок, отправляю единицу-никакой реакции. Отправляю двойку-никакой реакции. Убираю поиск максимума в двумерном массиве- все нормально. По получении единицы выполняется действие1, по получении двойки-действия2,3 и 4. Опять добавляю поиск максимума-опять никакой реакции.

    Вот поиск максимума:

    for (int i=0;i<10;i++)
    {
    maxArr[i]=test[i][0];
    for (int j=1;j<20;j++)
    {
    if (test[i][j] > maxArr[i])
    {
    maxArr[i]=test[i][j];
    }
    }
    }


    Хочу в двумерном массиве для каждого столбца найти максимум и сохранить как элемент одномерного массива с индексом, равным индексу строки в двумерном массиве.
    Я понятия не имею, что может быть не так, причем без условий все работает.Подскажите, пожалуйста
  • Вот весь скетч, если так будет понятнее:



    #include <GSM.h>
    #include <avr/pgmspace.h>
    #include <OneWire.h> //подключаем библиотеку

    //CosmoGSM использует ноги
    //цифровые: 0, 1, 6, 7
    //аналоговые: 2, 3 (если включен режим RTS и CTS)

    const char RemoteID[] PROGMEM = "+7910ххххххх"; //Шаблон номера, с которого ждём звонка и на который отправляем СМС
    const char PIN[] PROGMEM = "0000"; //ПИН-код
    char SMStxt[162]; // Буфер для чтения текста СМС
    String strSMS;
    unsigned long interval = 60000; //Интервал проверки состояния GPRS соединения
    unsigned long currentMillis;
    unsigned long previousMillis;

    //Пины мотора
    int motorPinLeft=9; //Крутится влево
    int motorPinRight=10; //Крутится вправо

    OneWire ds(2); // Номер ноги к которой подключили датчик температуры
    int sensePin=0; //Sound

    void setup()
    {
    delay(4000);
    while (GSM.Init(PIN)<0);
    GSM.NewSMSindic();
    GSM.WaitCall();
    GSM.WaitSMS();
    previousMillis=millis();

    pinMode (motorPinLeft, OUTPUT);
    pinMode (motorPinRight, OUTPUT);
    }

    //=======================
    // LOOP //
    //=======================
    void loop()
    {
    analogWrite (motorPinLeft, 0);
    delay(500);
    analogWrite (motorPinRight, 0);
    delay(500);

    // Начало отсчёта 60 сек.
    currentMillis = millis();
    if (GSM.CheckSMS()== 1)
    {
    //Есть новое СМС
    GSM.ReadSMS(NewSMS_index, (char*) SMStxt); //
    // Удалить СМСки (накапливать не будем!)
    GSM.DeleteAllSMS();
    strSMS = String(SMStxt);

    //Если пришла 1
    if(strSMS == "1")
    {
    //вызов функции, возвращающей
    //значение температуры
    float celsius = TemperatureFunction();

    //переводим полученное значение
    //температуры в массив символов и передаем
    char temperature[20];
    floatToString(temperature, celsius, 2, 7);

    while(GSM.SendSMS(RemoteID, temperature) < 0);
    }

    //Если пришла 2
    if(strSMS == "2")
    {
    float TestArr[10][2]; //массив из 10 столбцов (10 опытов),хранящий параметры ударов
    int test[10][20]=
    {
    {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
    {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
    {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
    {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
    {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
    {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
    {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
    {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
    {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
    {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
    };
    float t=0.5;
    float voltage=51;

    for (int i=0;i<10;i++)
    {
    TestArr[i][0]=t+0.5;
    TestArr[i][1]=voltage;
    }
    //Совершаем 10 ударов и берем по 20 значений амплитуды
    t=0.5;
    for (int i=0;i<10;i++)
    {
    t=t+0.5;
    //Удар (вызов процедуры)
    udar(voltage, t, i);
    //сэйвим значения в массив
    for (int j=0;j<20;j++)
    {
    test[i][j]=analogRead(sensePin);
    delay(50);
    }
    delay(10000); //даем звуку стихнуть и колоколу перестать качаться
    }

    analogWrite (motorPinLeft, voltage*5);//возвращаем вал в нужное положение
    delay(10*t);
    analogWrite (motorPinLeft, voltage*5);//возвращаем вал в нужное положение
    delay(10*t);
    //все по 0
    analogWrite (motorPinLeft, 0);
    delay(500);
    analogWrite (motorPinRight, 0);
    delay(500);

    //Ищем максимальное значение амплитуды звука
    //и определяем параметры этого удара
    int maxArr[10]= {0,0,0,0,0,0,0,0,0,0};

    /////-------------->
    for (int i=0;i<10;i++)
    {
    maxArr[i]=test[i][0];
    for (int j=1;j<20;j++)
    {
    if (test[i][j] > maxArr[i])
    {
    maxArr[i]=test[i][j];
    }
    }
    }
    //////--------------<

    int maxA;
    int maxInd=0;
    maxA=maxArr[0];
    maxInd=0;
    for (int i=1;i<10;i++)
    {
    if (maxArr[i]>maxA)
    {
    maxA=maxArr[i];
    maxInd=i;
    }
    }

    //вывод оптимальных параметров
    char period[20];
    floatToString(period, TestArr[maxInd][0], 2, 7);

    while(GSM.SendSMS(RemoteID, period) < 0);
    delay(20000);

    GSM.WaitCall();
    GSM.WaitSMS();
    // Начало отсчёта 60 сек.
    currentMillis = previousMillis = millis();
    }//Text of SMS
    }//SMS
    }//loop


    Четвертый день уже голову ломаю. То ли я чего-то не понимаю и что-то делаю не так, то ли мелочь какая-то, просто не замечаю. Но с другой стороны без условий и приема СМС все нормально. В общем буду благодарен, если поможете решить данную проблему.Заранее спасибо
  • Вы используете библиотеку GSM
    она годится только под шилд Cosmo GSM Connect

    Для Cosmo GSM Shield эта библиотека не подходит. Поэтому получение смсок не работает.
  • Простите пожалуйста, я перепутал-пользуюсь Cosmo GSM Connect, поэтому смски приходят и все работает, но только без цикла, в котором ищу максимум. С ним, почему-то, ничего не выходит(((
    Я в Arduino новичек, только начинаю разбираться. Может какая-то элементарная ошибка, а я ее не вижу(
  • Первое что вижу - delay
    Их тут нельзя использовать, они останавливают МК, это делать нельзя.
    Используйте отсчет времени, а не delay.

  • хорошо, попробую. Спасибо большое

Привет, незнакомец!

Похоже, вы новенький! Чтобы пообщаться с нами, кликните на одну из кнопок ниже :)

Войти с помощью OpenID

В этом теме: