Libreria Time per ESP32

Buongiorno,
sto rimettendo mano (per l'ennesima volta) al programma dell'irrigatore che ho sviluppato ormai 5 anni fa.
In discussioni su questo progetto mi era stata consigliata una conversione ad unix time degli orari memorizzati, purtroppo non ho mai avuto il tempo (e nemmeno l'esigenza) di farlo, ma ora per una modifica strutturale è necessario, perché per aggiungere una nuova fascia oraria per zona il controllo con le 'date' in formato hh:mm diventa impossibile o troppo complicato.

Le modifiche mi hanno portato ad eseguire il tutto su ESP32 (prima avevo un Arduino Nano)

Le domande che mi sto ponendo ora sono:

  1. Che libreria uso e sopratutto dove trovo la relativa reference (ora sto usando la TimeLib ma preferirei usare qualcosa di già presente nel pacchetto ESP-IDF);
  2. Se volessi implementare anche il controllo delle TimeZones, cosa posso fare?

Poi ulteriore domanda pratica che esula dalla gestione del tempo è:

  1. Ho un codice che pesa troppo (1349562 byte) per il mio ESP32;
    il progetto implementa il WiFi per collegarsi ad un NTP, mentre il Bluetooth per la comunicazione con l'app, esiste un metodo per diminuire la dimensione del compilato per poter aggiungere la possibilità di fare un aggiornamento tramite OTA?

Ringrazio in anticipo chi mi aiuterà
Alan

  1. Nessuna, c'è tutto già incluso nel core ESP32 per Arduino, compresa la gestione del timezone.
    Il nuovo esempio incluso SimpleTime.ino è un ottimo punto di partenza.

  2. Puoi selezionare una board che ti consente di scegliere lo schema di partizione (ad esempio ESP32 dev module) e selezionare una combinazione diversa come ad esempio Minimal SPIFFS (di default infatti la flash disponibile viene suddivisa in spazio programma, filesystem, spazio per OTA).

Intanto incomincio già a ringraziarti, come al solito preciso e disponibile :wink:.

Poi, nel caso della libreria Time che esiste già nel core esiste un reference e/o una documentazione? Non ho idea nemmeno di che funzioni ci siano ed eventualmente non ne conosco le firme.

Per quanto riguarda il secondo punto si, me ne sono accorto proprio prima mentre smanettavo, anche se la domanda resta comunque valida. Non vorrei aver scritto un codice con facendo scelte implementative da essere così pesante; ammetto che la combo BT-WiFi è pesante di suo (BT in particolare) però mi sembra tanto strano che pesi così tanto.

Ora mi sorge un altra questione di buona programmazione, ovvero la suddivisione in unità di compilazione (più file). Questa pratica mi risulterebbe comoda in tante altre applicazioni (che superano le 1000 righe) ma credo di non essere in grado al momento di gestirla al meglio.

In ogni caso, esiste in rete qualche guida riassuntiva che dia delle solide regole per una buona programmazione di piccole MCU.

EDIT:
altra domanda che mi sono posto: il DST è automatico o va gestito con le timezones?

Alan

La libreria time.h (che poi libreria non è in realtà) implementa i metodi classici del C/C++ per la gestione del timedate quindi basta che fai riferimento ad un qualsiasi manuale C/C++ dove sono trattate anche le librerie standard.

Ad esempio: Librerie standard/time.h - Wikibooks, manuali e libri di testo liberi

Per il discorso della dimensione del programma è normale: se metti insieme lo stack WiFi e quello Bluetooth la dimensione del compilato incrementa un bel po'. Del resto è anche comprensibile

Ottimo.
per il DST? Sai spiegarmi il da farsi?

Mentre ora mi viene in mente un'altra cosa: io posso settare manualmente l'ora?

Alan

Non c'è nulla da fare, se imposti correttamente il timezone viene gestito in automatico.
Rispetto all'esempio che ti ho linkato nel post precedente, io uso sempre questa istruzione che li invece è commentata di default

configTzTime(time_zone, ntpServer1, ntpServer2);

... a parte una cosa che è diseducativa, come creano le stringhe costanti che, hai fini educativi, sarebbe molto meglio facessero come si fa nel 'C' senza tirare in ballo i puntatori (che, se non si sa mooooolto bene come usare, poi sono sempre causa di problemi).

Per cui sarebbe meglio:

...
const char ssid[] = "YOUR_SSID";
const char password[] = "YOUR_PASS";

const char ntpServer1[] = "pool.ntp.org";
const char ntpServer2[] = "time.nist.gov";
...
const char time_zone[] = "CET-1CEST,M3.5.0,M10.5.0/3";  // TimeZone rule for Europe/Rome including daylight adjustment rules (optional)
...

Ne abbiamo parlato già in altri vari thread.

Guglielmo

Finalmente li ho studiati come si deve in Programmazione 1 e per fortuna li sto usando senza troppe confusioni;

Detto questo mi sto incasinando ancora di più perché nell'applicazione avevo lasciato la possibilità di aggiornare l'ora con quella del telefono (in caso di problemi con la rete), ed ora non riesco più a farlo se non con la

settimeofday(const timeval *p, ... )

ma non funziona come dovrebbe perché se creo una struct tm setto i minuti correttamente in unixtime e poi la copio in una struct timeval per passarla alla funzione mi setta i minuti sbagliati

Alan

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.