python ausgabe als lst speichern

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
frcom
User
Beiträge: 49
Registriert: Sonntag 24. September 2017, 19:35

Hallo liebe community,
ich habe folgendes Problem: Ich habe einen raspi 3 mit einem Ultraschallsender und -empfänger. Diese spreche ich über die GPIO-Pins mit einem pythonscript an:

Code: Alles auswählen

import RPi. GPIO as GPIO
import time

GPIO.setmode(GPIO.BCM)
GPIO_TRIGGER = 18
GPIO_ECHO = 24
GPIO.setup(GPIO_TRIGGER, GPIO.OUT)
GPIO.setup(GPIO_ECHO, GPIO.IN)

def distanz():
	GPIO.output(GPIO_TRIGGER, True)
	time.sleep(0.01001)
	GPIO.output(GPIO_TRIGGER, False)
	start = time.time()
	stop = time.time()
	while GPIO.input(GPIO_ECHO) == 0:
		start = time.time()
	while GPIO.input(GPIO_ECHO) == 1:
		stop = time.time()
	dauer = stop - start
	distanz = (dauer * 34320) / 2
	return distanz
	
if __name__ == '__main__':
	try:
		while True:
			abstand = distanz()
			time.sleep(1)
			print("Entfernung = %.1f cm" % abstand)
			
	except KeyboardInterrupt:
		print("		Messung gestoppt")
		GPIO.cleanup()
nun bekomme ich als outpu einfach jede Sekunde den gemessenen Wert. alles schön und gut... nun will ich diese Werte gerne in eine Datei als list speichern, um sie dann mittels matplotlib in ein Diagramm(y = Entfernung, x = Zeit) einzutragen. Erstmal würde mir reichen zu wissen, wie ich die ständigen outputs als list speichern kann... Wenn aber jmd gerade zufällig eine Idee hat, wie ich das Diagramm ständig live aktualisieren kann, beschwere ich mich sicher auch nicht ;)

meine Idee bisher ist, dass ich distanz einfach über

Code: Alles auswählen

def distanz():
[...]
if __name__ == '__main__':
[...]
variable = [distanz]
in eine Liste packe. Das logische Problem: variable wird ja dann ständig neu und anders definiert und nicht eine wachsende Liste erstellt. Ich weiß einfach nicht, wie ich da weiter komme. Vielen Dank für jede Hilfe!
Benutzeravatar
kbr
User
Beiträge: 1487
Registriert: Mittwoch 15. Oktober 2008, 09:27

frcom hat geschrieben:Erstmal würde mir reichen zu wissen, wie ich die ständigen outputs als list speichern kann...
Stell Dir vor, Du hast eine leere Liste. Immer dann, wenn ein Messwert erfasst wird, nutzt Du die Methode 'append' auf diese Liste um Zeitpunkt und Messwert hinzuzufügen. Das wäre schon mal ein Anfang.
frcom
User
Beiträge: 49
Registriert: Sonntag 24. September 2017, 19:35

Danke erstmal! so müsste das dann laufen oder? Habe gerade noch andere Fehler im Skript, weshalb ich es nicht einfach durchlaufen lassen kann...

Code: Alles auswählen

if __name__ == '__main__':
	try:
	liste = []
		while True:
			abstand = distanz()
			liste.append(abstand)
			print("Entfernung = %.1f cm" % abstand)
			
	except KeyboardInterrupt:
		print("			Messung gestoppt")
		GPIO.cleanup()
Vielen Dank für den Denkanschubser! So kommt man asntändig voran, ohne Erfolgserlebnisse zu verlieren...
frcom
User
Beiträge: 49
Registriert: Sonntag 24. September 2017, 19:35

Also, das hier hab ich jetzt:

Code: Alles auswählen

from __future__ import absolute_import, division, print_function
import RPi. GPIO as GPIO
import time
import matplotlib as mlp
import matplotlib.pyplot as plt

GPIO.setmode(GPIO.BCM)

GPIO_TRIGGER = 18
GPIO_ECHO = 24

GPIO.setup(GPIO_TRIGGER, GPIO.OUT)
GPIO.setup(GPIO_ECHO, GPIO.IN)

def distanz():
	GPIO.output(GPIO_TRIGGER, True)
	time.sleep(0.01001)
	GPIO.output(GPIO_TRIGGER, False)
	
	StartZeit = time.time()
	StopZeit = time.time()
	
	while GPIO.input(GPIO_ECHO) == 0:
		StartZeit = time.time()
	while GPIO.input(GPIO_ECHO) == 1:
		StopZeit = time.time()
	
	TimeElapsed = StopZeit - StartZeit
	distanz = (TimeElapsed * 34320) / 2
	return distanz

pause = input("Eingeben, wie lange zwischen den Messungen pausiert werden soll (Angabe in Sekunden): ")
anzahl = input("Eingeben, wie viele Messungen nacheinander durchgefuehrt werden sollen: ")
a = 0
liste = []

if __name__ == '__main__':
	try:
		while a < anzahl:
			a = a + 1
			abstand = distanz()
			liste.append(abstand)
			print("Entfernung = %.1f cm" % abstand)
			time.sleep(pause)
		
		with open('Messwerte_liste.txt', 'w') as out_file:
			out_file.write('{0}\n'.format(', '.join(str(n) for n in liste)))
			
		xmax = len(liste) * anzahl
		xmax = float(xmax)
		ymax = max(liste) + max(liste)/10
		ymax = float(ymax)
		x = liste
		y = []
		y2 = 0
		y.append(0)
		while y2 < anzahl:
			y2 = y2 + pause
			y.append(y2)
		

		plt.plot( x, y, 'bo')
		plt.title("Entfernungsmessung")
		plt.axis( [0, xmax, 0, ymax] )
		plt.grid(True)
		plt.xlabel("Zeit, t [s]")
		plt.ylabel("Entfernung, s [cm]")
		plt.savefig('Diagramm.png')
		plt.show()

			
	except KeyboardInterrupt:
		print("Messung gestoppt")
		print(liste)
		GPIO.cleanup()
allerdings bekomme ich die Fehlermeldung, dass plt nicht definiert ist... der import von matplotlib scheint nicht zu funktionieren, wenn ich aber normal python 3 ausführe kann ich es importieren. Weiß jemand, was da das Problem sein könnte? wäre euch sehr dankbar!
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

@frcom: also entweder bekommst Du einen ImportError (kein NameError), oder irgendeinen anderen Fehler, bei dem es schön wäre, wenn man die genaue Meldung sehen könnte.

Kann es sein, dass Du für Python2, mit dem Du das Skript offensichtlich ausführst, gar kein Matplotlib installiert hast?

Die Zeitmessung ist mit `wait_for_edge` genauer und resourcenschonender. Warum stehen die vier Anweisungen vor dem `if __name__ == '__main__':`? Diese und alles was nach dem if kommt, sollt eigentlich in eine Funktion wandern, die man üblicherweise `main` nennt. `input` sollte in Python2 nicht verwendet werden, nimm `raw_input` und wandle die Zahlen explizit mit `int`/`float` um. Variablen initalisiert man erst, wenn man sie braucht. `a` und `liste` sind sehr weit vom `while` entfernt (2 Ebenen). Statt der while-Schleife nimmt man besser eine for-Schleife. Eingerückt wird immer mit 4 Leerzeichen, nicht 3. Das GPIO.cleanup sollte in einem finally-Block stehen, so wie jetzt wird es im Normalfall gar nicht ausgeführt.
Antworten