Wert von Pythonscript in CSV Datei speichern

Python auf Einplatinencomputer wie Raspberry Pi, Banana Pi / Python für Micro-Controller
erz55
User
Beiträge: 9
Registriert: Mittwoch 22. Februar 2017, 15:42
Kontaktdaten:

Mittwoch 22. Februar 2017, 17:05

Hallo,
ich braeuchte mal eure Hilfe. Um es vorweg zunehmen, mein Wissen um Python und Co
ist nicht weltbewegend. Ich habe den folgenden Code zusammengestellt. Er funktioniert so auch,
obwohl es bestimmt professioneller geht. Nun mein Problem. Wie kann ich den Wert der mit
" print("%1.2f" % delta ) "
ausgegeben wird, extra noch in eine txt oder csv Datei schreiben?
Ich habe dieses Forum schon durchsucht und verschieden Sachen gefunden, aber ich bekomme es nicht
in die Reihe das fuer michzu nutzen.
Ich bin fuer jede Hilfe dankbar.

Code: Alles auswählen

#!/usr/bin/python
import RPi.GPIO as GPIO
import time
import datetime

# Variablen initialisieren
Tic = 0    # Zaehler
stopp = 0  # Zeitpunkt steigende Flanke 
start = 0  # Zeitpunkt fallende Flanke
delta = 0  # Zeitdifferenz zwischen start und stopp

# GPIO initialisieren
GPIO.setmode(GPIO.BCM)
GPIO.setup(21, GPIO.IN) 

# internen Pullup-Widerstand aktivieren.
GPIO.setup(21, GPIO.IN, pull_up_down = GPIO.PUD_UP)

# Callback-Funktion fuer beide Flanken
def measure(channel):
  global start
  global stopp
  global delta
  if GPIO.input(21) == 0:       # fallende Flanke, Startzeit speichern
    start = time.time()
  else:                         # steigende Flanke, Endezeit speichern
    stopp = time.time()
    delta =  stopp - start       # Zeitdifferenz berechnen
    print("%1.2f" % delta )  
    
    
# Interrupt fuer beide Flanken aktivieren
GPIO.add_event_detect(21, GPIO.BOTH, callback=measure, bouncetime=50)#bouncetime=200

try:
  while True:
    # nix Sinnvolles tun
    Tic = Tic + 1
    #print "Tic %d" % Tic
    time.sleep(1)

# reset GPIO settings if user pressed Ctrl+C
except KeyboardInterrupt:
  GPIO.cleanup()
  print("\nBye!")
Zuletzt geändert von Anonymous am Mittwoch 22. Februar 2017, 17:47, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
Sirius3
User
Beiträge: 7608
Registriert: Sonntag 21. Oktober 2012, 17:20

Mittwoch 22. Februar 2017, 18:10

@erz55: Callback-Routinen sind nicht dazu da, Daten zu speichern oder groß auszuwerten. Am besten verwendest Du eine Queue, um die Ereignisse in das Hauptprogramm (das ja im Moment noch arbeitslos ist) zu übergeben:

Code: Alles auswählen

#!/usr/bin/python
import RPi.GPIO as GPIO
import time
import Queue
 
# Callback-Funktion fuer beide Flanken
def measure(queue):
    # Flanke und Zeit speichern
    queue.put((GPIO.input(21) == 0, time.time()))
   
def main():
    # GPIO initialisieren
    GPIO.setmode(GPIO.BCM)
    GPIO.setup(21, GPIO.IN)
    
    # internen Pullup-Widerstand aktivieren.
    GPIO.setup(21, GPIO.IN, pull_up_down = GPIO.PUD_UP)

    queue = Queue.Queue()
    # Interrupt fuer beide Flanken aktivieren
    GPIO.add_event_detect(21, GPIO.BOTH, callback=lambda _: measure(queue), bouncetime=50)
 
    try:
        while True:
            edge, zeit = queue.get()
            if edge:
                start = zeit
            else:
                delta = start - zeit
                print("%1.2f" % delta)
    except KeyboardInterrupt:
        pass
    finally:
        GPIO.cleanup()
    print("\nBye!")

if __name__ = '__main__':
    main()
Dort ist es dann auch nicht schwer, statt des print eine Ausgabe in eine Datei zu schreiben.
erz55
User
Beiträge: 9
Registriert: Mittwoch 22. Februar 2017, 15:42
Kontaktdaten:

Mittwoch 22. Februar 2017, 18:38

Hallo Sirius3,

erstmal vielen Dank fuer die schnelle Antwort. Habe es gleich getestet.
Als Ausgabe kommt allerdings ein negativer Wert ( z.B. -2.18).
Ist es auch moeglich die Ausgabe so zu machen, das die Zeit zusammen gezaehlt wird?
Also Taster druecken - Zeit lauft - Taster loslassen - Zeit wird gespeichert und ausgegeben - Taster wieder druecken -
Zeit laeuft - Taster loslassen - Zeit wird dazugezaehlt und ausgegeben.
Wie gesagt , ich hab wirklich nicht viel Ahnung von der ganzen Sache. Und es ist auch keine Faulheit von mir.
Deshalb habe ich auch noch keinen Schimmer, wie man es macht den Wert in eine Datei auszugeben.
Kannst du mir bitte helfen.
__deets__
User
Beiträge: 2695
Registriert: Mittwoch 14. Oktober 2015, 14:29

Mittwoch 22. Februar 2017, 18:57

Ein bisschen zu versuchen zu verstehen was da passiert bei DEINEM Projekt solltest du schon. Und die Grundlagen der Arithmetik sind ja auch seit der Grundschule bekannt. Wenn da eine negative Zahl bei rum kommt, woran kann denn das liegen? Wo wird denn gerechnet, und was laeuft da falsch?
erz55
User
Beiträge: 9
Registriert: Mittwoch 22. Februar 2017, 15:42
Kontaktdaten:

Mittwoch 22. Februar 2017, 19:11

Da hast du schon rech und das mit dem Negativwert hab ich rausgekriegt
( Start und Zeit getauscht). Das mit der Grundschule ist aber schon wieder
reichlich 50 Jahre her. :D :D :D
Fuer das andere waere bisschen Hilfe nicht schlecht.
__deets__
User
Beiträge: 2695
Registriert: Mittwoch 14. Oktober 2015, 14:29

Donnerstag 23. Februar 2017, 11:53

In eine Datei zu schreiben ist ja nicht wirklich schwierig:

Code: Alles auswählen

with open("/pfad/zur/datei", "w") as outf:
    wert = 1.0
    outf.write("{}\n".format(wert))
Das musst du nun nur noch geschickt einbauen.
erz55
User
Beiträge: 9
Registriert: Mittwoch 22. Februar 2017, 15:42
Kontaktdaten:

Donnerstag 23. Februar 2017, 12:29

Da war ich wohl zu langsam. Ich hab es mal so probiert:

Code: Alles auswählen

try:
        while True:
            edge, zeit = queue.get()
            if edge:
                start = zeit
            else:
                delta = zeit - start
                print("%1.2f" % delta)
                s = ("%1.2f" % delta)
                f = file("verbrauch.csv", "w")
                f.write(s)
                f.close()
                
Das geht auch. Jetzt probier ich mal das von dir.
Was muss ich jetzt noch machen um das hinzubekommen?
Taster druecken - Zeit lauft - Taster loslassen - Zeit wird gespeichert und ausgegeben - Taster wieder druecken -
Zeit laeuft - Taster loslassen - Zeit wird dazugezaehlt und ausgegeben.
Sirius3
User
Beiträge: 7608
Registriert: Sonntag 21. Oktober 2012, 17:20

Donnerstag 23. Februar 2017, 13:01

@erz55: Du mußt halt die neue Dauer auf die alte Zeitdauer draufaddieren.
erz55
User
Beiträge: 9
Registriert: Mittwoch 22. Februar 2017, 15:42
Kontaktdaten:

Donnerstag 23. Februar 2017, 13:39

Muss ich das so verstehen:
Wert aus Datei "verbrauch.csv" lesen.
Gelesener Wert plus aktueller Wert und diesen neuen Wert
wieder in Datei schreiben.
Das ist mir zu hoch.

Code: Alles auswählen

#!/usr/bin/python
import RPi.GPIO as GPIO
import time
import Queue

# Callback-Funktion fuer beide Flanken
def measure(queue):
    # Flanke und Zeit speichern
    queue.put((GPIO.input(21) == 0, time.time()))

def main():
    # GPIO initialisieren
    GPIO.setmode(GPIO.BCM)
    GPIO.setup(21, GPIO.IN)
   
    # internen Pullup-Widerstand aktivieren.
    GPIO.setup(21, GPIO.IN, pull_up_down = GPIO.PUD_UP)
 
    queue = Queue.Queue()
    # Interrupt fuer beide Flanken aktivieren
    GPIO.add_event_detect(21, GPIO.BOTH, callback=lambda _: measure(queue), bouncetime=50)
 
    try:
        while True:
            edge, zeit = queue.get()
            if edge:
                start = zeit
            else:
                delta = zeit - start
                print("%1.2f" % delta )
                s = ("%1.2f" % delta )
                f = file("verbrauch.csv", "w")
                f.write(s)
                f.close()
                
    except KeyboardInterrupt:
        pass
    finally:
        GPIO.cleanup()
    print("\nBye!")
 
if __name__ == '__main__':
    main()
Sirius3
User
Beiträge: 7608
Registriert: Sonntag 21. Oktober 2012, 17:20

Donnerstag 23. Februar 2017, 14:54

@erz55: wenn Du es schon beschreiben kannst, dann kann es ja nicht mehr zu hoch sein. Aber so kompliziert brauchst Du es Dir ja nicht zu machen, da Du ja weißt, welchen Wert Du im Schritt davor in die Datei geschrieben hast, brauchst Du ihn nicht wieder lesen.
erz55
User
Beiträge: 9
Registriert: Mittwoch 22. Februar 2017, 15:42
Kontaktdaten:

Donnerstag 23. Februar 2017, 15:21

Soweit versteh ich das schon. Der Wert "delta" wird in die Datei geschrieben.
Jetzt kommt der neue Wert, ist ja auch "delta" und ueberschreibt sofort das alte "delta".
An welcher Stelle soll ich die beiden "delta" addieren. :K
Etwa so:

Code: Alles auswählen

try:
        while True:
            edge, zeit = queue.get()
            if edge:
                start = zeit
            else:
                delta = zeit - start
                dauer = delta + delta
                print("%1.2f" % dauer )
                s = ("%1.2f" % dauer )
                f = file("verbrauch.csv", "w")
                f.write(s)
                f.close()
sebastian0202
User
Beiträge: 168
Registriert: Montag 9. Mai 2016, 09:14
Wohnort: Berlin

Donnerstag 23. Februar 2017, 15:49

Du solltest dir unbedingt Anfänger Tutorials zu Python durchlesen.

Code: Alles auswählen

    try:
            dauer = 0
            while True:
                edge, zeit = queue.get()
                if edge:
                    start = zeit
                else:
                     # delta = zeit - start
                    dauer += zeit - start
                    print("%1.2f" % dauer )
                    s = ("%1.2f" % dauer )
                    f = file("verbrauch.csv", "w")
                    f.write(s)
                    f.close()
Sirius3
User
Beiträge: 7608
Registriert: Sonntag 21. Oktober 2012, 17:20

Donnerstag 23. Februar 2017, 15:54

wobei die Klammern bei print und der Zuweisung zu s überflüssig sind, dass der String zweimal erzeugt wird unschön ist, statt "file" "open" zum Öffnen von Dateien verwendet wird und man Dateien am besten mit dem with-Statement öffnet.

Code: Alles auswählen

            dauer = 0
            while True:
                edge, zeit = queue.get()
                if edge:
                    start = zeit
                else:
                     # delta = zeit - start
                    dauer += zeit - start
                    s = "%1.2f" % dauer
                    print s
                    with open("verbrauch.csv", "w") as f:
                        f.write(s)
erz55
User
Beiträge: 9
Registriert: Mittwoch 22. Februar 2017, 15:42
Kontaktdaten:

Donnerstag 23. Februar 2017, 16:14

Haette ich so nicht hin bekommen.
Danke an alle die mir weiter geholfen haben.
erz55
User
Beiträge: 9
Registriert: Mittwoch 22. Februar 2017, 15:42
Kontaktdaten:

Freitag 24. Februar 2017, 17:16

Hallo nochmal,
ich moechte die Datei "verbrauch.csv" unter /var/www/html erstellen lassen,
so das ich im Netzwerk drauf zugreifen kann.
Bekomme aber immer die Fehlermeldung:
Traceback (most recent call last):
File "/var/www/html/verbrauch.py", line 45, in <module>
main()
File "/var/www/html/verbrauch.py", line 33, in main
f = file("verbrauch.csv", "w")
IOError: [Errno 13] Permission denied: 'verbrauch.csv'

Muss ich da die Berechtigungen aendern?

Danke
Antworten