Blink without delay mit while......

Hi zusammen,

ich versuche sowas ähnliches wie ein Blink without Delay. Folgendes zum Sinn und Zweck:

Während die LED (GREEN1) an ist soll ein Sensor abgefragt werden. GREEN1 soll 3 Sekunden an sein...

Also dachte ich ich schreib mir die aktuellen Millisekunden in meine Variable time1 und geh dann in die While schleife....wenn also sie seit Programmstart verstrichenen Millisekunden plus mein Intervall von 3000 Millisekunden größer sind als die laufenden Millis() dann soll green1 HIGH sein.... ist dies nicht mehr der Fall LOW und time1 wird wieder 0 gesetzt.....

ABER.... es klappt nicht. Was mach ich falsch ?

[code]
int interval = 3000;
unsigned long time1 = 0;
const int green1 = 23;



void setup() {
  // put your setup code here, to run once:
  pinMode(green1, OUTPUT);
}

void loop() {
  time1 = millis();

  while (time1 + interval > millis()); {

    digitalWrite(green1, HIGH);

  }
  time1 = 0;
  digitalWrite(green1, LOW);

}

[/code]

while (time1 + interval > millis()); {

Ups.

Keine while mit millis(), das ist ein delay.

Aber abgesehen davon vergleicht man immer die Differenz von Zeitstempeln,
mit Summen zu arbeiten ist nicht überlaufsicher.

Dein Programm macht wenig ansonsten.

Whandall:
while (time1 + interval > millis()); {

Ups.

Keine while mit millis(), das ist ein delay.

Aber abgesehen davon vergleicht man immer die Differenz von Zeitstempeln,
mit Summen zu arbeiten ist nicht überlaufsicher.

Dein Programm macht wenig ansonsten.

Jo das es wenig macht hab ich auch gemerkt......

warum ist das ein Delay?

Bzw mit was kann ich das Problem sonst angehen ?

while (time1 + interval > millis());{

2 Fehler .. (vermute ich mal)
Erstens, das ";" muss da weg.
Zweitens, die Bedingung falsch von "Blink without Delay" abgeschrieben. So wird es nach 49,X Tagen ein Überlaufproblem geben.

Also das mit der Differenz wars Glaub ich.....

int interval = 3000;
unsigned long time1 = 0;
const int green1 = 23;



void setup() {
  // put your setup code here, to run once:
  pinMode(green1, OUTPUT);
}

void loop() {
  time1 = millis();

  while (time1 - interval < millis()); {

    digitalWrite(green1, HIGH);
    millis();
  }
  time1 = 0;
  digitalWrite(green1, LOW);

}

combie:
2 Fehler .. (vermute ich mal)
Erstens, das ";" muss da weg.
Zweitens, die Bedingung falsch von "Blink without Delay" abgeschrieben. So wird es nach 49,X Tagen ein Überlaufproblem geben.

wenn ich das ";" Wegmach funktionierts nicht mehr....

Das Überlaufproblem muss ich aber nichts unbedingt betrachten wenn das Din max ne Stunde an ist oder?

Jaenes:
warum ist das ein Delay?

Das ist delay()

void delay(unsigned long ms)
{
	uint32_t start = micros();

	while (ms > 0) {
		yield();
		while ( ms > 0 && (micros() - start) >= 1000) {
			ms--;
			start += 1000;
		}
	}
}

Solange du das Semikolon hinter dem while nicht entfernst, ist das wirklich einfach ein delay.

Das Überlaufproblem muss ich aber nichts unbedingt betrachten wenn das Din max ne Stunde an ist oder?

Kann sein....

Aber warum das falsche tun, wenn sich das richtige ohne Mehraufwand durchsetzen lässt.


Zusätzlich:

    digitalWrite(green1, HIGH);
    millis(); // << --- flüssiger als Wasser, überflüssig

Wenn du dir BlinkWithoutDelay ansiehst, wirst du erkennen, dass dort kein while oder sonst eine Schleifenkonstruktion drin vorkommt.

loop sollte keine Zeit brauchen und kommt dann unendlich oft dran. (Näherungsweise)

so gehts..... danke!

int interval = 3000;
unsigned long time1 = 0;
unsigned long time2 = 0;
const int green1 = 23;



void setup() {
  // put your setup code here, to run once:
  pinMode(green1, OUTPUT);
}

void loop() {

time2=0;
time1=millis();
while(time2<time1+interval){
  time2=millis();
  digitalWrite(green1,HIGH);
}
  digitalWrite(green1,LOW);
delay(1000);
}

Ich verabschiede mich wegen erwiesener Beratungsresistenz.

Viel Erfolg.

mit selbstgeschriebenem delay. "without delay" ist was anderes.

Whandall:
Ich verabschiede mich wegen erwiesener Beratungsresistenz.

Viel Erfolg.

? Ich bin bereit zuzugeben das ich mitnichten so viel Erfahrung habe in dem Thema wie du. Also LEHRE ER MICH! Aber nur zu sagen Nein geht nicht hat wenig damit zu tun jemandem zu helfen.

Erklärt mir halt oder lass es. Aber das gebashe weil jemand was nicht auf Anhieb versteht find ich gelinde gesagt kindisch scheisse und peinlich.

Keine whiles benutzen, beine Summen von Timings benutzen führt zu:

while(time2<time1+interval){

Das nenne ich bewiesen beratungsresitent.

Viel Glück bei deinem Ansatz, du wirst es brauchen.

hat wenig damit zu tun jemandem zu helfen

Ja ok.

Dass du einer der letzten sein wirst der merkt, dass du "beratungsresistent" bist, gehört leider zu dem Syndrom dazu. (Sorry)

Also, so pädagogisch wie es mir möglich ist:

  • Du hast dir BlinkWithoutDelay angesehen?
  • Warum ist da kein [b]while[/b] drin?
  • Wie lange brauchen 1000 loop-Durchläufe BlinkWithoutDelay?
  • Könnte man BlinkWithoutDelay um eine Tasterabfrage ergänzen?
    ( Beispiel: gedrückt --> schnell blinken, Taster offen --> langsam blinken )
  • Wie schnell würde der Sketch auf den Taster reagieren? (Wenn das langsame Blinken extrem langsam ist)
  • Könnte man den Sketch noch weiter ergänzen, ohne das vorhandene irgendwo mitten drin (vorzeitiger Abbruch einer while Schleife, weil ... ) ändern zu müssen?

Ein anderes Thema was hier schon diskutiert wurde und wo du deine Resistenz bewiesen hast:

   if (time2 < time1 + interval) {

ist etwas anderes als

   if (time2 - time1 < interval) {

auch wenn du mathematisch nachweisen kannst, dass beide Ausdrücke äquivalent sind.
Bei deinem mathematischen Beweis lässt du nämlich außer acht, dass diese Variablen keine natürlichen oder rationalen Zahlen sind, sondern nur einen begrenzten Wertebereich haben und überlaufen.

Die zweite Variante funktioniert übrigens auch während eines solchen Überlaufs.
Da die erste Variante keinerlei Vorteil hat, ist es einfach falsch, es so hinzuschreiben, auch wenn das Problem nur gaaanz selten auftreten wird.
Gibt auch Leute die begründen, dass Fehler, die selten auftreten, schlimmer sind als solche die sofort auffallen.