Unix Time по NTP и mkTime

Тема в разделе "Arduino & Shields", создана пользователем obuhanoe, 3 авг 2016.

  1. obuhanoe

    obuhanoe Гик

    Добрый вечер!
    Написал скетч, который заливаю в ESP266-01. Получаю по NTP время, чтобы понять нужно включить реле или еще нет и получаю странные значения для t_time_b и t_time_e
    Код (C++):
    unsigned long ntp_time = 0;
    int sH[2]= {6,20};
    int sM[2]= {0,0};
    int eH[2]= {6,21};
    int eM[2]= {30,15};
    time_t t_time_now, t_time_b, t_time_e;
    struct tm ts, te, t_now;

    t_time_now = (time_t(ntp_time));
           ts = te = t_now = *localtime(&t_time_now);

           for (int i = 0; i < 2; i++) {
         ts.tm_hour = sH[i];
            ts.tm_min  = sM[i];
            ts.tm_sec  = 0;
            te.tm_hour = eH[i];
            te.tm_min  = eM[i];
            te.tm_sec  = 0;

          t_time_b = mktime(&ts);
            t_time_e = mktime(&te);

        if (t_time_now >= t_time_b && t_time_now <= t_time_e) {
               
               Serial.println("RELAY ON");
               
               on_off = true;
            } else {
              on_off = false;
              Serial.println("RELAY OFF");
            }

    }
    ntp_time - значение корректное вида - 1470248857

    заметил что, ф-я mktime почему то не корректно конвертирует, значения получаются отрицательные.
    t_time_b = -444412352
    t_time_e = -444407852

    Помогите понять ошибку, спасибо

    P.S. - нормально ли, что скетч заливается в ESP8266-01 минут 5 через Arduino IDE?
     
  2. DIYMan

    DIYMan Guest

    Да вроде навскидку не видно особого криминала.

    Правка: прогнал ваш код:
    Код (C++):
    // Example program
    #include <iostream>
    #include <string>

    int main()
    {
    bool on_off;
    unsigned long ntp_time = 0;
    int sH[2]= {6,20};
    int sM[2]= {0,0};
    int eH[2]= {6,21};
    int eM[2]= {30,15};
    time_t t_time_now, t_time_b, t_time_e;
    struct tm ts, te, t_now;

    t_time_now = (time_t(ntp_time));
           ts = te = t_now = *localtime(&t_time_now);

           for (int i = 0; i < 2; i++) {
         ts.tm_hour = sH[i];
            ts.tm_min  = sM[i];
            ts.tm_sec  = 0;
            te.tm_hour = eH[i];
            te.tm_min  = eM[i];
            te.tm_sec  = 0;

          t_time_b = mktime(&ts);
          t_time_e = mktime(&te);
         
          std::cout << t_time_b << std::endl;
          std::cout << t_time_e << std::endl;

        if (t_time_now >= t_time_b && t_time_now <= t_time_e) {
             
               std::cout << ("RELAY ON") << std::endl;
             
               on_off = true;
            } else {
              on_off = false;
              std::cout <<  ("RELAY OFF") << std::endl;
            }

    }
    }
     
    через http://cpp.sh/ - всё корректно выводит.
     
    Последнее редактирование модератором: 3 авг 2016
  3. obuhanoe

    obuhanoe Гик

  4. Vetrinus

    Vetrinus Гик

    Arduino Mega Server умеет корректно получать время по NTP. Там, правда, W5100, но реализацию посмотреть можете
     
  5. obuhanoe

    obuhanoe Гик

    ESP8266 корректно получает данные, я это указал (ntp_time - это и есть текущее время полученное по NTP). А вот изменение полученного времени с последующей конвертацией с помощью mktime - происходит некорректно.
     
  6. fogary

    fogary Гик

    Может проверить, что содержат структуры ts и te, перед вызовом mktime.
     
  7. obuhanoe

    obuhanoe Гик

    Проверял, год, месяц, день, часы, минуты и секунды -
    Код (Text):
    116, 7, 3, 6, 0 , 0
    116, 7, 3, 6, 30 , 0
    116, 7, 3, 20, 0 , 0
    116, 7, 3, 21, 15 , 0
    Т.е. структура содержит корректные данные.
    Появилась идея прогнать этот код на nano или mega.
     
  8. DIYMan

    DIYMan Guest

  9. obuhanoe

    obuhanoe Гик

    То самое, только не понятно исправят в новом билде - чего Arduino IDE? или ф-ии mktime?
     
  10. DIYMan

    DIYMan Guest

    Там не в Arduino IDE дело, а в исходниках надстройки для ESP8266 - там надо править багу эту, насколько я понял.
     
  11. obuhanoe

    obuhanoe Гик

    А что Вы понимаете под надстройкой? Как только я залил скетч в ESP - весь SDK был стерт из памяти , верно? Вижу что они включили исправление в версию 2.4.0 - понять бы что это и как это потом установить при выходе данной версии.
     
  12. DIYMan

    DIYMan Guest

    Вы программируете ESP из-под Arduino IDE, так? Значит, у вас стоит пакет поддержки этого дела, установленный в Arduino IDE. Так вот - бага в этом пакете, а не в Arduino IDE. Обновить пакет можно, зайдя в менеджер плат и выбрав там новую версию, если она доступна уже.

    Неверно.
     
    obuhanoe нравится это.
  13. obuhanoe

    obuhanoe Гик

    Точно, Вы правы.
    Спасибо за напоминание.

    Не затруднит Вас пояснить?
     
  14. DIYMan

    DIYMan Guest

    SDK никуда не стирается - это набор файлов, которые лежат по месту установки SDK. SDK можно либо использовать - либо нет. Использование того или иного SDK в Arduino IDE осуществляется выбором типа платы для проекта.
     
    obuhanoe нравится это.
  15. obuhanoe

    obuhanoe Гик

    Понял, спасибо.

    Буду ждать выход версии 2.4.0 - после отпишусь, исправили или нет.