Go Down

Topic: RTC DS3231 impostare allarmi (Read 7669 times) previous topic - next topic

Patrick_M

#30
May 16, 2018, 03:11 pm Last Edit: May 16, 2018, 03:14 pm by Patrick_M
  Alarm.alarmRepeat(8,30,0, MorningAlarm);  // 8:30am every day
  Alarm.alarmRepeat(17,45,0,EveningAlarm);  // 5:45pm every day

queste non le usi più?

edit....

si certo, facendo i controlli come nel tuo secondo pezzo è come se impostassi degli allarmi. A questo punto prevedendo un aggiornamento periodico dell'ora in modo da essere abbastanza precisi puoi levare la timerAllerm
per inserire (lo sketch) il programma, dall'IDE clicca modifica, clicca copia per il forum poi vieni qui e incolla nel tuo post (ctrl+v) ;)

ziopippo

Alarm.alarmRepeat(8,30,0, MorningAlarm);  // 8:30am every day
  Alarm.alarmRepeat(17,45,0,EveningAlarm);  // 5:45pm every day

queste non le usi più?
Ho provato a commentarle insieme all'include della libreria TimeAlarms.h e mi sono accorto che non ne aveva bisogno.

ziopippo

Ora mi capita una cosa stranissima. Se recupero l'ora corrente con
Code: [Select]

void SyncRTC() {
  setSyncProvider(RTC.get);  // the function to get the time from the RTC
  if (timeStatus() != timeSet)
    Serial.println("Errore sincronizzazione con RTC");
  else
    Serial.println("Orario sincronizzato con RTC");
  digitalClockDisplay(); // Stampo l'ora corrente sul monitor seriale
 
  }


e poi dopo aver effettuato le dovute modifiche con
Code: [Select]

void ore()
{
  if (LCDML_BUTTON_checkUp()) // incremento l'orario
  {
    tmpHours = tmpHours < 23 ? tmpHours + 1 : tmpHours;
    lcd.setCursor(4, 0);
    if ( tmpHours < 10 ) lcd.print("0");
    lcd.print(tmpHours);
    LCDML_BUTTON_resetUp();
  }
  else if (LCDML_BUTTON_checkDown()) // decremento l'orario
  {
    tmpHours = tmpHours > 0 ? tmpHours - 1 : tmpHours;
    lcd.setCursor(4, 0);
    if ( tmpHours < 10 ) lcd.print("0");
    lcd.print(tmpHours);
    LCDML_BUTTON_resetDown();
  }
  else if (LCDML_BUTTON_checkEnter()) // passo ai minuti
  { LCDML_BUTTON_resetEnter();
    stato = 1;
  }
}

void minuti()
{

  if (LCDML_BUTTON_checkUp()) // incremento i minuti
  {
    tmpMinutes = tmpMinutes < 59 ? tmpMinutes + 1 : tmpMinutes;
    lcd.setCursor(7, 0);
    if ( tmpMinutes < 10 ) lcd.print("0");
    lcd.print(tmpMinutes);
    LCDML_BUTTON_resetUp();
  }
  else if (LCDML_BUTTON_checkDown()) // decremento i minuti
  {
    tmpMinutes = tmpMinutes > 0 ? tmpMinutes - 1 : tmpMinutes;
    lcd.setCursor(7, 0);
    if ( tmpMinutes < 10 ) lcd.print("0");
    lcd.print(tmpMinutes);
    LCDML_BUTTON_resetDown();
  }
  else if (LCDML_BUTTON_checkEnter()) // termino
    stato = 2;
  LCDML_BUTTON_resetEnter();
}


e vado a riscrivere l'orario aggiornato con RTC.write(tm) come nel codice sotto,

Code: [Select]
void LCDML_DISP_loop(LCDML_FUNC_set_time)
{
  // loop function, can be run in a loop when LCDML_DISP_triggerMenu(xx) is set
  // the quit button works in every DISP function without any checks; it starts the loop_end function
  g_lcdml_initscreen = millis(); // reset initscreen timer

  switch (stato) {
    case 0:
      ore();
      break;
    case 1:
      minuti();
      break;
    case 2:
      tm.Hour = tmpHours;             //set the tm structure to 23h31m30s on 13Feb2009
      tm.Minute = tmpMinutes;
      tm.Second = 0;
      /*
           tm.Day = 18;
         tm.Month = 5;
         tm.Year = 2018 - 1970;
      */
      SyncRTC(); // Sincronizzo il RTC per recuperare la data corretta
      RTC.write(tm);            //set the RTC from the tm structure
      Serial.println("MEMORIZZO ED ESCO");
      SyncRTC(); // Sincronizzo il RTC per aggiornare ora e data sul display
      // end function for callback
      LCDML_DISP_funcend();
      stato = 0;
      break;
  }


non capisco perchè l'orario lo setta correttamente mentre, a volte, mi memorizza date assurde sull'RTC sia che io preveda il recupero e la riscrittura della data corrente sia che decida di non aggiornare affatto la data.
Tipo, per esempio, da un aggiornamento di orario fatto poco fa, mi ha aggiornato la data con questa:
Code: [Select]
Orario sincronizzato con RTC
11:10:25 Gio, 31/12/2065
  :o  :smiley-confuse:

Consigli?

Patrick_M

serve il listato completo... per ammattire un po :D

però vedo che tu non tocchi la data quindi c'è qualche errore da qualche parte

qui nel caso di  aumento orario

tmpHours = tmpHours < 23 ? tmpHours + 1 : tmpHours;

se tmpHours è minore di 23 (esempio 22) incrementa di 1 (esempio 23)
se tmpHours è uguale a 23 non incrementa, resta 23

stessa cosa nel decremento

tmpHours = tmpHours > 0 ? tmpHours - 1 : tmpHours;

se tmpHours è maggiore di 0 (esempio 1) decrementa di 1 (esempio 0)
se tmpHours è uguale a 0 non decrementa, resta 0


è corretto ciò che succede?

la funzione write dell'rtc è questa
Code: [Select]

void DS3231RTC::write(tmElements_t &tm)
{
  Wire.beginTransmission(DS3231_CTRL_ID);
  Wire.write((uint8_t)0); // reset register pointer
 
  Wire.write(dec2bcd(tm.Second)) ;   
  Wire.write(dec2bcd(tm.Minute));
  Wire.write(dec2bcd(tm.Hour));      // sets 24 hour format
  Wire.write(dec2bcd(tm.Wday));   
  Wire.write(dec2bcd(tm.Day));
  Wire.write(dec2bcd(tm.Month));
  Wire.write(dec2bcd(tmYearToY2k(tm.Year)));   

  Wire.endTransmission(); 
}

però tu non imposti la data, perlomeno nel pezzo che hai allegato...
per inserire (lo sketch) il programma, dall'IDE clicca modifica, clicca copia per il forum poi vieni qui e incolla nel tuo post (ctrl+v) ;)

ziopippo

Grazie Patrick_M per la risposta.
Sciolgo subito i tuoi dubbi; Mi fermo a 23 perchè poi non avrebbe senso scrivere 24 visto che è possibile tornare a zero per settare la mezzanotte.

Come hai ben intuito la data non la tocco affatto ed è proprio per questo che non capisco da dove prenda quei valori assurdi e, soprattutto, per quale stranissimo motivo me l'aggiorna visto che io dichiaro solo l'orario!  :smiley-confuse:

Patrick_M

se non gli passi i dati che a quanto pare sono richiesti e non opzionali .... presumo che prenda dei valori (che però dovrebbero essere quelli della data iniziale) predefiniti

la cosa migliore sarebbe leggere i valori correnti (tutti), modificare quelli che serve e poi riscriverli (tutti)
per inserire (lo sketch) il programma, dall'IDE clicca modifica, clicca copia per il forum poi vieni qui e incolla nel tuo post (ctrl+v) ;)

ziopippo

se non gli passi i dati che a quanto pare sono richiesti e non opzionali .... presumo che prenda dei valori (che però dovrebbero essere quelli della data iniziale) predefiniti

la cosa migliore sarebbe leggere i valori correnti (tutti), modificare quelli che serve e poi riscriverli (tutti)
Concordo su entrambe le cose tant'è che la prima volta ho provato a non passarli poi, per sicurezza, ho impostato in modo che venga richiamata due volte la funzione SyncRTC()  proprio per far leggere la data certa prima di scrivere con rtc(write) e dopo aver scritto con rtc(write) per verificare cosa ha combinato.
In entrambi i casi scrive idiozie!  :smiley-confuse:

Patrick_M

si ma non vedo il pezzo che dopo aver letto con SyncRTC() copia i valori nelle varie tm.day, tm.year... e così via
per inserire (lo sketch) il programma, dall'IDE clicca modifica, clicca copia per il forum poi vieni qui e incolla nel tuo post (ctrl+v) ;)

ziopippo

si ma non vedo il pezzo che dopo aver letto con SyncRTC() copia i valori nelle varie tm.day, tm.year... e così via
E' tutto qui. Leggo, modifico e scrivo.




Code: [Select]

 case 2:
      tm.Hour = tmpHours;             //set the tm structure to 23h31m30s on 13Feb2009
      tm.Minute = tmpMinutes;
      tm.Second = 0;
      /*
           tm.Day = 18;
         tm.Month = 5;
         tm.Year = 2018 - 1970;
      */
      SyncRTC(); // Sincronizzo il RTC per recuperare la data corretta
      RTC.write(tm);            //set the RTC from the tm structure
      Serial.println("MEMORIZZO ED ESCO");
      SyncRTC(); // Sincronizzo il RTC per aggiornare ora e data sul display
      // end function for callback
      LCDML_DISP_funcend();
      stato = 0;
      break;



quello che non facicio però è:

Code: [Select]
  Wire.beginTransmission(DS3231_CTRL_ID);
  Wire.write((uint8_t)0); // reset register pointer
 


e neanche
Code: [Select]

  Wire.endTransmission(); 


Sarà qui il problema?



ziopippo

Altra domanda:
Se volessi utilizzare la memoria SRAM dell'RTC per memorizzare alcuni dati tipo: temperatura, orario e durata dei vari allarmi, ecc. pensi sia fattibile? Quanti dati posso eventualmente salvare? Qual'è la procedura per scriverli e leggerli? :)

Patrick_M

andiamo per gradi...
Code: [Select]

 case 2:
      tm.Hour = tmpHours;             //set the tm structure to 23h31m30s on 13Feb2009
      tm.Minute = tmpMinutes;
      tm.Second = 0;
      /*
           tm.Day = 18;
         tm.Month = 5;
         tm.Year = 2018 - 1970;
      */

qui tu imposti sulla tua struttura
ore
minuti
secondi
la data è commentata per cui non viene toccata quindi i valori che ci sono scritti.... nessuno li sa

questo:
Code: [Select]

      SyncRTC(); // Sincronizzo il RTC per recuperare la data corretta

dove scrive i dati che recupera?

e questo
Code: [Select]

      RTC.write(tm);            //set the RTC from the tm structure

scrive ore , minuti e secondi sull'rtc

e.... la data?
per inserire (lo sketch) il programma, dall'IDE clicca modifica, clicca copia per il forum poi vieni qui e incolla nel tuo post (ctrl+v) ;)

ziopippo

andiamo per gradi...
Code: [Select]

 case 2:
      tm.Hour = tmpHours;             //set the tm structure to 23h31m30s on 13Feb2009
      tm.Minute = tmpMinutes;
      tm.Second = 0;
      /*
           tm.Day = 18;
         tm.Month = 5;
         tm.Year = 2018 - 1970;
      */

qui tu imposti sulla tua struttura
ore
minuti
secondi
la data è commentata per cui non viene toccata quindi i valori che ci sono scritti.... nessuno li sa

questo:
Code: [Select]

      SyncRTC(); // Sincronizzo il RTC per recuperare la data corretta

dove scrive i dati che recupera?

e questo
Code: [Select]

      RTC.write(tm);            //set the RTC from the tm structure

scrive ore , minuti e secondi sull'rtc

e.... la data?

E' questo l'assurdo! (Scusa il punto interrogativo). Io non dico da nessuna parte di scrivere la data.
E' per questo non capisco il motivo per cui mi restituisce quelle date a caso (... per non dire altro... :D)
Se invece decido al momento del caricamento dello sketch di aggiornarla con

Code: [Select]
setTime(8, 29, 58, 19, 5, 18); Serial.println("Orario impostato manualmente");  //set time to Saturday 8:29:59am May 19 2018
 non ho nessun problema.

zoomx

Percaso dopo che l'anno doventa 2065 succede che poi rimane sempre quello?
Perché io sospetto un problema con l'alimentazione e la batteria di backup. Oppure al chip arriva un reset?
Se hai il modulo cinese ha un errore noto, c'è una sorta di circuito di ricarica della batteria tampone solo che la batteria tampone è non ricaricabile.
Su Internet ci sono delle foto della modifica da fare . Se non ricordo male, una di queste consiste nel dissaldare l'unico diodo presente.

ziopippo

#43
May 18, 2018, 04:09 pm Last Edit: May 18, 2018, 04:10 pm by ziopippo
Percaso dopo che l'anno doventa 2065 succede che poi rimane sempre quello?

Non saprei, come lo verifico?

L'alternativa, alla meno peggio, potrebbe essere leggere la data e riscriverla?

zoomx

Voglio dire, se stampi la data in periodi successivi non si schioda da 2065? Giusto per capire se non si tratti di un problema di comunicazione.

Go Up