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 ?
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
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
- Die Anzeige geht nicht. Da nimmst Du am besten mal ein einfaches Beispiel aus der lib, Das sollte ja auf jeden Fall funktionieren.
- 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