Arduino 4Digit 7Segment TM1637 Anzeige

Hallo liebe Community,
ich habe einen Code geschrieben, wo ein Timer eingestellt ist und dieser wird auf der 4Digit 7Segment TM1637 Anzeige angezeigt. Mein Problem ist jetzt, wie kann man es programmieren, dass er den Timer dauerhaft wiederholt?

Hier der Programmcode:

#define numberOfSeconds(_time_) ((_time_ / 1000) % 60)  
#define numberOfMinutes(_time_) (((_time_ / 1000) / 60) % 60)
#define DIO 2
#define CLK 3

#include <TM1637Display.h>

const uint8_t OFF[ ] = {0, 0, 0, 0};
const uint8_t HLAY[] = {B01110110, B00111000, B01011111, B01101110};
TM1637Display display(DIO,CLK);

unsigned long timeLimit = 10000;
boolean Zustand = false; 
void setup(){
  Serial.begin(9600);
  display.setBrightness(0x0f);
  display.setSegments(OFF);
  
}

void countdown(){

     long theTimer = timeLimit - millis();
     while(theTimer >0){
     int seconds = numberOfSeconds(theTimer);
     int minutes = numberOfMinutes(theTimer);

     display.showNumberDecEx(seconds, 0, true, 2, 2);
     display.showNumberDecEx(minutes, 0b01000000, true, 2, 0);
     theTimer =timeLimit - millis();
  }
}
void displayText() {
  display.setSegments(HLAY);
  delay(2000);
}

void loop(){
  displayText();
  countdown();
}

Vielen Dank im Voraus.
Viele Grüße
Florian

Du bist ja nu auch nicht den ersten Tag hier bei.
Bitte gehe in Deinen Post, markiere Deinen Code und drücke dann auf das </> Symbol.

Dein Konzept ist falsch.

spätestens hier:

Dein "countdown" soll dauerhaft und unveränderbar wieviele Minuen und wieviele Sekunden dauern?
Möchtest Du nach dem Ende des CountDown (0) eine Pause (wenn ja wie lange)

Er soll 18 Minuten gehen und nach Ablaufen des Countdown wieder von vorne neu anfangen. Die Pause soll 5 Sekunden betragen.

Aus meiner Kiste:

const unsigned long timerZeit = 1UL * 60 * 1000; // zeit in mS: Minuten * Sekunden * Grundlage == mS
const unsigned long pauseZeit = 5UL * 1000; // Zeit in mS: Sekunden * Grundlage == mS
const unsigned long tik = 1000; // Sekundentakt
unsigned long laufZeit = timerZeit;
unsigned long startZeit;
bool ausgabe = false;

void setup()
{
  Serial.begin(115200);
  Serial.println(F("Start..."));
  startZeit = millis();
  Serial.println(F("0 ms"));
}

void loop()
{
  // Berechnen und umschalten zwischen timer und Pause
  if (millis() - startZeit >= laufZeit)
  {
    Serial.print(F("Laufzeit abgelaufen! StartZeit: "));
    startZeit = millis();
    if (laufZeit == timerZeit)
      laufZeit = pauseZeit;
    else
      laufZeit = timerZeit;
    Serial.print(startZeit);
    Serial.print(F(" Laufzeit: "));
    Serial.println(laufZeit);
  }
  // Ausgabe
  if ((millis() - startZeit) % tik == 0)
  {
    if (!ausgabe)
    {
      Serial.println(millis() - startZeit);
      ausgabe = true;
    }
  }
  else
  {
    ausgabe = false;
  }
}

Ausbauen musst Du es Dir selbst. :wink:
Und das mit dem % ist ne Krücke, die für die Ausgabe ausreicht. Für eine Berechnung nicht verwenden!

Vielen Dank. Habe es ausgebaut. Funktioniert erstmal, dann habe ich noch eingebaut dass er am Anfang Play anzeigen soll. Das macht er aber halt dauerhaft. Der Timer wird dann nicht mehr dargestellt. Habe schon mehrere Sachen probiert aber irgendwie bekomme ich es nicht hin. Woran könnte es liegen ?
Code kommt später.

Zudem soll noch eine Transistoransteurung dazu kommen. Das heißt er soll so lange angeschaltet werden wie der Timer eingestellt ist und solange ausgeschaltet wie die Pause ist. Wie könnte man das realisieren?

Bin noch total neu in diesem Gebiet, deshalb frage ich so doof

Der Aufruf von play darf nicht erfolgen, wenn die Zeit läuft.

Selbes Prinzip wie das ausblenden der Anzeige.

Logik:
Ist der Timer zwischen Startzeit und 0?
Ja -> Transistor schalten
else -> Transistor nicht schalten

Habe es jetzt so programmiert

if(laufZeit == timerZeit)
{
digitalWrite(PIN_CONTROL_TRANSISTOR, HIGH);
}
else {
digitalWrite(PIN_CONTROL_TRANSISTOR, LOW);
}

So richtig ?

Das kannst Du testen.
Schreibe einfach ein Serial.println("an") bzw. "aus" in die Funktion rein - der Serielle Monitor wird geflutet, aber in dem Fall ist es egal.
Du siehst auf jeden Fall, ob in der Zeit die richtige Bedingung eingestellt ist.

Ja also es kommt immer die richtige Schaltung.
Aber wird dann zum Beispiel in der Timer Zeit nicht dauerhaft der Transistor angeschaltet, also ständig neu ? Oder stört das den Transistor nicht ?

Noch zu der Ausgabe mit Play. Dann müsste man doch so machen, dass er erst das anzeigt und dann erst mit der Zeit anfängt oder ? Wenn ja wie könnte man das machen ?

Vielen Dank für die Hilfe, dadurch verstehe ich immer mehr von der Materie. :slight_smile:

Ja, das ist ja Sinn der Sache :wink:

Nö.
Wird ja nicht ausgeschaltet.
Gehe an Deinen Lichtschalter.
Mach das Licht an.
Drücke immer wieder auf die Stellung, das das Licht angeht.
Was passiert?

Damit kommst Du aber nur dann zum korrekten Ergebnis, wenn bei Dir Kipp-, oder Wipp-Schalter verbaut sind :slightly_smiling_face:. Sind hingegen Druckschalter verbaut, passiert genau das, was der TO befürchtet -s Licht geht immer an und aus :thinking:

2 Likes

Ja habe es verstanden :joy:.

Und zu meiner Frage mit dem Anzeigen von dem Play?