RTC 1307 + display oled 1306 su bus I2C

Salve, ho buttato giù questo sketch solo per testare l'rtc che mi servirebbe per un'altro progetto, il problema è che quando vado ad includere il display l'ora non si aggiorna più, esempio se commento o elimino la linea u8g2.sendbufferdisplay l'orologio funziona correttamente sul serial monitor,se invece includo il display vedo l'ora corretta la prima volta al caricamento poi si azzerano i secondi al minuto precedente e l'ora rimane congelata.
In cosa sbaglio?
orologio.ino (1.1 KB)
Grazie

Posto il tuo codice per comodità:

#include "RTClib.h"

RTC_DS1307 rtc;
#include <Arduino.h>
#include <Wire.h>
#include <U8g2lib.h>

U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0);

void setup() {
  Serial.begin(9600);
  u8g2.begin();
  if (!rtc.begin()) {
    Serial.println("Non trovo il modulo RTC");
    Serial.flush();
    abort;
  }
  if (!rtc.isrunning()) {
    Serial.println("RTC non inizializzato, imposto da PC");
    rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
  }
  // rtc.adjust(DateTime(F(__DATE__), F(__TIME__))); //scommentare per forzare l'inizializzazione RTC
  // rtc.adjust(DateTime(2014, 1, 21, 3, 0, 0)); // esempio impostazione manuale RTC
}

void loop() {
  DateTime now = rtc.now();
  Serial.print(now.hour());
  Serial.print(':');
  Serial.print(now.minute());
  Serial.print(':');
  Serial.print(now.second());
  Serial.println();
  u8g2.setFont(u8g2_font_courR12_tf);
  u8g2.setCursor(2, 15);
  u8g2.print(now.hour());
  u8g2.print(':');
  u8g2.print(now.minute());
  u8g2.print(':');
  u8g2.print(now.second());
  u8g2.sendBuffer();
  u8g2.clearBuffer();
  delay(1000);
}

dall'help della libreria U8g2lib: LINK

void loop(void) {
  u8g2.clearBuffer();
  // ... scrivi qualcosa nel buffer
  u8g2.sendBuffer();
  delay(1000);

Mi pare logico pulire buffer/video, scrivere e poi usare sendBuffer()
Tu nel tuo codice scrivi, poi fai sendBuffer e subito dopo clear. Mi pare errata la sequenza

Ciao nid69ita,
all'inizio avevo fatto così poi ho fatto n... modifiche e nel semplificare il più possibile poi l'ho lasciato ma non cambia niente dopo il caricamento dello sketch azzera e congela i secondi, come se al primo passaggio fiulasse tutto liscio poi al secondo loop niente

Qui posto 2 screenshot


Ma la libreria Wire ... chi la inizializza? Non vedo un Wire.begin() ... :roll_eyes:

Guglielmo

Ciao Guglielmo,
Hai ragione non c'è ho provato a inserirlo nel set up ma non mi cambia niente

Cambia libreria ...

... personalmemte trovo queste librerie per OLED basati sul 1306 estremanente pesanti e farraginose ... se NON ti servono funzioni grafiche ti consiglio la leggerissima SSD1306Ascii (la trovi nel library manager del IDE), se invece ti serve la grafica, ti consiglio l'ottima LIBRERIA di Rinky-Dink Electronics.

Guglielmo

no, non mi serve la grafica proverò a cambiare libreria, avevo già provato con l'adafruit gfx, ma avevo lo stesso problema, quello che volevo capire è perchè non fuziona ho visto sketch molto simili se non uguali che funzionano anche senza la libreria wire che ho incluso per scrupolo.
Loris

La libreria Wire è obbligatoria e la chiamata alla begin() pure ... poi, che sbagliando, alcune librerie facciano loro internamente le due cose e non le lascino fare all'utente è un'altro paio di maniche ... :roll_eyes:

Guglielmo

ok, grazie Guglielmo, come avrai capito io non sono molto ferrato su Arduino e sto studiando e cercando di capire ed approfondire le mie conoscienze in questo mondo abbastaza nuovo per me, un grazie anche a tutti gli amici del forum che fanno un gran lavoro di supporto.

Loris

:grinning:
RISOLTO
!rtc.begin();
è bastato questa riga subito all'inizio del LOOP


RTC_DS1307 rtc;
#include <Arduino.h>
#include <Wire.h>
#include <U8g2lib.h>

U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0);

void setup() {
  Serial.begin(9600);
  Wire.begin();
  u8g2.begin();

  if (!rtc.begin()) {
    Serial.println("Non trovo il modulo RTC");
    Serial.flush();
    abort;
  }

  if (!rtc.isrunning()) {
    Serial.println("RTC non inizializzato, imposto da PC");
    rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
  }


  // rtc.adjust(DateTime(F(__DATE__), F(__TIME__))); //scommentare per forzare l'inizializzazione RTC

  // rtc.adjust(DateTime(2014, 1, 21, 3, 0, 0)); // esempio impostazione manuale RTC
}


void loop() {

    !rtc.begin();
  
  
  DateTime now = rtc.now();

  Serial.print(now.hour());
  Serial.print(':');
  Serial.print(now.minute());
  Serial.print(':');
  Serial.print(now.second());
  Serial.println();

  u8g2.clearBuffer();
  u8g2.setFont(u8g2_font_courR12_tf);
  u8g2.setCursor(2, 15);
  u8g2.print(now.hour());
  u8g2.print(':');
  u8g2.print(now.minute());
  u8g2.print(':');
  u8g2.print(now.second());

  u8g2.sendBuffer();
  

  delay(1000);
}

NON ha molto senso ... la rtc.begin() va fatta una sola volta e serve ad inizializzare la libreria e controllare la funzionalità del modulo RTC ... non mi piace affatto la soluzione, c'è sicuramente qualche cosa nascosta che crea il problema ... :roll_eyes:

Io continuerei ad indagare per capire, ma se vuoi ti puoi accontentare così ...

Guglielmo

Non so Guglielmo, ma cosi funziona comunque è chiamata inversa " ! "

Ehhhh ??? :open_mouth:

NON esiste la "chiamata inversa" ... li non fai altro che chiamare normalmente la begin() e poi invertire il valore che detto metodo ritorna (un boolean, che per altro, tu non usi).

Guglielmo

Per me al 99.99% c'é conflitto tra i due dispositivi visto che sono sullo stesso bus I2C.
Nessuna delle due lib viene chiamata con indirizzo del dispositivo. Sicuro non abbiano lo stesso indirizzo ?
Io proverei lo sketch I2CScanner collegando un dispositivo alla volta e verificherei non abbiano stesso indirizzo.
Il display di default dovrebbe avere indirizzo 0x03C mentre RTC dovrebbe avere di default indirizzo 0x68

si scusa per lo sfondone Guglielmo

Sicuro 0x03c per il display e 0x68 per rtc, non dicordo l'indirizzo per la ram dell'rtc ma comunque è diverso.
Comunque il problema si pone anche se rimuovo fisicamente il display e vado solo sul serial monitor, mentre se inibisco il senbuffer to display funziona, per me è solo software e non hw
Ciao

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