hallo,
such mal nach dem Beispiel (Arduino example) "Blink without delay()"
hallo,
such mal nach dem Beispiel (Arduino example) "Blink without delay()"
Hallo.
hab ich versucht aber das läuft ja dann immer in einer endlosschleife und ich habe keine Möglichkeit die schleife zu unterbrechen. Das ganze müsste in einem Thread laufen. Gibt es sowas?
Sorry.. Hier mein Code:
Code:void runTime(int mytime, uint16_t myColor){ unsigned long previousMillis = 0; unsigned long actTime = mytime; setBGColor(myColor); doRun = true; while(doRun){ unsigned long currentMillis = millis(); if (currentMillis - previousMillis >= interval) { previousMillis = currentMillis; // do something if(actTime >= 0){ displayTime(String(actTime)); actTime--; } else { doRun = false; } } } }
nein, auf dem ESP8266 gibt es von offizieller Seite keine threads für multithreading (ist wohl auch nicht vorgesehen), bis auf manche experimentelle Versuche einzelner Privatleute, ansonsten nur multithreading auf den normalen Arduinos (z.B. über Scheduler libs).
Ich könnte mir aber vorstellen, dass man aus den timer-Schleifen ausbrechen könnte, per semaphor
if(semaphor==x) return ()
Du springst andernfalls von loop aus die timer Funktion wiederholt an, lässt sie checken, und dann einen Wert zurückgeben, den du weiter verarbeitest (oder machst alles in loop).
Geändert von HaWe (04.12.2018 um 15:17 Uhr)
so in dieser Art:
Code:uint32_t starttime; void setup() { // put your setup code here, to run once: Serial.begin(115200); delay(3000); Serial.println("Serial started"); starttime=millis(); // start countdown } void setBGColor(uint32_t myColor){ } // eigene Funktion verwenden! void setcolor(uint32_t timesec) { uint32_t myColor2, myColor1, myColor0; // Color-Werte definieren! if(timesec>20) { setBGColor(myColor2); Serial.println("myColor2"); } else if(timesec<=5 && timesec>=0 ) { setBGColor(myColor0); Serial.println("myColor0"); } else if(timesec<=20 && timesec>0) { setBGColor(myColor0); Serial.println("myColor1"); } } uint32_t countdowntime=20; // sec countdown; void loop() { static int32_t passedsec, oldpassedsec=0, dtimesec=-1; passedsec= (millis()-starttime)/1000; if(oldpassedsec!=passedsec && passedsec<=countdowntime) { dtimesec=countdowntime-passedsec; Serial.println(dtimesec); setcolor(dtimesec); oldpassedsec=passedsec; if(dtimesec==0 && countdowntime==20) { countdowntime=120; starttime=millis(); } } // *SNIP* // do anything important // *SNIP* delay(1); // yield }
Geändert von HaWe (04.12.2018 um 15:15 Uhr)
hast du den Code mal getestet?
Hallo,
Vielen Dank für eure Hilfe.
Ich habe es nun zum laufen gebracht.
Vielen Dank an HaWe.
Jetzt ist es doch etwas grösser geworden.. Jaja.. mit dem essen steigt der Appetit.
Viele grüße
Michael
Sowas wie timer() in anderen Sprachen gibt es auch auf den ATmegas. Dazu muss aber der Timer programmiert werden, ist der dann abgelaufen, kann er einen Interrupt auslösen, so dass man also damit eine Funktion verbinden kann. Soweit meine laienhafte Beschreibung, ich habe das in anderen Zusammenhängen nebenbei mal gesehen, dass das möglich ist.In Java gibt's das Object Timer() und TimerTask()
MfG
Lesezeichen