swRTC

Leo ci ho rpovato, davvero ci ho rpovato, ma ora e' tardi e chiedo aiuto.
Credevo fosse una cosa banale invece non lo e', almeno per me.
Ricordi l'esempio che hai aggiunto nella swRTC che stampa sulla seriale l'orario con gli Zeri ?

Volevo modificarlo in modo da dirottare l'orario con gli zeri non verso la seriale, ma verso una Stringa, tipo:

String Orario = questobenedettoorologioconglizeri;

Ho speso un po' di tempo a capire la tua formula per inserire gli zeri, credo di averla capita, ma fa uso fortemente dell'hardware, cioe' stampi sulla seriale un carattere per volta e poi vai avanti con i calcoli, aggiungi i due punti :, ecc.
Ma fare le stesse cose tenendo come serbatoio una variabile mi e' oscuro, dove e' il trucco ?

Grazie

Fa uso dell'hardware? :sweat_smile:
E' una semplice formula che controlla se il numero è più grande di 9, in caso affermativo aggiunge uno "0".
Con un oggetto string la cosa è ancora più semplice perché gli string possono essere concatenati per cui al posto di Serial.print fai un semplice "+". Esempio: Orario += "0"

Una cosa così:

String Orario;

void setup() {....}
void loop() {
  Orario = "";
  printTime(WITHOUT_SECONDS);
}

void printTime(byte withSeconds) {
    sendNumber(rtc.getHours());
    Orario += ":";
    sendNumber(rtc.getMinutes());
    if (withSeconds) {
        Serial.print(":");
        sendNumber(rtc.getSeconds());
    }
}


void sendNumber(byte number) {
    byte temp; Serial.prin
    if (number>9) {
        temp=int(number/10);
        Orario +=(char(temp+48));
        number-=(temp*10);
    } else {
        Orario += "0";
    }
    Orario += (char(number+48));
}

Non so se funziona, l'ho scritto al volo

uso dell'hw nel senso che si appoggia alla memoria della seriale, intesa come hw, cioe' vai a scrivere il primo numero, poi vai a scrivere il secondo, poi vai a scrivere i due punti. usando sempre gli stessi comandi.
Avevo pensato alla concatenazione, ma cosi' a naso credevo non funzionasse. Ti fo sapere se va.
Grazie mille :slight_smile:

Funziona, e mi sono spiegato anche perche' ero fuori strada.
ho trovato un comportamento strano, forse dovuto alla 1.5 che uso ?
Alla stringa Orario, oltre all'ora, concatenavo anche degli spazi " ", delle barre '/' altri valori, ecc

ebbene usando due concatenazioni a seguire, con la prima inserisco solo l'orario con gli zeri, e poi nel rigo sotto inserisco le altre cose va.
se invece lascio tutto su un solo rigo si blocca il micro:
Questo si blocca

Stampa = Orario + "    " + rtc.getDay() + '/' + ....ecc.ecc.ecc

Questo va bene

Stampa = Orario;
Stampa += "    " + rtc.getDay() + '/' + ....ecc.ecc.ecc

Va bene cosi', i Bug sono brutta bestia, sono conctento che non ero io completamente rincoglionito perche' la concatenazione l'avevo provata e poi abbandonata subito visto il blocco del micro

Forse sarebbe il caso di segnalare il problema nel forum internazionale.
Io personalmente la 1.5.x ancora non la adopero per sviluppare per Arduino UNO ed altri micro. Mi tengo la 1.0.4 ( :P)

onestamente non sono convinto del bug, tu dici che e' bug ? sai cosa pensavo ? Che Orario e' gia' di per se una concatenazione perche' viene creato pezzo per pezzo per aggiungere gli zeri. Non e' che si crea qualche conflitto visto che non uso delay, e quindi con millis avevo pensato che In un determinato momento Orario non era disponibile a concatenazione da due lati ?
Separando su due righe le due concatenazioni mi assicuro che Orario viene concatenato e conluso, e solo dopo gli si aggiunge altro. Che ne pensi ?

No, non è possibile. Non può esserci un'istruzione "troppo veloce" da eseguire. Ogni istruzione viene eseguita solo dopo la precedente. :wink:

Puoi passarmi lo sketch che usavi?

C'è qualcosa che non quadra nella swRTC, oggi mi dice che è lunedì 14

Prendiamo un epoch di oggi 13/01/2013: 1358093934

il convertitore online mi restituisce
1358093934 [batch convert timestamps to human dates]
GMT: Sun, 13 Jan 2013 16:18:54 GMT
Your time zone: domenica 13 gennaio 2013 17:18:54 GMT+1

la libreria mi restituisce
passando il valore di epoch 1358093934
gg della settimana = 1 14/1/2013 16:19 <<<<<< errato


Prendiamo un epoch del 25/12/2012: 1356453600

il convertitore online mi restituisce
1356453600 [batch convert timestamps to human dates]
GMT: Tue, 25 Dec 2012 16:40:00 GMT
Your time zone: martedì 25 dicembre 2012 17:40:00 GMT+1

la libreria mi restituisce
passando il valore di epoch 1356453600
gg della settimana = 2 25/12/2012 16:40 <<<<<< esatto

nel 2014 è ancora errato
nel 2015 è ancora errato
nel 2016 la librirea tornerà ad essere corretta :slight_smile: :slight_smile:

ciao

Ma che servizio di conversione online hai usato? Alcuni sono sballati e danno risultati errati.
Questo qui:
http://www.onlineconversion.com/unix_time.htm
avevo visto che era corretto nei risultati.
Mettendo 1358093934 come timestamp ottengo:
Sun, 13 Jan 2013 16:18:54 GMT

http://www.epochconverter.com/ ho preso il primo che è uscito da google
però il mio orologio è sbagliato dal 1 gennaio, non c'è problema l'ho corretto con un -86400 fino al 31/12/2015 non ho problemi era solo a titolo informativo.

Riguarderò il codice.

No Leo, voglio dire, non voglio il rimborso o avvarlermi di garanzia :slight_smile: ti chiedo .. ho qualche problema io? o puoi constatare che siano intervenute delle varianti? perchè anch'io ho dei dubbi, non capisco perchè ho quei risultati.

ciao

pablos:
No Leo, voglio dire, non voglio il rimborso o avvarlermi di garanzia :slight_smile: ti chiedo .. ho qualche problema io? o puoi constatare che siano intervenute delle varianti? perchè anch'io ho dei dubbi, non capisco perchè ho quei risultati.

ciao
[/quote
Tempo fa scovai un problema con l'algoritmo che ho usato. Dopo il 29/2/2000 dovevo aggiungere a mano 1 giorno perché il 2000 è un anno particolare: secondo la classica formuletta non sarebbe bisestile (un anno è bisestile se è divisibile per 4 ma non per 100) però lo diventa perché è divisibile per 400.
Adesso quel giorno in più sembrerebbe di troppo. Tu poi mi dici che nel 2013 il timestamp è errato, così come lo sarà nel 2014 e 2015 ma nel 2016 sarà corretto. Guarda caso, il 2016 è bisestile. Sarà un caso?

scusa non ho capito questo quote

Tempo fa scovai un problema con l'algoritmo che ho usato. Dopo il 29/2/2000 dovevo aggiungere a mano 1 giorno perché il 2000 è un anno particolare: secondo la classica formuletta non sarebbe bisestile (un anno è bisestile se è divisibile per 4 ma non per 100) però lo diventa perché è divisibile per 400.

ho detto io ste cose??

No, ti spiegavo che tempo fa dovetti aggiungere 1 giorno alla formula perché dopo il 29/2/2000 andava indietro di 1 giorno.
Ora però quel giorno parrebbe in più, tu mi dici infatti che devi togliere 86400 secondi affinché tutto torni.
Devo capire quindi cosa c'è che non va.

ahhh scusa ho letto "Tempo fa scovavi" riferito a me ... :slight_smile: sorry

Credo di aver risolto. Il problema era sempre nella questione delle date post 29/2/2000. Non avevo corretto la funzione che trasformava un timestamp in un orario ma solo quella inversa, cioè quella che forniva il timestamp dell'orario corrente.
Quello sopra è il timestamp stampato dalla libreria dopo aver impostato l'orologio, quello sotto è l'orologio regolato con il timestamp. I valori coincidono.

16:18:53 -- 13/1/2013 (Leap year: no)
Day of week: 0 -- Timestamp: 1358093934



16:18:54 -- 13/1/2013 (Leap year: no)
Day of week: 0 -- Timestamp: 1358093934

La versione 1.0.6 è sul mio sito:
http://www.leonardomiliani.com/?p=411

ok funzia, grazie

pablos:
ok funzia, grazie

Bene.

scoprii io questo bug se ricordi,
ricordo anche che la soluzione fu cmq una pezza, nel senso che dovettimo decidere se tenere corretto il pre 2000 o il post 2000

e' acnora cosi' ? cioe' le date ante 2000 restano sbagliate ? (e' a titolo informativo, perche' onestamente non ce ne frega a nessuno, mica dobbiamo fare orologi che segnano gli anni 90 :))
pero' se e' csi' si mette una bella nota "la swRTC funziona solo con date anni 2000"