• Система автоматизации с открытым исходным кодом на базе 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


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