[solved] banale Frage von Neuling

Guten Abend in die Runde,

bin neu hier und vollführe gerade meine ersten Gehversuche mit dem Arduino Uno. Konkret versuche ich zu erreichen, dass ein vierstelliges 7-Segment Display im Sekundentakt hochzählt.

Zu diesem Zweck verwende ich im Code die Funktion delay(1000). Sobald ich das in den Code einfüge fängt das Display fröhlich an zu blinken und zeigt irgendwelchen Unfug an. Wenn ich aber konkrete Zahlen anzeigen lasse und gleichzeitig den delay Befehl lösche funktioniert alles, wie es soll.

Kann mir da irgendwer weiterhelfen wo das Problem liegt?

Grüße
Matthias

#include "SevSeg.h"
int sek=0;
SevSeg sevseg;

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

void loop() {
sevseg.setNumber(sek,4);
sevseg.refreshDisplay();
sevseg.setBrightness(60);
sek++;
delay(1000);

Das liegt an der Lib. Die erlaubt keine delays im loop. Steht auch so auf der GitHub-Seite:

Refreshing the display
sevseg.refreshDisplay();
Your program must run the refreshDisplay() function repeatedly to display the number. Note that any delays introduced by other functions will produce undesirable effects on the display.

Eventuell macht aber auch das sevseg.setBrightness(60); Probleme. Normalerweise wird das einmal ausgeführt und dann erst wieder wenn die Helligkeit geändert werden soll.

Setze mal das sevseg.setBrightness(60); nur ganz unten ins Setup.

Gruß, Jürgen

Das Display wird durch die Biibiothek gemultiplext, das heißt die Segmente werden nicht alle gelichzeitig eingeschaltet sondern Ziffer für Ziffer. Zuerst die Segment der 1. Stelle, dann die der 2. stelle usw. Damit das nicht blinkt muß das schneller als 30 bis 60 mal pro Sekunde geschehen.
Delay() beschäftigt den Controller für die Wartezeit. Er kann nichts anderes machen. Darum wird wahrscheinlich die Anzeige des Displays gestört.
Versuche die Wartezeit durch millis() zu realisieren. Siehe BlinkwithoutDelay - Die Nachtwächtererklärung - Deutsch - Arduino Forum
Für 7 Segmentanzeigen eignet sich der MAX7219 sehr gut da dieser das Display selbständig multiplex ansteuert. Der Kontroller braucht nur die Daten zu liefern.

Grüße Uwe

Mit millis()/1000 funktioniert es wie gewünscht. Der Teufel liegt wie immer im Detail.
Vielen Dank für die Hilfestellung!

Allen noch einen schönen Abend.
Viele Grüße
Matthias

Gut.
Aber versuch trotzdem zu verstehen wie millis() funktioniert. Das brauchst Du öfters.
Grüße Uwe

Hab aufgrund Deines Hinweises nochmal in der Referenz nachgelesen und festgestellt, dass der Rückgabewert der Funktion vom Typ unsigned long ist. Das muss ich bei der Variablendeklaration natürlich berücksichtigen.
Danke Uwe!

Hi

Was auch Sinn macht - negative Millisekunden seit Start machen einfach keinen Sinn.
Statt der Arduino-Schreibweise nutze ich uint32_t - Da sieht man DIREKT, Was Sache ist.
32 Bit, U=unsigned (ohne Vorzeichen, also kein Minus-Zeug).

MfG