Arduo Memory Reminder Medicine

Ciao, la funzione setSyncProvider() può avere successo o fallire. Per saperlo si deve leggere il valore di una variabile di stato che ora a memoria mi sfugge. Nel caso in cui il "sync" sia fallito, l'ora andrebbe esplicitamente impostata ad un valore prefissato. Se non si fa questo, la data e l'ora possono assumere valori casuali.

Comunque secondo me l'RTC dovrebbe essere parte integrante dell'hardware. IMHO, of course :slight_smile:

:slight_smile: Ciao tuxduino,

sicuramente sarà parte integrante, ma mi piacerebbe pensare anche che il device possa funzionare senza l'RTC, in maniera da poter provare il progetto anche senza, e non essere vincolati per forza di cose ad un qualcosa di esterno, riprendendo l'idea di poter utilizzare meno materiale possibile per la realizzazione del progetto stesso.

Questa versione sarà la versione base definitiva, per chi volesse cimentarsi nella realizzazione senza dover acquistare materiale aggiuntivo.

Da qui in poi, ci si dovrà sbizzarrire per le varie implementazioni di qualsisasi tipo, sia SW che HD.

Se ti torna in mente quale è la variabile di stato della funzione setSyncProvider() fammi un fischio, anche perchè in tal caso, si dovrebbe eliminare la funzione della correzione automatica del tempo giornaliera, nel caso sia presente l'RTC.

Penso comunque che per questo fine settimana si possa rincominciare a definire i nuovi upgrade da portare al progetto.

La versione funzionante (R1.0c) che posterò a momenti nel sito del FABLAB e qui sotto, avrà come base la R05i modificata da te, con la sistemazione di tutti i pin, HD e SW, l'integrazione della eprom esterna, con le funzioni di test R/W e l'inserimento dei tasti PGM ed ESC.

Se riesci provala con l'RTC, visto che ho aggiunto la eprom esterna che usa lo stesso bus I2C, anche perchè finalmente mi arriva questa settimana la shield RTC completa. (i tasti di test utilizzati per il test di R/W della eprom esterna sono UP e DW, dove UP scriverà sul monitor seriale il valore letto dal registro 0 della eprom, mentre DW lo incrementerà di un carattere e lo scriverò sempre sul registro 0).

Ho notato che l'ora viene verificata dell'RTC ogni 5 minuti. Questo valore si può cambiare?

PS.: Per i valori di set della tastiera analogica, trovi al fondo del listato una void chiamata "void inputbuttons()" dove basta inserire i valori della tua tastiera per poterla far funzionare. I tasti attivi saranno UP,DW,ENT,ESC,PGM.

:wink: Ciao.

A_M_R_1_0_0c.zip (9 KB)

L'ho trovata nel codice di esempio allegato alla libreria Time.

copio-incollo un frammento di setup():

  setSyncProvider(RTC.get);   // the function to get the time from the RTC
  if(timeStatus()!= timeSet) 
     Serial.println("Unable to sync with the RTC");
  else
     Serial.println("RTC has set the system time");

:slight_smile: Bene!
Questa serve per vedere se l'RTC funziona o è presente. Per disattivare l'aggiornamento automatico che ho verificato avviene ogni 5 minuti?

Forse, sarebbe bene non attivarlo proprio, semplicemente escludendo i comandi relativi all'RTC, nel caso non sia presente fisicamente, nel momento della compilazione del codice, qualora si voglia testare il progetto senza l'RTC.

OK. :roll_eyes:

In ogni caso, questa istruzione, si può utilizzare per fare visualizzare il messaggio di "guasto RTC time" e per disattivare l'ADJ orario giornaliero se presente l'hardware RTC.

Provvedo a generare la funzione di messaggistica, che potrebbe tornare utile per visualizzare eventuali segnalazioni e report delle assunzioni dei medicinali, nel caso si utilizzi una eprom esterna, dove andare a scaricare le operazioni.

Grazie.
Ciao.
:smiley:

=(
Credo che

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");

:cold_sweat:
Ciao brunello,

ma dove vado ad inserire la parte di skethc?

Inserendola prima del setup mi dà errore in compilazione ("expected constructor, destructor, or type conversion before '.' token")

Inserendola nel setup mi dà errore in compilazione ('class TwoWire' has no member named 'write') e ('class TwoWire' has no member named 'read').

?????

Hai qualche dritta in più, perfavore? =(

Grazie.

Nel setup()

Uhmmm.. usi un ide anzianotto

c'e' da rinominare wire.write in wire.send
e wire.read in wire.receive

:sweat_smile:

ok! errori risolti .

Ma dà comunque sempre RTC presente !!!!!

WHI ? :astonished:

Ti da' tutti e due i messaggi ?

:sweat_smile:

ok. "RTC presente" lo darebbe comunque sempre, ma comunque non mi visualizza "RTC malfunzionante" pur non essendo presente? :drooling_face:

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 )

un metodo sicuro e' quello di usare la ram interna all'RTC
Ci scrivi un valore e poi leggi se e' presente.

:roll_eyes:
oppure usare questo

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.

:stuck_out_tongue:
al momento uso questo codice, anche se è un modo per raggirare il problema

setSyncProvider(RTC.get);

if (hour() == 00 && minute() == 00 && second() == 00){
Serial.println("RTC non presente");
} else {
Serial.println("RTC presente");
}

:%

Se vengono fuori altre soluzioni, ben accette.

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");
 }

vero, cosi' deve funzionare

:stuck_out_tongue: :stuck_out_tongue: :stuck_out_tongue:
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");
}

Ciao.

:grin:

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.

Un saluto a tutti. :wink:

si, ma non ti dice se l' RTC e' fermo o attivo