Как снять время с GPRS Shield?

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

  1. bvv

    bvv Нерд

    Наткнулся на это вот: http://www.arduino.cc/playground/Code/time
    Можно ли эту библиотеку применять для получения времени с платы GPRS Shield? Сразу у меня как-то не получилось. Может, подскажете чего?
     
  2. nailxx

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

    Да, можно и ей воспользоваться. Обратите внимание на функцию `processSyncMessage` в примере. Вам нужно примерно то же самое. Только перед считыванием с Serial, вам нужно будет запросить само время соответствующей AT-командой у шилда.
     
  3. bvv

    bvv Нерд

    После того, как немножко помучался, взял и тупо откопипастил целиком скетч из примера. Выдает "waiting for sync message". Т.е. времени там нет, если я правильно понимаю (if(timeStatus() == timeNotSet)
    Serial.println("waiting for sync message");) . Почему? Оговорюсь сразу - специально время я не выставлял. Просто впихнул батарейку, рассчитывая на то, что часы стартанут сами. Точное время мне пока необязательно. Хотя время в принципе я с платы считывал (см. мою ветку http://forum.amperka.ru/threads/А-теперь-про-gprs-shield.811/page-2), хоть и кривовато шло. Что не так?
     
  4. nailxx

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

    Стало быть в `processSyncMessage` время не пришло. Вы точно перед этим давали AT-команду «AT+CCLK?»? Можете привести код целиком? (используйте кнопку «код» для вставки)
     
  5. bvv

    bvv Нерд

    Я тут поэкспериментировал. Время выдает. НО. Почему-то с каждым запуском программы время обнуляется и начинает "тикать" сначала. Код ниже по тексту. Картинка во вложении.

    Код (Text):
    // подключаем библиотеку GPRS модуля
    #include <SoftwareSerial.h>
    // заводим serial-соединение на 7 и 8 цифровых входах
    SoftwareSerial gprsSerial(7, 8);
     
    #include <Time.h>
     
    #define TIME_MSG_LEN  11  // time sync to PC is HEADER followed by Unix time_t as ten ASCII digits
    #define TIME_HEADER  'T'  // Header tag for serial time sync message
    #define TIME_REQUEST  7    // ASCII bell character requests a time sync message
     
    // T1262347200  //noon Jan 1 2010
     
    void setup()
    {
      Serial.begin(9600);
      gprsSerial.begin(19200);
    }
     
    void loop()
    {
      digitalClockDisplay();
      delay(1000);
      }
     
    void digitalClockDisplay()
    {
      gprsSerial.print("AT+CCLK?");
      gprsSerial.read();
      Serial.print(hour());
      printDigits(minute());
      printDigits(second());
      Serial.print(" ");
      Serial.print(day());
      Serial.print(" ");
      Serial.print(month());
      Serial.print(" ");
      Serial.print(year());
      Serial.println();
    }
     
    void printDigits(int digits)
    {
      // utility function for digital clock display: prints preceding colon and leading 0
      Serial.print(":");
      if(digits < 10)
      Serial.print('0');
      Serial.print(digits);
    }
     

    Вложения:

    • time.jpg
      time.jpg
      Размер файла:
      132 КБ
      Просмотров:
      736
  6. nailxx

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

    Уф, оф :) Вы стали ближе. Смотрите что вы написали:

    Код (Text):

    // спрашиваем у GPRS сколько времени
    gprsSerial.print("AT+CCLK?");
     
    // из ответа считываем один байт и выкидываем его
    gprsSerial.read();
     
    // печатаем время, прошедшее с момента перезагрузки
    // Arduino, т.к. оно никак не связывается с GPRS
    Serial.print(hour());
    printDigits(minute());
    printDigits(second());
     
    Вместо холостого `gprsSerial.read()` вам нужно правильно считать ответ, разобрать его и в соответствии с ним установить параметры текущего времени, которуе уже затем отдаётся через `hour`, `minute` и еже с ними. Примерно этим и занималась функция `processSyncMessage`. Вам стоило только подогнать её под формат строки, выдаваемый GPRS-Shield.

    Чую я не хватает вам знаний C++. Попробую сегодня найти время, чтобы показать как сделать правильно.
     
  7. bvv

    bvv Нерд

    Вы не совсем правы. Насчет того, что знаний не хватает :) Их нет в принципе :) Просто понадобился сей прибор (измерение температуры и отсылка результата смс-кой). Вот и действую методом "научного тыка".
     
  8. bvv

    bvv Нерд

    Каким-то кривым способом (функцией setTime) запустил время (см. аттач). Только получается, что этому времени абсолютно пофиг, что там творится в RTC. Я так понимаю, что мы устанавливаем некое время, а затем плюсуем по секунде? И как долго такое работать будет? Если не разберусь, как снимать время непосредственно с шилда, то и такой кривой вариант меня устроит. Лишь бы работало долго. Вот только не пойму, в каком формате функция возвращает значение времени? Чтоб можно был сравнить с эталоном?

    Код (Text):
    // подключаем библиотеку GPRS модуля
    #include <SoftwareSerial.h>
    // заводим serial-соединение на 7 и 8 цифровых входах
    SoftwareSerial gprsSerial(7, 8);
     
    #include <Time.h>
     
    #define TIME_MSG_LEN  20  // time sync to PC is HEADER followed by Unix time_t as ten ASCII digits
    #define TIME_HEADER  'T'  // Header tag for serial time sync message
    #define TIME_REQUEST  7    // ASCII bell character requests a time sync message
     
    // T1262347200  //noon Jan 1 2010
     
    void setup()
    {
      Serial.begin(9600);
      gprsSerial.begin(19200);
      setTime(14,32,00,30,10,12);
    }
     
    void loop()
    {
      digitalClockDisplay();
      delay(1000);
      }
     
    void digitalClockDisplay()
    {
      Serial.print(hour());
      printDigits(minute());
      printDigits(second());
      Serial.print(" ");
      Serial.print(day());
      Serial.print(" ");
      Serial.print(month());
      Serial.print(" ");
      Serial.print(year());
      Serial.println("");
    }
     
    void printDigits(int digits)
    {
      // utility function for digital clock display: prints preceding colon and leading 0
      Serial.print(":");
      if(digits < 10)
      Serial.print('0');
      Serial.print(digits);
    }