Forum: Mikrocontroller und Digitale Elektronik ESP32 multiple Software Timer


von Rainer M. (rainermk)


Lesenswert?

Ich habe ein Projekt, das mehrere (6) Sensoren innerhalb loop auswertet 
und bei erreichen eines Grenzwertes ein Gerät für einige Sekunden 
einschalten soll. Das Ausschalten soll im Hintergrund ausserhalb von 
loop geschehen.
Ich weiß, dass es hier Bibliotheken gibt, habe so etwas ähnliches schon 
vor langer Zeit mit eine Arduino Nano realisiert. Brauche jetzt aber 
einen ESP wegen WiFi etc.
Leider kann ich keine Bibliothek dazu finden.

Kann mir irgendwer bitte eine Link dazu geben.

Herzlichsten Dank im voraus.

Rainer

von Patrick C. (pcrom)


Lesenswert?

Dafuer braucht man nicht mehrere timers, sondern 1 timer der zB jede 
1msec ein counter erhoht.
Beim Arduino heisst das millis(), ich denke der ESP hat da denke auch 
schon etwas standard eingebaut.

Beim Programmierung started man nicht jedes mal einen neuen timer, aber 
definiert man bei welche millis etwas passieren soll.

https://www.arduino.cc/reference/en/language/functions/time/millis/

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Rainer M. schrieb:
> Das Ausschalten soll im Hintergrund ausserhalb von loop geschehen.
Warum so umständlich?

Du kannst doch in der Mainloop (die ja sowieso dauernd schnellstmöglich 
durchlaufen werden soll) einfach abfragen, ob die Zeit schon um ist. Und 
wenn es so weit ist den Ausgang deaktivieren.

Oder wird deine Mainloop aus irgendwelchen Gründen nicht 50..1000 mal 
pro Sekunde durchlaufen?

von J. S. (jojos)


Lesenswert?

hier ist ein gute Sucheseite für Arduino Libs:
https://www.arduinolibraries.info/

Da gibt es reichlich Treffer für Timer.

von Mario M. (thelonging)


Lesenswert?

Der Bibliotheksverwalter bietet z.B. "UniversalTimer" an.

https://github.com/michaelgranz/UniversalTimer

von Rainer M. (rainermk)


Lesenswert?

Sicher geht das auch in der Mainloop die oft genug durchlaufen wird, 
schon wegen OTA und millis verwende ich da schon für die Abfrage der 
Kanäle mit in einer 5 Sekunden Abfolge.

Was ich aber gerne möchte, ist dass ich nach dem Einschalten eine 
Funktion aufrufe die nach übergebener wieder ausschaltet ohne mich darum 
in loop kümmern zu müssen.

z.B. wie inzwischen gefunden 
https://github.com/espressif/arduino-esp32/blob/master/libraries/Ticker/examples/TickerBasic/TickerBasic.ino 
oder ähnlich. Muss mal sehen ob das passt.

Gruß

Rainer

von Pandur S. (jetztnicht)


Lesenswert?

> .. ohne mich darum in loop kümmern zu müssen.

Irgendwie wird das nichts mit Programmieren werden.

von Mike R. (thesealion)


Lesenswert?


von Arduino F. (Firma: Gast) (arduinof)


Lesenswert?

Rainer M. schrieb:
> das mehrere (6) Sensoren innerhalb loop auswertet

Warum diese Fixierung?

Merke:
loop() ist auch nur eine FreeRTOS Thread/Task

Kein Problem weitere Tasks zu starten. FreeRTOS macht dir dann auch das 
Timing.

von Εrnst B. (ernst)


Lesenswert?

Mike R. schrieb:
> Die notwendigen Librarys sind bei einem ESP32 doch schon mit dabei
> 
https://www.freertos.org/Documentation/02-Kernel/02-Kernel-features/05-Software-timers/01-Software-timers

Da sind sogar zwei Timer-"Libraries" dabei, die IDF-eigenen haben mehr 
Auflösung und hätten die Option, den Timer-Callback direkt im 
ISR-Kontext auszuführen.

https://docs.espressif.com/projects/esp-idf/en/stable/esp32/api-reference/system/esp_timer.html

Die oben verlinkte "Ticker"-Arduino-Bibliothek nutzt die ESP-IDF-Timer.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.