Skocz do zawartości

ESP8266, NTPClient, time.h, problem z gmtime


Pomocna odpowiedź

Napisano

Cześć, tydzień temu działało a dzisiaj nie. Na podstawie tego tutoriala(biblioteka i przykładowy kod) zrobiłem obsługę pobierania czasu dla mojego nodeMCU. Wszystko się kompilowało, wgrywało i działa po dziś dzień. Chciałem jednak wprowadzić małe poprawki w innej części kodu(mój asystent pieca CO) i wywala mi:

'gmtime' was not declared in this scope

a dokładnie

"C:\\Users\\user\\AppData\\Local\\Arduino15\\packages\\esp8266\\tools\\xtensa-lx106-elf-gcc\\1.20.0-26-gb404fb9-2/bin/xtensa-lx106-elf-g++" -D__ets__ -DICACHE_FLASH -U__STRICT_ANSI__ "-IC:\\Users\\user\\AppData\\Local\\Arduino15\\packages\\esp8266\\hardware\\esp8266\\2.4.2/tools/sdk/include" "-IC:\\Users\\user\\AppData\\Local\\Arduino15\\packages\\esp8266\\hardware\\esp8266\\2.4.2/tools/sdk/lwip2/include" "-IC:\\Users\\user\\AppData\\Local\\Arduino15\\packages\\esp8266\\hardware\\esp8266\\2.4.2/tools/sdk/libc/xtensa-lx106-elf/include" "-IC:\\Users\\user\\AppData\\Local\\Temp\\arduino_build_508794/core" -c -w -Os -g -mlongcalls -mtext-section-literals -fno-exceptions -fno-rtti -falign-functions=4 -std=c++11 -MMD -ffunction-sections -fdata-sections -DF_CPU=80000000L -DLWIP_OPEN_SRC -DTCP_MSS=536 -DARDUINO=10810 -DARDUINO_ESP8266_NODEMCU -DARDUINO_ARCH_ESP8266 "-DARDUINO_BOARD=\"ESP8266_NODEMCU\"" -DESP8266 "-IC:\\Users\\user\\AppData\\Local\\Arduino15\\packages\\esp8266\\hardware\\esp8266\\2.4.2\\cores\\esp8266" "-IC:\\Users\\user\\AppData\\Local\\Arduino15\\packages\\esp8266\\hardware\\esp8266\\2.4.2\\variants\\nodemcu" "-ID:\\ARDUINO\\projekty\\libraries\\MAX31850_OneWire" "-ID:\\ARDUINO\\projekty\\libraries\\DallasTemperature" "-ID:\\ARDUINO\\projekty\\libraries\\DFRobotDFPlayerMini" "-ID:\\ARDUINO\\projekty\\libraries\\HCSR04\\src" "-ID:\\ARDUINO\\projekty\\libraries\\Timers-master" "-IC:\\Users\\user\\AppData\\Local\\Arduino15\\packages\\esp8266\\hardware\\esp8266\\2.4.2\\libraries\\ESP8266WiFi\\src" "-ID:\\ARDUINO\\projekty\\libraries\\Blynk\\src" "-IC:\\Users\\user\\AppData\\Local\\Arduino15\\packages\\esp8266\\hardware\\esp8266\\2.4.2\\libraries\\ESP8266mDNS" "-IC:\\Users\\user\\AppData\\Local\\Arduino15\\packages\\esp8266\\hardware\\esp8266\\2.4.2\\libraries\\ArduinoOTA" "-IC:\\Users\\user\\AppData\\Local\\Arduino15\\packages\\esp8266\\hardware\\esp8266\\2.4.2\\libraries\\SoftwareSerial" "-ID:\\ARDUINO\\projekty\\libraries\\NTPClient" "C:\\Users\\user\\AppData\\Local\\Temp\\arduino_build_508794\\sketch\\PIEC_nodeMCU_NTPClient.ino.cpp" -o "C:\\Users\\user\\AppData\\Local\\Temp\\arduino_build_508794\\sketch\\PIEC_nodeMCU_NTPClient.ino.cpp.o"
C:\Users\user\AppData\Local\Temp\arduino_modified_sketch_466627\PIEC_nodeMCU_NTPClient.ino: In function 'void pobierzCzas()':

PIEC_nodeMCU_NTPClient:197:48: error: 'gmtime' was not declared in this scope

   struct tm *ptm = gmtime ((time_t *)&epochTime); 

                                                ^

PIEC_nodeMCU_NTPClient:198:17: error: invalid use of incomplete type 'struct tm'

   monthDay = ptm->tm_mday;

                 ^

In file included from c:\users\user\appdata\local\arduino15\packages\esp8266\tools\xtensa-lx106-elf-gcc\1.20.0-26-gb404fb9-2\xtensa-lx106-elf\include\c++\4.8.2\cwchar:44:0,

                 from c:\users\user\appdata\local\arduino15\packages\esp8266\tools\xtensa-lx106-elf-gcc\1.20.0-26-gb404fb9-2\xtensa-lx106-elf\include\c++\4.8.2\bits\postypes.h:40,

                 from c:\users\user\appdata\local\arduino15\packages\esp8266\tools\xtensa-lx106-elf-gcc\1.20.0-26-gb404fb9-2\xtensa-lx106-elf\include\c++\4.8.2\bits\char_traits.h:40,

                 from c:\users\user\appdata\local\arduino15\packages\esp8266\tools\xtensa-lx106-elf-gcc\1.20.0-26-gb404fb9-2\xtensa-lx106-elf\include\c++\4.8.2\string:40,

                 from c:\users\user\appdata\local\arduino15\packages\esp8266\tools\xtensa-lx106-elf-gcc\1.20.0-26-gb404fb9-2\xtensa-lx106-elf\include\c++\4.8.2\random:41,

                 from c:\users\user\appdata\local\arduino15\packages\esp8266\tools\xtensa-lx106-elf-gcc\1.20.0-26-gb404fb9-2\xtensa-lx106-elf\include\c++\4.8.2\bits\stl_algo.h:65,

                 from c:\users\user\appdata\local\arduino15\packages\esp8266\tools\xtensa-lx106-elf-gcc\1.20.0-26-gb404fb9-2\xtensa-lx106-elf\include\c++\4.8.2\algorithm:62,

                 from C:\Users\user\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.4.2\cores\esp8266/Arduino.h:255,

                 from C:\Users\user\AppData\Local\Temp\arduino_build_508794\sketch\PIEC_nodeMCU_NTPClient.ino.cpp:1:

C:\Users\user\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.4.2/tools/sdk/libc/xtensa-lx106-elf/include/wchar.h:56:8: error: forward declaration of 'struct tm'

 struct tm;

        ^

PIEC_nodeMCU_NTPClient:199:21: error: invalid use of incomplete type 'struct tm'

   currentMonth = ptm->tm_mon+1;

                     ^

In file included from c:\users\user\appdata\local\arduino15\packages\esp8266\tools\xtensa-lx106-elf-gcc\1.20.0-26-gb404fb9-2\xtensa-lx106-elf\include\c++\4.8.2\cwchar:44:0,

                 from c:\users\user\appdata\local\arduino15\packages\esp8266\tools\xtensa-lx106-elf-gcc\1.20.0-26-gb404fb9-2\xtensa-lx106-elf\include\c++\4.8.2\bits\postypes.h:40,

                 from c:\users\user\appdata\local\arduino15\packages\esp8266\tools\xtensa-lx106-elf-gcc\1.20.0-26-gb404fb9-2\xtensa-lx106-elf\include\c++\4.8.2\bits\char_traits.h:40,

                 from c:\users\user\appdata\local\arduino15\packages\esp8266\tools\xtensa-lx106-elf-gcc\1.20.0-26-gb404fb9-2\xtensa-lx106-elf\include\c++\4.8.2\string:40,

                 from c:\users\user\appdata\local\arduino15\packages\esp8266\tools\xtensa-lx106-elf-gcc\1.20.0-26-gb404fb9-2\xtensa-lx106-elf\include\c++\4.8.2\random:41,

                 from c:\users\user\appdata\local\arduino15\packages\esp8266\tools\xtensa-lx106-elf-gcc\1.20.0-26-gb404fb9-2\xtensa-lx106-elf\include\c++\4.8.2\bits\stl_algo.h:65,

                 from c:\users\user\appdata\local\arduino15\packages\esp8266\tools\xtensa-lx106-elf-gcc\1.20.0-26-gb404fb9-2\xtensa-lx106-elf\include\c++\4.8.2\algorithm:62,

                 from C:\Users\user\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.4.2\cores\esp8266/Arduino.h:255,

                 from C:\Users\user\AppData\Local\Temp\arduino_build_508794\sketch\PIEC_nodeMCU_NTPClient.ino.cpp:1:

C:\Users\user\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.4.2/tools/sdk/libc/xtensa-lx106-elf/include/wchar.h:56:8: error: forward declaration of 'struct tm'

 struct tm;

        ^

PIEC_nodeMCU_NTPClient:200:20: error: invalid use of incomplete type 'struct tm'

   currentYear = ptm->tm_year+1900;

                    ^

In file included from c:\users\user\appdata\local\arduino15\packages\esp8266\tools\xtensa-lx106-elf-gcc\1.20.0-26-gb404fb9-2\xtensa-lx106-elf\include\c++\4.8.2\cwchar:44:0,

                 from c:\users\user\appdata\local\arduino15\packages\esp8266\tools\xtensa-lx106-elf-gcc\1.20.0-26-gb404fb9-2\xtensa-lx106-elf\include\c++\4.8.2\bits\postypes.h:40,

                 from c:\users\user\appdata\local\arduino15\packages\esp8266\tools\xtensa-lx106-elf-gcc\1.20.0-26-gb404fb9-2\xtensa-lx106-elf\include\c++\4.8.2\bits\char_traits.h:40,

                 from c:\users\user\appdata\local\arduino15\packages\esp8266\tools\xtensa-lx106-elf-gcc\1.20.0-26-gb404fb9-2\xtensa-lx106-elf\include\c++\4.8.2\string:40,

                 from c:\users\user\appdata\local\arduino15\packages\esp8266\tools\xtensa-lx106-elf-gcc\1.20.0-26-gb404fb9-2\xtensa-lx106-elf\include\c++\4.8.2\random:41,

                 from c:\users\user\appdata\local\arduino15\packages\esp8266\tools\xtensa-lx106-elf-gcc\1.20.0-26-gb404fb9-2\xtensa-lx106-elf\include\c++\4.8.2\bits\stl_algo.h:65,

                 from c:\users\user\appdata\local\arduino15\packages\esp8266\tools\xtensa-lx106-elf-gcc\1.20.0-26-gb404fb9-2\xtensa-lx106-elf\include\c++\4.8.2\algorithm:62,

                 from C:\Users\user\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.4.2\cores\esp8266/Arduino.h:255,

                 from C:\Users\user\AppData\Local\Temp\arduino_build_508794\sketch\PIEC_nodeMCU_NTPClient.ino.cpp:1:

C:\Users\user\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.4.2/tools/sdk/libc/xtensa-lx106-elf/include/wchar.h:56:8: error: forward declaration of 'struct tm'

 struct tm;

        ^

Znaleziono wiele bibliotek w "ESP8266WiFi.h"
Wykorzystane: C:\Users\user\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.4.2\libraries\ESP8266WiFi
Znaleziono wiele bibliotek w "BlynkSimpleEsp8266.h"
Wykorzystane: D:\ARDUINO\projekty\libraries\Blynk
Niewykorzystane: D:\ARDUINO\arduino187\Arduino\libraries\Blynk
Znaleziono wiele bibliotek w "ESP8266mDNS.h"
Wykorzystane: C:\Users\user\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.4.2\libraries\ESP8266mDNS
Znaleziono wiele bibliotek w "ArduinoOTA.h"
Wykorzystane: C:\Users\user\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.4.2\libraries\ArduinoOTA
Znaleziono wiele bibliotek w "DallasTemperature.h"
Wykorzystane: D:\ARDUINO\projekty\libraries\DallasTemperature
Niewykorzystane: D:\ARDUINO\arduino187\Arduino\libraries\MAX31850_DallasTemp
Niewykorzystane: D:\ARDUINO\projekty\libraries\MAX31850_DallasTemp
Znaleziono wiele bibliotek w "HCSR04.h"
Wykorzystane: D:\ARDUINO\projekty\libraries\HCSR04
Niewykorzystane: D:\ARDUINO\arduino187\Arduino\libraries\HCSR04
Znaleziono wiele bibliotek w "Timers.h"
Wykorzystane: D:\ARDUINO\projekty\libraries\Timers-master
Niewykorzystane: D:\ARDUINO\arduino187\Arduino\libraries\Timers-master
Znaleziono wiele bibliotek w "NTPClient.h"
Wykorzystane: D:\ARDUINO\projekty\libraries\NTPClient
Znaleziono wiele bibliotek w "OneWire.h"
Wykorzystane: D:\ARDUINO\projekty\libraries\MAX31850_OneWire
Niewykorzystane: D:\ARDUINO\arduino187\Arduino\libraries\MAX31850_OneWire
Znaleziono wiele bibliotek w "DFRobotDFPlayerMini.h"
Wykorzystane: D:\ARDUINO\projekty\libraries\DFRobotDFPlayerMini
Znaleziono wiele bibliotek w "SoftwareSerial.h"
Wykorzystane: C:\Users\user\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.4.2\libraries\SoftwareSerial
Użycie biblioteki MAX31850_OneWire w wersji 1.0.1 z folderu: D:\ARDUINO\projekty\libraries\MAX31850_OneWire 
Użycie biblioteki DallasTemperature w wersji 3.9.0 z folderu: D:\ARDUINO\projekty\libraries\DallasTemperature 
Użycie biblioteki DFRobotDFPlayerMini w wersji 1.0.5 z folderu: D:\ARDUINO\projekty\libraries\DFRobotDFPlayerMini 
Użycie biblioteki HCSR04 w wersji 1.0.0 z folderu: D:\ARDUINO\projekty\libraries\HCSR04 
Użycie biblioteki Timers-master w wersji 16.4.1 z folderu: D:\ARDUINO\projekty\libraries\Timers-master 
Użycie biblioteki ESP8266WiFi w wersji 1.0 z folderu: C:\Users\user\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.4.2\libraries\ESP8266WiFi 
Użycie biblioteki Blynk w wersji 0.6.1 z folderu: D:\ARDUINO\projekty\libraries\Blynk 
Użycie biblioteki ESP8266mDNS z folderu C:\Users\user\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.4.2\libraries\ESP8266mDNS (legacy)
Użycie biblioteki ArduinoOTA w wersji 1.0 z folderu: C:\Users\user\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.4.2\libraries\ArduinoOTA 
Użycie biblioteki SoftwareSerial w wersji 1.0 z folderu: C:\Users\user\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.4.2\libraries\SoftwareSerial 
Użycie biblioteki NTPClient w wersji 3.1.0 z folderu: D:\ARDUINO\projekty\libraries\NTPClient 
exit status 1
'gmtime' was not declared in this scope

Po poszukiwaniach rozwiązania problemu, doszedłem tylko do tego, że może to mieć coś wspólnego z bibliotekami time.h, lub Time.h. Jednak w moim projekcie nie używam tych bibliotek. Coś mnie tknęło i jednak dołożyłem najpierw time.h, a później zamiast niej Time.h. O dziwo problem z kompilacją zniknął i wszystko pięknie się kompiluje. Nie wiem czy fizycznie działa, bo zabrakło mi czasu by sprawdzić.

Powtarzam, wcześniej wszystko śmigało bez problemu i nagle jakaś niespodzianka.

Kto mi wytłumaczy zależności?

Moja funkcja pobierania czasu wygląda tak:

void pobierzCzas(){
  timeClient.update();
  unsigned long epochTime = timeClient.getEpochTime();
  currentHour = timeClient.getHours();
  currentMinute = timeClient.getMinutes();
  weekDay = timeClient.getDay();

  struct tm *ptm = gmtime ((time_t *)&epochTime); 
  monthDay = ptm->tm_mday;
  currentMonth = ptm->tm_mon+1;
  currentYear = ptm->tm_year+1900;
}

Przyznam bez bicia, że nie mam pojęcia co robi ta linijka:

struct tm *ptm = gmtime ((time_t *)&epochTime);

 

13 minut temu, SOYER napisał:

Przyznam bez bicia, że nie mam pojęcia co robi ta linijka:

Akurat w tym przypadku dokładnie to samo, co robi funkcja gmtime w całym cywilizowanym świecie 🙂 Najprościej poczytać linuksowego mana:

https://linux.die.net/man/3/gmtime

Masz tam wszystko objaśnione, Arduinowe funkcje mogą być co prawda uproszczone ale ogólna zasada jest taka sama.

  • Lubię! 1

Ok, to już doczytałem tutaj, rozumiem, ze to jakaś struktura która niesie informację o czasie(liczba sekund od 1970), z której można wyciągnąć dzień, miesiąc, godzinę itd. za pomocą tm_cośtam, ale co to za wskaźnik(?) ptm?. Skąd się wszystko bierze? To chyba jakaś ważna rzecz ten time.h...?

Dlaczego wcześniej działało bez dołączonej tej biblioteki? W moim szkicu działającym teraz w piwnicy na pewno nie ma jej dołączonej, a działa...

 

10 minut temu, SOYER napisał:

ale co to za wskaźnik(?) ptm?

Hm... sądząc po kodzie jest to wskaźnik na strukturę tm, a sądząc po nazwie pointer to tm 😉 A swoją drogę przeczytaj tego mana, tam jest dużo więcej na ten temat.

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...