Передать время на Arduino

Подключение исполнительных устройств, датчиков, контроллеров.

Модератор: immortal

PAV
Сообщения: 949
Зарегистрирован: Пт дек 06, 2013 11:30 am
Откуда: Москва
Благодарил (а): 68 раз
Поблагодарили: 94 раза

Передать время на Arduino

Сообщение PAV » Вт фев 25, 2014 10:07 am

Как?
Кто-нибудь реализовал?
Пытаюсь, но пока не получается - мозг "замылился" похоже.
У меня все передается /command?(pinNo),(command)
В МЖД выделяю каждую часть времени (час, мин, сек, день ..). Могу передать одним числом в Ардуину, но у ардуины нет таких переменных, которые потянут такое большое число, чтобы распарсить его потом.
На Arduino использую библиотеку Time с settime().
Могу обновлять с сервера времени, могу поставить часы реального времени, но мне надо, чтобы МЖД периодически устанавливал часы на Ардуино.
КАК?
dmw
Сообщения: 469
Зарегистрирован: Вт мар 12, 2013 1:22 am
Благодарил (а): 41 раз
Поблагодарили: 81 раз

Re: Передать время на Arduino

Сообщение dmw » Вт фев 25, 2014 10:19 am

а что мешает передавать время в unixtime?
Для дуины это будет переменная unsigned long
PAV
Сообщения: 949
Зарегистрирован: Пт дек 06, 2013 11:30 am
Откуда: Москва
Благодарил (а): 68 раз
Поблагодарили: 94 раза

Re: Передать время на Arduino

Сообщение PAV » Вт фев 25, 2014 12:16 pm

а можно сразу пример, как переводить в unixtime или как выделять на МЖД?
dmw
Сообщения: 469
Зарегистрирован: Вт мар 12, 2013 1:22 am
Благодарил (а): 41 раз
Поблагодарили: 81 раз

Re: Передать время на Arduino

Сообщение dmw » Вт фев 25, 2014 12:28 pm

На МЖД есть встроенная функция $timePC=time(); http://smartliving.ru/Main/ProgrammingFunctions
Передавайте в виде /command?time=($timePC)

Судя по описанию библиотеки setTime() прекрасно работает с time_t. http://www.pjrc.com/teensy/td_libs_Time.html
Поэтому на дуине, приняв данные, обновляете часы:
setTime($timePC);
Alex
Сообщения: 2357
Зарегистрирован: Пт апр 20, 2012 12:53 pm
Благодарил (а): 42 раза
Поблагодарили: 262 раза

Re: Передать время на Arduino

Сообщение Alex » Вт фев 25, 2014 1:04 pm

Всё уже придумано до нас. (с) :)

Там на страничке

http://smartliving.ru/forum/viewtopic.p ... 3&start=70

длинный листинг, где на Arduino организованы виртуальные часы, корректируемые из М по сети.

То, что вам надо, единственное, иногда бывают ошибки — нужно допилить алгоритм.
PAV
Сообщения: 949
Зарегистрирован: Пт дек 06, 2013 11:30 am
Откуда: Москва
Благодарил (а): 68 раз
Поблагодарили: 94 раза

Re: Передать время на Arduino

Сообщение PAV » Вт фев 25, 2014 3:30 pm

dmw писал(а): Передавайте в виде /command?time=($timePC)
Спасибо большое, отлично работает. Зря я голову ломал ;)

Единственное МЖД передает GMT значение, а как часовой пояс учесть? AdjustTime или проще как-то можно?
Аватара пользователя
sergejey
Site Admin
Сообщения: 4284
Зарегистрирован: Пн сен 05, 2011 6:48 pm
Откуда: Минск, Беларусь
Благодарил (а): 75 раз
Поблагодарили: 1559 раз
Контактная информация:

Re: Передать время на Arduino

Сообщение sergejey » Вт фев 25, 2014 3:34 pm

time(); должно отдавать время с учётом настроек часового пояса.

Сергей Джейгало, разработчик MajorDoMo
Идеи, ошибки -- за предложениями по исправлению и развитию слежу только здесь!
Профиль Connect -- информация, сотрудничество, услуги
PAV
Сообщения: 949
Зарегистрирован: Пт дек 06, 2013 11:30 am
Откуда: Москва
Благодарил (а): 68 раз
Поблагодарили: 94 раза

Re: Передать время на Arduino

Сообщение PAV » Вт фев 25, 2014 4:39 pm

Код сценария МЖД

Код: Выделить всё

$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);
PAV
Сообщения: 949
Зарегистрирован: Пт дек 06, 2013 11:30 am
Откуда: Москва
Благодарил (а): 68 раз
Поблагодарили: 94 раза

Re: Передать время на Arduino

Сообщение PAV » Вт фев 25, 2014 10:41 pm

Блин, при тестах вообще время перестало приходить. Оказалось, что я использую для парсинга команды 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");

PAV
Сообщения: 949
Зарегистрирован: Пт дек 06, 2013 11:30 am
Откуда: Москва
Благодарил (а): 68 раз
Поблагодарили: 94 раза

Re: Передать время на Arduino

Сообщение PAV » Вт фев 25, 2014 11:18 pm

maxLength был короткий, изменил на 40 - все заработало
Ответить