Mit Python Messen, schreiben und Wert in txt Datei speichern


#1
Hallo zusammen

Ich habe mir ein Raspberry pi 3 erst vor einigen Wochen erworben um mit einem Ultraschall Sensor (SR 04) Die Schneehöhe automatisiert messen zu können. Dies ist zu mindest der Plan :)

Der Plan fürs erste ist das der Sensor misst, schreibt, und eine Text Datei mit einem Wert, jede Minute überschrieben wird mit neuem Wert. (automatisiert)
Die Text Datei könnte man automatisiert per FTP hoch laden und in eine Mysql Tabelle eintagen. (automatisiert)

Nun ich habe einige Anleitungen gefunden um das Raspberry einzurichten und ein Python Code gefunden
um den Sensor anzusprechen und Messungen zu machen und abzuspeichern in TXT.
Das Problem ist der Code ist nicht automatisiert.
Ich muss das Prog. mit "sudo python Ultraschall.py" starten, der Sensor misst alle 5 Sekunden ein ein Wert und Speichert die Werte erst in die Datei wenn ich manuell mit Ctrl. C das Programm beende.

Meiner Ansicht nach gibt 2 Lösungsansätze:
1.Man könnte den Code zu einer schlaufe bringen.

So das er nicht:
Misst (in 5Sek. Abstand), schreibt,.... manuell Stopt mitCtrl. und Speichert in txt.

Sondern:
Messen, Schreiben, Speichern, 5 sekunden pausiert und wider automatisch von vorne beginnt
Messen Schreiben Speichern

2. Der Andere Lösungsansatz währe:

Das Ultraschall.py Prog. extern mit externem .py Zu Starten und nach 7 Sek. zu beenden und danach erneut Starten. In Schleife.
Ich denke ist sicher die unelegantere Lösung.

Habe einiges probiert leider bin ich nicht der Python freak.
Ich versuchte den Code im untern teil bei der Ausgabe zu verändern um zu speichern ohne das Prg. stopen zu müssen,
leider wurde mir immer ein Fehler Protokolliert. :(

Hier den Code der Misst (in 5Sek. abstand), schreibt,.... manuell stopt mitCtrl. und Speichert in txt.

Code:
#Bibliotheken einbinden
import RPi.GPIO as GPIO
import time

#GPIO Modus (BOARD / BCM)
GPIO.setmode(GPIO.BOARD)
GPIO.setwarnings(False)
#GPIO Pins zuweisen
GPIO_TRIGGER = 16
GPIO_ECHO = 18

#Richtung der GPIO-Pins festlegen (IN / OUT)
GPIO.setup(GPIO_TRIGGER, GPIO.OUT)
GPIO.setup(GPIO_ECHO, GPIO.IN)


def distanz():
        # setze Trigger auf HIGH
        GPIO.output(GPIO_TRIGGER, True)

        # setze Trigger nach 0.01ms aus LOW
        time.sleep(0.00001)
        GPIO.output(GPIO_TRIGGER, False)

        StartZeit = time.time()
        StopZeit = time.time()

        # speichere Startzeit
        while GPIO.input(GPIO_ECHO) == 0:
                StartZeit = time.time()

        # speichere Ankunftszeit
        while GPIO.input(GPIO_ECHO) == 1:
                StopZeit = time.time()

        # Zeit Differenz zwischen Start und Ankunft
        TimeElapsed = StopZeit - StartZeit
        # mit der Schallgeschwindigkeit (34300 cm/s) multiplizieren
        # und durch 2 teilen, da hin und zurueck
        distanz = (TimeElapsed * 34300) / 2

        return distanz

if __name__ == '__main__':

  try:
    file_out = open("Testdatei.txt","w")

    while True:

      abstand = distanz()

      print ("Gemessene Entfernung = %.1f cm" % abstand)

      file_out.write("%.1f cm\n" % abstand)

      time.sleep(5)



  # Beim Abbruch durch STRG+C resetten

  except KeyboardInterrupt:

    print("Messung vom User gestoppt")

    GPIO.cleanup()

    file_out.close()
Ich währe euch sehr dankbar wenn mir jemand mit der Automatisierung der Erstellung der Text Datei alle 5sek Abgespeichert....helfen könnte.

Das mit dem hochladen der Datei und eintagen in Mysql. schaue ich später weiter.
Genau so das ich den Abstand vom Sensor bis zu Schneedecke messe und eintage was nicht die Schneehöhe ist

Danke im Voraus für ein Lösungsansatz
 
Zuletzt bearbeitet:

Technipion

Erfahrenes Mitglied
#2
Hallo Flipswetter,
wenn ich den aktuellen Code richtig verstehe, speicherst du bereits alle 5 Sekunden automatisiert einen neuen Wert in die Ausgabedatei (Testdatei.txt). Allerdings werden die Werte jeweils in eine neue Zeile geschrieben.

Kannst du vielleicht nochmal ein bisschen ausholen und genauer erklären, was das Python-Programm machen soll? Ich kenne mich recht gut mit Python/Raspi aus und könnte dir dann dabei helfen.
Allerdings habe ich im Moment den Eindruck, die Details sind noch nicht ganz ausgefeilt.

Am besten ist, du machst dir nochmal die übergeordnete Aufgabe klar. Dinge wie z.B. die Synchronisation per FTP, oder die Geschichte mit der MySQL-Datenbank müssen eigentlich klar sein bevor man an's Entwickeln eines einzelnen Unterprogrammes gehen kann.
Tipp: Da Python sehr mächtig ist, könnte man das evtl. auch mit dem Python-Programm machen. Andererseits bietet Linux natürlich auch alles was du brauchst.

Ich weiß wie ich gerade klinge, aber vertraue mir bitte, ich meine es nur gut mit dir :). Ein Software-System muss durchdacht sein, bevor man in die Entwicklung geht. Zumindest in einem gewissen Grad, sonst verlierst du irgendwann den Faden. Da spricht meine Erfahrung als Code-Cleaner ;).

Gruß Technipion