Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

RTC 3231

Progetti, interfacciamento, discussioni varie su questa piattaforma.

Moderatori: Foto UtenteMassimoB, Foto UtenteWALTERmwp, Foto Utentexyz

0
voti

[1] RTC 3231

Messaggioda Foto Utenteapollo17 » 20 apr 2020, 12:46

Per la RTC3231, ho problemi di settaggio di precisione, mi spiego ho un programmini per data e ora su lcd a 6 hh:mm:ss che è supportato da RTC3231, direi molto precisa dopo diverse settimane.
Il problema che riscontro su diversi programmi ad esempio quello sotto che non riesco a fare un settaggio al secondo preciso prendendo come riferimento orario inrim ad esempio. Mi ritrovo sempre una volta che attivo orologio secondi almeno 20 e qualche volta anche 1 minuto. Ho provato ad aggiungere al settaggio iniziale un delta in più come minuti e secondi ma la differenza varia sempre è aleatoria una volta che attivo orologio.
non è la batteria perché se stacco da USB e riavvio programma mi ritrovo sempre ultimo orario (non preciso) settato.
Poi è normale che nel passaggio da alimentazione USB ad alimentatore esterno per Arduino si perde addirittura anche un paio di minuti. Grazie
Avatar utente
Foto Utenteapollo17
28 1 5
Frequentatore
Frequentatore
 
Messaggi: 148
Iscritto il: 30 lug 2017, 11:59

0
voti

[2] Re: RTC 3231

Messaggioda Foto UtenteIlGuru » 20 apr 2020, 13:07

Direi che non è normale.
\Gamma\nu\tilde{\omega}\theta\i\ \sigma\epsilon\alpha\upsilon\tau\acute{o}\nu
Avatar utente
Foto UtenteIlGuru
4.724 2 10 13
Master EY
Master EY
 
Messaggi: 1686
Iscritto il: 31 lug 2015, 23:32

0
voti

[3] Re: RTC 3231

Messaggioda Foto Utentexyz » 20 apr 2020, 13:45

RTC 3231 con batteria è molto preciso e stabile.
Avatar utente
Foto Utentexyz
6.350 2 4 5
G.Master EY
G.Master EY
 
Messaggi: 1679
Iscritto il: 5 dic 2009, 18:37
Località: Italy Turin

0
voti

[4] Re: RTC 3231

Messaggioda Foto Utenteapollo17 » 20 apr 2020, 17:32

fatto delle prove di fatto il programma per settare rtc funziona perché se setto rtc da seriale, stacco USB per divesi minuti e poi successivamente ricollego USB avvio programma settaggio vado a visualizzare su monitor seriale orario perfetto, quindi la rtc con batteria funziona.
programma settaggio :
Codice: Seleziona tutto
#include <RTClib.h>                 // real time clock
#include <Wire.h>

#define LCD_ADDRESS 0x27            // Define LCD characteristics
#define LCD_ROWS 4
#define LCD_COLUMNS 20
#define LCD_BACKLIGHT 1             // backlight turned on

#include <LiquidCrystal_PCF8574.h>
LiquidCrystal_PCF8574 lcd(LCD_ADDRESS);         // LCD I2C
RTC_DS3231 RTC;

#define BUFLEN  20
uint8_t data [6];

const char allowed[] = {'/', ':', ' ', '0', '1', '2', '3', '4', '5', '6', '7',
                        '8', '9', '0', 10, 13, 8};

char inbuf[BUFLEN];


// it holds the value from the calculation in tmpVar
char time_buffer[16];               // memory for display convertion
char date_buffer[16];               // memory for display convertion
char press_buffer[16];              // memory for display convertion
uint8_t year = 0;
uint32_t syncTime = 0;              // time of last sync()
uint32_t last_mill = 0;             // holds the last millis value
uint32_t yesterday = 0;              // memorize the last used day
uint8_t counter;
DateTime now;                       // initialize a DateTime structure

void printTime(void)
{
    now = RTC.now();
    year = now.year() -2000;
    // converting the time into hh:mm:ss
    sprintf(time_buffer, "%02d:%02d:%02d", now.hour(), now.minute(),
                            now.second());
    // converting the date into dd:mm:yy
    sprintf(date_buffer, "%02d/%02d/%02d ", now.day(), now.month(),
                            year);
    Serial.print(date_buffer);
    Serial.println(time_buffer);
}

void wait4buf(void)
{
    /* Reading the Serial one character at time. Only allowed character will
     * be taken.
     * When buffer is full or terminated by Line Feed or Carriage Return, the
     * the input will be completed      */

    uint8_t i = 0;
    uint8_t x = 0;
    while (i < BUFLEN) {                    // wait until the buffer is full
        if (Serial.available() > 0) {
            x = Serial.read();
            if ((x == 13) || (x == 10)) {   // or wait for a LN or CR
                inbuf[i] = 0;               // put a NULL termination
                break;
            }
            if (isAllowed(x)) {             // anything not allowed is holding
                if ( x == 8) {              // backspace move back into buffer
                    --i;
                    x = 0;                  // remove the character
                }
                else inbuf[i++] = x;        // else put one more char in buffer
            }
        }
    }
}

bool isAllowed(char c)
{
    /* checking the character against the list for validity
     * Whether is not listed it returns false result */
    uint8_t i=0;
    for (i = 0; i < sizeof(allowed); i++) {
        if (c == allowed[i]) return true;
    }
    return false;
}

void getTime(void)
{
    uint8_t i = 0;
    uint8_t c = 0;
    uint8_t cnt = 0;
    uint8_t val = 0;
    Serial.println(F("Enter date and time"));
    Serial.println(F("yy/mm/dd hh:mm:ss format or"));
    Serial.print(F("Even a single digit is allowed yy/m/d h:mm:d, "));
    Serial.println(F("but respect the separators"));
    wait4buf();                         // capture the input
    // for the given space
    for (i=0; i < BUFLEN; i++){
        c = inbuf[i];                  // read the written data
        // but separators it terminate one value
        if (c == '/' || c == ':' || c == ' ') {
            data[cnt++] = val;          // save the calculated value
            val = 0;                    // reset the value
            c = inbuf[++i];             // get next character
        }
        if (c == 0) {
            data[cnt] = val;
            break;                      // end of the buffer
        }
        c -= '0';
        if (c <= 9) val = 10 * val + c ; // convert digits to a number
    }
    Serial.flush();
    Serial.println();
    RTC.adjust(DateTime(data[0] + 2000, data[1], data[2], data[3],
                        data[4], data[5]));
}

uint8_t setTime(void)
{
    uint8_t inputchar;
    /* Function to wait 3 seconds for a Serial input.
     * If press any key than Y, the process is left without any change
     * Else it will allow to set the time manually
     */
    last_mill = millis();           // remember the entry time
    // asking to process the inputs
    Serial.print(F("The current date and time is: "));
    printTime();
    Serial.print(F("Please set newline ending at the settings "));
    Serial.println(F("on the lower right of the Serial Monitor"));
    Serial.println();
    Serial.println(F("Enter Y to set the date and time"));
    Serial.println(F("Enter H to halt the system, so you may repeat by resetting"));
    Serial.println(F("Enter Z to leave the current time untouch"));
    Serial.println(F("Enter any key or wait 3 seconds to quit and set time automatically"));
    // wait for any keys until the 3 seconds will expire if no inputs
    while (1) {
        if ((millis() - last_mill) > 2999) {
            return 1;
        }
        if (Serial.available()) {
            inputchar = Serial.read() & 95;
            // if z is pressed the leave the settings and keep the current time
            switch (inputchar) {
                case 'Z' : {
                    return 0;
                }
                case 'H' : {
                    return 255;
                }
            // any key else than y will quit
                case 'Y' : {
                    getTime();
                    Serial.print(F("The current date and time is now: "));
                    printTime();
                    Serial.println(F("Thank you."));
                    delay(1000);
                    return 0;
                }
                default : {
                    return 1;
                }
            }
        }
    }
}

void setup(void)
{
    Serial.begin(57600);        // start serial port
    while (!Serial);            // wait to be ready
    if (RTC.lostPower()) {      // when the battery is removed, then the time
        Serial.println(F("Loading RTC"));
        year = setTime();
        if (year == 1) {
                                // will sync with USB
            RTC.adjust(DateTime(F(__DATE__), F(__TIME__)));
        }
        if (year == 255) {
            Serial.println(F("System halted"));
            while (1);
        }
    }
    lcd.begin(LCD_COLUMNS, LCD_ROWS);
    delay(3000);                // let see the initial message
    lcd.clear();                // then clear the display
}

void loop(void)
{
    // every seconds it's reading the analog input and calculate the value
    if ((millis() - last_mill) > 999) {
        last_mill = millis();
        now = RTC.now();
    }
}

il problema nasce dal programma orologio che secondo me legge male orario da rtc con un delta di quasi 1 minuto e 1/2 in modo aleatorio ogni volta che lo eseguo.
Data e ora : #define LCD_ADDRESS 0x27            // Define LCD characteristics
#define LCD_ROWS 4
#define LCD_COLUMNS 20
#define LCD_BACKLIGHT 1             // backlight turned on

#include <Wire.h>
#include <LiquidCrystal_PCF8574.h>
#include <RTClib.h>                 // real time clock

LiquidCrystal_PCF8574 lcd(LCD_ADDRESS);         // LCD I2C
RTC_DS3231 rtc;

uint32_t rsyncTime = 0;              // time of last sync()
void setup(void)
{
    Serial.begin(57600);            // start serial port
    while (!Serial);                // wait to be ready
    lcd.begin(LCD_COLUMNS, LCD_ROWS);
    // backlight turned on
    lcd.setBacklight(LCD_BACKLIGHT);
    Serial.println(F("System is ready"));
    if (! rtc.begin()) {
        Serial.println("Couldn't find RTC Module");
        while (1);
    }
   
   
    rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));

    lcd.clear();
    lcd.print("Sistema Pronto");
    delay(5000);
}

void loop()
{
    static long this_sec;           // memory that hold temporary last second
    DateTime now = rtc.now();       // update the time
    // if one second difference
    if (now.secondstime() > this_sec) {
        // update the temporary data
        this_sec = now.secondstime();
                                   
        lcd.clear();          // new
                   // 
        if(now.day()<10) lcd.print('0');
        lcd.print(now.day(), DEC);           // Giorno
       
        lcd.print('/');
        if(now.month()<10) lcd.print('0');   //   Mese  Controllo doppio zero         
        lcd.print(now.month(), DEC);   //
       
        lcd.print('/');
        if(now.year()<10) lcd.print('0');   // Anno   
        lcd.print(now.year(), DEC); 

        lcd.setCursor(0,1);                    // ORARIO
        if(now.hour()<10) lcd.print('0');      //  ORA Controllo doppio zero                       //
        lcd.print(now.hour(), DEC);
        lcd.print(':');
        if(now.minute()<10) lcd.print('0');    // MINUTI  Controllo doppio zero
        lcd.print(now.minute(), DEC);
        lcd.print(':');
        if(now.second()<10) lcd.print('0');                       // SEcondi
        lcd.print(now.second(), DEC);
        delay(500);
        // lcd.print(now.secondstime());
    }
}
Avatar utente
Foto Utenteapollo17
28 1 5
Frequentatore
Frequentatore
 
Messaggi: 148
Iscritto il: 30 lug 2017, 11:59

0
voti

[5] Re: RTC 3231

Messaggioda Foto UtenteIlGuru » 20 apr 2020, 18:03

Ho messo il codice all'interno dei tag CODE
\Gamma\nu\tilde{\omega}\theta\i\ \sigma\epsilon\alpha\upsilon\tau\acute{o}\nu
Avatar utente
Foto UtenteIlGuru
4.724 2 10 13
Master EY
Master EY
 
Messaggi: 1686
Iscritto il: 31 lug 2015, 23:32

0
voti

[6] Re: RTC 3231

Messaggioda Foto Utenteapollo17 » 20 apr 2020, 18:29

Ho messo il codice all'interno dei tag CODE


non lo vedo scusami
Avatar utente
Foto Utenteapollo17
28 1 5
Frequentatore
Frequentatore
 
Messaggi: 148
Iscritto il: 30 lug 2017, 11:59


Torna a Arduino

Chi c’è in linea

Visitano il forum: Nessuno e 2 ospiti