А теперь про GPRS Shield

Тема в разделе "Arduino & Shields", создана пользователем bvv, 1 окт 2012.

  1. Unixon

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

    А хоть на какой то скорости ответ считываетмя вменяемый?
     
  2. bvv

    bvv Нерд

    Поэкспериментировал. На разных скоростях примерно-приблизительно такая же ерунда "в столбик".
     
  3. bvv

    bvv Нерд

    Набросал другой скетч (см. ниже). Я конечно, помню, что "goto" это моветон. Зато хоть как-то работает :) . Но через какое-то время начинает выдавать всякую фигню. См. аттач. Что с этим делать?
    Народ! Помогите, плз! Очень надо девайс запустить!

    // подключаем библиотеку GPRS модуля
    #include <SoftwareSerial.h>
    #include <stdio.h>
    #include <string.h>
    // заводим serial-соединение на 7 и 8 цифровых входах
    SoftwareSerial gprsSerial(7, 8);

    void setup ()
    {
    gprsSerial.begin(19200);
    Serial.begin(9600);
    }

    String currStr = "";
    char result;
    void loop ()
    {
    delay(300);
    if (!gprsSerial.available())
    delay(100);
    gprsSerial.println("AT+CCLK?");
    delay(100);

    timeRead:
    char currSymb = gprsSerial.read();
    currStr = currStr + currSymb;
    if (currSymb == '\r')
    {
    goto timePrint;
    }

    else
    {
    goto timeRead;
    }

    timePrint:

    delay(100);
    Serial.println(currStr);
    currStr="";
    delay(100);
    }
     

    Вложения:

    • 22-10-3.jpg
      22-10-3.jpg
      Размер файла:
      42,3 КБ
      Просмотров:
      579
  4. bvv

    bvv Нерд

    А вот кстати еще вопросик. Для снятия времени вот это: http://www.arduino.cc/playground/Code/time можно использовать? Мне ж вся строка не нужна. Только часы+минуты. Все бы упростилось значительно.
     
  5. Val_abc

    Val_abc Нерд

    Если это еще интересно.
    У меня вот так заработало

    Код (Text):

    //Скетч разработан на основе информации отсюда http://wiki.amperka.ru/%D0%B1%D0%B5%D1%81%D0%BF%D1%80%D0%BE%D0%B2%D0%BE%D0%B4%D0%BD%D0%B0%D1%8F-%D1%81%D0%B2%D1%8F%D0%B7%D1%8C:gprs-shield
    //Переделан так чтобы не использовать String, добавлено считывание времени с GPRS шилда

    #include <SoftwareSerial.h>

    SoftwareSerial gprsSerial(7, 8);
    int i=0;
    char msg[160]="";
    char phoneNum[20]="";
    char time[30]="";
    boolean isMessage=false;
    unsigned long previousTimer=0;
    unsigned interval=1000;

    void setup()
    {
      Serial.begin(19200);  
      delay(2000);
      gprsSerial.begin(19200);             
      delay(300);
      gprsSerial.print("AT+CCLK=\"13/03/25,10:00:00+16\"\r"); //Устанавливаем время
      Serial.println("GPRS started");  
    }

    void loop(void)
    {
      unsigned long currentTimer = millis();  
      if ((currentTimer - previousTimer) > interval) {
        previousTimer = currentTimer;
        gprsSerial.print("AT+CCLK?\r");  //Запрашиваем время каждую секунду
      }

      if (gprsSerial.available()){     //Считываем время, а также СМС и т.д.
        char buf = gprsSerial.read();
        // Serial.print(buf);
        if ('\r' == buf) {
          msg[i++] ='\0';  //Добавляем нуль терминатор
          if (isMessage) {
            //если текущая строка - SMS-сообщение,
            //отреагируем на него соответствующим образом
            Serial.println(phoneNum); //Печатаем номер телефона с которого пришла СМС
            Serial.println(msg);  //Печатаем текст СМС         
            isMessage = false;
          }
          else {
            if (!strncmp("+CMT",msg,4)) {
              int i=0;
              //если текущая строка начинается с "+CMT",
              //то следующая строка является сообщением
              isMessage = true;
              for (i=8;(msg[i]!=',') && (i<30);i++) {  //Выбираем из первой строки сообщения номер телефона с которого оно было отправлено
              }
              msg[i-1]='\0';          //Добавляем нуль терминатор в конец строки с номером телефона
              strcpy(phoneNum,msg+8); //Копируем номер телефона в другую строку
            }
            if (!strncmp("+CCLK",msg,5)) {  //Делаем все то же самое с последовательностью символов начинающейся на +CCLK
              int i=0;                    //Эта последовательность является ответом шилда на запрос текущего времени
              for (i=8;(msg[i]!='"') && (i<40);i++) {  //Выделяем из ответа строку содержащую текущее время
              }
              msg[i-3]='\0';
              strcpy(time,msg+8);
              Serial.println(time); //и печатаем ее       
            }
          }
          i=0;         
        }
        else if ('\n' != buf) {
          msg[i++] = buf;
        }  
      }
    }


     
     
    nailxx нравится это.
  6. Ого, спасибо, сильно заинтересовался часиками, сам их не заметил в даташите...

    Известно ли что-то про добротность этих часиков?

    В имеющемся у меня экземпляре Mega 2560 часики отстают примерно на 9 секунд в час, причем из поисков в интернетах получилось, что это не бага, а фича, так типа и задумано

    Пока что решил проблему точного времени тем, что через GPRS примерно раз в час запрашиваю время по протоколу NTP, и корректирую часы. Впрочем, надо не забывать, что батарейка RTC есть не на всех платах (а на моей есть, хотя ни в одном даташите не нарисована, пришлось разобрать ), и, при первом старте системы, время всё равно надо как-то узнавать из внешних источников.
     
  7. antonim

    antonim Нуб

    можете подсказать, как "заставить" gsm-модуль запросить у оператора реальное время (исходим из того, что оператор это поддерживает). чтобы это время далее можно было считать из модуля посредством AT+CCLK.
     
  8. yhl

    yhl Нерд

    Если у тебя оператор мегафон отправь *122#
     
  9. MDV

    MDV Гик

    Если я правильно помню в библе, что на амперке, есть функция запроса времени.
    Дополнительно, да простят меня админы. на сайте it5 есть пример не только как брать время из модема но и как его синхронизировать с глобальным сайтом, но там чип другой и необходимо немного править библиотеку
     
  10. Как конкретно считать или час или минуту с GPRS шилда