7 Segment zeigt keine Variablen an

Hallo Leute,
Ich habe mir ein normales 7-Segment-Display gekauft und wollte die Uhrzeit (von einer RTC) darauf anzeigen. Dazu wollte ich die Uhrzeit in einer Variable speichern und sie dann auf dem Display anzeigen lassen. Für das Display nutze ich die “SevSeg”-Bibliothek.
Allerdings zeigt das Display keine Zahlen, welche ich in Variablen speichere an. Im Code habe ich also die RTC erstmal weggelassen, es funktioniert trotzdem nicht…

#include "SevSeg.h"

SevSeg sevseg;

void setup() {
  byte numDigits = 4;
  byte digitPins[] = {2, 3, 4, 5};
  byte segmentPins[] = {6, 7, 8, 9, 10, 11, 12, 13};
  sevseg.begin(COMMON_ANODE, numDigits, digitPins, segmentPins);
}

void loop() {
  int x = 1234; //Ich habe auch schon "float" ausprobiert
  sevseg.setNumber(x,3);
  sevseg.refreshDisplay();
  sevseg.setBrightness(100);
  delay(1000);
}

Meine Glaskugel sagt, dass du das ganze noch nicht richtig verstanden hast. Darum hast du da auch ein delay() eingebaut, und glaubst dass das nicht stört.

Jetzt habe ich mal dafür gesorgt, dass das nicht stört: (hoffentlich)

#include "SevSeg.h"

SevSeg sevseg;

void setup() {
  byte numDigits = 4;
  byte digitPins[] = {2, 3, 4, 5};
  byte segmentPins[] = {6, 7, 8, 9, 10, 11, 12, 13};
  sevseg.begin(COMMON_ANODE, numDigits, digitPins, segmentPins);
}

void yield()
{
  sevseg.refreshDisplay();
}

void loop() {
  int x = 1234; //Ich habe auch schon "float" ausprobiert
  sevseg.setNumber(x,3);
  sevseg.setBrightness(100);
  delay(1000);
}

Nichts gegen delay(), es macht manchmal Sinn. Aber oftmals ärgert es mehr, als es nützt.

Danke, das hat funktioniert. Aber ich habe das delay() dann einfach ganz rausgenommen, das geht auch ; )

Hi

Viel wichtiger: Hast Du verstanden, was combie anders gemacht hat?

Dazu musst Du wissen, daß delay() die ganze Wartezeit über prüft, ob die Warterei schon vorbei ist - wenn NICHT, wird die Funktion yield() aufgerufen.

In Deinem Sketch hast Du die Werte an die Lib geschickt, Diese hat 1x die Zahlen aufblitzen lassen (Multiplex-Betrieb) und dann kam Dein delay(). Der µC macht Pause, alle LED sind aus, Du siehst Nichts. Dann wird erneut die Zahl zur Lib geschickt und wahrscheinlich wird die Zahl auch 1x angezeigt - dann kommt schon wieder Dein delay().

In comie's Code schickst Du die Zahl zur Lib und startest dann die Wartezeit. Während der Wartezeit wird immer wieder yield() aufgerufen und darin steht der Funktionsaufruf, daß die Ziffern per Multiplex ausgegeben werden. Wenn die Wartezeit vorbei ist, bleiben die Anzaigen aus, bis die nächste Wartezeit wieder yield() aufruft und Dir die Ziffern anzeigt.

MfG

Guten Abend,

warum denn eine Bibliothek verwenden bei solch einer einfachen Aufgabe?
Man lernt doch viel mehr, wenn man den Ablauf selber schreibt und Schritt
für Schritt “entwickelt”.

Hast du einzelne 7SEG-Anzeigen:

#define debug_info(...) Serial.print(__VA_ARGS__) //F(),ln,\n beachten
#define Baudrate 19200
const uint8_t SEG[5][7] =
{ //a,  b,  c,  d,  e,  f,  g
  {22, 23, 24, 25, 26, 27, 28}, //SEG 0 100s
  {29, 30, 31, 32, 33, 34, 35}, //SEG 1 10s
  {36, 37, 38, 39, 40, 41, 42}, //SEG 2 1s
  {43, 44, 45, 46, 47, 48, 49}, //SEG 3 100ms
  {14, 15, 16, 17, 18, 19, 20}  //SEG 4 10ms
};
void akt_7SEG(const uint32_t ZT_long);
void setup()
{
    Serial.begin(Baudrate);
    while (!Serial) {/*WARTEN*/}
  //5x 7SEG Anzeigen
  for (uint8_t xs = 0; xs < 5; xs++)
  {
    for (uint8_t xe = 0; xe < 7; xe++)
    {
      pinMode(SEG[xs][xe], OUTPUT);
    }
  }
akt_7SEG(123450); //12345 zum test
}
void loop() {}

//Ausgabe 7Segment Anzeigen (sek,sek,sek | ms,ms)
void akt_7SEG(const uint32_t ZT_long)
{
  uint32_t divisor = 100000;
  uint8_t BCD[5];
  const bool zeichen[14][7] =
  { //a, b, c, d, e, f, g
    {1, 1, 1, 1, 1, 1, 0}, //Zahl 0
    {0, 1, 1, 0, 0, 0, 0}, //Zahl 1
    {1, 1, 0, 1, 1, 0, 1}, //Zahl 2
    {1, 1, 1, 1, 0, 0, 1}, //Zahl 3
    {0, 1, 1, 0, 0, 1, 1}, //Zahl 4
    {1, 0, 1, 1, 0, 1, 1}, //Zahl 5
    {1, 0, 1, 1, 1, 1, 1}, //Zahl 6
    {1, 1, 1, 0, 0, 0, 0}, //Zahl 7
    {1, 1, 1, 1, 1, 1, 1}, //Zahl 8
    {1, 1, 1, 1, 0, 1, 1} //Zahl 9
  };
 //Rundenzeit ausgeben
      //rundenzeit in einzelne Stellen aufteilen
      for (uint8_t x = 0; x < 5; x++)
      {
        BCD[x] = (ZT_long / divisor) % 10;
        divisor /= 10;
      }
      #ifdef debug_info
        debug_info(F("Segment Ausgabe\n"));
      #endif
      //Segmente ansteuern 5x7
      for (uint8_t x5 = 0; x5 < 5; x5++)
      {
        #ifdef debug_info
          debug_info(x5);
          debug_info(F(" = "));
        #endif
        for (uint8_t x7 = 0; x7 < 7; x7++)
        {
          digitalWrite(SEG[x5][x7], zeichen[BCD[x5]][x7]);
          #ifdef debug_info
            debug_info(zeichen[BCD[x5]][x7]);
            debug_info(F(" "));
          #endif
        }
        #ifdef debug_info
          debug_info(F("\n"));
        #endif
  }
}//akt_7SEG() ENDE

Solltest du eine Kombianzeige verwenden musst du nur das “digit” mit der passenden Ausgabe ansteuern in einer Zeit, welche für den Betrachter nicht wahrnehmbar ist.

Hoffe ich konnte auf die schnelle helfen :slight_smile:

PS BCD-Code könnte interessant sein :o