Набросал другой скетч (см. ниже). Я конечно, помню, что "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); }
А вот кстати еще вопросик. Для снятия времени вот это: http://www.arduino.cc/playground/Code/time можно использовать? Мне ж вся строка не нужна. Только часы+минуты. Все бы упростилось значительно.
Если это еще интересно. У меня вот так заработало Код (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; } } }
Ого, спасибо, сильно заинтересовался часиками, сам их не заметил в даташите... Известно ли что-то про добротность этих часиков? В имеющемся у меня экземпляре Mega 2560 часики отстают примерно на 9 секунд в час, причем из поисков в интернетах получилось, что это не бага, а фича, так типа и задумано Пока что решил проблему точного времени тем, что через GPRS примерно раз в час запрашиваю время по протоколу NTP, и корректирую часы. Впрочем, надо не забывать, что батарейка RTC есть не на всех платах (а на моей есть, хотя ни в одном даташите не нарисована, пришлось разобрать ), и, при первом старте системы, время всё равно надо как-то узнавать из внешних источников.
можете подсказать, как "заставить" gsm-модуль запросить у оператора реальное время (исходим из того, что оператор это поддерживает). чтобы это время далее можно было считать из модуля посредством AT+CCLK.
Если я правильно помню в библе, что на амперке, есть функция запроса времени. Дополнительно, да простят меня админы. на сайте it5 есть пример не только как брать время из модема но и как его синхронизировать с глобальным сайтом, но там чип другой и необходимо немного править библиотеку