Страница 1 из 2
Передать время на Arduino
Добавлено: Вт фев 25, 2014 10:07 am
PAV
Как?
Кто-нибудь реализовал?
Пытаюсь, но пока не получается - мозг "замылился" похоже.
У меня все передается /command?(pinNo),(command)
В МЖД выделяю каждую часть времени (час, мин, сек, день ..). Могу передать одним числом в Ардуину, но у ардуины нет таких переменных, которые потянут такое большое число, чтобы распарсить его потом.
На Arduino использую библиотеку Time с settime().
Могу обновлять с сервера времени, могу поставить часы реального времени, но мне надо, чтобы МЖД периодически устанавливал часы на Ардуино.
КАК?
Re: Передать время на Arduino
Добавлено: Вт фев 25, 2014 10:19 am
dmw
а что мешает передавать время в unixtime?
Для дуины это будет переменная unsigned long
Re: Передать время на Arduino
Добавлено: Вт фев 25, 2014 12:16 pm
PAV
а можно сразу пример, как переводить в unixtime или как выделять на МЖД?
Re: Передать время на Arduino
Добавлено: Вт фев 25, 2014 12:28 pm
dmw
На МЖД есть встроенная функция $timePC=time();
http://smartliving.ru/Main/ProgrammingFunctions
Передавайте в виде /command?time=($timePC)
Судя по описанию библиотеки setTime() прекрасно работает с time_t.
http://www.pjrc.com/teensy/td_libs_Time.html
Поэтому на дуине, приняв данные, обновляете часы:
setTime($timePC);
Re: Передать время на Arduino
Добавлено: Вт фев 25, 2014 1:04 pm
Alex
Всё уже придумано до нас. (с)
Там на страничке
http://smartliving.ru/forum/viewtopic.p ... 3&start=70
длинный листинг, где на Arduino организованы виртуальные часы, корректируемые из М по сети.
То, что вам надо, единственное, иногда бывают ошибки — нужно допилить алгоритм.
Re: Передать время на Arduino
Добавлено: Вт фев 25, 2014 3:30 pm
PAV
dmw писал(а):
Передавайте в виде /command?time=($timePC)
Спасибо большое, отлично работает. Зря я голову ломал
Единственное МЖД передает GMT значение, а как часовой пояс учесть? AdjustTime или проще как-то можно?
Re: Передать время на Arduino
Добавлено: Вт фев 25, 2014 3:34 pm
sergejey
time(); должно отдавать время с учётом настроек часового пояса.
Re: Передать время на Arduino
Добавлено: Вт фев 25, 2014 4:39 pm
PAV
Код сценария МЖД
Код: Выделить всё
$arip = gg("Arduino.IP");
$timePC=time();
$cmdUrl = "http://". $arip. "/command?99,". $timePC;
say($cmdUrl);
getURL($cmdUrl,0);
Вот прямо сейчас 17:35 выдало следующее значение - 1393335335
Arduino после установки времени по данному числу выдает 13:35
Разница 4 часа, я и подумал, что не учтен часовой пояс (я в Москве)
UPD: Забил в несколько онлайн конвертеров - кто-то выдает 13, кто-то 17 - что за ...?
UPD2: Ага, я на линуксе (малинка), похоже тут собака порылась.
UPD3: В общем пока в скетч добавил adjustTime(14400);
Re: Передать время на Arduino
Добавлено: Вт фев 25, 2014 10:41 pm
PAV
Блин, при тестах вообще время перестало приходить. Оказалось, что я использую для парсинга команды GET ommandReceived.toInt() и режется последняя цифра.
Как переделать код, чтобы MDparameter стал unsigned long?
Код: Выделить всё
EthernetClient client = server.available();
if (client) {
Serial.println("new client");
// an http request ends with a blank line
boolean currentLineIsBlank = true;
while (client.connected()) {
if (client.available()) {
char c = client.read();
if (url.length() < maxLength) {
url+=(c);
}
// if you've gotten to the end of the line (received a newline
// character) and the line is blank, the http request has ended,
// so you can send a reply
if (c == '\n' && currentLineIsBlank) {
Serial.print("HTTP request: ");
Serial.println(url);
if (url.indexOf("?")>=0) {
int PosB=url.indexOf("?")+1;
int PosE=url.indexOf("HTTP");
if (url.indexOf(",")>=0) {
// command has parameters
int PosP=url.indexOf(",");
commandReceived=url.substring(PosB,PosP);
parametersReceived=url.substring(PosP+1,PosE-1);
} else {
// command does not have parameters
commandReceived=url.substring(PosB,PosE-1);
parametersReceived="";
}
//Serial.print("Command: ");
//Serial.println(commandReceived);
//Serial.print("Parameter: ");
//Serial.println(parametersReceived);
MDcommand = commandReceived.toInt();
MDparameter = parametersReceived.toInt();
//Serial.print("MDCommand: ");
//Serial.println(MDcommand);
}
// send a standard http response header
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println("Connection: close");
client.println();
client.println("<!DOCTYPE HTML>");
client.println("<html><head><title>Arduino</title></head><body>");
client.println("</body><html>");
break;
}
if (c == '\n') {
// you're starting a new line
currentLineIsBlank = true;
}
else if (c != '\r') {
// you've gotten a character on the current line
currentLineIsBlank = false;
}
}// end if (client.available())
} //END while (client.connected())
// give the web browser time to receive the data
delay(1);
// close the connection:
url = "";
client.stop();
Serial.println("client disconnected");
Re: Передать время на Arduino
Добавлено: Вт фев 25, 2014 11:18 pm
PAV
maxLength был короткий, изменил на 40 - все заработало