modulo orologio

Fatto tutto come mi hai detto ma la data resta quella di prima D:

Colzadanicola: Fatto tutto come mi hai detto ma la data resta quella di prima D:

Non si imposta proprio o non si sincronizza? Ovvero quando hai scritto come ti ho detto anno mese giorno etc e poi dai invio non si imposta? Sicuro di non aver saltato qualche passaggio? Oppure si imposta ma poi quando stacchi arduino e lo rimetti la data non si sincronizza ed è come se non l'avessi impostata? Pubblica a questo punto lo sketch Questa immagine magari ti aiuterà meglio a capire se magari hai saltato qualcosa |500x335

Grazie mille davvero gentili, alla fine ce l'ho fatta

Colzadanicola: Grazie mille davvero gentili, alla fine ce l'ho fatta

Bene! ;)

Ho scoperto che l'orario si è "sballato" dopo qualche giorno che è rimasto staccato,potrebbe essere la pila?ma strano perche' è da due settimane che mi è arrivato.

Nessuno saprebbe dirmi se è la pila ?

questo è il mio programma dell’rtc:

#include <DS3232RTC.h> //http://github.com/JChristensen/DS3232RTC
#include <Time.h>      //http://www.arduino.cc/playground/Code/Time  
#include <Wire.h>      //http://arduino.cc/en/Reference/Wire
 
void setup(void)
{
    Serial.begin(9600);
    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");      
}
 
void loop(void)
{
    digitalClockDisplay();  
    delay(1000);
}
 
void digitalClockDisplay(void)
{
    // digital clock display of the time
    Serial.print(hour());
    printDigits(minute());
    printDigits(second());
    Serial.print(' ');
    Serial.print(day());
    Serial.print(' ');
    Serial.print(month());
    Serial.print(' ');
    Serial.print(year()); 
    Serial.println(); 
}
 
void printDigits(int digits)
{
    // utility function for digital clock display: 
    // prints preceding colon and leading 0
    Serial.print(':');
    if(digits < 10)
        Serial.print('0');
    Serial.print(digits);
}

questo è setserial(che uso per impostare l’orario):

#include <DS3232RTC.h>        //http://github.com/JChristensen/DS3232RTC
#include <Streaming.h>        //http://arduiniana.org/libraries/streaming/
#include <Time.h>             //http://playground.arduino.cc/Code/Time
#include <Wire.h>             //http://arduino.cc/en/Reference/Wire

void setup(void)
{
    Serial.begin(115200);
    
    //setSyncProvider() causes the Time library to synchronize with the
    //external RTC by calling RTC.get() every five minutes by default.
    setSyncProvider(RTC.get);
    Serial << F("RTC Sync");
    if (timeStatus() != timeSet) Serial << F(" FAIL!");
    Serial << endl;
}

void loop(void)
{
    static time_t tLast;
    time_t t;
    tmElements_t tm;

    //check for input to set the RTC, minimum length is 12, i.e. yy,m,d,h,m,s
    if (Serial.available() >= 12) {
        //note that the tmElements_t Year member is an offset from 1970,
        //but the RTC wants the last two digits of the calendar year.
        //use the convenience macros from Time.h to do the conversions.
        int y = Serial.parseInt();
        if (y >= 100 && y < 1000)
            Serial << F("Error: Year must be two digits or four digits!") << endl;
        else {
            if (y >= 1000)
                tm.Year = CalendarYrToTm(y);
            else    //(y < 100)
                tm.Year = y2kYearToTm(y);
            tm.Month = Serial.parseInt();
            tm.Day = Serial.parseInt();
            tm.Hour = Serial.parseInt();
            tm.Minute = Serial.parseInt();
            tm.Second = Serial.parseInt();
            t = makeTime(tm);
            RTC.set(t);        //use the time_t value to ensure correct weekday is set
            setTime(t);        
            Serial << F("RTC set to: ");
            printDateTime(t);
            Serial << endl;
            //dump any extraneous input
            while (Serial.available() > 0) Serial.read();
        }
    }
    
    t = now();
    if (t != tLast) {
        tLast = t;
        printDateTime(t);
        if (second(t) == 0) {
            float c = RTC.temperature() / 4.;
            float f = c * 9. / 5. + 32.;
            Serial << F("  ") << c << F(" C  ") << f << F(" F");
        }
        Serial << endl;
    }
}

//print date and time to Serial
void printDateTime(time_t t)
{
    printDate(t);
    Serial << ' ';
    printTime(t);
}

//print time to Serial
void printTime(time_t t)
{
    printI00(hour(t), ':');
    printI00(minute(t), ':');
    printI00(second(t), ' ');
}

//print date to Serial
void printDate(time_t t)
{
    printI00(day(t), 0);
    Serial << monthShortStr(month(t)) << _DEC(year(t));
}

//Print an integer in "00" format (with leading zero),
//followed by a delimiter character to Serial.
//Input value assumed to be between 0 and 99.
void printI00(int val, char delim)
{
    if (val < 10) Serial << '0';
    Serial << _DEC(val);
    if (delim > 0) Serial << delim;
    return;
}

Quando lo hai impostato la prima volta, hai provato a staccare Arduino e riaccenderlo e vedere se l’orario continuava ad avanzare correttamente? Potrebbe essere anche un problema di sincronizzazione…

Comunque io di solito da un esempio prendo solo quello che mi serve realmente… ad esempio nel tuo programma si potrebbe benissimo anche fare:

#include <DS3232RTC.h> //http://github.com/JChristensen/DS3232RTC
#include <Time.h>      //http://www.arduino.cc/playground/Code/Time  
#include <Wire.h>      //http://arduino.cc/en/Reference/Wire
 
void setup ()
{
    Serial.begin(9600);
    setSyncProvider(RTC.get);   // the function to get the time from the RTC
      }
 
void loop ()
{Serial.print(hour());
 Serial.print(":");
  Serial.print(minute());
  Serial.print(":");
 Serial.print(second());
Serial.print("     ");
Serial.print(day());
Serial.print("/");
 Serial.print(month());
Serial.print("/");
  Serial.print(year());
 Serial.println("");
 delay(1000);
}

Ma l'orario resta preciso per un po' poi cosí dal nulla o torna al 2000 o comunque si sfasa.

Problema risolto,era questione di librerie sbagliate,comunque l'orario esce strano quano è minore di dieci esce per esempio 3 al posto di 03 nei minuti o nei secondi

Ecco mi pareva strano :slight_smile: E mi pare strano comunque questo “problema alle librerie” :smiley: Comunque per i numeri stampati “male”, era stato già affrontato post indietro come argomento… comunque:

if(minute()<9)  Serial.print('0');
Serial.print(minute());

E così via per le ore e i secondi, oppure solo per i minuti e i secondi vedi tu…
Io sinceramente l’ho lasciati come erano, intanto si capisce benissimo lo stesso :slight_smile:
Ovviamente metti la riga seguendo lo stesso ordine del programma precedente, se no te la stampa male nel monitor seriale.

Per intenderci:

Serial.print(hour());
 Serial.print(":");
  if(minute()<9)  Serial.print("0");
Serial.print(minute());
  Serial.print(":");
 Serial.print(second());

Sì ma o fai <= 9 o fai < 10, altrimenti per 9 lo 0 iniziale non lo stampi ;).

Grande Sukko esatto :) distrazione scusate

perfetto :) :) :) :)

Bene!