libreria DS3231.h

Buongiorno.
Lo sketch che uso include la libreria DS3231.h.

La compilazione mi avvisa ds3231.h :no such file or directory.
Attraverso la "gestione librerie" ho installato :DS3231(by Wicker)
SodaqDS3231

E nel mio #include libreria trovo:DS3231
RTC3231
SodaqDS3231

Eppure quando lancio la compilazione mi dà errore.
Fra tutte queste librerie mi trovo un po' in difficoltà.

Ho anche scaricato da Github Arduino_RTCtime master senza risultato.
MI trovo indifficoltà
Grazie

ciao

immagino che lo sketch sia un copia incolla, potresti darci il link dove viene spiegato il tutto?

di librerie ne trovi anche di uguali con lo stesso nome, solitamente chi pubblica un articolo, da anche il download della libreria/e usata/e nello sketch.

PS se nell'articolo la libreria ti viene data in un file zip o in una cartella, devi installarla manualmente

Un saluto

MD

Buonasera.
Ti posso anche mandare lo sketch ma non credo sia importante perché comunque anche per altri progetti avrò bisogno di quella libreria.

In effetti come consiglia fortemente gpb01 le librerie è tassativamente indispensabile scaricarle tramite “gestione librerie” All’inizio ho fatto così ma poi vedendo che la libreria continuava a non essere presente ho cercato di scaricarla da altri siti tipo github in forma zip e nonostante ciò non sono riuscito a inserirla nello sketch facendo solo una grande confusione tra le librerie.

Il bello è che sono sicuro di averla in qualche modo ottenuta per altri progetti che ho purtroppo salvato su di un altro pc che adesso non è più in mia disponibilità.
le librerie che ho installato da gestione librerie sono:DS3231by Wicker

DS3232 byChristensen

RTCtime by smz

e per completezza come chiedi anche lo sketch

#include <Wire.h>
#include "ds3231.h"
#include "rtc_ds3231.h"
#include <LiquidCrystal.h>

LiquidCrystal lcd(8,9,4,5,6,7); 

#define BUFF_MAX 128

uint8_t time[8];
char recv[BUFF_MAX];
unsigned int recv_size = 0;
unsigned long prev, interval = 1000;

void setup()
{
    Serial.begin(9600);
    Wire.begin();
    DS3231_init(DS3231_INTCN);
    memset(recv, 0, BUFF_MAX);
    Serial.println("GET time");
    lcd.begin(16, 2);
    lcd.clear();
    
    //Serial.println("Setting time");
    //parse_cmd("T302911604102014",16);
}

void loop()
{
    char in;
    char tempF[6]; 
    float temperature;
    char buff[BUFF_MAX];
    unsigned long now = millis();
    struct ts t;

    // show time once in a while
    if ((now - prev > interval) && (Serial.available() <= 0)) {
        DS3231_get(&t); //Get time
        parse_cmd("C",1);
        temperature = DS3231_get_treg(); //Get temperature
        dtostrf(temperature, 5, 1, tempF);

        lcd.clear();
        lcd.setCursor(1,0);
        
        lcd.print(t.mday);
        
        printMonth(t.mon);
        
        lcd.print(t.year);
        
        lcd.setCursor(0,1); //Go to second line of the LCD Screen
        lcd.print(t.hour);
        lcd.print(":");
        if(t.min<10)
        {
          lcd.print("0");
        }
        lcd.print(t.min);
        lcd.print(":");
        if(t.sec<10)
        {
          lcd.print("0");
        }
        lcd.print(t.sec);
        
        lcd.print(' ');
        lcd.print(tempF);
        lcd.print((char)223);
        lcd.print("C ");
        prev = now;
    }

    
    if (Serial.available() > 0) {
        in = Serial.read();

        if ((in == 10 || in == 13) && (recv_size > 0)) {
            parse_cmd(recv, recv_size);
            recv_size = 0;
            recv[0] = 0;
        } else if (in < 48 || in > 122) {;       // ignore ~[0-9A-Za-z]
        } else if (recv_size > BUFF_MAX - 2) {   // drop lines that are too long
            // drop
            recv_size = 0;
            recv[0] = 0;
        } else if (recv_size < BUFF_MAX - 2) {
            recv[recv_size] = in;
            recv[recv_size + 1] = 0;
            recv_size += 1;
        }

    }
}

void parse_cmd(char *cmd, int cmdsize)
{
    uint8_t i;
    uint8_t reg_val;
    char buff[BUFF_MAX];
    struct ts t;

    //snprintf(buff, BUFF_MAX, "cmd was '%s' %d\n", cmd, cmdsize);
    //Serial.print(buff);

    // TssmmhhWDDMMYYYY aka set time
    if (cmd[0] == 84 && cmdsize == 16) {
        //T355720619112011
        t.sec = inp2toi(cmd, 1);
        t.min = inp2toi(cmd, 3);
        t.hour = inp2toi(cmd, 5);
        t.wday = inp2toi(cmd, 7);
        t.mday = inp2toi(cmd, 8);
        t.mon = inp2toi(cmd, 10);
        t.year = inp2toi(cmd, 12) * 100 + inp2toi(cmd, 14);
        DS3231_set(t);
        Serial.println("OK");
    } else if (cmd[0] == 49 && cmdsize == 1) {  // "1" get alarm 1
        DS3231_get_a1(&buff[0], 59);
        Serial.println(buff);
    } else if (cmd[0] == 50 && cmdsize == 1) {  // "2" get alarm 1
        DS3231_get_a2(&buff[0], 59);
        Serial.println(buff);
    } else if (cmd[0] == 51 && cmdsize == 1) {  // "3" get aging register
        Serial.print("aging reg is ");
        Serial.println(DS3231_get_aging(), DEC);
    } else if (cmd[0] == 65 && cmdsize == 9) {  // "A" set alarm 1
        DS3231_set_creg(DS3231_INTCN | DS3231_A1IE);
        //ASSMMHHDD
        for (i = 0; i < 4; i++) {
            time[i] = (cmd[2 * i + 1] - 48) * 10 + cmd[2 * i + 2] - 48; // ss, mm, hh, dd
        }
        boolean flags[5] = { 0, 0, 0, 0, 0 };
        DS3231_set_a1(time[0], time[1], time[2], time[3], flags);
        DS3231_get_a1(&buff[0], 59);
        Serial.println(buff);
    } else if (cmd[0] == 66 && cmdsize == 7) {  // "B" Set Alarm 2
        DS3231_set_creg(DS3231_INTCN | DS3231_A2IE);
        //BMMHHDD
        for (i = 0; i < 4; i++) {
            time[i] = (cmd[2 * i + 1] - 48) * 10 + cmd[2 * i + 2] - 48; // mm, hh, dd
        }
        boolean flags[5] = { 0, 0, 0, 0 };
        DS3231_set_a2(time[0], time[1], time[2], flags);
        DS3231_get_a2(&buff[0], 59);
        Serial.println(buff);
    } else if (cmd[0] == 67 && cmdsize == 1) {  // "C" - get temperature register
        Serial.print("temperature reg is ");
        Serial.println(DS3231_get_treg(), DEC);
    } else if (cmd[0] == 68 && cmdsize == 1) {  // "D" - reset status register alarm flags
        reg_val = DS3231_get_sreg();
        reg_val &= B11111100;
        DS3231_set_sreg(reg_val);
    } else if (cmd[0] == 70 && cmdsize == 1) {  // "F" - custom fct
        reg_val = DS3231_get_addr(0x5);
        Serial.print("orig ");
        Serial.print(reg_val,DEC);
        Serial.print("month is ");
        Serial.println(bcdtodec(reg_val & 0x1F),DEC);
    } else if (cmd[0] == 71 && cmdsize == 1) {  // "G" - set aging status register
        DS3231_set_aging(0);
    } else if (cmd[0] == 83 && cmdsize == 1) {  // "S" - get status register
        Serial.print("status reg is ");
        Serial.println(DS3231_get_sreg(), DEC);
    } else {
        Serial.print("unknown command prefix ");
        Serial.println(cmd[0]);
        Serial.println(cmd[0], DEC);
    }
}

void printMonth(int month)
{
  switch(month)
  {
    case 1: lcd.print(" January ");break;
    case 2: lcd.print(" February ");break;
    case 3: lcd.print(" March ");break;
    case 4: lcd.print(" April ");break;
    case 5: lcd.print(" May ");break;
    case 6: lcd.print(" June ");break;
    case 7: lcd.print(" July ");break;
    case 8: lcd.print(" August ");break;
    case 9: lcd.print(" September ");break;
    case 10: lcd.print(" October ");break;
    case 11: lcd.print(" November ");break;
    case 12: lcd.print(" December ");break;
    default: lcd.print(" Error ");break;
  } 
}

questo è il tutorial: https://forum.arduino.cc/index.php?action=post;topic=601606.0;last_msg=4084615#preview_section

Saluti e grazie

karafasta:
Fra tutte queste librerie mi trovo un po’ in difficoltà.

anche io, è un po’ una giungla.

Io ho fatto prove con questa libreria
https://github.com/NorthernWidget/DS3231
Versione 1.0.2
La trovi nel gestore librerie “DA3231 by Addrew Wickert, Eric Ayard, Jean-Claude Wippler”

La uso così:

#include <DS3231.h> // V. 1.0.2 https://github.com/NorthernWidget/DS3231
#include <Wire.h>
DS3231 rtc;

#define RTC_READ_INTERVAL 200
unsigned long rtcLastRead = 0;
// Dati richiesti dalla libreria per la lettura dei dati.
bool rtcCentury = true;
bool rtcH12; // Non lo uso perchè preferisco le 24h
bool rtcPM; // Non lo uso perchè preferisco le 24h

byte anno, mese, giorno, ora, minuti, secondi;

void setup() {
  // Start the I2C interface
  Wire.begin();
  rtc.setClockMode(false); // Imposta la notazione a 24 ore.
  /*
  // Da scommentare per inizializzare l'rtc la prima volta, poi tiene l'ora impostata da solo.
  rtc.setSecond(20);//Set the second
  rtc.setMinute(40);//Set the minute
  rtc.setHour(14);  //Set the hour
  rtc.setDoW(5);    //Set the day of the week
  rtc.setDate(25);  //Set the date of the month
  rtc.setMonth(2);  //Set the month of the year
  rtc.setYear(19);  //Set the year (Last two digits of the year)
  */
  // Start the serial interface
  Serial.begin(9600);
  rtcLastRead = millis();
}

bool readDS3231() {
  unsigned long currMillis = millis();
  if (currMillis - rtcLastRead < RTC_READ_INTERVAL) {
    return false;
  }
  rtcLastRead = rtcLastRead + RTC_READ_INTERVAL;
  secondi = rtc.getSecond();
  minuti = rtc.getMinute();
  ora = rtc.getHour(rtcH12, rtcPM);
  giorno = rtc.getDate();
  mese = rtc.getMonth(rtcCentury);
  anno = rtc.getYear();
  return true;
}

void printDataOra() {
  char fmtDataOra[20]
  sprintf(fmtDataOra, "%d/%02d/%02d %02d:%02d:%02d", 2000+anno, mese, giorno, ora, minuti, secondi);
  Serial.print(fmtDataOra);
}

void loop() {
  bool ret = readDS3231();
  if (ret) {
    printDataOra();
  }
}

So che ce n’è una che legge tutto in una botta sola con un metodo tipo rtc.now() che su questa che uso io non c’è, e lo salva in una variabile timestamp se non erro e da li estrae i vari dati, ma non ho approfondito per capire quale esattamente sia.
Comunque cambia poco dal mio punto di vista, e come prestazioni ci siamo.

Il codice l’ho estratto al volo da uno mio un po’ più articolato che legge in modo più ottimizzato solo i dati che cambiano per ridurre i tempi in modo un po’ maniacale, per cui, questo postato, è scritto a mano e non è stato validato dal compilatore, potrebbe avere qualche errore di digitazione.

Intanto vedo dal tuo sketch che ci sono due librerie che si riferiscono al 3231.
Già per i "puristi" del codice usare una libreria spesso è controproducente, ma usarne due è assurdo anche per i non puristi.

Poi, come principio, io dico SEMPRE di importare la libreria e poi provare TUTTI gli esempi che appaiono in > Esempi quando la libreria è stata importata perché questi esempi FUNZIONANO (proprio perchè collegati alla libreria importata) e servono a capire come usarla per i nostri progetti.
Andare a copiare un programma in un sito web e POI cercare una libreria in un altro sito espone, come minimo, a problemi di compilazione, di aggiornamento libreria, di malfunzionamenti ecc. ecc..