Forum: Mikrocontroller und Digitale Elektronik Zeitsteuerung in einer while Schleife MicroPython


von Dieter T. (dieter_t)


Lesenswert?

Mein Programm:
1
import machine
2
import utime
3
import sys
4
letzte_zeit = 0
5
diff_erreicht = 0
6
7
def zeit_diff(schlafen):
8
    global letzte_zeit
9
    if utime.ticks_diff(utime.ticks_ms(), letzte_zeit) >= schlafen:
10
        letzte_zeit = utime.ticks_ms()
11
        diff_erreicht = 1
12
        return(diff_erreicht)
13
14
while True:
15
    print("I am the main program")
16
17
    if zeit_diff(2) == 1:
18
          print("do something when the time period-1 is up")
19
          diff_erreicht = 0
20
          
21
#how can I program this now, so that the next If statements are executed correctly.          
22
    
23
    if zeit_diff(1000) == 1:
24
          print("do something when the time period-2 is up")
25
          diff_erreicht = 0
26
27
    if zeit_diff(2000) == 1:
28
          print("do something when the time period-3 .... is up")
29
          diff_erreicht = 0

Ich möchte im Hauptprogramm zeitgesteuert verschiedene Aufgaben 
erledigen.
Wie muss ich mein Unterprogramm ändern, so das ich die If-Abfragen 
mehrfach
zeitgesteuert abfragen kann.
Bin noch ein Neuling.

: Verschoben durch Moderator
von chris_ (Gast)


Lesenswert?

Vielleicht gibt es auf deinem Micropythonsystem "thread". Das würde dann 
Multithreading erlauben:

https://techtutorialsx.com/2017/10/02/esp32-micropython-creating-a-thread/

von John Doe (Gast)


Lesenswert?


von Jemand (Gast)


Lesenswert?

Dieter T. schrieb:
>
1
> def zeit_diff(schlafen):
2
>     global letzte_zeit
3
>     if utime.ticks_diff(utime.ticks_ms(), letzte_zeit) >= schlafen:
4
>         letzte_zeit = utime.ticks_ms()
5
>         diff_erreicht = 1
6
>         return(diff_erreicht)
7
>

Einrückung und Scope beachten, bitte... Entweder so:
1
def zeit_diff(schlafen):
2
    global letzte_zeit
3
    if utime.ticks_diff(utime.ticks_ms(), letzte_zeit) >= schlafen:
4
        letzte_zeit = utime.ticks_ms()
5
        return 1 # besser: True
6
    return 0 # besser: False

oder so:
1
def zeit_diff(schlafen):
2
    global letzte_zeit
3
    diff_erreicht = 0 # besser: False
4
    if utime.ticks_diff(utime.ticks_ms(), letzte_zeit) >= schlafen:
5
        letzte_zeit = utime.ticks_ms()
6
        diff_erreicht = 1 # besser: True
7
    return diff_erreicht

HTH.

von Dieter T. (dieter_t)


Lesenswert?

Vereinfacht noch einmal das Ziel.

Mein Hauptprogramm läuft beständig durch.

alle zB. 2 sek soll die erste If-Bedingung abgefragt werden und falls 
sie erfüllt ist ausführen.

alle zB. 5 sek soll die zweite Bedingung abgefragt werden und falls 
erfüllt dann ausgefürt werden.

alle zB. 7 sek soll die dritte Bedingung abgefragt werden und falls 
erfüllt dann ausgefürt werden.

Dann wäre es gut die Differenz der einzelnen Abfragen als Rückgabe zu 
haben.

Es soll auch eine IF-Abfrage sein die, wenn sie erfüllt ist, dann z.B. 
wärend der Ausführung immer alle 2 sek. was ausführt.

Dies wäre noch die wichtigste Aufgabe.

im Hauptprogramm will ich dann abhängig vom code die einzelnen sek 
steuern können.

Und dann wird das gesammte sehr komplex für mich

von Karl (Gast)


Lesenswert?

Wenn du 3 Zeiten Willst, dann mach doch 3 Zähler. Sofern MicroPython OOP 
unterstützt, solltest du dich in OOP einarbeiten. Da machst du eine 
Klasse und dann 3 Instanzen mit den unterschiedlichen Zeiten.

Dieter T. schrieb:
> while True:
>     print("I am the main program")

Hier erscheint tausende male je Sekunde dein Text, willst du das 
wirklich?

von Dieter Tepe (Gast)


Lesenswert?

Hier erscheint tausende male je Sekunde dein Text, willst du das 
wirklich?
Natürlich nicht, der Satz steht da im Beispiel als Platzhalter für s 
Hauptpogramm

von Jemand (Gast)


Lesenswert?

Dieter T. schrieb:
> Vereinfacht noch einmal das Ziel.

Schon klar.

> Und dann wird das gesammte sehr komplex für mich

Bitte entschuldige, hast Du meinen vorherigen Beitrag verstanden? Wenn 
Du die von mir erwähnten Punkte nicht beachtest, wird das nämlich leider 
nie was. Anhand des Code, den Du oben gepostet hast, nehme ich an, daß 
Du Dich mit Python noch nicht sonderlich gut auskennst. Wenn meine 
Vermutung zutrifft, empfehle ich Dir wärmstens, zunächst einmal Python 
zu lernen und Dich erst dann an die Programmierung von Mikrocontrollern 
mit Micropython zu begeben, wenn Du die Sprache halbwegs beherrschst.

Übrigens würde ich das eher so machen, daß ich eine Klasse für den 
Counter schriebe, meine Funktionen mit ihren gewünschten 
Ausführungszeiten an einer Instanz dieser Klasse registrierte und eine 
weitere Methode (das könnte auch __call__() sein) der Instanz jede 
Sekunde von einem Hardware-Timer aufrufen ließe.

von Dieter T. (dieter_t)


Lesenswert?


von Dieter T. (dieter_t)


Lesenswert?

Jemand schrieb:
> Anhand des Code, den Du oben gepostet hast, nehme ich an

Mein Code lief ja bis zur 2 If Anfrage richtig, nur das Return hatte ich 
vor dem kopieren wohl verschoben. Das die nächsten beiden If Anfragen 
dann Globalen überschrieben hatten war mir auch klar.

Jemand schrieb:
> diff_erreicht = 1 # besser: True
>     return diff_erreicht

Mein gesamter Code war nur ein Beispiel das erklären sollte was ich 
erreichen wollte.
Und das letztendlich True und False besser ist sei Mal erst 
dahingestellt man könnte für die zweite If Anfrage mit der Variable als 
drei oder ..... weiterarbeiten.
Ja ich bin noch Neuling in Python aber deine Ausführungen darüber sind 
hohl. Wer sagt dir das ich keine Erfahrung in andere Sprachen habe 
........
Ich suche hier eigendlich nur nach eine bessere Lösung, oder bessere 
Ansätze. Vielleicht Hinweise wie man so etwas viel besser unter Python 
lösen kann.

: Bearbeitet durch User
von Jemand (Gast)


Lesenswert?

Dieter T. schrieb:
> Jemand schrieb:
>> Anhand des Code, den Du oben gepostet hast, nehme ich an
>
> Mein Code lief ja bis zur 2 If Anfrage richtig,

Er hat zufällig funktioniert, aber richtig war er trotzdem nicht. 
Anscheinend legst Du andere Qualitätskriterien für Deinen Code an als 
ich für meinen.

> nur das Return hatte ich
> vor dem kopieren wohl verschoben.

Das kann ich kaum glauben, denn dann hättest Du eine undefinierte 
Variable.

> Das die nächsten beiden If Anfragen
> dann Globalen überschrieben hatten war mir auch klar.

Das war aber gar nicht mein Punkt.

> Jemand schrieb:
>> diff_erreicht = 1 # besser: True
>>     return diff_erreicht
>
> Mein gesamter Code war nur ein Beispiel das erklären sollte was ich
> erreichen wollte.

Das hättest Du möglicherweise besser dazuschreiben sollen, für mich war 
das nicht ersichtlich. Was ich sehe, ist, daß Dein Code nicht 
funktioniert, und daß er das zumindest mit diesem Denkansatz auch nicht 
wird.

> Und das letztendlich True und False besser ist sei Mal erst
> dahingestellt man könnte für die zweite If Anfrage mit der Variable als
> drei oder ..... weiterarbeiten.

Dafür gibt es in Python so Dinger, wie hießen die noch gleich? Mist, 
vergessen.

> Ja ich bin noch Neuling in Python aber deine Ausführungen darüber sind
> hohl.

... und obwohl sie so hohl sind, hast Du sie nicht verstanden. Schade.

> Wer sagt dir das ich keine Erfahrung in andere Sprachen habe

Hat irgendjemand etwas dazu gesagt? Ich jedenfalls nicht. Meine 
Vermutung war, daß Du ein Neuling in Python bist, was Du gerade 
bestätigt hast. Deswegen hatte ich Dir geraten, Dich zunächst mit der -- 
also: dieser -- Sprache vertraut zu machen.

> Ich suche hier eigendlich nur nach eine bessere Lösung, oder bessere
> Ansätze. Vielleicht Hinweise wie man so etwas viel besser unter Python
> lösen kann.

Auch solche Hinweise habe ich Dir gegeben, aber sie waren Dir leider zu 
hohl. Nun, dann kann ich Dir wohl nicht helfen, schade, das tut mir 
leid. Insofern bleibt mir nur noch, meine Zeit nicht weiter zu 
verschwenden, und Dir viel Glück bei Deinen weiteren Versuchen zu 
wünschen -- ich vermute, daß Du es brauchen wirst.

von Dieter T. (dieter_t)


Lesenswert?

Jemand schrieb:
> Deswegen hatte ich Dir geraten, Dich zunächst mit der -- also: dieser --
> Sprache vertraut zu machen.
Bin ich nicht gerade dabei mich mit der Sprache vertaut zu machen.

Jemand schrieb:
> Auch solche Hinweise habe ich Dir gegeben, aber sie waren Dir leider zu
> hohl.
Das deine Hinweise zum Thema hol sind hab ich nie gesagt. Wenn ich dabei 
bin mich vertaut zu machen und jemand sagt ich soll mich erstmal 
vertraut machen, das finde ich schon ziemlich hohl.
John Die hat zB. ein super Hinweis gegeben wo ich mich vertaut machen 
könnte. Und siehe da mein Projekt ist ein Stück weitergekommen .

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.