setSyncProvider(RTC.get);
if(timeStatus()!= timeSet) {
Serial.println("Unable to sync with the RTC");
} else {
Serial.println("RTC has set the system time");
}
usata subito dopo l'upgrade della data ed ora, non sia corretto.
Probabilmente questa istruzione serve a verificare solo se i tempi sono allineati, per eseguire poi un allinenamento.
Usata così che ci sia o meno l'RTC, il risultato è sempre ("RTC has set the system time"), proprio perchè il tempo RTC = 00.00 e quello impostato in arduiono è stato appena aggiornato a 00.00
Mi sa che non è questa la soluzione per verificare la presenza dell' RTC. :*
Wire.beginTransmission(0x68); // Open I2C line in write mode (0x68 DS1307 )
Wire.write((byte)0x00); // Set the register pointer to (0x00)
Wire.endTransmission(); // End Write Transmission
Wire.requestFrom(0x68, 1); // Open the I2C line in send mode
if ( Wire.read() & 0x80 ) {
Serial.println ("RTC malfunzionante ");
}
Serial.println("RTC presente");
Strano.
si controlla se il bit 7 del registro RTC e' a Zero ( 0=running 1=stop ).. in pratica si guarda se l'RTC e' attivo.
Leggendo su un registro che non esiste dovrebbe darti 255.... quindi come se fosse fermo ( o non presente )
Wire.beginTransmission(0x68); // Open I2C line in write mode (0x68 DS1307 )
Wire.send((byte)0x00); // Set the register pointer to (0x00)
Wire.endTransmission(); // End Write Transmission
Wire.requestFrom(0x68, 1); // Open the I2C line in send mode
if (Wire.available()) {
Serial.println("RTC presente");
}
ma non posso provarlo, perchè non ho ancora l'RTC, e neppure la soluzione di scrivere e poi leggere una memoria interna dell'RTC.
cosi' scrivi sulla ram interna e verifichi la presenza del dato
Wire.beginTransmission(0x68); // Open I2C line in write mode (0x68 DS1307 )
Wire.write((byte)0x08); // Set the register pointer to (0x08) internal RAM
Wire.write((byte)0x09); // valore da scrivere
Wire.endTransmission(); // End Write Transmission
Wire.beginTransmission(0x68);
Wire.write((byte)0x08);
Wire.endTransmission();
Wire.requestFrom(0x68, 1); // Open the I2C line in send mode
if ( Wire.read() != 9 ) {
Serial.println ("RTC mancante");
}
Trovato soluzione nella spiegazione dei comandi della libreria time.
setSyncInterval(adjs); // imposta il tempo in secondi di autosincronizzazione dove adjs è il valore da impostare
setSyncProvider(RTC.get); // attiva la sincronizzazione tra l'RTC ed Arduino, impostando il nuovo intervallo di autosincronizzazione
if (timeNeedsSync != 0){ // verifica se è andato a buon fine la sincronizzazione tra i device
Serial.println("Unable to sync with the RTC");
} else {
Serial.println("RTC has set the system time");
}
Tra tutte le soluzioni, la migliore, concreta e funzionante, e la seguente
Wire.beginTransmission(0x68); // Open I2C line in write mode (0x68 DS1307 )
Wire.send((byte)0x00); // Set the register pointer to (0x00)
Wire.endTransmission(); // End Write Transmission
Wire.requestFrom(0x68, 1); // Open the I2C line in send mode
if (Wire.available()) { //verify if RTC is present
Serial.println("RTC presente");
} else {
Serial.println("RTC presente");
}
Finalmente l'ho potuta testare. Montato la shield al volo e provata. OK.
Copia ed incolla troppo veloce senza controllare.
Nella sistemazione del codice copiato dal mio, non ho aggiornato le descrizioni del serial print.
In realtà il device mi avvisa anche sul display LCD.
Wire.beginTransmission(0x68); // Open I2C line in write mode (0x68 DS1307 )
Wire.send((byte)0x00); // Set the register pointer to (0x00)
Wire.endTransmission(); // End Write Transmission
Wire.requestFrom(0x68, 1); // Open the I2C line in send mode
if (Wire.available()) { //verify if RTC is present
Serial.println("RTC presente");
} else {
Serial.println("RTC non presente o errore di comunicazione");
}
Ho realizzato una nuova versione sia hardware che software del progetto, la R.1.1A, che prenderà il posto della release R0.5i dedicata al primo hardware e che posterò appena sistemato il seguente problema.
Ho usato il bus I2C per il display, L'RTC e la EEPROM in maniera da avere più pin liberi per eventuali upgrade hardware.
Al momento della compilazione, ho avuto dei problemi con l'IDE 0022 per la libreria LCD I2C. Sono passato così all' ultima versione, la 1.0.3 e mi ritrovo a dover disattivare l'audio, perchè la libreria tone non funziona più. "Compromesso accettato."
Qualcuno sà come posso sistemare il problema?
Ho visto che nella nuova versione IDE, viene fornita una libreria dedicata all'audio "pitches.h" che naturalmente funziona, ma vuole tassativamente utilizzare i pin 8-9 e 11. Posso utilizzare il pin A1, per l'uscita audio, o sono vincolato a questi pin.