RTClib und U8g2 sind nicht kompatibel?

Moin Männers,

seit 2 Tagen qulle ich mich mit einfacher Uhr herum und dem Display.

Habe ich in einem Scetch u8G2lib und die RTClib zusammen, dann will der ESP32 nicht starten, bleibt hängen.
Das passiert nach dem ich die time.now rtc.now im loop einfüge.

Mit ne andere DS3231.lib, funktioniert es wunderbar.
Aber die Lib hat kein direktes schreiben der Uhrzeit in den DS3231.

Dann versucht mit Display und Tasten die Urzeiten zu stellen. Aber auch schwer...
Dann versucht über NTP Server die Uhrzeit in den RTC zu schreiben, dies möchte ich nur über ein Menü anstoßen...

Die RTC.lib hat hescheiten Schreibbefehl, im Tests läuft es auch.
Versucht man zusammen zu schusters mit der u8g2, startet der ESP32 net.

Kennt jemand so ein Verhalten?
Mit sicherheit bin ich zu blöde zu, Erfahrung ist bei mir eher mager.

Grüße

Da sölltest du auch schreiben von welcher Lib du sprichst. Es gibt nicht nur eine.

Meine DS3231 stelle ich z.B. so:

  setTime(a_tmeHour, a_tmeMinute, a_tmeSecond, a_tmeDay, a_tmeMonth, a_tmeYear);
  DS3231.set(now());
1 Like

Vielen Dank für die Antwort,

bin später am Rechner, kann gerne bischen genauer beschreiben.

Deine Lösung siht ja gut aus, welche .lib verwendest Du?

Habe auch sehr großen respeckt euch gegen über, Wahnsinn wie viel man für das ganze wissen muss.

Ich muss ehrlich sagen, ich schue auf euch rauf wie ein 2 Jähriges Kind der auf einen 2 Meter hohen Mann herauf schaut.

Mein vorgehen ist eignentlich eher... Strg C = Strg V

:face_with_open_eyes_and_hand_over_mouth::disappointed::sleepy::rofl:

dann nimm doch die andere lib die funktioniert. Warum sollt es denn unbedingt die RTClib überhaupt sein? Eigentlich braucht man für den Chip ja nicht wirklich eine Library...

Einfach die <time.h> aus dem ESP core, evtl. NTP (sind ja nur ein paar wenige Zeilen) und eben RTC noch als backup bzw. beim Start bis zum ersten NTP ...

1 Like

Ist ganz einfach wieso, im Netz sind viele Beispiele auf der Lib aufgebaut.

RTC soll die Hauptrolle übernehmen, wlan soll nur irgendwann über einen Menüpunkt sich aktevieren lassen aktuelle Zeit ziehen und das dem RTC beibringen.

Die ESP,s kommen in ein Fahrzeug rein. Diese Option möchte ich mehr oder weniger haben, falls die Batterie ausgetauscht werden müsste. Oder eben bei Zeitumstellung.

Im Netz gibts auch viele Kartzenvideos. Trotzdem ist eine Katze nicht für jedermann.

Nimm die Lib die geht.
(oder eben die <time.h> und den RTC als Zeitprovider hinzufügen, du bist auf einem ESP32, da unterstelle ich passen "viele" Beispiele sowieso nicht genau ...)

1 Like

Diese Lib verwende ich schon seit einigen Jahren.
Allerdings habe ich seit einiger Zeit fast alles auf (wo's geht) NTP umgestellt.

1 Like

Das kann ich nicht bestätigen, läuft bei mir zusammen.

Der Fehler steckt also vermutlich in Deinem Programm.

1 Like

Hey Danke euch schon mal sehr an der stelle.

Ich poste bisschen mein Kartoffelsalat :upside_down_face:.


#include <Arduino.h>
#include <U8g2lib.h>

#ifdef U8X8_HAVE_HW_SPI
#include <SPI.h>
#endif
#ifdef U8X8_HAVE_HW_I2C
#include <Wire.h>
#endif
#include <DS3231.h>

#define SDA_PIN 21
#define SCL_PIN 22

RTClib myRTC;

void setup(void) {

  Serial.begin(57600);
  u8g2.begin();  
  u8g2.clearBuffer(); 
  Wire.begin(SDA_PIN, SCL_PIN);

  pinMode(2, OUTPUT);
  digitalWrite(2, HIGH);
  pinMode(13, INPUT_PULLUP); //Set pin for time/date mode button to input
  digitalWrite(13, HIGH); //Turn on pullup resistors
  pinMode(12, INPUT_PULLUP); //Set pin for time/date set button to input
  digitalWrite(12, HIGH); //Turn on pullup resistors
  pinMode(14, INPUT_PULLUP); //Set pin for external alarm indicator output
  digitalWrite(14, LOW); //Initialize external alarm to off state
}

void loop(void) {
  DateTime now = myRTC.now();
  digitalWrite(2, HIGH);
  
  u8g2.firstPage();
  do {
    u8g2.setFont(u8g2_font_spleen16x32_mf);
    u8g2.setCursor(178,20);
    u8g2.print(now.hour(), DEC);
    u8g2.print(':');
    u8g2.print(now.minute(), DEC);
  } while ( u8g2.nextPage() );
  delay(1000);

}

So funktioniert es die Uhrzeit aus dem RTC zu ziehen und auf dem Display anzeigen zu lassen.
Die Libs habe ich mehr oder weniger viele von GitHub.

So hatte ich zusammen gebaut, da startet das Gerät nicht:


#include <WiFi.h>     // For WiFi
#include <Arduino.h>
#include <U8g2lib.h>
#include "time.h"     // For time things
#include "RTClib.h"   // For DS3231 RTC Module
#ifdef U8X8_HAVE_HW_SPI
#include <SPI.h>
#endif
#ifdef U8X8_HAVE_HW_I2C
#include <Wire.h>
#endif

#define SDA_PIN 21
#define SCL_PIN 22


U8G2_GP1294AI_256X48_F_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/18, /* data=*/23, /* cs=*/25, /* dc=*/U8X8_PIN_NONE, /* reset=*/33);

const char* ssid = "............";
const char* password = "..............";
const int  UTCOffset = +1;

struct tm timeinfo;

RTC_DS3231 rtc;

void setup(void) {

 Serial.begin(115200);
 u8g2.begin();  
 u8g2.clearBuffer(); 
 Wire.begin(SDA_PIN, SCL_PIN);

 //connect to WiFi
 Serial.printf("Connecting to %s ", ssid);
 WiFi.begin(ssid, password);
 while (WiFi.status() != WL_CONNECTED) {
     delay(500);
     Serial.print(".");
 }
 Serial.println(" CONNECTED");

 configTime(0, 0, "pool.ntp.org");
 getLocalTime(&timeinfo);

 rtc.adjust(DateTime(mktime(&timeinfo)+UTCOffset*3600));
 
 printRTCTime();
 
}

void loop(void) {
 DateTime now = rtc.now();
 
 printRTCTime();
 delay(10000);

 u8g2.firstPage();
 do {
   u8g2.setFont(u8g2_font_spleen16x32_mf);
   u8g2.setCursor(178,20);
   u8g2.print(now.hour(), DEC);
   u8g2.print(':');
   u8g2.print(now.minute(), DEC);
 } while ( u8g2.nextPage() );
 delay(1000);
}

void printRTCTime()
{
 DateTime now = rtc.now();
 
 Serial.print("RTC: ");
 Serial.printf("%02d/%02d/%04d (%02d:%02d:%02d)\n", now.month(), now.day(), now.year(), now.hour(), now.minute(), now.second());

}

Setze ich diese Zeile hinein, da gehts net mehr...:

DateTime now = rtc.now();

Aus dem funktionierenden Lib zusammen mit dem Display, gibt es nen Beispiel, da wird aber über den Serielleeingabe gelöst:

/*
DS3231_set.pde
Eric Ayars
4/11

Test of set-time routines for a DS3231 RTC

*/

#include <DS3231.h>
#include <Wire.h>

DS3231 myRTC;

byte year;
byte month;
byte date;
byte dOW;
byte hour;
byte minute;
byte second;

void getDateStuff(byte& year, byte& month, byte& date, byte& dOW,
                  byte& hour, byte& minute, byte& second) {
    // Call this if you notice something coming in on
    // the serial port. The stuff coming in should be in
    // the order YYMMDDwHHMMSS, with an 'x' at the end.
    boolean gotString = false;
    char inChar;
    byte temp1, temp2;
    char inString[20];
    
    byte j=0;
    while (!gotString) {
        if (Serial.available()) {
            inChar = Serial.read();
            inString[j] = inChar;
            j += 1;
            if (inChar == 'x') {
                gotString = true;
            }
        }
    }
    Serial.println(inString);
    // Read year first
    temp1 = (byte)inString[0] -48;
    temp2 = (byte)inString[1] -48;
    year = temp1*10 + temp2;
    // now month
    temp1 = (byte)inString[2] -48;
    temp2 = (byte)inString[3] -48;
    month = temp1*10 + temp2;
    // now date
    temp1 = (byte)inString[4] -48;
    temp2 = (byte)inString[5] -48;
    date = temp1*10 + temp2;
    // now Day of Week
    dOW = (byte)inString[6] - 48;
    // now hour
    temp1 = (byte)inString[7] -48;
    temp2 = (byte)inString[8] -48;
    hour = temp1*10 + temp2;
    // now minute
    temp1 = (byte)inString[9] -48;
    temp2 = (byte)inString[10] -48;
    minute = temp1*10 + temp2;
    // now second
    temp1 = (byte)inString[11] -48;
    temp2 = (byte)inString[12] -48;
    second = temp1*10 + temp2;
}

void setup() {
    // Start the serial port
    Serial.begin(57600);
    
    // Start the I2C interface
    Wire.begin();
}

void loop() {
    
    // If something is coming in on the serial line, it's
    // a time correction so set the clock accordingly.
    if (Serial.available()) {
        getDateStuff(year, month, date, dOW, hour, minute, second);
        
        myRTC.setClockMode(false);  // set to 24h
        //setClockMode(true); // set to 12h
        
        myRTC.setYear(year);
        myRTC.setMonth(month);
        myRTC.setDate(date);
        myRTC.setDoW(dOW);
        myRTC.setHour(hour);
        myRTC.setMinute(minute);
        myRTC.setSecond(second);
        
        // Test of alarm functions
        // set A1 to one minute past the time we just set the clock
        // on current day of week.
        myRTC.setA1Time(dOW, hour, minute+1, second, 0x0, true,
                        false, false);
        // set A2 to two minutes past, on current day of month.
        myRTC.setA2Time(date, hour, minute+2, 0x0, false, false,
                        false);
        // Turn on both alarms, with external interrupt
        myRTC.turnOnAlarm(1);
        myRTC.turnOnAlarm(2);
        
    }
    delay(1000);
}

Mit Wlan gibts da leider nichts, ich weiß vielleicht ist es wirklich für euch sehr einfach und Ihr lachts über meine Dusseligkeit. Wäre ja auch irgendwo berechtigt, ich schnalle es einfach noch nicht.

Beachtet die anderen eingebunden Libs nicht so sehr, dieser Sketch ist zum testen da. Die Tasten sind quasi gerade auch noch blind.
Wollte erst Uhrzeitstellung über die Tasten realisieren, das ist aber noch heftiger im Umfang, eigentlich auch viel zu viel des guten. Mir reichen ja auch nur Stunden und Minuten, da muss man aber sich um alles unnötige kümmern, zumindest für meinen vorhaben.

Eigentlich war auch der Plan gar kein Wlan zu nutzen, wenn aber dieser nur über einen Menüpunkt die Zeit holt, bei bedarf wäre ja noch ok.

Sorry für die blöden Fragen

Wo ist im Setup?

myRTC.begin();

Es ist bestimmt in allen Beispielen, falsch kopiert?
Wie soll die RTC funktionieren wen die nicht eigeschaltet wird, deine Funkuhr tuts auch ohne Bat :wink:
zum einstellen reicht das

myRTC.adjust(DateTime(F(__DATE__), F(__TIME__)));
1 Like

ist bei dir falsch, soll so sein

DateTime now = myRTC.now();`
1 Like

grundsätzlich fehlt in Allen Beispielen im Setup

rtc.begin();

musst aber aufpassen auf Schreibweise im jedem Sketch heißt die RTC anders. mall RTC, mall myRTC

1 Like

Schreib was für Display du hast, zeige Link, ESP32 was für einer?
UM so was zusammen kleistern nimmt man Beispiele aus den Lib nicht so "ach das wird was, uuu das ist schön":wink:

2 Likes

Dankeschön fürs drüber scahuen,

der erste Sketch funktioniert, ich sehe die Zeit auf meinem Display. Auch serielle ausgabe, diese habe ich raus geschmissen, bracht man net.

Der letzte Sketch ist originaler und unveränderter aus dem example Bibliothek.
Das steht auch kein rtc. im Setup

Fragt mich warum weshalb etc. nicht, bin eh zu blöde da komplett duch zu blicken.

Das Beispiel zum schreiben, ist doch die Zeit wo der Sketch erstellt wird? Das werde ich in einem Jahr wahrscheinlich auch nicht mehr wissen, und dann da wieder anfangen mit irgendwas zu fummeln ist nicht das ziel.
Tasten wären geil, über das Display und gut ist... Batterie gewechselt, zeit eingestellt und glücklich sein, das war der Plan...

Ich habe mal zwei Beispiele zusammenkopiert:

#include <Arduino.h>
#include <U8g2lib.h>
U8G2_SH1106_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);  // Hier den Displaytyp anpassen!

#include "RTClib.h"
RTC_DS3231 rtc;

char daysOfTheWeek[7][12] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};

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

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

  u8g2.begin();
}

void loop () {
  DateTime now = rtc.now();

  Serial.print(now.year(), DEC);
  Serial.print('/');
  Serial.print(now.month(), DEC);
  Serial.print('/');
  Serial.print(now.day(), DEC);
  Serial.print(" (");
  Serial.print(daysOfTheWeek[now.dayOfTheWeek()]);
  Serial.print(") ");
  Serial.print(now.hour(), DEC);
  Serial.print(':');
  Serial.print(now.minute(), DEC);
  Serial.print(':');
  Serial.print(now.second(), DEC);
  Serial.println();

  u8g2.clearBuffer();          // clear the internal memory
  u8g2.setFont(u8g2_font_ncenB08_tr); // choose a suitable font
  u8g2.drawStr(0, 10, "Hello World!"); // write something to the internal memory
  u8g2.setCursor(0, 20);
  u8g2.print(now.second());
  u8g2.sendBuffer();          // transfer internal memory to the display
  delay(3000);
}

Funktioniert das bei Dir?

Verrückt :face_with_open_eyes_and_hand_over_mouth::rofl:

Ist schön und fein nur macht manchmal Probleme war scon zwei mall hier im Forum. und ich hatte auch auf einem Mega deshalb nehme rtc,begin direkt, wird nichts angezeigt ist klar das was nicht stimmt

1 Like

Sehe keine Uhrzeit :wink:

1 Like

Ja ist auch richtig so, das Bild war vor dem RTC Modul.

2 Tage saß ich vor diesem gelumpe, und der eine Eintrag hat es gelöst, könnte mich selber in den hintern treten. :frowning:

rtc.begin();

Dankeschön für den Tipp!!!!!!!!!!! Bist ein Schatzi!

Hier jetzt das "funktionierende" Sketch:


#include <WiFi.h>     // For WiFi
#include <Arduino.h>
#include <U8g2lib.h>
#include "time.h"     // For time things
#include "RTClib.h"   // For DS3231 RTC Module
#ifdef U8X8_HAVE_HW_SPI
#include <SPI.h>
#endif
#ifdef U8X8_HAVE_HW_I2C
#include <Wire.h>
#endif

#define SDA_PIN 21
#define SCL_PIN 22


U8G2_GP1294AI_256X48_F_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/18, /* data=*/23, /* cs=*/25, /* dc=*/U8X8_PIN_NONE, /* reset=*/33);

const char* ssid = ".......................";
const char* password = "............................";
const int  UTCOffset = +1;

struct tm timeinfo;

RTC_DS3231 rtc;

void setup(void) {

  Serial.begin(115200);
  u8g2.begin();  
  u8g2.clearBuffer(); 
  Wire.begin(SDA_PIN, SCL_PIN);
  rtc.begin();

  //connect to WiFi
  Serial.printf("Connecting to %s ", ssid);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
      delay(500);
      Serial.print(".");
  }
  Serial.println(" CONNECTED");

  configTime(0, 0, "pool.ntp.org");
  getLocalTime(&timeinfo);

  rtc.adjust(DateTime(mktime(&timeinfo)+UTCOffset*3600));
  
  printRTCTime();
  
}

void loop(void) {
  DateTime now = rtc.now();
  
  printRTCTime();
  delay(1000);

  u8g2.firstPage();
  do {
    u8g2.setFont(u8g2_font_spleen16x32_mf);
    u8g2.setCursor(178,20);
    u8g2.print(now.hour(), DEC);
    u8g2.print(':');
    u8g2.print(now.minute(), DEC);
  } while ( u8g2.nextPage() );
  delay(1000);
}

void printRTCTime()
{
  DateTime now = rtc.now();
  
  Serial.print("RTC: ");
  Serial.printf("%02d/%02d/%04d (%02d:%02d:%02d)\n", now.month(), now.day(), now.year(), now.hour(), now.minute(), now.second());

}

Das Bild reiche ich nach, das Beispiel von agmue probiere ich gleich aus

Schön :wink:
Das vom @agmue wird funktionieren ist ja Standard für RTC und Display nur musst dein Display einsetzen , es ist für ein 0,98" OLED.

1 Like