Programm unterbrechen und bei bestimmter Bedingung weiterlaufen lassen.

Python auf Einplatinencomputer wie Raspberry Pi, Banana Pi / Python für Micro-Controller
Antworten
Schlangenmensch
User
Beiträge: 61
Registriert: Freitag 18. Februar 2022, 10:13

Hallo,
ich möchte an einem Ferraris-Stromzähler die Umdrehungen der "Zählerscheibe" mitschreiben. Um ein Permanentes schreiben bei "if MOVE.read_u16() > 3500:" zu vermeiden, würde ich gerne eine Bedingung einbauen, die das Programm erst wieder weiterlaufen lässt, wenn sich "if MOVE.read_u16() > 3500:" ändert.

Mir scheint "break" der falsche Ansatz zu sein und würde mich über eure Tips freuen.

Code: Alles auswählen

from machine import ADC,Pin  #ADC0 an A0 von TCR5000 anschliessen.
from utime import sleep
from ds1302 import DS1302



MOVE = ADC(0)
LED = Pin(25,Pin.OUT)



ds =DS1302(Pin(18),Pin(17),Pin(16))

ds.date_time()



#ds.date_time([2022, 5, 2, 00, 12, 07, 00]) #auskommentieren
i = 0

while True:
    
        
    
        (Y,M,D,day,hr,m,s)=ds.date_time()


    
        if s < 10:
            s = "0" +str(s)

        if m < 10:
            m = "0" +str(m)
        
        if hr < 10:
            hr = "0" +str(hr)
        
        if D < 10:
            D = "0" +str(D)
        
        if M < 10:
            M = "0" +str(M)
        
        if Y < 10:
            Y = "0" +str(Y)
        
        
        

        
            
    
    
    
        if MOVE.read_u16() > 3500: #Freq sollte vorher getestet werden.
            i = i + 1
            print("1")
            LED.value(1)
            
            
        
            
            with open("red.txt", "a") as file:
                file.write(str(Y) + ":" + str(M) + ":" + str(D) +  " ; " )
                file.write(str(hr) + ":" + str(m) + ":" + str(s) + " ::: " + (str(i)) + "\n" )
                file.close()
              
            def pause():
                while True:
                    if Move.read_u16() < 3500:
                        
                        break
          
            
                
             
            sleep(2)
            
   #         if i >= 5:
    #            i = 0
     #           with open("red.txt", "a") as file:
      #              file.write("\n" + "Stillstand" + "\n" + "\n")
       #             file.close()
        #    
         #           sleep(10)
                
            
            
            
       
            
            #if MOVE.read_u16() < 3500: #Freq sollte vorher getestet werden.
             #   i = 0
              #  print("0")
               # LED.value(0)
                
            
            
            #sleep(2)
        
__deets__
User
Beiträge: 14543
Registriert: Mittwoch 14. Oktober 2015, 14:29

Meine Guete, woher hast du denn diese Leerzeichenwueste? Das kann man ja kaum entziffern. Und bevor es jetzt wieder losgeht mit dem "wie ich meinen Code schreibe ist meine Sache, warum koennt ihr euch nicht auf die eigentliche Frage fokussiern": wir muessen den Code schon lesen koennen, damit wir ihn verstehen und verbessern koennen. Und letztlich profitierst davon auch du.

Deine Beschreibung ist ziemlich unklar, aber grundsaetzlich ist es schon richtig, mit while auf das eintreten der guewenschten Bedingung zu warten. Welche das genau ist kann ich nicht sagen, wie gesagt: zu unklar. Aber vor allem wuerde man auch gleich

Code: Alles auswählen

while bedingung_nicht_erfuellt():
    pass
schreiben, statt da nochmal ein if reinzuschnoerkeln, welches dann ein break benoetigt.

Das du "pause" nicht aufrufst ist dir klar? Sieht man vielleicht nicht so gut. Siehe oben.
Schlangenmensch
User
Beiträge: 61
Registriert: Freitag 18. Februar 2022, 10:13

Sorry, ich stehe noch ganz am Anfang mit der Programmierung und habe das Tutorial auch noch nicht durchgearbeitet. Ich habe auch schon div. User zur Weißglut gebracht weil ich mich nicht an die Conventionen von Micropython halte. Ich habe leider immer nur wenig Zeit und bin zu ungeduldig um die Codes "ordentlich" zu schreiben. Ich gelobe Besserung.

Kann ich in micropython überhaupt break: verwenden?
__deets__
User
Beiträge: 14543
Registriert: Mittwoch 14. Oktober 2015, 14:29

Die Besserung gelobst du ja schon eine ganze Weile...

Natuerlich kann micropython break. Wieso denkst du das koennte es nicht? Hast du verstanden, was ich dir geschrieben haben? Das du dein pause gar nicht benutzt? Wenn man das nicht aufruft, kann es auch nicht break benutzen.
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

Die vielen Leerzeilen machen den Code praktisch unlesbar. Auch Micropython kennt Stringformatierungen, die den Code stark vereinfacht.

Code: Alles auswählen

from machine import ADC, Pin  #ADC0 an A0 von TCR5000 anschliessen.
from utime import sleep
from ds1302 import DS1302

MOVE = ADC(0)
LED = Pin(25, Pin.OUT)

ds =DS1302(Pin(18), Pin(17), Pin(16))
# ds.date_time([2022, 5, 2, 00, 12, 07, 00])
i = 0
while True:
    if MOVE.read_u16() > 3500: #Freq sollte vorher getestet werden.
        i += 1
        print("1")
        LED.value(1)
            
        (Y, M, D, day, hr, m, s) = ds.date_time()
        with open("red.txt", "a") as file:
            file.write(f"{Y:02d}:{M:02d}:{D:02d} ; {hr:02d}:{m:02d}:{s:02d} ::: {i}\n")
        sleep(2)
        while MOVE.read_u16() < 3500:
            pass
Schlangenmensch
User
Beiträge: 61
Registriert: Freitag 18. Februar 2022, 10:13

Das mit break frage ich nur weil micropython ja eingeschränkte Funktionen gegenüber Python hat. Ich hatte da auch mal wegen utime und sleep Probleme. Mir ist klar das ich "pause" definiere, was mir aber nicht ganz klar ist, wo ich "pause" aufrufen kann damit die Bedingung ausgeführt wird.
__deets__
User
Beiträge: 14543
Registriert: Mittwoch 14. Oktober 2015, 14:29

Da, wo du das willst, musst du das aufrufen. Wie jede andere Funktion auch.
Schlangenmensch
User
Beiträge: 61
Registriert: Freitag 18. Februar 2022, 10:13

Ok, das Programm läuft mit Eueren Änderungen so wie ich mir das vorgestellt habe. Ich bedanke mich für Euere unendliche Geduld mit mir und wünsche Euch noch einen schönen Feiertag.

Was mich aber noch interessieren würde, woher bekomme ich die Kürzel der Stringformatierung bzw. was bedeutet {Y:02d}.
Benutzeravatar
sparrow
User
Beiträge: 4195
Registriert: Freitag 17. April 2009, 10:28

Aus der Dokumentation.
Antworten