Ciao ragazzi ho iniziato a creare il programma per il mio acquario basandomi sul progetto di riciweb pian panino comincio a imparare tante cose utili, però sono ancora agli inizi, e volevo chiedervi riguardo all' rtc cosa posso fare.. ho trovato tanti sketch on line ma tutti diversi e non so quale usare. Cosa mi consigliate?
Mah ... guarda, il DS1307 è un dispositivo piuttosto semplice e ... imparare da soli a gestirlo, senza usare "librerie" varie già fate da altri è anche molto educativo ...
Parti con lo studiarti le funzioni della libreria di sistema Wire , ti studi il datasheet del DS1307 e ... ti scrivi le TUE funzioni ...
Esempio ...
... il DS1307 ha come indirizzo I2C il valore 0x68 (... pag. 12 del datasheet : "... the 7-bit DS1307 address, which is 1101000") quindi, come prima cosa verificherai che il dispositivo è correttamente collegato e funzionante :
Wire.beginTransmission(0x68); // DS1307
delay(50);
if (Wire.endTransmission() != 0) {
Serial.println("ERRORE: RTC DS1307 non disponibile");
}
else {
Serial.println("Trovato DS1307 RTC");
}
... come vedi bastano un paio di chiamate alla libreria Wire
Anche leggere l'ora è piuttosto semplice ... devi giusto ricordarti che i valori ti vengono dati in BCD e che quindi devi convertirli con una semplice operazione matematica :
byte bcdToDec(byte val)
{
return ( (val/16*10) + (val%16) );
}
... dopo di che, definita questa semplice funzioncina che ti fa la conversione vai a leggerti, sempre con delle semplici chiamate alla Wire, l'ora che il DS1307 ha al suo interno :
Wire.beginTransmission(0x68);
Wire.write(0x00);
Wire.endTransmission();
Wire.requestFrom(0x68, 7);
ds1307_data[0] = bcdToDec(Wire.read() & 0x7f); // secondi
ds1307_data[1] = bcdToDec(Wire.read()); // minuti
ds1307_data[2] = bcdToDec(Wire.read() & 0x3f); // ore
ds1307_data[3] = bcdToDec(Wire.read()); // giorno della settimana
ds1307_data[4] = bcdToDec(Wire.read()); // giorno del mese
ds1307_data[5] = bcdToDec(Wire.read()); // mese
ds1307_data[6] = bcdToDec(Wire.read()); // anno
... dove, in questo esempio, ds1307_data è un array che ti sei definito tu per memorizzare la data
Insomma ... certo, all'inizio non sarà facilissimo, ma secondo me, facendo esperienza con un device semplice come il DS1307 ... piano piano imparerai come si parla con il bus I2C e questo ... ti sarà sicuramente utile in futuro per ... evitare tanti piccoli problemi
Se poi invece il tutto è ... ancora troppo complesso da capire ... bé ... allora QUI c'è la "pappa fatta" ...
Buon divertimento ...
Guglielmo
Ciao Guglielmo e scusa per il ritardo, grazie della risposta..
Infatti io voglio imparare e personalizzare il mio progetto sennò avrei seguito passo passo passo quello di riciweb
L'unico problema è capire tutte le funzioni, purtroppo è quasi tutto in inglese che capisco parzialmente.. c è per caso una guida in italiano? Il libro ufficiale può essermi d'aiuto?
nicola90wii:
L'unico problema è capire tutte le funzioni, purtroppo è quasi tutto in inglese che capisco parzialmente.. c è per caso una guida in italiano? Il libro ufficiale può essermi d'aiuto?
Mmm .. non credo che il libro ufficiale si addentri nella spiegazione della libreria "Wire" ... e, onestamente, libri in Italiano non ne conosco ...
Comunque le funzioni che a te servono sono proprio poche e ... con un piccolo sforzo ed un buon dizionari di inglese ... non dovresti avere troppa difficoltà
Più complessa magari può risultare la lettura dei datasheet e ... quelli li trovi SOLO in lingua inglese.
Purtroppo, se vuoi proseguire con questa passione ... devi necessariamente farti un corso di Inglese (almeno tecnico) o ... sarai sempre in difficoltà ... :~
Guglielmo
A quello che ho capito la libreria wire legge i dati che un dispositivo manda da un dato indirizzo (l'RTC ha 0x68).
Prima però il dispositivo deve essere istruito circa il numero da cui deve cominciare a contare (data , ora ed eventualmente giorno della settimana) e la libreria wire lo esegue inserendo gli appositi comandi.
Quindi come tutti gli sketch:
Prima dichiari le variabili che ti servono
poi passi al setup
Poi inizializzi la libreria con "begin"
Poi inizializzi l'indirizzo del dispositivo con beginTransmission (indirizzo)
Poi dichiari da che parte interna del dispositivo cominci a scrivere e che tipo di dato è ((byte)0x00)
Infine scrivi i secondi da 0x00 a 0x59 poi i minuti da 0x00 a 0x59 poi le ore che hanno un dato in più che non ho ben capito ((byte)0x80 | da0x00 a 0x24) e cosi via.
Chiudi la trasmissione con endTransmission e passi al loop
Quindi tiri su il lavoro che fa l'RTC contare:
Inizializzi la trasmissione all indirizzo dell'RTC (0X68)
Leggi cosa c'e scritto (byte) quindi wire(byte) e da che parte interna cominci a leggere quindi wire((byte)0x00)
Chiudi la trasmissione come prima
converti i dati da byte a quello che ti serve (decimale esadecimale o altro) e li stampi sul seriale oppure li lavori come variabile.
Io inoltre ho un posto dietro casa dove metto tutte le croci dei "cristi"che tiro giu' quando mi metto a fare qualcosa con arduino
ciao Alberto
capitankevin:
....
Io inoltre ho un posto dietro casa dove metto tutte le croci dei "cristi"che tiro giu' quando mi metto a fare qualcosa con arduino
Se invece di scomodare i "Cristi" e mettere "Croci" dedicassi il tempo a studiarti i datasheet ... capiresti più cose ed avresti molti meno problemi ] ] ]
Guglielmo