Problema con DS3231 [RISOLTO]

Buongiorno a tutti, ho realizzato un orologio con ds3231 e un display tft da 1.3 pollici. Ho collegato sia il ds3231 che il display sui pin A4 A5 del mio arduino nano sfruttando il bus i2c. Dopo qualche problema a trovare la corretta libreria per il display l'orologio ha cominciato a funzionare senza problemi. Ieri l'ho lasciato acceso per controllare il funzionamento e dopo 1h ho visto che l'orario era completamente sballato. Ho controllato il monitor seriale ed ad un certo orario l'orologio è saltato ad un'atro orario ed altra data. Ho riprovato e la cosa è risuccessa. Ho staccato il ds3231 e l'ho attaccato ad un arduino mega lanciando un semplicissimo sketch della libreria che mostra il funzionamento della stessa scrivendo sul monitor seriale ora e data. Anche così dopo circa 1h l'orario salta senza motivo. A questo punto penso che il mio DS3231 sia rotto, volevo però capire se magari invece è un problema diverso che si è già presentato. Sono inesperto quindi … Grazie a tutti.

Buongiorno,
come già ti è stato richiesto nell'altro post nella sezione Italiana del forum, nel rispetto del nostro regolamento, ti chiedo cortesemente di presentarti QUI (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con MOLTA attenzione il su citato REGOLAMENTO ... Grazie. :slight_smile:

Massimo71pg:
… A questo punto penso che il mio DS3231 sia rotto, volevo però capire se magari invece è un problema diverso che si è già presentato. Sono inesperto quindi … Grazie a tutti.

Magari prova a mettere qui il codice che usi per la prova (…mi raccomando, in conformità al regolamento, punto 7, il codice va racchiuso tra i tag CODE che, in fase di edit, ti inserisce il bottone </> … primo a sinistra) ed ha confermarci che le resistenze di pull-up, sui due segnali SCL e SDA, siano presenti.

Guglielmo

Buongiorno Guglielmo,
intanto grazie per la tua risposta. No non avevo inserito resistenze di pull up, nel progetto che ho preso su internet non erano comprese ed ancora non mi azzardo a fare modifiche. Ieri sera leggendo il tuo post le ho inserite (avevo delle resistenze da 5k1ohm) ed ho riconnesso il DS3231. Ho acceso il tutto ed il display stava dando dei problemi le scritte erano scomposte, ho ritolto subito le resistenze di pull up ma niente stesso problema a questo punto ho provato a scollegare il DS3231 ed il display ha ripreso a funzionare correttamente... E qui sono rimasto malissimo :o ... l'orologio senza il DS3231 sul display funzionava, è partito da 00.00.00 ma l'ho rimesso e lasciato acceso fino questa mattina quando sono partito x il lavoro. E funziona perfettamente nessun salto di orario... Come è possibile che funzioni senza il DS3231 collegato? Questa sera aggiungo anche il codice, scusate se ancora non fatto ma sono rientrato ieri sera dal lavoro e ripartito questa mattina. Comunque se funziona senza il ds3231 ho praticamente risolto...

Massimo71pg:
... Come è possibile che funzioni senza il DS3231 collegato?

Per questo occorre vedere il codice ... probabilmente funziona sfruttando il clock di sistema che però ... non ha un'altrissima precisone sui tempi lunghi, quindi, dopo ore, potresti trovarti svariati minuti di differenza ... ::slight_smile:

Guglielmo

Ok provo a postare il codice sperando di non fare confusione… Come vedrete dallo stesso ho inserito 3 pulsanti oltre che display e DS3231, un pulsante set che lascia accedere alla possibilità di impostare ora e minuti. In questa applicazione non mi interessa la parte datario, devo usare poi il tutto per pilotare delle strisce led che andranno ad illuminare il mio acquario. La parte che memorizza orario di accensione e spegnimento non è ancora presente e neppure quella che piloterà la striscia led che tenterò di far accendere e spegnere dimmerandola con un mosfet. Ma per ora mi interessa far funzionare l’orario…. Grazie 1000 del vs tempo.

#include <Arduino.h>
#include <U8g2lib.h>
#include <SPI.h>
#include <Wire.h>

#include <DS3232RTC.h>      // https://github.com/JChristensen/DS3232RTC
#include <TimeLib.h>
U8G2_SH1106_128X64_NONAME_1_HW_I2C u8g2(U8G2_R0);

#define SET 2
#define PIU 3
#define MENO 4

void setup()

{
  u8g2.begin();

  setSyncProvider(RTC.get);   // the function to get the time from the RTC
  //setTime(9,9,00,12,2,2019); //Setta l'orario

  pinMode( SET, INPUT );
  pinMode( PIU, INPUT );
  pinMode( MENO, INPUT );
  
}

char cOrario[16];

void loop()

{
  
  Orario().toCharArray(cOrario,16);
  
  u8g2.firstPage();
  do {
    u8g2.setFont(u8g_font_unifont);
    u8g2.drawStr(0,24,"Hello World!");
    u8g2.drawStr(0,36,"Hello World!");
    u8g2.drawStr(0,48,cOrario);
  } while ( u8g2.nextPage() );

  digitalClockDisplay();
  delay(1000);
  if (digitalRead(SET) == HIGH) {

    delay (500);
    SetOrario();}
}

String Orario() //Restituisce la stringa orario
{ 
  String S = String(second());
  String M = String(minute());
  String H = String(hour());

  if (S.length() == 1){S = ('0' + String(second()));}
  if (M.length() == 1){M = ('0' + String(minute()));}
  if (H.length() == 1){H = ('0' + String(hour()));}  

  return H + ':' + M + ':' + S;
}

void SetOrario()
{
  //Setta Orario
  int Vora = hour();
  String Sora = String(Vora);
  char valore[3];
  Sora.toCharArray(valore,3);
  delay(1000);
  while (digitalRead(SET) == LOW)
  {
    Sora = String(Vora);
    Sora.toCharArray(valore,3);    
    u8g2.firstPage();
    do {
      u8g2.setFont(u8g_font_unifont);
      u8g2.drawStr(0,24,"SETUP - ORA");
      u8g2.drawStr(0,36,valore);
    } while ( u8g2.nextPage() );   
    
    if (digitalRead(PIU) == HIGH) // Aggiunge ora
    {Vora ++;
    if (Vora == 24) {Vora = 0;}
    //Serial.println(Vora);
    delay(500);}

    if (digitalRead(MENO) == HIGH) // Toglie ora
    {Vora --;
    if (Vora == -1) {Vora = 23;}
    //Serial.println(Vora);
    delay(500);}
    
  }
  delay(1000);

  int Vmin = minute();
  Sora = String(Vmin);
  Sora.toCharArray(valore,3);
  delay(1000);
  
  while (digitalRead(SET) == LOW)
  {
    Sora = String(Vmin);
    Sora.toCharArray(valore,3);    
    u8g2.firstPage();
    do {
      u8g2.setFont(u8g_font_unifont);
      u8g2.drawStr(0,24,"SETUP - MINUTI");
      u8g2.drawStr(0,36,valore);
    } while ( u8g2.nextPage() ); 
    
    if (digitalRead(PIU) == HIGH) // Aggiunge minuti
    {Vmin ++;
    if (Vmin == 60) {Vmin = 0;}

    delay(500);}

    if (digitalRead(MENO) == HIGH) // Toglie minuti
    {Vmin --;
    if (Vmin == -1) {Vmin = 59;}
 
    delay(500);}  
  }
  setTime(Vora,Vmin,0,1,1,2000);
}

Buongiorno a tutti, ieri sera mi sono messo a cercare su internet e ho capito che in realtà come mi suggeriva Guglielmo non stavo visualizzando l’orario del DS3231. Ho deciso di cambiare la libreria di gestione ed ho riscritto il codice che metto sotto se interessasse a qualcuno. E’ ancora un codice di prova lo potete vedere da 1000 cose ma adesso funziona perfettamente e quando spengo e riaccendo l’orologio mantiene l’orario senza problemi. Ringrazio Guglielmo per il suo tempo e la giusta “imbeccata” che mi ha permesso di sistemare questa cosa, probabilmente sciocca ma che era difficoltosa per un nuovo come me… :smiley: :smiley: :smiley: :smiley:

#include <Arduino.h>
#include <U8g2lib.h>
#include <Wire.h>

#include <DS3232RTC.h>      // https://github.com/JChristensen/DS3232RTC

U8G2_SH1106_128X64_NONAME_1_HW_I2C u8g2(U8G2_R0);

#define SET 2
#define PIU 3
#define MENO 4
#define LEDOutput 12

int Start = 1;
int Stop = 2;
String Adessos;
int Adesson;

void setup()

{
  u8g2.begin();

  setSyncProvider(RTC.get);   // the function to get the time from the RTC
  setTime(0,0,00,12,2,2019); //Setta l'orario

  pinMode( SET, INPUT );
  pinMode( PIU, INPUT );
  pinMode( MENO, INPUT );
  pinMode( LEDOutput, OUTPUT);
  
}

char cOrario[16];

void loop()

{
  
  Orario().toCharArray(cOrario,16);
  
  u8g2.firstPage();
  do {
    u8g2.setFont(u8g_font_unifont);
    u8g2.drawStr(0,24,"Hello World!");
    u8g2.drawStr(0,36,"Hello World!");
    u8g2.drawStr(0,48,cOrario);
  } while ( u8g2.nextPage() );

  //digitalClockDisplay();
  delay(100);

  Adessos = String(hour()) + String(minute());
  Adesson = Adessos.toInt();
  if (Adesson >= Start && Adesson < Stop)
    {digitalWrite(LEDOutput,HIGH);}
  else
    {digitalWrite(LEDOutput,LOW);}
  
  if (digitalRead(SET) == HIGH) {

    delay (500);
    SetOrario();}
}

String Orario() //Restituisce la stringa orario
{ 
  String S = String(second());
  String M = String(minute());
  String H = String(hour());

  if (S.length() == 1){S = ('0' + String(second()));}
  if (M.length() == 1){M = ('0' + String(minute()));}
  if (H.length() == 1){H = ('0' + String(hour()));}  

  return H + ':' + M + ':' + S;
}

void SetOrario()
{
  //Setta Orario
  int Vora = hour();
  String Sora = String(Vora);
  char valore[3];
  Sora.toCharArray(valore,3);
  delay(1000);
  while (digitalRead(SET) == LOW)
  {
    Sora = String(Vora);
    Sora.toCharArray(valore,3);    
    u8g2.firstPage();
    do {
      u8g2.setFont(u8g_font_unifont);
      u8g2.drawStr(0,24,"SETUP - ORA");
      u8g2.drawStr(0,36,valore);
    } while ( u8g2.nextPage() );   
    
    if (digitalRead(PIU) == HIGH) // Aggiunge ora
    {Vora ++;
    if (Vora == 24) {Vora = 0;}
    //Serial.println(Vora);
    delay(500);}

    if (digitalRead(MENO) == HIGH) // Toglie ora
    {Vora --;
    if (Vora == -1) {Vora = 23;}
    //Serial.println(Vora);
    delay(500);}
    
  }
  delay(1000);

  int Vmin = minute();
  Sora = String(Vmin);
  Sora.toCharArray(valore,3);
  delay(1000);
  
  while (digitalRead(SET) == LOW)
  {
    Sora = String(Vmin);
    Sora.toCharArray(valore,3);    
    u8g2.firstPage();
    do {
      u8g2.setFont(u8g_font_unifont);
      u8g2.drawStr(0,24,"SETUP - MINUTI");
      u8g2.drawStr(0,36,valore);
    } while ( u8g2.nextPage() ); 
    
    if (digitalRead(PIU) == HIGH) // Aggiunge minuti
    {Vmin ++;
    if (Vmin == 60) {Vmin = 0;}

    delay(500);}

    if (digitalRead(MENO) == HIGH) // Toglie minuti
    {Vmin --;
    if (Vmin == -1) {Vmin = 59;}
 
    delay(500);}  
  }
  setTime(Vora,Vmin,0,1,1,2000);
}

Beh, che dire … bravo ! :slight_smile:

Guglielmo

Scusate ma da un po’ rincoglionito come sono ho rimesso il codice errato… :blush: :blush: :blush: Il codice corretto è questo sotto come potete vedere la libreria è la 3231.h …Scusate ancora…

#include <Arduino.h>
#include <U8g2lib.h>
#include <Wire.h>

#include <DS3231.h>      // https://github.com/JChristensen/DS3232RTC

U8G2_SH1106_128X64_NONAME_1_HW_I2C u8g2(U8G2_R0);

DS3231 clock;
RTCDateTime dt;

#define SET 2
#define PIU 3
#define MENO 4
#define LEDOutput 12

int Start = 1;
int Stop = 2;
String Adessos;
int Adesson;

void setup()

{
  u8g2.begin();

  Serial.begin(9600);
  
  clock.begin();//Inizializza Orologio

  pinMode( SET, INPUT );
  pinMode( PIU, INPUT );
  pinMode( MENO, INPUT );
  pinMode( LEDOutput, OUTPUT);
  
}

char cOrario[16];
char cDatario[16];

void loop()

{
  
  Orario().toCharArray(cOrario,16);
  Datario().toCharArray(cDatario,16); 
  
  u8g2.firstPage();
  do {
    u8g2.setFont(u8g2_font_guildenstern_nbp_t_all);
    u8g2.drawStr(30,24,cDatario);
    u8g2.setFont(u8g2_font_tenstamps_mn);
    u8g2.drawStr(0,40,cOrario);
  } while ( u8g2.nextPage() );

  //digitalClockDisplay();
  delay(100);

  Adessos = String(dt.hour) + String(dt.minute);
  Adesson = Adessos.toInt();
  if (Adesson >= Start && Adesson < Stop)
    {digitalWrite(LEDOutput,HIGH);}
  else
    {digitalWrite(LEDOutput,LOW);}
  
  if (digitalRead(SET) == HIGH) {

    delay (500);
    SetOrario();}
}

String Orario() //Restituisce la stringa orario
{ 
  
  dt = clock.getDateTime();
  String S = String(dt.second);
  String M = String(dt.minute);
  String H = String(dt.hour);

  if (S.length() == 1){S = ('0' + String(dt.second));}
  if (M.length() == 1){M = ('0' + String(dt.minute));}
  if (H.length() == 1){H = ('0' + String(dt.hour));}  

  return H + ':' + M + ':' + S;
}

String Datario() //Restituisce la stringa data
{ 
  String D = String(dt.day);
  String M = String(dt.month);
  String Y = String(dt.year);

  if (D.length() == 1){D = ('0' + String(dt.day));}
  if (M.length() == 1){M = ('0' + String(dt.month));} 

  return D + '/' + M + '/' + Y;
}

void SetOrario()
{
  //Setta Orario
  int Vora = dt.hour;
  String Sora = String(Vora);
  char valore[3];
  Sora.toCharArray(valore,3);
  delay(1000);
  while (digitalRead(SET) == LOW)
  {
    Sora = String(Vora);
    Sora.toCharArray(valore,3);    
    u8g2.firstPage();
    do {
      u8g2.setFont(u8g2_font_guildenstern_nbp_t_all);
      u8g2.drawStr(0,24,"SETUP - ORA");
      u8g2.setFont(u8g2_font_tenstamps_mn);
      u8g2.drawStr(40,40,valore);
    } while ( u8g2.nextPage() );   
    
    if (digitalRead(PIU) == HIGH) // Aggiunge ora
    {Vora ++;
    if (Vora == 24) {Vora = 0;}
    //Serial.println(Vora);
    delay(500);}

    if (digitalRead(MENO) == HIGH) // Toglie ora
    {Vora --;
    if (Vora == -1) {Vora = 23;}
    //Serial.println(Vora);
    delay(500);}
    
  }
  delay(1000);

  int Vmin = dt.minute;
  Sora = String(Vmin);
  Sora.toCharArray(valore,3);
  delay(1000);
  
  while (digitalRead(SET) == LOW)
  {
    Sora = String(Vmin);
    Sora.toCharArray(valore,3);    
    u8g2.firstPage();
    do {
      u8g2.setFont(u8g2_font_guildenstern_nbp_t_all);
      u8g2.drawStr(0,24,"SETUP - MINUTI");
      u8g2.setFont(u8g2_font_tenstamps_mn);
      u8g2.drawStr(40,40,valore);
    } while ( u8g2.nextPage() ); 
    
    if (digitalRead(PIU) == HIGH) // Aggiunge minuti
    {Vmin ++;
    if (Vmin == 60) {Vmin = 0;}

    delay(500);}

    if (digitalRead(MENO) == HIGH) // Toglie minuti
    {Vmin --;
    if (Vmin == -1) {Vmin = 59;}
 
    delay(500);}  
  }

  int Vday = dt.day;
  Sora = String(Vday);
  Sora.toCharArray(valore,3);
  delay(1000);
  
  while (digitalRead(SET) == LOW)
  {
    Sora = String(Vday);
    Sora.toCharArray(valore,3);    
    u8g2.firstPage();
    do {
      u8g2.setFont(u8g2_font_guildenstern_nbp_t_all);
      u8g2.drawStr(0,24,"SETUP - GIORNO");
      u8g2.setFont(u8g2_font_tenstamps_mn);
      u8g2.drawStr(40,40,valore);
    } while ( u8g2.nextPage() ); 
    
    if (digitalRead(PIU) == HIGH) // +Giorni
    {Vday ++;
    if (Vday == 32) {Vday = 1;}

    delay(500);}

    if (digitalRead(MENO) == HIGH) // -Giorni
    {Vday --;
    if (Vday == -1) {Vday = 31;}
 
    delay(500);}  
  }

  int Vmon = dt.month;
  Sora = String(Vmon);
  Sora.toCharArray(valore,3);
  delay(1000);
  
  while (digitalRead(SET) == LOW)
  {
    Sora = String(Vmon);
    Sora.toCharArray(valore,3);    
    u8g2.firstPage();
    do {
      u8g2.setFont(u8g2_font_guildenstern_nbp_t_all);
      u8g2.drawStr(0,24,"SETUP - MESE");
      u8g2.setFont(u8g2_font_tenstamps_mn);
      u8g2.drawStr(40,40,valore);
    } while ( u8g2.nextPage() ); 
    
    if (digitalRead(PIU) == HIGH) // +mese
    {Vmon ++;
    if (Vmon == 13) {Vmon = 1;}

    delay(500);}

    if (digitalRead(MENO) == HIGH) // -mese
    {Vmon --;
    if (Vmon == 0) {Vmon = 12;}
 
    delay(500);}  
  }

  int Vyea = dt.year;
  Sora = String(Vyea);
  char valorey[5];
  Sora.toCharArray(valorey,5);
  delay(1000);
  
  while (digitalRead(SET) == LOW)
  {
    Sora = String(Vyea);
    Sora.toCharArray(valorey,5);    
    u8g2.firstPage();
    do {
      u8g2.setFont(u8g2_font_guildenstern_nbp_t_all);
      u8g2.drawStr(0,24,"SETUP - ANNO");
      u8g2.setFont(u8g2_font_tenstamps_mn);
      u8g2.drawStr(40,40,valorey);
    } while ( u8g2.nextPage() ); 
    
    if (digitalRead(PIU) == HIGH) // +Anni
    {Vyea ++;
    if (Vyea == 100) {Vmon = 0;}

    delay(500);}

    if (digitalRead(MENO) == HIGH) // -Anni
    {Vyea --;
    if (Vyea == -1) {Vyea = 99;}
 
    delay(500);}  
  }
  // Manual (Year, Month, Day, Hour, Minute, Second)
  clock.setDateTime(Vyea,Vmon,Vday,Vora,Vmin,0);
}