помогите создать библиотеку

bee73
Offline
Зарегистрирован: 27.10.2019

Добрый всем день!

Есть скейч рабочий который возвращает время и дату основываясь на данных сайта. Создал 2-а файла библиотеки, но не работает ошибка: no matching function for call to 'ClassDateTime::ClassDateTime(const char [11], const char [21])'

 

 

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Вставьте скетч по правилам форума для начала

bee73
Offline
Зарегистрирован: 27.10.2019

Простите сейчас попробую, сразу не разобрался как

bee73
Offline
Зарегистрирован: 27.10.2019
#include <Arduino.h>
#include <StringDateTime.h>
const char ssid[] = ".......";  //  SSID (название) вашей сети
 const char pass[] = "........";       // пароль к вашей сети
ClassDateTime StringDateTime(ssid, pass);
void setup() { 
  
  Serial.begin(9600);
  Serial.println(StringDateTime.StringDateTime );
}

void loop() {
  //String str = DateTime.DateTime;
  //Serial.println(str);

}

 

/*
 описание в файле StringDateTime.cpp
*/
#ifndef StringDateTime_h
#define StringDateTime_h
 
//#include "WProgram.h"
#include <Arduino.h>
 
class ClassDateTime
{
  public:
    String StringDateTime(String ssid, String pass);
    //time_t getNtpTime();
    //void sendNTPpacket();
  private:
    String _ssid;
    String _pass;
};
 
#endif
/*
получение даннх о времени и дате с сайта us.pool.ntp.org
за основу взят скейч http://wikihandbk.com/wiki/Arduino:%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1%80%D1%8B/TimeNTP_ESP8266WiFi
для московского времени const int timeZone = 3 если нужен -1 час const int timeZone = 2, если -2 const int timeZone = 1
так же необходимы библиотеки TimeLib.h/ESP8266WiFi.h/WiFiUdp.h
*/

//  включение стандартных функций Ардуино
//#include "WProgram.h"
#include "StringDateTime.h"
#include <Arduino.h>
#include <TimeLib.h>
#include <ESP8266WiFi.h>
#include <WiFiUdp.h>



 String ClassDateTime :: StringDateTime(String ssid, String pass)
{
  //const char ssid[] = ssid;  //  SSID (название) вашей сети
  //const char pass[] = pass;       // пароль к вашей сети

  // NTP-серверы:
  static const char ntpServerName[] = "us.pool.ntp.org";//https://www.ntppool.org/zone/us
  //static const char ntpServerName[] = "time.nist.gov";
  //static const char ntpServerName[] = "time-a.timefreq.bldrdoc.gov";
  //static const char ntpServerName[] = "time-b.timefreq.bldrdoc.gov";
  //static const char ntpServerName[] = "time-c.timefreq.bldrdoc.gov";

  const int timeZone = 3;     // центрально-европейское время -1 московское - 3
  //const int timeZone = -5;  // восточное время (США)
  //const int timeZone = -4;  // восточное дневное время (США)
  //const int timeZone = -8;  // тихоокеанское время (США)
  //const int timeZone = -7;  // тихоокеанское дневное время (США) 


  WiFiUDP Udp;
  unsigned int localPort = 8888;  // локальный порт для прослушивания UDP-пакетов

  time_t getNtpTime();
  void printDigits(int digits);
  void sendNTPpacket(IPAddress &address);

  //while (!Serial) ; // нужно только для Leonardo
  delay(250);

  WiFi.begin(_ssid, _pass);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
   }
  Udp.begin(localPort);
  setSyncProvider(getNtpTime);
  setSyncInterval(300);
  
  char* str1 = ":";
  char* str2 = ".";
  String stringhr = String(hour(), DEC);
  String stringmt = String(minute(), DEC);
  String stringsd = String(second(), DEC);
  String stringday = String(day(), DEC);
  String stringmonth = String(month(), DEC);
  String stringyear = String(year(), DEC);

  String SDateTime = stringhr +str1+ stringmt +str1+ stringsd + '#' + stringday + str2 + stringmonth + str2 + stringyear;
   

  time_t prevDisplay = 0; // когда будут показаны цифровые часы

  /*-------- Код для NTP ----------*/

  const int NTP_PACKET_SIZE = 48;  //  NTP-время – в первых 48 байтах сообщения
  byte packetBuffer[NTP_PACKET_SIZE];  //  буфер для хранения входящих и исходящих пакетов 

  time_t getNtpTime()
  {
    IPAddress ntpServerIP; // IP-адрес NTP-сервера

    while (Udp.parsePacket() > 0) ; // отбраковываем все пакеты, полученные ранее 
    // подключаемся к случайному серверу из списка:
    WiFi.hostByName(ntpServerName, ntpServerIP);
    sendNTPpacket(ntpServerIP);
    uint32_t beginWait = millis();
    while (millis() - beginWait < 1500) {
      int size = Udp.parsePacket();
      if (size >= NTP_PACKET_SIZE) {
        Udp.read(packetBuffer, NTP_PACKET_SIZE);  // считываем пакет в буфер 
        unsigned long secsSince1900;
        // конвертируем 4 байта (начиная с позиции 40) в длинное целое число: 
        secsSince1900 =  (unsigned long)packetBuffer[40] << 24;
        secsSince1900 |= (unsigned long)packetBuffer[41] << 16;
        secsSince1900 |= (unsigned long)packetBuffer[42] << 8;
        secsSince1900 |= (unsigned long)packetBuffer[43];
        return secsSince1900 - 2208988800UL + timeZone * SECS_PER_HOUR;
      }
    }
    //Serial.println("No NTP Response :-(");  //  "Нет NTP-ответа :(" //
    return 0; // если время получить не удалось, возвращаем «0» 
  }

  // отправляем NTP-запрос серверу времени по указанному адресу: 
  void sendNTPpacket(IPAddress &address)
  {
    // задаем все байты в буфере на «0»: 
    memset(packetBuffer, 0, NTP_PACKET_SIZE);
    // инициализируем значения для создания NTP-запроса
    // (подробнее о пакетах смотрите по ссылке выше) 
    packetBuffer[0] = 0b11100011;   // LI (от «leap indicator», т.е. «индикатор перехода»), версия, режим работы 
    packetBuffer[1] = 0;     // слой (или тип часов) 
    packetBuffer[2] = 6;     // интервал запросов 
    packetBuffer[3] = 0xEC;  // точность 
    // 8 байтов с нулями, обозначающие базовую задержку и базовую дисперсию: 
    packetBuffer[12] = 49;
    packetBuffer[13] = 0x4E;
    packetBuffer[14] = 49;
    packetBuffer[15] = 52;
    // После заполнения всех указанных полей
    // вы сможете отправлять пакет с запросом о временной метке:      
    Udp.beginPacket(address, 123); // NTP-запросы к порту 123
    Udp.write(packetBuffer, NTP_PACKET_SIZE);
    Udp.endPacket();
  }
  return SDateTime;
}

 

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Что по вашему происходит в строке 5 первого листинга (использование библиотеки)

bee73
Offline
Зарегистрирован: 27.10.2019

Прости но я ещё полный 0 делал копипастом с примеров библиотек

bee73
Offline
Зарегистрирован: 27.10.2019

пример брал https://alexgyver.ru/lessons/library-writing/ в строк а 5 используется класс библиотеки

bee73
Offline
Зарегистрирован: 27.10.2019

весь день ушел а толку ноль, помоги плиз создать библиотек и как ею воспользоваться?

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

В общем помогаю - в 5 строке первого листинга ты пытаешься создать экземпляр класса с указанием двух параметров. Такого конструктора не существует в описании твоего класса, вот компилятор и ругается. 
это: ClassDateTime StringDateTime(ssid, pass);

Замени на это: ClassDateTime sDateTime;

А это: Serial.println(sDateTime.StringDateTime );

На это: Serial.println(sDateTime.StringDateTime (ssid, pass));

Хоть немного читай что копипастишь. )) Вникать перед сном лень, но это первое что заметил. Должно заработать. Хотя не факт, гайвера тут не любят. 

bee73
Offline
Зарегистрирован: 27.10.2019

Спасибо, а кто такой гайвер? 

в классе и в конструкторе я добавлял StringDateTime(String ssid, String pass); почему нельзя сначала передать все параметры а потом обратиться для получения выходного параметра?

Гриша
Offline
Зарегистрирован: 27.04.2014

bee73 пишет:

... а кто такой гайвер? 

пост 6 прочтите ссылку и поймете, а не любят из-за того, что неразумные копипастят его "творения" и вместо того, чтобы учиться - орут ПАМАГИТЕ вот их всех и отправляют к АВТОРУ.... справедливости нужно отметить, что к тому самому автору есть законные претензии по его творениям... как-то так. 

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Передать можно, для этого и существует конструктор класса. Но у тебя в классе он отсутсвует (не описан). 
Почитай про классы, конструкторы классов, деструкторы классов, экземпляры класса. 

Гриша
Offline
Зарегистрирован: 27.04.2014

ADD.  вот занимательный "свежачек" попробуйте помочь такому "хотельщику"...

bee73
Offline
Зарегистрирован: 27.10.2019

Спасибо, буду дальше мучиться, нашел недостающую }  поправил но увы...

b707
Offline
Зарегистрирован: 26.05.2017

bee73 пишет:

весь день ушел а толку ноль, помоги плиз создать библиотек и как ею воспользоваться?

уважаемый, нафига с таким уровнем знаний (нулевым) браться за создание своей библиотеки? Сначала программировать научитесь

bee73
Offline
Зарегистрирован: 27.10.2019

b707 пишет:

уважаемый, нафига с таким уровнем знаний (нулевым) браться за создание своей библиотеки? Сначала программировать научитесь

[/quote]
Вы если помочь можите помогите плиз а если нет проходите мимо. А оченивать чей либо опыт нечего. Или форум нужен чтобы п...и мериться чей код круче типа

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Знаете, код достаточно безграмотный (хотя бы вот это).

bee73 пишет:

String StringDateTime(String ssid, String pass);

и я бы не стал делать из него библиотеку.

Но, если Вы хотите, Вам лучше обратиться к его автору - https://community.alexgyver.ru/ Он скорее поможет, чем здесь.

Алексей.
Алексей. аватар
Offline
Зарегистрирован: 02.02.2018

bee73,
Для esp8266 в sdk есть ntp клиент и обертка для его использования в cores/esp8266/time.cpp
Подскажите, почему нет доверия к тому что есть в sdk, не работает или свой код всегда лучше?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Алексей. пишет:

Подскажите, почему нет доверия к тому что есть в sdk, не работает или свой код всегда лучше?

Так ТС же объяснил

bee73 пишет:

Прости но я ещё полный 0 делал копипастом с примеров библиотек

При этом, нашёл у кого копипастить :)

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

от вы все тут твари бездушные, человек, хоть и полный 0, а уже БИБЛИОТЕКУ  скопипастить задумал, и ощасливить нас.  

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

DetSimen пишет:

от вы все тут твари бездушные, человек ...

https://www.youtube.com/watch?v=RVSWXIquUPA

bee73
Offline
Зарегистрирован: 27.10.2019

Добрый день! сам скетч рабочий, да я скопипастил скейч и оставил в нем все необходимое, для цели получения времени и даты.

Нужно было сделать библиотеку, дабы уменьшить объем кода в будущем скейче. Простые библиотеки я создавал когда тренировался (без вложенных функций) а вот с большой библиотекой не получилось, поэтому и обратился к вам за помощью.... цель была передать в библиотеку данные сети а получить строку с временем и датой

Алексей.
Алексей. аватар
Offline
Зарегистрирован: 02.02.2018

DetSimen пишет:
от вы все тут твари бездушные, человек, хоть и полный 0, а уже БИБЛИОТЕКУ  скопипастить задумал, и ощасливить нас.
Про ntp клиента в sdk спрашивал совсем не для того чтоб потролить.
Иногда код выходит из под контроля, при наличии исходников отлаживать вызовы хоть как-то возможно, а тут проприетарный кусок кода в собранном виде.
Может он ведет себя неадекватно, вот и спрашивал про это.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

bee73, я Вам уже всё сказал в #16. И про рабочий скетч, и про то, к кому Вам лучше обратиться. Вы читаете, что Вам пишут?

bee73
Offline
Зарегистрирован: 27.10.2019

читал...

b707
Offline
Зарегистрирован: 26.05.2017

уважаемый (?) lee73 - вы видимо не в курсе, что в аддоне Ардуино для ЕСП уже есть готовая библиотека NTPClient

Весь запрос времени - это несколько строчек вместо фигни, что вы понаписали

#include <NTPClient.h>
#include <ESP8266WiFi.h>
#include <WiFiUdp.h>

const char *ssid     = "YOUR_SSID";
const char *password = "YOUR_PASS";

const long utcOffsetInSeconds = 3600;

char daysOfTheWeek[7][12] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};

// Define NTP Client to get time
WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP, "pool.ntp.org", utcOffsetInSeconds);

void setup(){
  Serial.begin(115200);

  WiFi.begin(ssid, password);

  while ( WiFi.status() != WL_CONNECTED ) {
    delay ( 500 );
    Serial.print ( "." );
  }

  timeClient.begin();
}

void loop() {
  timeClient.update();

  Serial.print(daysOfTheWeek[timeClient.getDay()]);
  Serial.print(", ");
  Serial.print(timeClient.getHours());
  Serial.print(":");
  Serial.print(timeClient.getMinutes());
  Serial.print(":");
  Serial.println(timeClient.getSeconds());
  //Serial.println(timeClient.getFormattedTime());

  delay(1000);
}

 

bee73
Offline
Зарегистрирован: 27.10.2019

спасибо конечно, да я не в курсе но смысл был в том, чтобы не выводить в монитор порта время а получить его для скейча в виде строки для дальнейшего использования, к примеру раз в сутки проабдейтить время на RTS DS1307 

bee73
Offline
Зарегистрирован: 27.10.2019

Да я конечно понимаю, что многие из вас тут гуру в с++ в ардуино, но ведь и вы наверняка с чего то начинали спрашивали совета. Мне всегда казалось что форумы для этого и существуют, чтобы спросить совета, помощи, от тех кому это не трудно. Перед тем как сюда обратиться я перепробовал создание многих библиотек с примеров в инете и с данного сайта http://arduino.ru/Hacking/LibraryTutorial, трудностей не возникало, но к сожалению не нашел примера использования в библиотеки несколько функций и возврата значений....

b707
Offline
Зарегистрирован: 26.05.2017

bee73 пишет:

спасибо конечно, да я не в курсе но смысл был в том, чтобы не выводить в монитор порта время а получить его для скейча в виде строки

а поменять формат готового времени - это такая серьезная задача, что надо отдельную библиотеку писать? поправить в скетче формат в две-три строчки - без либы никак?

Вы никак не поймете, почему над вами смеются - да потому что в каждой вашей строчке сквозит, что вы программировать неделю назад начали. А уже за библиотеку схватились. Это как недоучив буквы, браться вывески рисовать. А потом народ ходит по улице и видит надпись "Ножь и вилька" и ухохатывается...

 

b707
Offline
Зарегистрирован: 26.05.2017

bee73 пишет:

Перед тем как сюда обратиться я перепробовал создание многих библиотек с примеров в инете и с данного сайта http://arduino.ru/Hacking/LibraryTutorial, трудностей не возникало, но к сожалению не нашел примера использования в библиотеки несколько функций и возврата значений....

не нужно вам создавать библиотеки. Научитесь программировать, освойтесь с функциями, передачей парметров, типами значений и ссылками и указателями. Потом пройдите классы...

Через год-другой, может быть, дойдете до библиотек. А сейчас у вас вместо библиотеки получится полный шлак. Таких библиотек, которые интересны только автору и от кода которых тошнит - и так в инете навалом.

bee73
Offline
Зарегистрирован: 27.10.2019

Вы по своему правы, но вы же знаете для чего нужны библиотеки и функции , как часть чтобы минимизировать основной код, вот и мне не хотелось всю эту портянку в основной код впихивать, хотя как писал выше сам код рабочий трудности с библиотекой возникли.

Да как вариант все можно было вместо библиотеки вывести в функцию к которой обратиться по прерываю или в определенное время с  DS1307

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

bee73 пишет:

мне не хотелось всю эту портянку в основной код впихивать

А и не надо.  Можно по разным файлам распихать свои мега-полезные функции и подключать их по мере необходимости.  Первые страницы любой книжки по языку Си. 

nik182
Offline
Зарегистрирован: 04.05.2015

Библиотека не минимизирунт основной код. Иногда наоборот, раздувает из за попытки объять необятное. Если под основным кодом понимать загружаемую в МК программу, а не текст, который на экране. Иногда гораздо полезнее видеть содержимое. А уж сколько раз встречался совет изменить что то в библиотеке. 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

DetSimen пишет:

bee73 пишет:

мне не хотелось всю эту портянку в основной код впихивать

А и не надо.  Можно по разным файлам распихать свои мега-полезные функции и подключать их по мере необходимости.  Первые страницы любой книжки по языку Си. 

можно и не читая книжки, прямо в IDE, создаёшь, можно даже вторым файлом ino - тогда подключать не надо )))

bee73
Offline
Зарегистрирован: 27.10.2019

b707 -  Ваш скейч позволяет только время и день недели получить, у данной библиотеки https://github.com/arduino-libraries/NTPClient/blob/master/keywords.txt нет метода даты, может посоветуете аналогичную с датой?

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Да чо вы все накинулись. ТС даже не знал где исходник «по заимствовал», таких направлять надо, а не гнобить... А недочеты очевидные с опытом исправить можно...

Алексей.
Алексей. аватар
Offline
Зарегистрирован: 02.02.2018

Там есть метод

/**
 * @return time in seconds since Jan. 1, 1970
 */
unsigned long getEpochTime() const;

Получайте секунды переводите в struct tm и форматируйте как угодно.

П.С. Этот метод будет возвращать секунды уже пересчитывая с прошедшими millis

unsigned long NTPClient::getEpochTime() const {
  return this->_timeOffset + // User offset
         this->_currentEpoc + // Epoc returned by the NTP server
         ((millis() - this->_lastUpdate) / 1000); // Time since last update
}

т.е. если вызвать его ещё раз через минуту, он вернет уже другое, актуальное значение.

bee73
Offline
Зарегистрирован: 27.10.2019

вот тут https://randomnerdtutorials.com/esp32-ntp-client-date-time-arduino-ide/ вроде похожа на прежний вариант, кто знает как качество библиотеки?

b707
Offline
Зарегистрирован: 26.05.2017

bee73 пишет:

вот тут https://randomnerdtutorials.com/esp32-ntp-client-date-time-arduino-ide/ вроде похожа на прежний вариант, кто знает как качество библиотеки?

bee73 - какое "качество библиотеки" вас интересует? Все NTP сервера выдают текущее время в виде одного единственного числа - в секундах с 1 января 1970г.

Ни один сервер не выдает вам дату или месяц. час или год. Только секунды. Это значение называется EpochTime. Все прочие часы годы и месяцы вы можете получить из этих секунд путем несложных вычислений.

 

Update - посмотрел эту библиотеку - в ней тоже нет методов для числа, месяца и года - есть только для уже заранее форматированной даты. Но все что нужно, можно подсмотреть в коде и написать самому

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

b707 пишет:

bee73 пишет:

вот тут https://randomnerdtutorials.com/esp32-ntp-client-date-time-arduino-ide/ вроде похожа на прежний вариант, кто знает как качество библиотеки?

bee73 - какое "качество библиотеки" вас интересует? Все NTP сервера выдают текущее время в виде одного единственного числа - в секундах с 1 января 1970г.

Ни один сервер не выдает вам дату или месяц. час или год. Только секунды. Это значение называется EpochTime. Все прочие часы годы и месяцы вы можете получить из этих секунд путем несложных вычислений.

 

Update - посмотрел эту библиотеку - в ней тоже нет методов для числа, месяца и года - есть только для уже заранее форматированной даты. Но все что нужно, можно подсмотреть в коде и написать самому

NTP может иметь разную точность, даже 1 (Одну) микросекунду )))

Алексей.
Алексей. аватар
Offline
Зарегистрирован: 02.02.2018

Странный вопрос о качестве...
4-года назад, автор этой библиотеки сделал форк от оригинальной той самой arduino-libraries/NTPClient.
Добавил метод getFormattedDate, что видимо и принесло ему 30 звезд.
Судя по датам коммитов, забросил библиотеку 2 года назад, а arduino-libraries/NTPClient переодически допиливается.
Пилить продолжают, это или так хреново, что заплатки только успевают ставить, или наоборот, проект представляет какой-то интерес и продолжает развиваться. Лучше конечно второе чем первое.

b707
Offline
Зарегистрирован: 26.05.2017

Алексей. пишет:

4-года назад, автор этой библиотеки сделал форк от оригинальной той самой arduino-libraries/NTPClient.
Добавил метод getFormattedDate, что видимо и принесло ему 30 звезд.

Надо, наверно, тоже форкануть и добавить еще методы getDate() getMonth() и getYear() - такая библиотека, судя по интересу ТС - соберет все звезды Гитхаба :)

bee73
Offline
Зарегистрирован: 27.10.2019

Алексей. пишет:

Получайте секунды переводите в struct tm и форматируйте как угодно.

Вас не затруднит показать как это сделать? секунды перевести в struct tm

Алексей.
Алексей. аватар
Offline
Зарегистрирован: 02.02.2018

struct tm *localtime(const time_t *_timer);
аргумент - указатель на time_t (time_t это такой тип данных, фактически это long, подробнее в types.h), содержащий количество секунд, прошедших с 00:00:00 01/01/1970

Локалтайм стандартный, есть в ман-ах, там-же (на той-же странице) и struct tm

bee73
Offline
Зарегистрирован: 27.10.2019

Спасибо. Правильно ли я вас понял. для struct tm нужна библиотека types.h?

b707
Offline
Зарегистрирован: 26.05.2017

bee73 пишет:

Спасибо. Правильно ли я вас понял. для struct tm нужна библиотека types.h?

lee73 - что вы фигней страдаете? - я ж вам подсказл, посмотрите в коде библиотеки NTPClient, как из EpochTime вычислить день месяц и год и скопируйте себе в скетч. Там реально математика на уровне пятого класса

bee73
Offline
Зарегистрирован: 27.10.2019

спасибо я уже скопипастил и услышал тут все лестное :) решил идти путем проб и ошибок шаг за шагом, пусть не библиотека а функция у меня получиться с подачей вашего кода, вот только с датой разберусь, тему структоур покурил но так и не понял как они применяются вот и спросил совета, и видимо нужна библиотека types.h

Алексей.
Алексей. аватар
Offline
Зарегистрирован: 02.02.2018

bee73 пишет:
Спасибо. Правильно ли я вас понял. для struct tm нужна библиотека types.h?
Нет не нужна, это заголовочный файл, он уже есть в поддержке вашей платы esp8266
в types.h определен тип данных time_t, он используется в функции locаltime, а struct tm как и функция locаltime объявлены в другом заголовочном файле time.h, который тоже у вас есть.

Гриша
Offline
Зарегистрирован: 27.04.2014

может немного с запозданием, рекомендую заглянуть по этой ссылке Unix-время

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

bee73 пишет:

Спасибо. Правильно ли я вас понял. для struct tm нужна библиотека types.h?

Нужна time.h

Она у Вас есть (в поставке IDE) и в самом файле всё подробно описано.

bee73
Offline
Зарегистрирован: 27.10.2019

Скажите где узнать, что передать на печать после структуры, не смог найти содержимое types.h

ругается tm_day понятно что такой переменной нет...

#include <NTPClient.h>
#include <ESP8266WiFi.h>
#include <WiFiUdp.h>

const char ssid[] = "REDR555RE";
const char pass[] = "KHY456RF65TSGT4TUE";
const long utcOffsetInSeconds = 7200;
char daysOfTheWeek[7][12] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
long timeOffset = 10800;
WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP,  "pool.ntp.org", timeOffset, 60000);//, utcOffsetInSeconds);

void setup() 
{
 Serial.begin(115200);
 WiFi.begin(ssid, pass);
 while (WiFi.status() != WL_CONNECTED)
  {
    delay(500);
    Serial.print(".");  
  }
  while(!timeClient.update()) {
  timeClient.forceUpdate();
}
  delay(250);
  Serial.println(timeClient.getFormattedTime());
  Serial.println(timeClient.getEpochTime());
  time_t(timeClient.getEpochTime());
  struct tm *localtime(const time_t *_timer);
  Serial.println(tm_day);

}

void loop() {
  //timeClient.update();
  //Serial.print(daysOfTheWeek[timeClient.getDay()]);
  //delay(1000);

}