RTCDS1307, 4digit 7-Segment-Display, MAX7219

Hallo zusammen
Momentan habe ich ein Problem damit die Zeit, die von einer DS1307-RTC ausgelesen wird über den Arduino auf einer 4-digit 7-Segment-Anzeige darzustellen.
Die 7-Segment-Anzeige wird durch einen MAX7219 gesteuert.
Was ich schon geschafft habe:
-Auf der 7-Segment-Anzeige Zahlen darstellen
-Ausgabe der Zeit auf dem Seriellen Monitor
Was passiert wenn ich das zusammenfüge:
Die 7-Segment-Anzeige flackert. Die Segmente bilden keine Zahl.
Dies ist mein Code:

#include <Wire.h>
#include "RTClib.h"
RTC_DS1307 rtc;

//7-Segment
#include <LedControl.h>

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

  //RTC - Vom Beispiel einfach übernommen
#ifdef AVR
  Wire.begin();
#else
  Wire1.begin()
#endif
  rtc.begin();


  if (! rtc.isrunning()) {
    Serial.println("RTC is NOT running!");
    // following line sets the RTC to the date & time this sketch was compiled
    rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));

    // This line sets the RTC with an explicit date & time, for example to set
    // January 21, 2014 at 3am you would call:
    // rtc.adjust(DateTime(2014, 1, 21, 3, 0, 0));
  }
}

void loop () {
  DateTime now = rtc.now();
  LedControl seg = LedControl (11, 13, 7, 0);

  seg.shutdown(0, false);
  seg.setIntensity(0, 15);

  //// ANZEIGE DER UHRZEIT

  //wie oben: führende 0 bei der Stunde
  byte hourOnes = now.hour();
  byte hourTens = 0;
  while (hourOnes > 9) {
    hourOnes = hourOnes - 10;
    hourTens = hourTens + 1;
  }
  seg.setDigit (0, 3, hourTens, false);
  seg.setDigit (0, 2, hourOnes, false);

  //wie oben: führende 0 bei der Minute
  byte minuteOnes = now.minute();
  byte minuteTens = 0;
  while (minuteOnes > 9) {
    minuteOnes = minuteOnes - 10;
    minuteTens = minuteTens + 1;
  }
  seg.setDigit (0, 1, minuteTens, false);
  seg.setDigit (0, 0, minuteOnes, false);

}

Ich verwende die LedControl-Library für die 7-Segment-Anzeige.
Die Anzeige ist die CC56-21EWA von Kingbright und das RTC-Modul ist von Sparkfun.

Kann mir jemand helfen? Im Internet habe ich bis jetzt noch keine Infos zu diesen Fehlern gefunden.
Vielen Dank
techniclover

Da ich deine 7-Segment-Anzeige leider nicht kenne, kann ich nur vermuten, dass evtl. ein Schaltungsfehler vorliegt.

Hier wäre ein Schaltbild angebracht.

Was ich schon geschafft habe:
-Auf der 7-Segment-Anzeige Zahlen darstellen
-Ausgabe der Zeit auf dem Seriellen Monitor
Was passiert wenn ich das zusammenfüge:
Die 7-Segment-Anzeige flackert. Die Segmente bilden keine Zahl.

  LedControl seg = LedControl (11, 13, 7, 0);

würde ich global machen und nicht innerhalb loop definieren.

Da du nur max jede Sekunde eine neue Anzeige brauchst, mach mal in loop() zum Test ausnahmsweise ein delay(1000);rein. Dann kannst du auch Serial-Testausgaben einbauen und schnell genug mitlesen.

Generell würde ich nur verstandenen Code verwenden :wink:


Dies ist ein Schaltplan, den ich gezeichnet habe.

Den Code habe ich verstanden. Ich verstehe blos nicht weshalb die Zeit nicht stabil bleibt. Könnte es an ungenügender Stromversorgung liegen?
Mit dem delay (1000); funktioniert es teilweise und teilweise nicht. Es blinkt nun einfach alle Sekunden.

Im Beispiel LCDemo7Segment.ino sehe ich

void setup() {
  /*
   The MAX72XX is in power-saving mode on startup,
   we have to do a wakeup call
   */
  lc.shutdown(0,false);
  /* Set the brightness to a medium values */
  lc.setIntensity(0,8);
  /* and clear the display */
  lc.clearDisplay(0);
}

Das würde ich mal so übernehmen, also von loop nach setup bewegen.

Wenn ich dies übernehme und auch meinen Namen für die Anzeige verwende (Im Beispiel heisst die Anzeige lc. Bei mir seg)

Ich kann

LedControl seg = LedControl (11, 13, 7, 0)

nicht zum SetUp nehmen, da dann später die Fehlermeldung auftaucht, dass seg nicht definiert wurde.

techniclover:
Wenn ich dies übernehme und auch meinen Namen für die Anzeige verwende (Im Beispiel heisst die Anzeige lc. Bei mir seg)

Ich kann

LedControl seg = LedControl (11, 13, 7, 0)

nicht zum SetUp nehmen, da dann später die Fehlermeldung auftaucht, dass seg nicht definiert wurde.

Global heißt "oberhalb"des Setups, bei den übrigen Definitionen.

Dann so:

//7-Segment
#include <LedControl.h>
LedControl seg = LedControl (11, 13, 7, 0);

Anleitung zur Selbsthilfe: Wenn Du in das Beispiel geschaut hättest, wäre Dir meine Ungenauigkeit aufgefallen :slight_smile: