Seite 1 von 1
Schleife benötigt die jede Sekunde einen Messwert ausgeben soll
Verfasst: Donnerstag 12. November 2015, 12:17
von dejvid
Hallo zusammen,
ich versuche die ganze Zeit einen Code zu programmieren der mir einen Messerwert jede Sekunde ausgeben soll, nur klappt dies nicht so wie ich möchte.
Er spuckt mir leider pro Sekunde gefühlte 20 Werte aus anstatt nur einen auszugeben.
Hier ist mein Code:
Code: Alles auswählen
from sense_hat import SenseHat
import time
import datetime
sense = SenseHat()
temp = sense.get_temperature()
print("Temperature: %s C" % temp)
humi = sense.get_humidity()
print("Luftfeuchtigkeit: %s Prozent" % humi)
press = sense.get_pressure()/1000
time_old = time.strftime("%S") + time.strftime("%M")
time_old = int(time_old)
while True:
while time_old <= time.strftime("%S") + time.strftime("%M"):
print("Druck: %s bar" % press, time.strftime("%Y:%m:%d:%H:%M:%S"))
time_old = time_old + 1
Ich habe versucht, dass in derVariable time_old zunächst die aktuellen minuten und sekunden zusammen gezählt werden und daraufhin in der While schleife eine sekunde dazu addiert werden soll. Nur iwie addiert er die eine Sekunde nicht dazu.
Kann mir da bitte jemand einen Denkanstoß oder Tipp geben?
Re: Schleife benötigt die jede Sekunde einen Messwert ausgeben soll
Verfasst: Donnerstag 12. November 2015, 12:48
von BlackJack
@dejvid: Sekunden und Minuten zu addieren macht keinen Sinn. Was soll denn das sein wenn man 5 Minuten plus 3 Sekunden rechnet und 8, äh ja 8 was genau herausbekommt? Ausserdem addierst Du auch gar nicht die Zahlen sondern fügst die Zeichenkettenreräsentationen zusammen und wandelst *das* dann in eine Zahl um. Bei dem Beispiel ergeben 5 Minuten und 3 Sekunden dann 35, wo sich auch wieder die Frage stellt 35 *was*? Was soll das bedeuten? Ein weiteres Problem sind die zwei unabhängigen `strftime()`-Aufrufe. Zwischen den beiden Aufrufen vergeht ja auch Zeit und in dieser Zeit kann die Uhr von einer Minute auf die nächste springen womit die beiden Werte nicht mehr zusammen passen. Wenn der Sekundenaufruf um 5:59s passiert dann hat man für die Sekunden den Wert 59 und wenn zwischen den beiden Aufrufen die Uhr auf 6:00s umspringt hat man für die Minuten den Wert 6, also zusammen eigentlich die Werte die man um 6:59s erwartet — fast eine ganze Minute in die Zukunft.
Die aktuelle Zeit in Sekunden bekommt man übrigens mit der `time.time()`-Funktion.
Verwende doch einfach ein `time.sleep()`. Falls Dir das zu ungenau ist weil der Code in der Schleife ja auch ein wenig Zeit benötigt, dann müssten wir erst einmal ermitteln wie gross die Abweisung und der „Jitter“ ist und ob das in einem Rahmen liegt mit dem man nicht sowieso leben muss wenn man kein Echtzeitbetriebssystem verwendet. Eventuell ist das `sched`-Modul aus der Standardbibliothek an der Stelle noch interessant.
Re: Schleife benötigt die jede Sekunde einen Messwert ausgeben soll
Verfasst: Donnerstag 12. November 2015, 13:07
von dejvid
Moin BlackJack,
ich habe das Problem bemerkt und habe daraufhin M und S vertauscht, so dass die Minuten an erster Stelle stehen.
So soll er zum Beispiel 3 Minuten und 10 Sekunden zu der Zahl 310 zusammen fügen, wie dus auch schon gesagt hast. Ich mache das aus diesem Grund, weil wenn ich nur die Sekunden betrachten würde er nach 59 Sekunden auf Null springt und die andere Variable hochzählt, was folgt -> die Bedingung nicht mehr gelten wird.
Mit der Sleep funktion hatte ich es auch schon probiert, ist leider nur zu ungenau für unseren Betreuer.
Die Time.time() Funktion spuckt mir noch zusätzliche einen Komma-Wert aus, den ich gar nicht gebrauchen kann.
Mein Problem liegt vermute ich an der Bedingung.
Re: Schleife benötigt die jede Sekunde einen Messwert ausgeben soll
Verfasst: Donnerstag 12. November 2015, 13:14
von BlackJack
@dejvid: Wieso kannst Du den Kommawert nicht gebrauchen? Wenn Du die Nachkommastellen nicht berücksichtigst, dann wird es nur *ungenauer*. Wenn Du einen Zeitpunkt `timestamp` hast der mit `time.time()` erzeugt wurde und wissen willst wie lange Du ”schlafen” musst, damit Du eine Sekunde weiter bist, dann brauchst Du doch nur ein
Code: Alles auswählen
timestamp = time.time()
while True:
messung()
next_timestamp = timestamp + 1
time.sleep(next_timestamp - timestamp)
timestamp = next_timestamp
Oder halt das `sched`-Modul verwenden statt das Rad selber neu zu erfinden.
Re: Schleife benötigt die jede Sekunde einen Messwert ausgeben soll
Verfasst: Donnerstag 12. November 2015, 13:27
von dejvid
Das ist aufjedenfall eine gute Idee und werde es später ausprobieren.
Da ich mich leider noch nicht so gut mit python auskenne, kenne ich das sched Modul nicht.
Was kann ich mit diesem Modul machen?
Vielen dank für deine Unterstützung!
Re: Schleife benötigt die jede Sekunde einen Messwert ausgeben soll
Verfasst: Donnerstag 12. November 2015, 13:39
von BlackJack
@dejvid: Module in der Standardbibliothek haben eine Dokumentation:
https://docs.python.org/2/library/sched.html
Re: Schleife benötigt die jede Sekunde einen Messwert ausgeben soll
Verfasst: Montag 28. Dezember 2015, 12:57
von masterof
Das folgende Beispiel zeigt einen einfachen Thread, der alle fünf Sekunden die aktuelle Zeit ausgibt:
Code: Alles auswählen
import thread
import time
def print_time(delay):
while 1:
time.sleep(delay)
print time.ctime(time.time())
# Starte den neuen Thread.
thread.start_new_thread(print_time, (5,))
# Nun tue etwas anderes, während der Thread läuft.
while 1:
pass
quelle Seite 176:
http://www.reportlab.com/media/imadj/da ... 3e3d0e.PDF
Re: Schleife benötigt die jede Sekunde einen Messwert ausgeben soll
Verfasst: Montag 28. Dezember 2015, 13:26
von pillmuncher
masterof hat geschrieben:
Dave Beazley ist einer meiner Helden. Sein Buch ist von 1999. Seitdem haben sich ein paar Kleinigkeiten geändert. Zum Beispiel man soll neuderdings nicht mehr das
thread-Modul, sondern das
threading-Modul verwenden. Mit
neuerdings meine ich: seit ungefähr 15 Jahren.
Re: Schleife benötigt die jede Sekunde einen Messwert ausgeben soll
Verfasst: Montag 28. Dezember 2015, 13:42
von BlackJack
Das ganze mal in die Gegenwart portiert:
Code: Alles auswählen
#!/usr/bin/env python
# coding: utf8
from __future__ import absolute_import, division, print_function
import time
from datetime import datetime as DateTime
from threading import Thread
def print_time(delay):
while True:
time.sleep(delay)
print(DateTime.now())
def main():
thread = Thread(target=print_time, args=(5,))
thread.daemon = True
thread.start()
while True:
time.sleep(1)
if __name__ == '__main__':
main()