Tm1637 als Impulszähler

Hallo, ich hab mir einige Proekte mit Uhr angeschaut, möchte ein Proekt bauen mit tm1637 als Impulszähler vorwärts und rückwärts.Als Impulsgeber sollen Photoelektronischer Schalter - U-Form sein.Einer für Vorwärts- und zweite für Rückwärtszählen.Wie kann man den sketch anpassen?
Bitte um Entschuldigung, falls ich was nicht korrekt angegeben habe.Mach natürlich bei Unklarheiten.

Ich hab diesen Sketch genommen, aber Display ist dunkel

#include <TM1637TinyDisplay.h>

#include <TM1637Display.h>

#define numberOfSeconds(_time_) ((_time_ / 1000) % 60)
#define numberOfMinutes(_time_) (((_time_ / 1000) / 60) % 60)

int startPin = 9; // start, stop, delete
int zwischenzeitPin = 8; // pause, continue

int stateStart;
int stateZwischenzeit;

int lastStateStart;
int lastStateZwischenzeit;

int programState = 0;

unsigned long startZeit = 0;
long zwischenzeit = 0;
long zeitAngehalten = 0;

TM1637Display display(2, 3);

void setup() {
  Serial.begin(115200);

  pinMode(startPin, INPUT_PULLUP);
  pinMode(zwischenzeitPin, INPUT_PULLUP);

  // Set brightness
  display.setBrightness(0x0c);

}

void showTime(long theTime) {

  unsigned long myTime = theTime - startZeit;

  int seconds = numberOfSeconds(myTime);
  int minutes = numberOfMinutes(myTime);

  display.showNumberDecEx(seconds, 0, true, 2, 2);
  if (seconds % 2 == 0) {
    display.showNumberDecEx(minutes, 0b01000000, true, 2, 0);
  } else {
    display.showNumberDecEx(minutes, 0, true, 2, 0);
  }
}

void loop() {

  stateStart = digitalRead(startPin);
  stateZwischenzeit = digitalRead(zwischenzeitPin);

  switch (programState) {
    case 0: // gestoppt
      startZeit = 0;
      display.showNumberDecEx(0, 0b01000000, true, 2, 2);
      display.showNumberDecEx(0, 0b01000000, true, 2, 0);
      // start
      if ((stateStart == LOW) && (stateStart != lastStateStart)) {
        startZeit = millis();
        programState = 1;
      }
      break;
    case 1: // gestartet
      showTime(millis());
      // zwischenzeit
      if ((stateZwischenzeit == LOW) && (stateZwischenzeit != lastStateZwischenzeit)) {
        zwischenzeit = millis();
        programState = 2;
      }
      // stop
      if ((stateStart == LOW) && (stateStart != lastStateStart)) {
        zeitAngehalten = millis();
        programState = 3;
      }
      break;
    case 2: // zwischenzeit
      showTime(zwischenzeit);
      // zwischenzeit ausblenden
      if ((stateZwischenzeit == LOW) && (stateZwischenzeit != lastStateZwischenzeit)) {
        programState = 1;
      }
      break;
    case 3: // gestoppt
      // weiter laufen lassen
      if ((stateZwischenzeit == LOW) && (stateZwischenzeit != lastStateZwischenzeit)) {
        startZeit = startZeit + (millis() - zeitAngehalten);
        programState = 1;
      }
      // löschen
      if ((stateStart == LOW) && (stateStart != lastStateStart)) {
        programState = 0;
      }
      break;
  }

  lastStateStart = stateStart;
  lastStateZwischenzeit = stateZwischenzeit;
}

Hallo,
Bitte hier nachlesen und die fehlendn Angaben nachlesen.
Dazu die Links posten.

Hallo, ich benutze Arduino Uno
Habe als Grundprogramm Stoppuhr mit Arduino und Segmentanzeige – Arduino+TM1637 genommen.TM1637 Bibliothek von Avishay Orpaz in der aktuellen Version.
Photoelektronischer Schalter - U-Form
Stromversorgung: 3.3~5V
Ausgabesignal: digital (HIGH und LOW)
Durchmesser der Aussparung (U-Form): ~10mm
Maße: 232018mm
Am Anfang habe ich versucht ein Sketch zu schreiben mit hilfe von Grove_4Digit Display TM1637.Hab aber nur "0000" bekommen, und kann nicht die Photoelektronischer Schalter anschließen.
Das ist der sketch :

#include "TM1637.h"
int8_t DispMSG[] = {1, 2, 3, 4};   
#define CLK 3
#define DIO 2
TM1637 tm1637(CLK, DIO);
int i=0;
int t[4]={0,0,0,0};
void num(unsigned int value)
{
    for (int8_t i = 3; i>=0; i--) {
        DispMSG[i] = value % 10;
        value /= 10;
    }
}
void setup()
{
  tm1637.init();

  tm1637.set(2);
  tm1637.point(false);
  tm1637.display(DispMSG);
  delay(1000);
}
void loop()
{

num (i);
tm1637.display(DispMSG);
  i++;
  if(i>=9999);{
    i=0;
    }

}

Es fehlen die Links zu deinen Teilen. Oder müssen wir raten bzw. für dich suchen ?


Es sind 2 Optokoppler, die ich am Rad montiert habe

Anschließen möchte ich die als Signalgeber an Pin5 und Pin6 bei Arduino.

Links für die Optokoppler hab ich keine.Die geben High oder Low.

Eigentlich es ist ein Schalter Prinzip.Geschwindigkeit ist maximal 1000 U/min

Das sind keine Optokoppler, sondern Lichtschranken und die wirst du doch gekauft habe. Da gibt es sicher einen Link zum Händler.

Dann mach wenigstens ein gutes Foto von dem Teil, damit wir alles erkennen können.

ja , bei funduinoshop.com

Bin gerade beim suchen, ob die was für die Teile haben

IC ist LM393

Das habe ich mit diesem Scetch erreicht

#include "TM1637.h"
int8_t DispMSG[] = {1, 2, 3, 4};   
#define CLK 3
#define DIO 2
TM1637 tm1637(CLK, DIO);
int i=0;
int t[4]={0,0,0,0};
void num(unsigned int value)
{
    for (int8_t i = 3; i>=0; i--) {
        DispMSG[i] = value % 10;
        value /= 10;
    }
}
void setup()
{
  tm1637.init();

  tm1637.set(2);
  tm1637.point(false);
  tm1637.display(DispMSG);
}
void loop()
{

num (i);
tm1637.display(DispMSG);
  i++;
  if(i>=9999);{
    i=0;
    }

}

@HotSystems
Was hat Euch denn nicht an #4 gefallen?

Ich weiß nicht, wie ich es mit Eingängen von Lichtschranken verbinden kann.Es muß beginnen, aber wie?

Warum sollte mir das nicht gefallen ?

Das hab ich jetz nicht kopiert

Hallo,
Du hast ja eigentlich zwei Probleme

  1. Die Anzeige geht nicht. Da nimmst Du am besten mal ein einfaches Beispiel aus der lib, Das sollte ja auf jeden Fall funktionieren.
  2. Die Auswertung der Lichtschranken. Wie hast Du die denn angeordnet ? Auf einem Foto erkenne ich, sie sind anscheinend direkt übereinander montiert. Das Loch in dem Rad sollte so lang sein das es einen Zustand gibt bei dem beide Lichtschranken gleichzeitig das Loch erkennen. Dann ist der Rest doch ganz einfach. Wenn die obere Lichtschranke das Loch erkennt die untere aber noch nicht dann dreht sich das Rad links herum. Wenn die obere Lichtschranke das Loch erkennt und die untere auch schon durchsehen kann , dann dreht das Read rechts herum.

Also immer auf die Flanke "wird frei" von der oberen Lichtschranke abfragen und dann abhängig vom Zustand der unteren Lichtschranke vorwärts oder rückwärts zählen.

Ich hab da was von 1000U/min gelesen , das sind etwa 16Hz = 62ms. Wenn das Loch 1/10 des Umfanges ist muss man 6ms erkennen können. Ich würde das mit einem Interrupt auswerten. Beispiele gibts dazu zum Drehencoder. Du kannst auch eine lib dafür verwenden.

Heinz

Nachtrag
eventuell muss das Loch ein bisschen länger sein damit beide Lichtschranken gleichzeitig sicher durchsehen können. Wenn nur ein Loch drin ist kann das bei höheren Drehzahlen zu einer Unwucht werden. Dann muss eventuell noch ein zweites Loch genau gegenüber rein.

Hallo,
@my_xy_projekt

im setup gibts ein

ich kenne die lib nicht , könnte mir aber vorstellen das das einem begin() gleichkommt. Vermutlich fehlt noch was anderes.

Gruß Heinz