• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Time.h для ESP8266

valerivp

Member
ругается сборщик:

R:\testtime/testtime.ino:10: undefined reference to `gmtime'
R:\testtime/testtime.ino:11: undefined reference to `strftime'

в коде:
Код:
#include <time.h>
void setup() {
 //   Serial.begin(115200);
  static char TimeStringBuf[16]; //20140527T000000
  time_t t = 0;
  tm* timestruct = gmtime(&t);
  strftime(TimeStringBuf, sizeof(TimeStringBuf), "%Y%m%dT%H%M%S", timestruct);
  t = mktime(timestruct);
 
//  Serial.println(TimeStringBuf);
 }
void loop() {
    // put your main code here, to run repeatedly:
   
}
причем на mktime не ругается.

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

Юрий Ботов

Moderator
Команда форума
А кто вам обещал что в Ардуино, да еще и для esp, имплементирована вся "стандартная" библиотека? Может еще spawn, system или signal захотите с виртуальной памятью? Человек вам дело ответил...

Вот все что знает ардуино:
Код:
/*
* time.c - ESP8266-specific functions for SNTP
* Copyright (c) 2015 Peter Dobler. All rights reserved.
* This file is part of the esp8266 core for Arduino environment.
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU Lesser General Public License for more details.
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*
*/

#include <time.h>
#include "sntp.h"


#ifndef _TIMEVAL_DEFINED
#define _TIMEVAL_DEFINED
struct timeval {
  time_t      tv_sec;
  suseconds_t tv_usec;
};
#endif

extern char* sntp_asctime(const struct tm *t);
extern struct tm* sntp_localtime(const time_t *clock);

// time gap in seconds from 01.01.1900 (NTP time) to 01.01.1970 (UNIX time)
#define DIFF1900TO1970 2208988800UL

static int s_daylightOffset_sec = 0;
static long s_timezone_sec = 0;
static time_t s_bootTime = 0;

// calculate offset used in gettimeofday
static void ensureBootTimeIsSet()
{
    if (!s_bootTime)
    {
        time_t now = sntp_get_current_timestamp();
        if (now)
        {
            s_bootTime =  now - millis() / 1000;
        }
    }
}

static void setServer(int id, const char* name_or_ip)
{
    if (name_or_ip)
    {
        //TODO: check whether server is given by name or IP
        sntp_setservername(id, (char*) name_or_ip);
    }
}

void configTime(int timezone, int daylightOffset_sec, const char* server1, const char* server2, const char* server3)
{
    sntp_stop();

    setServer(0, server1);
    setServer(1, server2);
    setServer(2, server3);

    s_timezone_sec = timezone;
    s_daylightOffset_sec = daylightOffset_sec;
    sntp_set_timezone(timezone/3600);
    sntp_init();
}

int clock_gettime(clockid_t unused, struct timespec *tp)
{
    tp->tv_sec  = millis() / 1000;
    tp->tv_nsec = micros() * 1000;
    return 0;
}

// seconds since 1970
time_t mktime(struct tm *t)
{
    // system_mktime expects month in range 1..12
    #define START_MONTH 1
    return DIFF1900TO1970 + system_mktime(t->tm_year, t->tm_mon + START_MONTH, t->tm_mday, t->tm_hour, t->tm_min, t->tm_sec);
}

time_t time(time_t * t)
{
    time_t seconds = sntp_get_current_timestamp();
    if (t)
    {
        *t = seconds;
    }
    return seconds;
}

char* asctime(const struct tm *t)
{
    return sntp_asctime(t);
}

struct tm* localtime(const time_t *clock)
{
    return sntp_localtime(clock);
}

char* ctime(const time_t *t)
{
    struct tm* p_tm = localtime(t);
    char* result = asctime(p_tm);
    return result;
}

int gettimeofday(struct timeval *tp, void *tzp)
{
    if (tp)
    {
        ensureBootTimeIsSet();
        tp->tv_sec  = (s_bootTime + millis()) / 1000;
        tp->tv_usec = micros() * 1000;
    }
    return 0;
}
 
Последнее редактирование:

gerkimuyda

New member
Прикол в том, что горе-ваятели библиотек для ESP for Arduino коверкают их при каждом чихе.
Вот насколько изменились sntp в Release 2.4.0 по сравнению с Prelease 2.4.0-rc2:
"Use lwip v2 by default"
Arduino/sntp.h at master · esp8266/Arduino · GitHub
И тупо все скетчи, которые работали неделю назад - перестали компилироваться....
 

Юрий Ботов

Moderator
Команда форума
где есть исходники стандартных библиотек для ESP и для Mega2560 ?
У вас на компьютере: ядро обычно где то тут: c:\Пользователи\Имяпользователя\AppData\Local\Arduino15\packages\{Arduino/esp8266}\hardware\{Arduino/esp8266}\Номерверсии\cores\{Arduino/esp8266}
Дополнительные библиотеки тут:
c:\Пользователи\Имяпользователя\AppData\Local\Arduino15\packages\{Arduino/esp8266}\hardware\{Arduino/esp8266}\Номерверсии\libraries
В фигурных скобках - "или Arduino или esp8266"
 

valerivp

Member
У вас на компьютере: ядро обычно где то тут: c:\Пользователи\Имяпользователя\AppData\Local\Arduino15\packages\{Arduino/esp8266}\hardware\{Arduino/esp8266}\Номерверсии\cores\{Arduino/esp8266}
Дополнительные библиотеки тут:
c:\Пользователи\Имяпользователя\AppData\Local\Arduino15\packages\{Arduino/esp8266}\hardware\{Arduino/esp8266}\Номерверсии\libraries
В фигурных скобках - "или Arduino или esp8266"
там нет

но я нашел, AVR GCC, исходники
 

valerivp

Member
У меня тут:
C:\Users\yuryb\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.6.20\cores\arduino
там мало всего, например time.c нету
у меня там только эти файлы:
abi.cpp
Arduino.h
binary.h
CDC.cpp
Client.h
HardwareSerial.cpp
HardwareSerial.h
HardwareSerial0.cpp
HardwareSerial1.cpp
HardwareSerial2.cpp
HardwareSerial3.cpp
HardwareSerial_private.h
hooks.c
IPAddress.cpp
IPAddress.h
main.cpp
new.cpp
new.h
PluggableUSB.cpp
PluggableUSB.h
Print.cpp
Print.h
Printable.h
Server.h
Stream.cpp
Stream.h
Tone.cpp
Udp.h
USBAPI.h
USBCore.cpp
USBCore.h
USBDesc.h
WCharacter.h
WInterrupts.c
wiring.c
wiring_analog.c
wiring_digital.c
wiring_private.h
wiring_pulse.c
wiring_pulse.S
wiring_shift.c
WMath.cpp
WString.cpp
WString.h
 

Pilnikov

Active member
Поройтесь поиском по всему компу файлов time.h - потом результаты поиска сюды c путями.
 

Pilnikov

Active member
У меня компилятор в ардуине умеет писать так:

Несколько библиотек найдено для "SoftwareSerial.h"
Используется: Z:\ardu\sketch\libraries\SoftwareSerial
Не используется: C:\Users\pilnikov\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.3.0\libraries\SoftwareSerial
Используем библиотеку Time-master версии 1.5 из папки: Z:\ardu\sketch\libraries\Time-master
Используем библиотеку TinyGPS в папке: Z:\ardu\sketch\libraries\TinyGPS (legacy)
Используем библиотеку SoftwareSerial версии 1.0 из папки: Z:\ardu\sketch\libraries\SoftwareSerial


Это компиляция примера
* TimeGPS.pde
* example code illustrating time synced from a GPS


И все ясно и понятно - откуда чего взялось.
 
Сверху Снизу