ESP8266: Aggiungere la data all'orologio NTP

È possibile che i mesi siano numerati da 0 a 11 per farli coincidere direttamente con gli elementi da 0 a 11 dell'array dei nomi dei mesi?

Si, tm_mon va da 0 a 11, però ... dovresti sapere che tocca studiarseli i reference :grin:

Guglielmo

Come ha detto Guglielmo i mesi partono da 0.
Se hai bisogno anche dell'anno considera anche che è il numero di anni trascorsi dal 1900 quindi se vuoi quello corrente ti basta fare

timeinfo.tm_year + 1900

Grazie a entrambi! Siete sempre preziosi.

Questo è il problema: nel tuo link precedente non ho trovato le informazioni necessarie e non capivo dove dovevo andare a cercarle! In elettronica cerco la sigla di un componente e trovo ciò che mi occorre; qui spesso non ci riesco!

Per l'anno avevo notato qualcosa di strano, ma poi ho dovuto abbreviare la visualizzazione togliendo le prime due cifre e non ho più avuto il problema.

Sto vedendo il reference e non riesco a spiegarmi una cosa: perché i mesi iniziano da zero, mentre i giorni del mese iniziano da uno?...

Ahhh beh ... magari guardando i sorgenti della time.h si capisce che hanno fatto delle ottimizazioni e che gli veniva più comodo così :grin:

Comunque, li hai tutti i range esatti, incluso il fatto dell'anno che ti diceva poco sopra cotestatnt, quindi ... a te fare i calcoli :wink:

Guglielmo

Secondo me perché i mesi hanno un nome corrispondente cosi come il giorno della settimana.
Partendo da 0 è facile abbinare il numero all'indice di un array contenente le relative stringhe.

char daysOfTheWeek[7][12] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
Serial.println(daysOfTheWeek[timeinfo.tm_wday];

E' ciò che avevo sospettato io nel post #21. :slight_smile: Stranamente, però, fanno la stessa cosa per i giorni dell'anno, che vanno da 0 a 365 con 365 che indica l'ultimo giorno di un anno bisestile.
Non è fatto in una maniera omogenea per essere semplice da usare. Secondo me, ogni tanto sbaglia anche chi l'ha scritto!

Ecco, appunto: nel tuo link
https://github.com/arduino/esp8266/blob/master/tools/sdk/libc/xtensa-lx106-elf/include/time.h
avevo cercato la time.h, ma non l'ho trovata. Non l'ho cercata altrove perché ero convinto che avrei dovuto trovarla lì, date le differenze che avevi fatto notare rispetto alla versione per l'ATMega328p.

Ho trovato anche questo:
https://forum.arduino.cc/t/confusion-with-time-h-and-timelib-h/433864/5
ed è ancora più oscuro... >:(

Cerca i sorgenti della AVR libc, poi vai nella cartella libc/time/ dove ci sono tutti i .c che implementano le varie funzioni che sono dichiarate in time.h

E' piuttosto ... articolata :wink:

Guglielmo

Avevo corretto con Lu-Do da 1 a 7 credendo che la settimana iniziasse da Lunedì, ma non avrebbe funzionato di Domenica! Adesso è giusto.

... ho oltretutto notato che la AVR libc implementa in time anche svariate funzioni che su altre piattaforme non sono state implementate.

Per essere precisi toccherebbe ogni volta cercare tutti i sorgenti e vedere cosa è stato implementato e cosa no ... :roll_eyes:

Guglielmo

https://github.com/feilipu/Arduino_RTC_Library
dice che gli anni partono dal 2000...

... dipende dall'implementazione anche quello :roll_eyes:

In AVR libc c'è chiaramente scritto che partono dal 1900.

Guglielmo

E' un mondo in cui nulla è certo... :frowning:
Nell'elettronica capita raramente, ma qui è la regola! >:(

Read the documentation
Grrr... :face_with_symbols_over_mouth:

Altro tentativo:
https://www.google.com/search?q=avr+libc+arduino+source+code

Forse è la volta buona:
https://www.google.com/search?q=avr+libc+time.h+arduino+source+code
da cui:
https://github.com/Patapom/Arduino/blob/master/Libraries/AVR%20Libc/avr-libc-2.0.0/include/time.h

Guarda che ti ho messo il link ed il percorso da seguire nel mio post #29 ... :roll_eyes:

Guglielmo

Uh... Grazie!
https://github.com/avrdudes/avr-libc

https://github.com/avrdudes/avr-libc/blob/main/libc/time/iso_week_date_r.c
ma dice:

    /* compute ISO8601 day of week (1 ... 7, Monday = 1) */
    wday = n + 6; /* epoch was a Saturday */
    wday %= 7;
    if (wday == 0)
        wday = 7;

A quanto pare, trasforma 0...6 in 1...7! Devo aspettare Domenica per sapere se funziona... :frowning:

void scrive_data() // Mia discussione: https://forum.arduino.cc/t/esp8266-aggiungere-la-data-allorologio-ntp/1043345
{                  // time.h per ESP8266: https://github.com/arduino/esp8266/blob/master/tools/sdk/libc/xtensa-lx106-elf/include/time.h
time_t now;        // time.h e timelib.h: https://forum.arduino.cc/t/confusion-with-time-h-and-timelib-h/433864/5
struct tm timeinfo; 
now = time(nullptr); // Ottengo l'ora aggiornata dal sistema.
timeinfo = *localtime(&now); // Aggiorno la struct timeinfo con il tempo localizzato secondo il timezone definito.
matrix.fillScreen(LOW);
const char giorno[7][3]={"Do","Lu","Ma","Me","Gi","Ve","Sa"};   //      NOTA: tm_wday inizia da 0 per Domenica!
matrix.drawChar(1,0,  giorno[timeinfo.tm_wday][0], HIGH,LOW,1); // Giorno 1
matrix.drawChar(7,0,  giorno[timeinfo.tm_wday][1], HIGH,LOW,1); // Giorno 2         
matrix.drawChar(17,0, 48+timeinfo.tm_mday/10, HIGH,LOW,1); // Giorno d
matrix.drawChar(23,0, 48+timeinfo.tm_mday%10, HIGH,LOW,1); // Giorno u
matrix.drawChar(34,0, 48+(timeinfo.tm_mon+1)/10, HIGH,LOW,1); // Mese d NOTA: tm.mon parte da 0!
matrix.drawChar(40,0, 48+(timeinfo.tm_mon+1)%10, HIGH,LOW,1); // Mese u
uint16_t anno=timeinfo.tm_year; // Scrivo l'anno a partire dalle unità. NOTA: tm.year parte dal 1900!
matrix.drawChar(57,0, 48+anno%10, HIGH,LOW,1); // Anno u                Per la visualizzazione a 4 cifre,
anno/=10;                                      //                       quindi, bisogna aggiungere 1900!
matrix.drawChar(51,0, 48+anno%10, HIGH,LOW,1); // Anno d
matrix.write(); // Send bitmap to display
delay(3000);
sfumo();
}

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