Umdrehungen in Zeit umsetzung mit TM1637

Hallo, ich nutze Arduino UNO als Zähler für Umdrehungen mit volgender Bibliotek GitHub - avishorp/TM1637: Arduino library for TM1637 (LED Driver)

#include <TM1637Display.h>  // lib laden

// Module connection pins (Digital Pins)
constexpr byte CLK { 2 };
constexpr byte DIO { 3 };
constexpr byte pinSchranke1 { 5 };  // Impuls Zähler
constexpr byte pinSchranke2 { 6 };  // Impuls Richtung
bool sl1Hell, sl2Hell;              // Status der Lichtschranken
bool sl1Merker= true;                     // Hilfsmerker für die Flanke an SL1
int counter;                        // Zählerwert

TM1637Display display(CLK, DIO);  // Instanz anlegen

void setup() {
  Serial.begin(115200);
  Serial.println("Start");
  pinMode(pinSchranke1, INPUT);
  pinMode(pinSchranke2, INPUT);
  display.setBrightness(0x0f);  // einstellen
  Serial.println(counter);
  display.showNumberDec(counter, false);
}

void loop() {
  sl1Hell = !digitalRead(pinSchranke1);  //invertiert lesen
  sl2Hell = !digitalRead(pinSchranke2);

  if (sl1Hell == true && sl1Merker == false) {
    sl1Merker = true;  // Flankenmerker setzen
    Serial.print("SL1 wird hell");
    if (sl2Hell == true) {
       counter++;
       if (counter>=10000) counter=0;
      
    } else {
      counter--;
      if (counter <=-1)counter=9999;

      
    }
    Serial.print("   Zähler");
    Serial.println(counter);
    display.showNumberDec(counter, false);  // Wert auf Anzeige
  }

  if (sl1Hell == false) sl1Merker = false;  // Flankenmerker reset
  delay(5);  //entprellen
}

möchte aber die Umdrehungen in Zeit umstellen.Eine umdrehung entspricht 0,90334 sek.Wie kann ich es als Zeit in min und sec umstellen?Ich habe ein Display mit 4 Bit, evtl. muß ich auf 6 Bit das System umbauen.Bitte um Hilfe.Es kann sein, dass ich noch etwas in der Beschreibung vergessen habe.

Für zählen von Umdrehungen werden Lichtschranke benutzt


Es sind 2 St. Eine für Richtung und andere für Zählen

Im englischen Teil des Forum müssen die Beiträge und Diskussionen in englischer Sprache verfasst werden.
Deswegen wurde diese Diskussion in den deutschen Teil des Forums verschoben.

mfg ein Moderator.

Mir ist nicht klar, was du darstellen möchtest.

Du hast eine Zeit in Sekunden und willst die in Minuten und Sekunden anzeigen?

Mit Division und Modulus könntest du das umrechnen:

t = 93 // Zeit in Sekunden

m = t / 60; // Minuten
s = t % 60; // Sekunden

Da deine Zeit aber schon unter einer Sekunde ist, wird das halt nur 0 anzeigen...

Danke für Antwort.Ich möchte, dass erste 2 Segmente in Minuten, und letzte 2 Segmente in Sec angezeigt werden sobald nach Umdrehungen die Zeit erreicht wird.Milisec sollen nicht angezeigt werden.

Ich kann gerade nicht kompilieren... aber so ähnlich sollte der Code aussehen:

#include <TM1637Display.h>

constexpr byte CLK { 2 };
constexpr byte DIO { 3 };

TM1637Display display(CLK, DIO);

void setup() {
  display.setBrightness(0x0f);
}

uint16_t t = 50;

void loop() {
  t++;

  auto m = t / 60;
  auto s = t % 60;

  display.showNumberDec(m, true, 2, 0);
  display.showNumberDec(s, true, 2, 2);
  
  delay(1000);
}

Danke, und wie mach ich die Anpassung an die Zeit?Bei mir ist eine Umdrehung nur 0,90334 sek

Unter der Annahme, dass counter volle Umdrehungen zählt:

uint32_t t = (counter * 90334UL) / 100000UL;

Edit: UL an den Konstanten ergänzt.

Oder Du machst die Differnz der Millis zwischen 2 Auslösungen der Lichtschranke.

Da bekommst Du 903 millisekunden.

Grüße Uwe

Nein.

Mach sowas nicht. Es ist überflüssig.

Du brauchst nicht die Drehrichtung?

Das kostet Zeit, in der nicht gemessen wird.

warum?

Und unter der Voraussetzung, dass die Umdrehung gleichmässig über die Zeit läuft.

Was passiert, wenn die Zeit eine andere ist?

Dann stimmt natürlich die Berechnung der aufsummierten Dauer auch nicht mehr.

Danke für die Infos.Ich war fort, jetzt probiere ich es.

Hallo, hab probiert, Kompilation geht nicht durch.
Problem mit "t"

Ich brauch doch die Drehrichtung.Es muß vorwärts und rückwärts zählen.Jetzt zählt es bis "9999" und springt auf "0000" genau so von "0000" springt auf "9999" bei zurückzählen.Wenn ich auf Zeit umstelle, dann soll es Sekunden bis 60 zählen und bei Minuten dann weiter gehen.

So sihet jetzt aus

#include <TM1637Display.h>  // lib laden

// Module connection pins (Digital Pins)
constexpr byte CLK { 2 };
constexpr byte DIO { 3 };
constexpr byte pinSchranke1 { 5 };  // Impuls Zähler
constexpr byte pinSchranke2 { 6 };  // Impuls Richtung
bool sl1Hell, sl2Hell;              // Status der Lichtschranken
bool sl1Merker= true;                     // Hilfsmerker für die Flanke an SL1
int counter;                        // Zählerwert

TM1637Display display(CLK, DIO);  // Instanz anlegen

void setup() {
  Serial.begin(115200);
  Serial.println("Start");
  pinMode(pinSchranke1, INPUT);
  pinMode(pinSchranke2, INPUT);
  display.setBrightness(0x0f);  // einstellen
  uint32_t t = (counter * 90334UL) / 100000UL;
  Serial.println(counter);
  display.showNumberDec(counter, true);
}

void loop() {
  t++;
  constexpr int maxVal {9999};
  sl1Hell = !digitalRead(pinSchranke1);  //invertiert lesen
  sl2Hell = !digitalRead(pinSchranke2);
  auto m = t / 60;
  auto s = t % 60;

  display.showNumberDec(m, true, 2, 0);
  display.showNumberDec(s, true, 2, 2);
  if (sl1Hell == true && sl1Merker == false) {
    sl1Merker = true;  // Flankenmerker setzen
    Serial.print("SL1 wird hell");

    counter = ((sl2Hell) ? counter + 1 : counter - 1) % (maxVal + 1);
    if (counter < 0) counter = maxVal;
    
    Serial.print("   Zähler");
    Serial.println(counter);
    display.showNumberDec(counter, true);  // Wert auf Anzeige
  }

  if (sl1Hell == false) sl1Merker = false;  // Flankenmerker reset
  delay(5);  //entprellen
}

Kompilation geht aber nicht durch
Problem mit "t"

Der komplette Block ist da falsch.

t muss vorher definiert werden.
Und dann ohne definition im loop() könnte das klappen.
Hat aber noch immer das umkehren der Werte drin, das delay ebenso und das mit der Drehrichtung ist da auch nicht bei.

Wenn sich die Drehrichtung ändert, soll was passieren?

Kein Wunder.
Du hast beim Abschreiben aus Post #7 übersehen, dass es da eine globale Vereinbarung von t zwischen setup() und loop() gibt. Dein t im setup() ist nur dort gültig.

In der Fehlermeldung steht doch drin, woran es fehlt: "was not declared in this scope"

Beispiel
void setup()
{
}

void loop()
{
    t++;
}


C:\...\sketch_may8a.ino: In function 'void loop()':
C:\...\sketch_may8a.ino:7:3: error: 't' was not declared in this scope
   t++;
   ^
exit status 1

Compilation error: 't' was not declared in this scope

Ich empfehle dringend ein C++-Buch, Kapitel "Gültigkeitsbereich von Variablen".

Dein Code ist auch sonst unbrauchbar. In Zeile 33 und 34 schreibst Du m und s auf das Display und bei nächsten Flanke (also längstens 0.90334s später) schreibst Du den Counter da drauf (Zeile 44). Etwa fünf Millisekunden später wird das wieder überschrieben mit der Zeit. Das würde ein fürchterliches Geflacker geben...

Bei änderung der Drehrichtung soll rückwärts zählen.Das hat auch funktioniert