Sveglia con modulo RTC DS1302

Ciao a tutti,
sono ancora in ballo con questo maledetto RTC. Sto cercando di programmarlo come sveglia, utilizzando la libreria di henning karlsen. Purtroppo questa libreria non ha una funzione di sveglia, quindi sto cercando di arrangiarmi in qualche modo nello sketch ma, non essendo molto buono in programmazione, non sto avendo buoni risultati. Vi posto la parte del codice che mi da problemi

void loop(){
  retroilluminazione(); //funzione per la retroilluminazione
  avviotemporizzato(); //funzione di sveglia per il pc
  cambiostat = analogRead(cambiolcd);
  if(cambiostat > 1000 && cambiostat <=1024){  //se viene tenuto premuto, il pulsante mostra la seconda schermata                         (temperatura e umidità)
    lcd.clear();

    temperaturaigrometro();
    delay(1000);
  }
  else if(cambiostat < 1000){ //se invece non è premuto, vengono mostrate ora e data
    lcd.clear();
    orologio();
  }
}

void avviotemporizzato(){
  if(rtc.getTimeStr() == "12:03:10"){ //se il tempo è uguale a quello segnato, esegui
    digitalWrite(optoalim, HIGH);
    delay(2000);
    digitalWrite(optopc, HIGH);
    delay(100);
    digitalWrite(optopc, LOW);
    delay(1000);
  }
  else if(rtc.getTimeStr() != "12:03:05"){ //altrimenti continua
  } 
}
void orologio(){ //funzione orologio/calendario
  lcd.setCursor(4, 0);
  lcd.print(rtc.getTimeStr());
  Serial.println(rtc.getTimeStr());
  Serial.println(rtc.getDOWStr());
  Serial.println(rtc.getDateStr());
  lcd.setCursor(0, 1);
  lcd.print(rtc.getDOWStr(FORMAT_SHORT));
  lcd.setCursor(6, 1);
  lcd.print(rtc.getDateStr());
  delay(1000);
}

Come potete vedere, avvio la funzione "avviotemporizzato" all'inizio del loop, quindi non dovrebbero esserci problemi nel rilevare l'ora. rtc.getTimeStr dovrebbe dare come output una stringa del formato "hh:mm:ss", quindi non capisco perchè l'if non funzioni.

Ho provato anche ad unire "avviotemporizzato" ed "orologio" in un'unica funzione, ma il problema persiste.

qualcuno ha avuto qualche esperienza con questi moduli RTC ed è in grado di aiutarmi? Ho già provato a cercare nel forum (e anche in rete) ma non ho trovato niente che fa al caso mio...

Esattamente, cos'è che osservi e cos'è invece che ti aspetteresti?
Tieni conto che il codice scritto così accende la sveglia solo quando l'orario è quello indicato e la spenge solo quando l'orario è diverso da quello indicato.

Lui tiene conto del tempo, e questo è giusto. Però, con la funzione "avviotemporizzato", vorrei che fosse letta l'ora e che, se corrisponde a quella da me segnata ("12:03:05"), facesse le funzioni sotto l'if. Esattamente come hai scritto, il codice deve accendere la sveglia con l'orario indicato e spegnerlo con l'orario diverso da quello indicato. Però non succede nulla.

riposto il codice perchè mi sono accorto di un errore...

oid loop(){
  retroilluminazione(); //funzione per la retroilluminazione
  avviotemporizzato(); //funzione di sveglia per il pc
  cambiostat = analogRead(cambiolcd);
  if(cambiostat > 1000 && cambiostat <=1024){  //se viene tenuto premuto, il pulsante mostra la seconda schermata                         (temperatura e umidità)
    lcd.clear();

    temperaturaigrometro();
    delay(1000);
  }
  else if(cambiostat < 1000){ //se invece non è premuto, vengono mostrate ora e data
    lcd.clear();
    orologio();
  }
}

void avviotemporizzato(){
  if(rtc.getTimeStr() == "12:03:05"){ //se il tempo è uguale a quello segnato, esegui
    digitalWrite(optoalim, HIGH);
    delay(2000);
    digitalWrite(optopc, HIGH);
    delay(100);
    digitalWrite(optopc, LOW);
    delay(1000);
  }
  else if(rtc.getTimeStr() != "12:03:05"){ //altrimenti continua
  } 
}
void orologio(){ //funzione orologio/calendario
  lcd.setCursor(4, 0);
  lcd.print(rtc.getTimeStr());
  Serial.println(rtc.getTimeStr());
  Serial.println(rtc.getDOWStr());
  Serial.println(rtc.getDateStr());
  lcd.setCursor(0, 1);
  lcd.print(rtc.getDOWStr(FORMAT_SHORT));
  lcd.setCursor(6, 1);
  lcd.print(rtc.getDateStr());
  delay(1000);
}

Non conosco quella lib. La chiamata a rtc.getTimeStr cosa restituisce? Un oggetto String?

si, restituisce l'ora nel formato hh:mm:ss.

Forse c'è un errore logico, ora però non lo vedo.
Fai uno sketch di prova, imposta nel setup un orario qualsiasi, tipo 12:00:00 e poi nel loop metti l'accensione del led sul pin 13 qualche secondo dopo, ad esempio alle 12:00:20. Guarda se te lo fa oppure no.

no non lo fa. orario di partenza 12:03:00 e orario di accensione led 12:03:05.

if(rtc.getTimeStr() == "12:03:05"){
    digitalWrite(ledprova, HIGH);
  }

Allora forse quella funzione non restituisce l'ora nel formato che dicono oppure ci sono caratteri diversi.
Fai una prova:

String temp = rtc.getTimeStr();
Serial.println(temp);
Serial.prinln(temp.length());

Che ottieni?

ottengo:

12:03:02
8

Mi dai il link della lib che stai usando?

eccola
http://www.henningkarlsen.com/electronics/library.php?id=5

Dal file DS1302.cpp:

char *DS1302::getTimeStr(uint8_t format)

Come vedi, restituisce una stringa in stile C, non un oggetto String, come ti avevo chiesto io :wink:

leo72:
La chiamata a rtc.getTimeStr cosa restituisce? Un oggetto String?

C'è una sottile differenza...
http://arduino.cc/en/Reference/String

Devi convertire l'oggetto in stringa prima di fare il confronto.

ah, ecco perchè... non sono il massimo in programmazione, non riesco ad orientarmi bene.

comunque alla fine ho risolto. da quello che ho capito, sono riuscito a trasformare in oggetto string l'output di getTimeStr e poi a compararlo con l'orario da me impostato.

void avviotemporizzato(){
  String temp = rtc.getTimeStr();
  if(temp == "12:03:05"){ //se il tempo è uguale a quello segnato le 7 di mattina di default
    digitalWrite(optoalim, HIGH);
    delay(2000);
    digitalWrite(optopc, HIGH);
    delay(100);
    digitalWrite(optopc, LOW);
    delay(1000);
  }
  else if(temp != "12:03:05"){ //altrimenti continua
  } 
}

Ti ringrazio per il prezioso aiuto che mi hai fornito :slight_smile:

sagara_939:
ah, ecco perchè... non sono il massimo in programmazione, non riesco ad orientarmi bene.

Purtroppo nell'universo Arduino convivono cose in C e cose in C++, e questo genera una gran confusione.

Ti ringrazio per il prezioso aiuto che mi hai fornito :slight_smile:

Figurati

Salve.
A volte è più la confusione che programmazione, non conoscevo il DS1302 ma a grani linee il DS1307 a prima vista sembra che abbia più RAM interna poi cosa da approfondire, a parte questo domandine il Chip in entrambi le versioni segnala lo stato di carica della batteria tampone, se si! qualcuno conosce se nelle librerie appare tale comando per il test o altri espedienti in merito?
Se no! , scusate di tutti questi SE ma anche la vita è tutta una programmazione fino alla fine del programma..OPS..
Ritornando, se no ! ho bisogno di un circuito esterno per rilevarne lo stato di carica ?
Saluti

Che io sappia nessun chip ti dice lo stato della carica della batteria tampone. Non so neanche se ti conviene leggerne la carica, forse sarebbe più la corrente che gli prelievi tenendola costantemente collegata ad un pin che la sua corrente di autoscarica. Mettila e fregatene, nella peggiore delle ipotesi hai 5/7 anni di autonomia.. D'altronde è una batteri tampone , deve intervenire solo in casi di emergenza :wink:

OK, ma leggi solo lo stato di carica come in certe videocamere o in altri dispositivi come i cellulari che ti segnala un preallarme

Ma quelli sono oggetti che, come nel caso dei cell, ricarichi una volta al giorno. La batt tampone di un DS1307 dura 7/10 anni, a seconda dei casi... fai prima a cambiarla periodicamente che a scaricarla leggendola continuamente :wink:

Si capisco infatti si fa così anche nei PC la si cambia solo quando l'orologio di sistema inizia a darti problemi, sopratutto quando i tuoi file più recenti riporta la data e l'ora di cinque o sette anni prima :), ossia quando il tuo vecchio PC lo dovevi ancora acquistare.....della serie ritorno al passato chi sa se i Byte vagiscono o bittizano uen..uennnn. :smiley: come ringiovanire senza lifting..... se lo sa qualcuno si installa una batteria e non la cambia più povero berlù

[OT]
In molti dei vecchi PC XT degli anni '80 la batt tampone non c'era, era montata sugli AT, i PC di fascia alta. Quindi ogni volta che accendevi la macchina la data ripartiva dal 1° gennaio 1980 XD