Наткнулся на это вот: http://www.arduino.cc/playground/Code/time Можно ли эту библиотеку применять для получения времени с платы GPRS Shield? Сразу у меня как-то не получилось. Может, подскажете чего?
Да, можно и ей воспользоваться. Обратите внимание на функцию `processSyncMessage` в примере. Вам нужно примерно то же самое. Только перед считыванием с Serial, вам нужно будет запросить само время соответствующей AT-командой у шилда.
После того, как немножко помучался, взял и тупо откопипастил целиком скетч из примера. Выдает "waiting for sync message". Т.е. времени там нет, если я правильно понимаю (if(timeStatus() == timeNotSet) Serial.println("waiting for sync message");) . Почему? Оговорюсь сразу - специально время я не выставлял. Просто впихнул батарейку, рассчитывая на то, что часы стартанут сами. Точное время мне пока необязательно. Хотя время в принципе я с платы считывал (см. мою ветку http://forum.amperka.ru/threads/А-теперь-про-gprs-shield.811/page-2), хоть и кривовато шло. Что не так?
Стало быть в `processSyncMessage` время не пришло. Вы точно перед этим давали AT-команду «AT+CCLK?»? Можете привести код целиком? (используйте кнопку «код» для вставки)
Я тут поэкспериментировал. Время выдает. НО. Почему-то с каждым запуском программы время обнуляется и начинает "тикать" сначала. Код ниже по тексту. Картинка во вложении. Код (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); }
Уф, оф Вы стали ближе. Смотрите что вы написали: Код (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++. Попробую сегодня найти время, чтобы показать как сделать правильно.
Вы не совсем правы. Насчет того, что знаний не хватает Их нет в принципе Просто понадобился сей прибор (измерение температуры и отсылка результата смс-кой). Вот и действую методом "научного тыка".
Каким-то кривым способом (функцией 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); }