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
Ma la libreria Wire ... chi la inizializza? Non vedo un Wire.begin() ...
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 ...
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
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 ...
Io continuerei ad indagare per capire, ma se vuoi ti puoi accontentare così ...
Guglielmo
Non so Guglielmo, ma cosi funziona comunque è chiamata inversa " ! "
Ehhhh ???
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.