swRTC

nono, nella eeprom ci va solo la.variabile x che dars boolean solo per dire se ora legale e attiva o no.
orario resta gestito fa rtc, nel mio caso, e da swrtc, nel tuo caso.
Tu potresti non usate eeprom, mentre nel caso di rtc serve farlo.

Ok. Ho capito.

secondo me questo controllo non lo metti nell'interrupt ma sono quando l'utente richiede la data: se la data cade nel giono compreso tra X e Y, allora aggiungi un'ora. Quindi l'orologio in se se ne frega dell'ora legale, è un'aggiunta secondaria.
questo è necessario sopratutto nella mia versione, per non incasinare i conti col timestamp

lesto:
secondo me questo controllo non lo metti nell'interrupt ma sono quando l'utente richiede la data: se la data cade nel giono compreso tra X e Y, allora aggiungi un'ora. Quindi l'orologio in se se ne frega dell'ora legale, è un'aggiunta secondaria.

Sì.

questo è necessario sopratutto nella mia versione, per non incasinare i conti col timestamp

Che anche tu non hai mai messo a posto XD

ehm ehm ehm.. adesso sto lavorando ad altro,però in effetti almeno i test per studiare l'andamento dell'errore dei quarzi potevo farlo :slight_smile:

lesto:
ehm ehm ehm.. adesso sto lavorando ad altro

Siamo sulla stessa barca... XD
Pensa che ho ancora da realizzare il PCB per la mia stazione meteo... poi sto finendo di lavorare sul sensore dei gas ed ora ho già un altro paio di idee da "coltivare"... non finisco mai niente :sweat_smile:

finisce sempre così, i progettini personali non si ha mai tempo i finirli, e quando ce l'hai lo usi per aggiungere sempre qualcosa...

io mi costringo a finire, o almeno a mettere un punto fermo.
altrimenti si lascia sempre tutto a meta'
ad esempio ho la shield ethernet ed ho il megadisplay elettroluminescente che mi aspettano, ma se non metto questa benedetta ora legale ed accantono definitivamente il valvolare, poi so che resterebbe sempre monco.

potrei iniziare a tentare di scrivere io il codice, ce la posso fare ?
almeno inizio a vedere come si usa la eeprom che non l'ho mai fatto.

Usare la EEPROM è facile. Per leggere una locazione dai il suo indirizzo, per scrivere dai l'indirizzo ed il valore.
Delay(5) dopo ogni scrittura (secondo il datasheet ci mette circa 3,3ms a salvare un byte).

la eeprom è facile se inizia ragionare in byte, che poi ti serve per l'ethernet shield.

per il resto parti dal codice che abbiamo già scritto!

Il codice della swrtc a me non serve, uso rtc hardware.
Devo solo gestire ora legale, correggendo rtc.
Quindi ognI 6 mesi correggere in automatico lorario dellrtc hw.

Volendo fare le cose in grande potrebbe diventare una libreria dove scegliere solo la nazione. Esiste infatti un file open.source manutenuto, che include tutti i paesi di tutte le epoche.

Ma per me e troppo, mi basta la mia misera ora da spostare :slight_smile:

Testato:
Volendo fare le cose in grande potrebbe diventare una libreria dove scegliere solo la nazione. Esiste infatti un file open.source manutenuto, che include tutti i paesi di tutte le epoche.

E' un dispendio inutile di risorse.
Alla fine, quanto andrebbe ad occupare questa libreria in termini di Flash? Troppo.
Ora come ora, la swRTC occupa sui 1750 byte, con tutta la gestione degli interrupt e dei timer. Quindi usabilissima anche sui Tiny con 2 kB di memoria.

di preciso non so, pero' visto che mantiene lo storico effettivamente e' una cosa grande, sfizioso il fatto che l'orario tedesco del periodo dell'occupazione a fine guerra, non e' definito in quanto le 4 potenze occupanti, usavano orari diversi :slight_smile:

Ora che lo so, stanotte dormirò più tranquillo XD XD

A parte gli scherzi, io sono un po' pratico, in queste cose. Se una cosa non serve, la lascio perdere.

Ragazzi, molto bella la discussione tecnica sulla precisione di sti orogologi ma sul concreto io sto cercando di aggiornare l'ora via seriale, mandando una stringa tipo !D201111260049 . Peccato che arrivo a memorizzare in un array tutti i caratteri e con la funzione String riesco anche a suddividere anno, mese, giorno etc...

Ma quando vado a usare la stringa che ho creato dentro la funzione per l'aggiornamento dell'ora ---> B O O M ! !

sketch_nov26a.cpp: In function 'void loop()':
sketch_nov26a:62: error: no matching function for call to 'swRTC::setTime(String&, String&, int)'
/Users/matteo/Documents/Arduino/libraries/swRTC/swRTC.h:32: note: candidates are: boolean swRTC::setTime(byte, byte, byte)

Ora le stringhe me le compongo così:

String anno = String(inData[0]) + String(inData[1]) + String(inData[2]) + String(inData[3]);
String mese = String(inData[4]) + String(inData[5]);
String giorno = String(inData[6]) + String(inData[7]);
String ora = String(inData[8]) + String(inData[9]);
String minuto = String(inData[10]) + String(inData[11]);

Peccato che lui voglia delle variabili "byte" se ho capito bene. Ma non so come concatenare delle variabili byte!!!
Come avrete inteso sono un niubbo!!

Ciao
M

Sì, swRTC.setTime richie dati in formato byte.
Devi fare la conversione tra tipi di dato.
Prova convertendo il tuo dato String in un char* usando String.toCharArray e poi con atoi a convertire questo in un numero.

Una soluzione più semplice è spedire direttamente i dati in formato byte: byte mandi, byte arrivano.

leo72:
Sì, swRTC.setTime richie dati in formato byte.
Devi fare la conversione tra tipi di dato.
Prova convertendo il tuo dato String in un char* usando String.toCharArray e poi con atoi a convertire questo in un numero.

Una soluzione più semplice è spedire direttamente i dati in formato byte: byte mandi, byte arrivano.

Grazie, ma io non ce l'ho già l'array di byte?? Scusa ti metto il codice che uso... perché non ci capisco niente :stuck_out_tongue:

#include <swRTC.h>
swRTC rtc;

int  inChar;             // var that will hold the bytes-in read from the serialBuffer
byte inData[12];  // array that will hold the different bytes  100=100characters;


void setup() {
 
  delay(2000);
  rtc.stopRTC();
  rtc.setTime(10,43,0); //set the correct time...
  rtc.setDate(25,11,2011); //... and date if you want
  rtc.startRTC();
  
  Serial.begin(9600);
  Serial.println("Arduino Ready");
}

void loop () {

  
  
  while(Serial.available() > 0) 
  {


   inChar = Serial.read(); // leggo il primo carattere inviato
   if(inChar == '!') // se inizia per ! allora è un comando e vado a vedere che comando
   {

    Serial.print("Comando: ");
    inChar = Serial.read(); // leggo il secondo carattere inviato
    if(inChar == 'D')  // se inizia per D è il comando settare data e ora
    {
     Serial.println("TimeSync ");
     // leggo le prossime 12 cifre per il formato data YYYYMMDDhhmm
     
     int i = 0;
     for (i=0;i<11;i++)
     {
       inChar = Serial.read();
       inData[i] = inChar;
     }
    
     String anno =  String(inData[0]) + String(inData[1]) + String(inData[2]) + String(inData[3]); 
     String mese = String(inData[4]) + String(inData[5]);
     String giorno = String(inData[6]) + String(inData[7]);
     String ora = String(inData[8]) + String(inData[9]);
     String minuto = String(inData[10]) + String(inData[11]);
      
     delay(2000);
     rtc.stopRTC();
     rtc.setTime(ora,minuto,0); //set the correct time...
     rtc.setDate(giorno,mese,anno); //... and date if you want
     rtc.startRTC();
          
    }

   }

  }

}

Tu hai un array di byte, che non è propriamente una stringa del C classico, ossia un array di char*. atoi funziona con questo tipo di dati,.

L'alternativa, come ti ho detto, per evitare tutte queste conversioni, è spedire direttamente i dati in formato byte. Cioè spedisci byte(23) e ricevi byte(23).

Ok ce l'ho fatta... posto il codice che magari a qualche principiante come me puo servire..
Setto l'ora con comando da seriale tipo: !D201111261200 e mandando un "G" mi dice l'ora...

#include <swRTC.h>
swRTC rtc;

int  inChar;
byte inData[12];  

void setup() {
 
  delay(2000);
  rtc.stopRTC();
  rtc.setTime(10,43,0);
  rtc.setDate(25,11,2011);
  rtc.startRTC();
  
  Serial.begin(9600);
  Serial.println("Arduino Ready");
}

void loop () {

  
  while(Serial.available() > 0) 
  {


   inChar = Serial.read(); // leggo il primo carattere inviato
   if(inChar == '!') // se inizia per ! allora è un comando e vado a vedere che comando
   {

    Serial.print("Set -> ");
    inChar = Serial.read(); // leggo il secondo carattere inviato
    if(inChar == 'D')  // se inizia per D è il comando settare data e ora
    {
     Serial.print(" Time : ");
     
     int i = 0;
     for (i=0;i<12;i++) // leggo le prossime 12 cifre per il formato data YYYYMMDDhhmm
     {
       inChar = Serial.read();
       inData[i] = inChar;
     }
     
     char anno[] = { inData[0], inData[1], inData[2], inData[3], 0 };
     char mese[] = { inData[4], inData[5], 0 };
     char giorno[] = { inData[6], inData[7], 0 };
     char ora[] = { inData[8], inData[9], 0 };
     char minuto[] = { inData[10], inData[11], 0 };
     
     int Anno = atoi(anno);
     int Mese = atoi(mese);
     int Giorno = atoi(giorno);
     int Ora = atoi(ora);
     int Minuto = atoi(minuto);
      
     Serial.print(Anno);
     Serial.print("/");
     Serial.print(Mese);
     Serial.print("/");
     Serial.print(Giorno);
     Serial.print(" ");
     Serial.print(Ora);
     Serial.print(":");
     Serial.println(Minuto);
       
     delay(2000);
     rtc.stopRTC();
     rtc.setTime(Ora,Minuto,0);
     rtc.setDate(Giorno,Mese,Anno); 
     rtc.startRTC();
 
    }
    


   }
  
  
   if (inChar == 'G')
   {
     Serial.print(rtc.getYear(), DEC);
     Serial.print("/");
     Serial.print(rtc.getMonth(), DEC);
     Serial.print("/");
     Serial.print(rtc.getDay(), DEC);
     Serial.print(" ");
     Serial.print(rtc.getHours(), DEC);
     Serial.print(":");
     Serial.println(rtc.getMinutes(), DEC);
    }
  
   
  
  }
  
  

}

Dimeticavo, grazie per l'hint Leo!