Страница 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 - все заработало