PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : stimmt dieser Sketch-Teil?



xxrider
11.02.2018, 11:27
/
unsigned long zeit;
unsigned long zeit1;
unsigned long zeit2;
.
.
.
void loop() {

zeit=millis();
zeit1=zeit;
zeit2=zeit-zeit1;


while (analogValue>50 && zeit2>5000) { //5 Sekunden Wartezeit sowie höchste Schwelle nicht überschritten
zeit2=zeit-zeit1;
digitalWrite(green, LOW);

digitalWrite(yellow, HIGH);

digitalWrite(red, LOW);
usw.


Was ich will:
eine Wartezeit mit der bestimmten LED Konstellation (Yellow = on) soll erhalten werden, außer eine Schwelle wird unterschritten (A/D Eingang < 50), dann sollte die Schleife beendet werden. Klappt aber in der Praxis nicht (keine Wartezeit)...

HaWe
11.02.2018, 11:49
ich denke: nein.

durch zeit=millis();
zeit1=zeit;
zeit2=zeit-zeit1;

wird
zeit1=zeit;

und weil dadurch
zeit-zeit1 dasselbe ist wie zeit-zeit,
und weil zeit-zeit immer = Null ist,
ist automatisch immer
zeit2=0.

Tipp:
benenne mal zeit1 um in "zeitAlt"
und zeit2 benenne um in "delta_t"
dann wirds vielleich auch semantisch klarer.

xxrider
11.02.2018, 12:00
ich denke: nein.

durch zeit=millis();
zeit1=zeit;
zeit2=zeit-zeit1;

wird
zeit1=zeit;

und weil dadurch
zeit-zeit1 dasselbe ist wie zeit-zeit,
und weil zeit-zeit immer = Null ist,
ist automatisch immer
zeit2=0.

Tipp:
benenne mal zeit1 um in "zeitAlt"
und zeit2 benenne um in "delta_t"
dann wirds vielleich auch semantisch klarer.

Ich wollte über Zeit1=Zeit einen Wert für zeit1 unveränderlich für die darauffolgende While-Schleife festlegen.
IN der while-schleife dürfte doch zeit1 nicht verändert werden, aber zeit (davon unabhängig, weils im Hintergrund immer weiterläuft) ist variabel, oder verstehe ich das falsch?

Siro
11.02.2018, 20:37
Das sollte evtl. so funktionieren:




digitalWrite(yellow, HIGH); // gelbe Led an ?

zeit = millis() + 5000; // aktueller Zeitwwert + deine maximale Wartezeit 5 Sekunden
do // Schleifen
{
if (analogValue < 50) break; // Abbruch der Schleife wenn der Analogwert < 50 wird
} while (millis() < zeit); // ansonsten weiterschleifen bis millis den Wert von zeit überschreitet

// landet hier wenn die Zeit abgelaufen ist und/oder Analogwert kleiner 50 geworden ist.

digitalWrite(yellow, LOW); // gelbe Led aus ?


must natürlich dafür sorgen, das dein Analogwert noch innerhalb der Schleife irgendwie aktualisiert wird.

Siro

xxrider
11.02.2018, 22:55
Danke, Siro. Das habe ich gemerkt, dass man in der Schleife den A/D Wandler weiter auslesen muss.
Und auch für deinen Code, werde ich mir anschauen und mir zueigen machen!