RTC "Real Time Clock" e la definizione del buffer (forse un mistero dei puntatori?)

Salve a tutti.
Nel mio attuale progettino devo integrare un RTC per tenere dei log con la data aggiornata, premetto che tutto il mio progetto funziona ma mi sono inbattutto in una condizione di cui non ho chiaro il motivo e io fin dove posso voglio capire....
Vi pongo di seguito due sketch il primo è l'esempio della libreria per leggere l'RTC in uso, l'altro sketch è pressoche identico solo che il BUFFER per leggere l'ora l'ho definito a livello globale e non più locale al LOOP.
Nel primo sketch il monitor seriale restituisce un orario che si aggiorna e si vedono i secondi che vanno avanti.
Nel secondo sketch il monitor seriale restituisce un orario fisso.
Penso già che sia una questione di puntatori, ma perchè?
Ovviamente ringrazio tutti anticipatamente.

-Primo Sktech

#include <Wire.h>
#include <RTClib.h>

RTC_DS1307 rtc;

void setup() {
  Serial.begin(57600);

#ifndef ESP8266
  while (!Serial); // wait for serial port to connect. Needed for native USB
#endif

  if (! rtc.begin()) {
    Serial.println("Couldn't find RTC");
    while (1);
  } // end rtc.begin()

  rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));

  if (! rtc.isrunning()) {
    Serial.println("RTC is NOT running!");
    rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));

  }
}

void loop() {

   DateTime now = rtc.now();
   char ora[] = "hh:mm:ss"; //Buffer definito a livello locale
   Serial.println(now.toString(ora));


   delay(10);
}

-Secondo Sketch

#include <Wire.h>
#include <RTClib.h>

RTC_DS1307 rtc;

char ora[] = "hh:mm:ss";  //Buffer definito a livello globale

void setup() {
  Serial.begin(57600);

#ifndef ESP8266
  while (!Serial); // wait for serial port to connect. Needed for native USB
#endif

  if (! rtc.begin()) {
    Serial.println("Couldn't find RTC");
    while (1);
  } // end rtc.begin()
  rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
  if (! rtc.isrunning()) {
    Serial.println("RTC is NOT running!");
    rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));

  }
}

void loop() {

   DateTime now = rtc.now();
 
   Serial.println(now.toString(ora));


   delay(10);
}

La notte porta consiglio.... anche se non ho ancora verificato penso che il metodo "toString" dell' oggetto "now", sovrascriva i caratteri "hh:mm:ss" inseriti nel BUFFER in fase di definizione (probabilmente con i rispettivi caratteri dell'ora, minuti e secondi); di conseguenza alla successiva chiamata del metodo non c'è più la giusta sequenza di caratteri nel BUFFER!!
Se è così scusate ancora per il disturbo....

Si, anch'io penso che il problema sia quello, se vuoi accertarlo prova a modificare così:

Ciao, Ale.

Qui "RTClib: DateTime Class Reference"
dice che la toString() sovrascrive il buffer passato come parametro.
Il pointer restituito è per comodità il puntatore al buffer (ora) stesso.
Mi pare un pò una caxxata, però bisogna adeguarsi.
In teoria quindi dovrebbe anche essere possibile:

now.toString(ora);  // qui buffer ora viene modificato
Serial.println(ora);

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.