Arduino: Mit 4Digit 7 Segment - Display Zahlen abwechselnd anzeigen?

2 Antworten

Entschuldige, hatte keine Benachrichtigung mehr bekommen...

Habe gerade durch Zufall gesehen, das noch ein Tippfehler drin ist. Tschuldige... :)

if (Pulse == HIGH){
      if (toggle = HIGH){
        toggle = LOW;
      } else {
        toggle = HIGH;
      }
    }

Die Zeile "if (toggle = HIGH) {" muss "if (toggle == HIGH) {" heißen. Das 2. Gleich fehlt zur Prüfung. Mit nur einem = ist es eine Zuweisung und kein Vergleich. Dann sollte es eig klappen.

Falls Du noch nicht den Fehler selbst gefunden hast...


KriegerMan 
Beitragsersteller
 17.01.2018, 20:20

Hatte ich schon, aber trotzdem vielen dank ^^


1

Wenn du die Leitungen Multiplext , ist das Projekt Problemlos Umsetzbar.

http://www.tacticalcode.de/2013/01/led-matrix-grundlagen-mit-multiplexing.html


RareDevil  12.01.2018, 12:46

Diese Antwort hat aber nichts mit der eigendlichen Frage zu tun. Er braucht eine Timerfunktion, die nicht das Programm anhält...

1
Silberfan  12.01.2018, 13:36
@RareDevil Mit 4Digit 7 Segment - Display Zahlen abwechselnd anzeigen?

da steht nix von Timer Funktion

0
RareDevil  12.01.2018, 15:33
@Silberfan

Aber in der Beschreibung. Er sucht einen Ersatz für Delay mit je einer Sekunde, weil er Delay mit dem genutzten Modul für eine 7Segment-Anzeige nicht nutzen kann. Man sollte alles lesen, nicht nur die Überschrift.

Ein Beispiel wie es gehen würde:

int Pulse = LOW;  //Sekundenimpuls
int toggle = LOW;  //Status wechselt jede Sekunde high-low
unsigned long previousMillis = 0;  // Zwischenspeicher der Millisekunden für Zeitdifferenz
const long interval = 1000;  // Impulszeit in Millisekunden (1000 = 1Sekunde)
void setup() {
 // Setup
}

void loop() {
//Sekundenimpuls 1x pro Sekunde HIGH
  unsigned long currentMillis = millis();
  if (currentMillis - previousMillis >= interval) {
    previousMillis = currentMillis;
    Pulse = HIGH;
  } else {
    Pulse = LOW;
  }    

//Statuswechsel je Pulse=HIGH
 if (Pulse == HIGH){
      if (toggle = HIGH){
        toggle = LOW;
      } else {
        toggle = HIGH;
      }
    }
    
//Programmcode
if (toggle==HIGH){
  // Wird ausgeführt wenn toggle=HIGH
} else {
  // Wird ausgeführt wenn LOW
}

}
1
KriegerMan 
Beitragsersteller
 12.01.2018, 18:01
@RareDevil

Okay vielen Dank, soweit verstanden. Kannst du mir dennoch sagen, (da ich komplett neu mit der Bibliothek bin und auch nur wenige Befehle etc. durch unseren Unterricht kennen gelernt habe,) was "millis" in dem Fall ist? Habs in einem BeispielCode der Bibliothek gesehen, aber wusste net was es bewirkt.

0
RareDevil  12.01.2018, 18:08
@KriegerMan

Die Arduino stellt millis() und micros() bereit. millis() gibt einen fortlaufenden Wert wieder, der die Laufzeit seit Start des Programm in Millisekunden zählt und micros() das gleiche in Microsekunden... Diese laufen immer weiter bis zum Überlauf und fangen wieder von vorne an... Setzt man jetzt zu einem Zeitpunkt einen dieser Werte in eine Variable, kann man in jedem Zyklus die Zeitdifferenz errechnen lassen und hat somit eine Zeitvariable... Hier wird jetzt geprüft, wann 1000ms vergangen sind, dann wird die Variable "Pulse" gesetzt und die vorhergespeicherte Zeit mit der aktuellen Zeit ersetzt und das Spiel beginnt von vorne... "Pulse" wird dann automatisch wieder zurück gesetzt...


0
KriegerMan 
Beitragsersteller
 12.01.2018, 23:57
@RareDevil

Okay, vielen Dank, millis und micros war mir noch nicht bekannt. Das erleichtert jetzt so einiges.

0
KriegerMan 
Beitragsersteller
 13.01.2018, 00:12
@RareDevil
Ok mein Kopf raucht ab: #include <SevSeg.h>

SevSeg sevseg; //Ein sieben Segment Objekt initialisieren

int Pulse = LOW;  //Sekundenimpuls
int toggle = LOW;  //Status wechselt jede Sekunde high-low
unsigned long previousMillis = 0;  // Zwischenspeicher der Millisekunden für Zeitdifferenz
const long interval = 1000;  // Impulszeit in Millisekunden (1000 = 1Sekunde)

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_CATHODE;
  bool updateWithDelays = false;
  bool leadingZeros = false;
  
  sevseg.begin(hardwareConfig, numDigits, digitPins, segmentPins, resistorsOnSegments, updateWithDelays, leadingZeros);
  sevseg.setBrightness(90);
}
void loop() {
  unsigned long currentMillis = millis();
  if (currentMillis - previousMillis >= interval) {
    previousMillis = currentMillis;
    Pulse = HIGH;
  } else {
    Pulse = LOW;
  }    

 if (Pulse == HIGH){
      if (toggle = HIGH){
        toggle = LOW;
      } else {
        toggle = HIGH;
      }
    }
if (toggle==HIGH){
sevseg.setNumber(2406);
} else {
sevseg.setNumber(2412);
  }
sevseg.refreshDisplay();
}

Klappt net, hängt dauerhaft bei 2412... Mein Gehirn ist kaputt

0