Millis macht nicht das was ich will

Hi Forum,

ich habe eine Kleine Lichtschranke die stumpf zählt. Wenn ich etwas durchschiebe leuchtet eine Led von Grün auf Rot in einer zeit die ich einstelle. In dieser zeit darf nichts gezählt werden. ist die zeit vorbei wird in einem Counter +1 gerechnet und die Led leuchtet wieder Grün ist eine bestimmte anzahl von Objekten erreicht Ist der Zahlvorgang beendet und die Led leuchtet dauerhaft Rot.
Problem ist delay. da es erst Nach der delayzeit die ich einstelle (drehcodierschalter) der Zähler +1 rechnet. Das ist nicht unbedingt das was ich wollte. Ich wollte das der Counter zählt und dann die delayzeit wartet. das heißt dann auch das er wenn die anzahl von Objekten erreicht ist er sofort sagt Zahlvorgang beendet und nicht erst die delayzeit wartet. Ich hab das mit millis versucht aber will irgendwie nicht. kann mir jemand helfen?

NDFS:
kann mir jemand helfen?

Das sieht nicht nach einem compilierfähigen Code aus. Für mich stellt das eine Mindestanforderung dar, um mich damit zu beschäftigen.

Schritt 1: Sinnlose Leerzeilen entfernen
Schritt 2: kompilieren drücken und erste Fehlermeldung ansehen und beheben. Wenn nicht klar - hier fragen
Schritt 3: Serial.begin ergänzen

ich hab dann auch aufgegeben.
Kompilieren soll das Monster schon. Schritt 2 daher wiederholen bis es erfolgreich ist.

  1. Serial.begin(xxxx); vergessen
  2. previousMillis; nicht deklariert
  3. Lichtschranke_G nicht deklariert und wird nicht gesetzt
  4. Lichtschranke_G_Last nicht deklariert und wird nicht gesetzt
  5. Serial.print("\t Zaehlvorgang beendet!"); vor void ein_Zaehlvorgang(), steht außerhalb jeglicher Funktion
  6. Lichtschranke wird nicht eingelesen

Was ist "Sollwert" bzw. wo wird es definiert?

exit status 1
'Sollwert' was not declared in this scope

combie:
Was ist "Sollwert" bzw. wo wird es definiert?

Es ist oben einkommentiert. Weiß ehrlich gesagt nicht warum. Wollte wahrscheinlich etwas anderes einkommentieren und hab versehentlich das genommen. Habe Ihn eben vorsichtshalber mal getestet das ist jetzt der richtige Code. :cold_sweat:
Mfg

Und selbst, wenn man den Kommentar weg macht, ist es immer noch falsch.
Denn EEPROM.write(); erwartet ein uint8_t, kein int.
Auch liefert EEPROM.read(Adresse) ein uint8_t und kein int.

Es ist und bleibt ein Typemismatch

combie:
Und selbst, wenn man den Kommentar weg macht, ist es immer noch falsch.
Denn EEPROM.write(); erwartet ein uint8_t, kein int.
Auch liefert EEPROM.read(Adresse) ein uint8_t und kein int.

Hab ich nicht ganz verstanden. Das Läuft ja alles, auch der EEPROM

Wenn du einen Elefanten (int), in deine Tupperdose stopfst (wo nur uint8_t rein passt)....
Und ihn dann wieder raus holst, ist es dann noch ein Elefant(int), oder eher etwas zerdrücktes, uint8_t förmiges?

Ich rate dir zu Sorgfalt im Umgang mit Typen.
Gewöhne dich bitte nicht an einen schlampigen Umgang damit.
Du machst dir selber so nur unnötige Probleme, welche dir irgendwann ganz böse auf die Füße fallen.

Beispiel:

    if (Sollwert < 1000)

      Sollwert++;

    EEPROM_Beschreiben();

uint8_t kann nur Werte von 0 bis 255 annehmen.
Der Vergleich mit 1000 kann also nur ein logischer Fehler sein.

Das Läuft ja alles, auch der EEPROM
Noch!
Aber der Pferdefuß lauert.

Bitte poste noch einmal den aktuellen und vollständigen Sketch (alle Tabs).

Gruß

Gregor

PS:

... das ist jetzt der richtige Code. :cold_sweat: ...

Wo?

Du solltest in der IDE die Warnungen des Compilers einschalten, dann bekommst Du wertvolle Hinweise (Programm aus #11):

[sup]In file included from C:\Users\User\AppData\Local\Temp\arduino_modified_sketch_515117\Test_Forum.ino:1:0:
C:\Program Files (x86)\arduino-1.8.6\hardware\arduino\avr\libraries\EEPROM\src/EEPROM.h:43:30: warning: type qualifiers ignored on function return type [-Wignored-qualifiers]
     operator const uint8_t() const       { return **this; }
                              ^
C:\Program Files (x86)\arduino-1.8.6\hardware\arduino\avr\libraries\EEPROM\src/EEPROM.h:92:26: warning: type qualifiers ignored on function return type [-Wignored-qualifiers]
     operator const int() const          { return index; }
                          ^
C:\Users\User\AppData\Local\Temp\arduino_modified_sketch_515117\Test_Forum.ino: In function 'void loop()':
C:\Users\User\AppData\Local\Temp\arduino_modified_sketch_515117\Test_Forum.ino:209:18: warning: comparison is always true due to limited range of data type [-Wtype-limits]
     if (Sollwert < 1000)
                  ^
[/sup]

NDFS:
... ich änder es um Danke:)

Ja, mach' das - und ...

NDFS:
das ist jetzt der Code den ich vor mir habe ...

... versuche möglichst, den Code lesbarer zu gestalten. Vor allem: Überflüssige Leerzeilen raus. Was Klammerungen und Einrückungen angeht, ist Geschmackssache. Aber einfache if()/else()-Konstrukte, die sich ja oft um die selbe Sache drehen und ähnlich aussehen, kann man z. B. als Blöcke einzeliger Konstrukte „gestalten“.

HTH

Gregor

PS: „sprechendere“ Bezeichner wären hilfreich. Mit „TASTER1“ kann ich 5 Zeilen weiter nicht allzu viel assoziieren.

Darf denn die Adresse int bleiben?

die Doku sagt:

Parameters
address: the location to write to, starting from 0 (int)

Also ja.

Hallo,

ich hab Deine Aufgabenstellung noch nicht ganz verstanden. Also nochmal das was ich verstanden habe.

-Wenn die Lichtschranke unterbrochen wird soll eine grüne LED ausgehen und eine Rote an
-ein Zähler soll um 1 erhöht werden ( Fanke Lichtschranke auswerten, starzeit = millis())
-bei einem erneuten Signal der Lichtschranke wird nicht gezählt
-Wenn ein max Zählerstand erreicht ist, soll der Zustand der LED so bleiben (rot an /grün aus)
-Wenn eine Zeit abgelaufen ist ( millis()-starzeit >= Zeitwert) und der Zähler < max ist soll die rote aus gehen und die grüne an.
-Es kann ein neuer Zählvorgang erfolgen, Zähl wird wieder freigegeben.

Wenn es das ist und du millis() verstanden hast solltest Du jetzt eigendlich klar kommen. Wenn nicht nach Nachtwächter suchen.

Gruß Heinz

Nachtrag

@Tommy das ist kein Codesegment geht also so durch ? :slight_smile:

Gruß Heinz

Hi,

Sorry für die späte Antwort.
Also der Code den ich euch gezeigt habe läuft top. Das einzige was mich stört ist Das der Counter erst zählt wenn die delayzeit[x] abgelaufen ist das heißt das der Status Zählvorgang beendet auch erst erscheint wenn die delayzeit abgelaufen ist. Das möchte ich nicht ich wollte das so das er erst vergleicht ob counter >= Sollwert dann die delayzeit abläuft damit ich wenn der Zählvorgang beendet ist ich nicht erst nach z.b. 30 Sekunden das weiß sondern direkt.

was ich habe:

Lichtschranke unterbrochen -> delay -> counter++ -> eventuell Zählvorgang beendet

was ich möchte:

Lichtschranke unterbrochen -> counter++ (direkt am Display anzuzeigen) -> counter>=Sollwert? ->delay

das delay ist dazu da damit nicht versehentlich durch meine Hand oder so nochmal gezählt wird.

Sprechende Bezeichner finde ich gut werde ich direkt mal ändern. Für sonstige programmier verbrechen die ich begangen habe oder ein paar Tipps für einen schöneren Code wäre ich auch sehr Dankbar :slight_smile:

Mfg

Wenn dein Automat nicht das tut, was du willst, dann musst du ihn ändern.

Tipp 1:
Verzichte auf das/alle delay()

Tipp 2:
Baue klar definierte endliche Automaten.
Teile die Funktionalitäten "vernünftig" auf

Ansonsten, gehts mir wie Rentner:

ich hab Deine Aufgabenstellung noch nicht ganz verstanden.

NDFS:
Also der Code den ich euch gezeigt habe läuft top.

Naja ... genau das tut er noch nicht :slight_smile:

Du möchtest, dass mehrere Dinge quasi gleichzeitig passieren oder getan werden. Das geht nicht anders als mit einem endlichen Automaten. Das Modell ist vielleicht zuerst schwer zu durchschauen - letztlich aber ziemlich simpel.

Vielleicht hilft das hier.

Gruß

Gregor

NDFS:
Lichtschranke unterbrochen -> delay -> counter++ -> eventuell Zählvorgang beendet

was ich möchte:

Lichtschranke unterbrochen -> counter++ (direkt am Display anzuzeigen) -> counter>=Sollwert? ->delay

das delay ist dazu da damit nicht versehentlich durch meine Hand oder so nochmal gezählt wird.

Mfg

Hallo,

Wenn alles schon super klappt, was ich nicht ganz nachvollziehen kann, dann dreh die Anweisungen doch einfach rum so wie du es beschrieben hast.

Lichtschranke unterbrochen -> counter++ -> -> Anzeige -> delay

Gruß Heinz