Messwerte grafisch darstellen - wie macht man das?

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • .
    .
    edit 13.05.2014: Das Projekt ist inzwischen umgesetzt: PiUS - Die Zisterne sendet Daten zum Wasserstand
    .
    .
    Ich hoffe die Frage steht im richtigen Unterforum. Falls nicht, bitte verschieben.

    Ich habe vor, den Wasserpegel einer Zisterne zu überwachen und graphisch darzustellen. Hierzu habe ich dieses Projekt nachgebaut: http://www.gtkdb.de/index_36_2272.html

    Das läuft soweit im Testaufbau einwandfrei. Nun bringt es mir aber nichts, die Entfernung zur Wasseroberfläche in cm zu sehen. Ich bräuchte die Angabe in %, wobei 50cm 100% entspricht und 200cm 0 % entsprechen.

    Zusätzlich möchte ich die Daten mit Datum und Uhrzeit in einer Grafik darstellen. Die Werte sollen im Realbetrieb alle 30 Minuten geholt werden. Das sollte für eine vernünftige grafische Aufbereitung ausreichen. Die Grafiken soll für einen Tag, für eine Woche, für einen Monat und für ein Jahr erstellt werden. Zusätzlich soll ein Langzeitgraph erstellt werden. Das alles soll dann über eine Homepage dargestellt werden.

    Ich habe schon im Netz gesucht, aber nicht das Passende gefunden. Was ich gefunden habe, ist RRDTool, aber da habe ich nur Lösungen gefunden, die Werte auswerten, die über RS232 reinkommen.

    Kennt jemand ein Projekt, das die Daten ähnlich graphisch aufbereitet, wie es mir vorschwebt? Oder vielleicht eine Software ähnlich RRDTool, die ich dafür nutzen könnte?

  • Messwerte grafisch darstellen - wie macht man das?? Schau mal ob du hier fündig wirst!

    • Offizieller Beitrag

    Hi die Zurordnung der Entfernungen zu % kriegst du hin? Wo speicherst du die Daten? Bestimmt in einer Datenbank, oder?. Wenn du die Werte dort hast, kannst du die grafische Auswertung mit allem machen was es im Netz so gibt, jpgraph und Highcharts fallen mir auf Anhieb ein, wenn es wirklich in Python sein soll wäre gnuplot.py eine mögliche Lösung.

  • Die Zuordnung bekomme ich nicht hin. Mein Problem ist, dass ich nicht programmieren kann. Die hiesige VHS bietet keine passenden Kurse an und der größte Computer Laden in der Gegend, der etliche Kurse gibt, bietet weder etwas für Linux, noch zum programmieren an. Also habe ich damit angefangen, ein Buch zu lesen. Aber das ist alles so komplex, dass es meinen (Frei)Zeitrahmen sprengt. Da beisst sich dann die Katze in den Schwanz, denn ohne diese verflixte Software kann ich meine Ideen nicht umsetzen. Daher suche ich ähnliche Projekte, die ich relativ einfach auf meine Hardware abändern kann.

    So wie ich Deine Fragen verstehe, müsste es so sein, dass der ausgegebene Wert mit Datum und Uhrzeit in eine Datenbank geschrieben wird. Von dort wird es dann von einer Software ausgelesen, die die Grafiken erstellt. Soweit richtig verstanden?

    Kannst Du mir einen Tip geben, wo ich deutschsprachige Informationen zum Thema Datenbank finde, die so geschrieben sind, dass auch ein Anfänger sie versteht?


  • Ich habe schon im Netz gesucht, aber nicht das Passende gefunden. Was ich gefunden habe, ist RRDTool, aber da habe ich nur Lösungen gefunden, die Werte auswerten, die über RS232 reinkommen.

    Kennt jemand ein Projekt, das die Daten ähnlich graphisch aufbereitet, wie es mir vorschwebt? Oder vielleicht eine Software ähnlich RRDTool, die ich dafür nutzen könnte?

    kannst du nicht folgendes abwandeln ?
    [Tutorial] 1Wire Temperaturmessung mit Datenerfassung und Visualisierung

    Kellermann66
    9. September 2013 um 11:01

    dort bei 1 ist der Werdegang doch erklärt

    aus Temperatur wird eben Wasserstand und das Umrechnen fällt dir leicht

    lasst die PIs & ESPs am Leben !
    Energiesparen:
    Das Gehirn kann in Standby gehen. Abschalten spart aber noch mehr Energie, was immer mehr nutzen. Dieter Nuhr
    (ich kann leider nicht schneller fahren, vor mir fährt ein GTi)

    • Offizieller Beitrag
    Zitat

    So wie ich Deine Fragen verstehe, müsste es so sein, dass der ausgegebene Wert mit Datum und Uhrzeit in eine Datenbank geschrieben wird. Von dort wird es dann von einer Software ausgelesen, die die Grafiken erstellt. Soweit richtig verstanden?

    . Der Wert vom Sensor wird zu erst in deine Prozentzahl umgewandelt und dann in einen DB geschrieben.
    Ich würde das so umrechnen:

    Wenn kleiner-gleich 50cm, dann 0 (Prozent), größer-gleich 200cm dann 100 (Prozent). Ansonsten gilt: 200 - 50 = 150 (zu betrachtender Messbereich) / 100 = 1,5cm/pro 1 %

    Beispiel:

    100cm gemessen

    (100-50) / (150/100) = 33,3; stimmt auffallend ;)

    [code=php]
    # calculate distance
    TimeElapsed = StopTime - StartTime
    Distance = (TimeElapsed * 34300) / 2
    If Distance <= 50: Distance = 100
    If Distance >= 200: Distance = 0
    If Distance != 50 and Distance != 0:
    Distance = 100 - ((Distance-50) / 1,5)
    return Distance[/php]

    Beispiele zum Speichern in Datenbanken findest du hier zu Hauf, das Thema timestamp hatten wir auch schon ein paar mal. Beachte: Immer nur Zahlen Speichern. "Sinnlose" Formatierungszeichen wie cm/% usw, gehören auf den Bildschirm, nicht in die Datenbank.

    Ich nutze ja auch so einen Sensor und habe teilweise extreme Abweichungen/Fehlmessungen bemerkt, wie ist das bei dir?

    Edit: code angepasst


  • Wenn kleiner-gleich 50cm, dann 0 (Prozent), größer-gleich 200cm dann 100 (Prozent). Ansonsten gilt: 200 - 50 = 150 (zu betrachtender Messbereich) / 100 = 1,5cm/pro 1 %
    Beispiel:

    100cm gemessen

    (100cm-50cm) / (150cm/100%) = 33,3% ; stimmt auffallend ;)


    (100-50) cm / 1,5 cm/% = 33,3 %

    habe ich auch so ungefähr rausbekommen nur ist die Steigung negativ je größer desto weniger (in den Grenzen von 50cm-200cm)

    was ist mit 180cm ?

    rechne ich nach obiger Rechnung (180 - 50) / 1,5 hätte ich 86% :s

    es müsste aber weniger sein als 86% also ist der Pegel 100% - 86% = 14% weil bei 200cm ja 0% sind

    Tabelle

    200cm = 0%
    168cm = 25%
    125cm = 50%
    83cm = 75%
    50cm = 100%

    Bilder

    lasst die PIs & ESPs am Leben !
    Energiesparen:
    Das Gehirn kann in Standby gehen. Abschalten spart aber noch mehr Energie, was immer mehr nutzen. Dieter Nuhr
    (ich kann leider nicht schneller fahren, vor mir fährt ein GTi)

    Einmal editiert, zuletzt von jar (30. April 2014 um 11:25)

  • Willst du die prozentuale "Leere" darstellen oder der prozentualen Füllgrad? Willst du sagen Zisterne ist zu 14% leer oder zu 86% gefüllt ( letzteres würde ich machen außerdem würde ich die gesamte Höhe nehmen -> trockene Zisterne ist 0% gefüllt.

    --
    man ist das System-Anzeigeprogramm für die Handbuchseiten von Linux.

    • Offizieller Beitrag

    jar

    da hast du wahr ;). Es ist natürlich negativ, ich hab die Formel oben angepasst. Der Sinn sollte aber erkennbar sein. Auch ist es nicht sonderlich schwer zu lesen so das weitere Anpassungen durch den TE erfolgen können. Programmieren ist ja kein Hexenwerk.

  • habe mal ein Bild eingefügt und eine Tabelle

    lasst die PIs & ESPs am Leben !
    Energiesparen:
    Das Gehirn kann in Standby gehen. Abschalten spart aber noch mehr Energie, was immer mehr nutzen. Dieter Nuhr
    (ich kann leider nicht schneller fahren, vor mir fährt ein GTi)

  • Hallo dbv,

    Zitat

    Programmieren ist ja kein Hexenwerk.

    Doch! :daumendreh2: Das muss es sein - sonst würden sich da mehr heranwagen.

    Es muss irgendetwas Verborgenes dahinter stecken, einem programmierbaren Dings Geheimnisse zu entlocken, die ohne Eigen-Programmierung nie zutage kommen würden.

    Beste Grüße

    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

    Einmal editiert, zuletzt von Andreas (30. April 2014 um 14:47)

  • So, nachdem ich nun endlich die Hardware installiert habe (Tutorial folge demnächst mit Fotos) und auch auf Anhieb alles läuft, kommt nun die Software dran. Ich habe mir die Zeile durchgelesen. Soweit ist das (sogar für mich halbwegs) nachvollziehbar. Nachdem mir die Suchmaschine erklärt hat, dass ich mit /* und */ etwas auskommentieren kann, habe ich damit die Originalzeilen auskommentiert und statt dessen Deine eingefügt.

    Leider ist da aber noch irgendein Fehler drin.

    Code
    pi@raspberrypi ~ $ sudo ./ultrasonic.py 
      File "./ultrasonic.py", line 36
        If Distance <= 50: Distance = 100
                  ^
    SyntaxError: invalid syntax
    pi@raspberrypi ~ $


    Testweiweise habe ich das Gleichheitszeichen weg gelassen, aber daran scheint es nicht zu liegen. Bevor ich jetzt wegen Unkenntnis den Abend mit "Try and Error" verbringe, mal die Frage in die Runde, bzw. dbv, sofern er online ist. Wo liegt da jetzt der Fehler?

  • Jetzt meckert er schon wieder über etwas anderes:

    Code
    pi@raspberrypi ~ $ sudo ./ultrasonic.py 
    Traceback (most recent call last):
      File "./ultrasonic.py", line 75, in <module>
        main()
      File "./ultrasonic.py", line 54, in main
        Distance = MeasureDistance()
      File "./ultrasonic.py", line 39, in MeasureDistance
        Distance = 100 - ((Distance-50) / 1,5)
    TypeError: unsupported operand type(s) for -: 'int' and 'tuple'
    pi@raspberrypi ~ $

    Hat wohl doch was mit Hexerei zu tun ;)

  • Hallo Neueinsteiger,

    na also, da geht doch was.

    Vermutlich haben die Daten, die in der Zeile verwendet werden, unterschiedliche Datentypen. Kannst Du mal den Code für Deine Funktion MeasureDistance schicken? Vermutlich gibt diese keine Ganzzahl zurück.

    Äh.. Anders:

    Mach doch mal:

    1.

    Code
    Distance = 100 - ((Distance-50) / 1.5)

    oder - wenn's nicht will - dann

    2.

    Code
    Distance = 100.0 - ((Distance-50.0) / 1.5)

    also Dezimalpunkt - kein Dezimalkomma.

    Wenn mein Tip funktioniert: Keinen Code für MeasureDistance schicken ;)

    Gutes Gelingen

    Andreas


    P.S.: Ich kann kein Python...

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

    Einmal editiert, zuletzt von Andreas (3. Mai 2014 um 22:13)

  • Der komplette Code wurde hier kopiert. http://www.gtkdb.de/index_36_2272.html Ich habe lediglich die GPIO Pins angepasst.
    Der Originalcode läuft von Anfang an einwandfrei. Daran oder an den Pins liegt es also schonmal nicht.

    Okay, also erster Tip ergibt:

    Mache ich die ".0" noch hinter die 50, dann kommt:

    Ich kann weder, noch...

  • Hallo Neueinsteiger,


    Code
    Distance = 100.0 - ((Distance-50) / 1.5)

    1 Punkt 5 - nicht 1 Komma 5

    Dann bitte noch mal starten...


    Viel Erfolg!

    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

    Einmal editiert, zuletzt von Andreas (3. Mai 2014 um 22:58)

  • Ah, ich glaub ich habs.

    Code
    # von dbv - original wurde auskommentiert
      TimeElapsed = StopTime - StartTime
      Distance = (TimeElapsed * 34300) / 2
      if Distance <= 50.0: Distance = 100.0
      if Distance >= 200.0: Distance = 0.0
      if Distance != 50.0 and Distance != 0.0:
        Distance = 100.0 - ((Distance-50.0) / 1.5)
      return Distance

    Kann es sein, dass es am Komma bei "1,5" gelegen hat? Das habe ich gegen einen Punkt getauscht. Nun sieht es so aus:

    Morgen tausche ich noch "cm" gegen "%". Jetzt gehts in die Horizontale, der Tag war lang.

    edit: Du warst schneller.

  • Hallo Neueinsteiger,

    wenn Du jetzt noch in Deinen Code etwas wie

    Code
    GPIO.setwarnings(False)

    einbaust, dann kommt folgende WARNUNG nicht mehr:

    Code
    ./ultrasonic.py:68: RuntimeWarning: This channel is already in use, continuing anyway.  Use GPIO.setwarnings(False) to disable warnings.

    Ursache ist, dass Du wahrscheinlich die GPIO-Ports, die Du während des Testens Deines Programmes ausliest, nicht sauber geschlossen hast. Vielleicht hast Du das Programm unterbrochen?

    Das passiert mir auch - ist nicht tragisch, sieht nur unschön aus.


    Gutes Gelingen!

    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

  • Guten Morgen zusammen,

    ich sitze nun schon eine ganze Weile vor dem Script und habe diverse Probleme. Ein kleiner Schönheitsfehler ist die Messungenauigkeit des Sensors. Die Entfernung schwankt von Messung zu Messung ein wenig. Eine Lösung wäre vielleicht, 10 Sekunden lang jede Sekunde eine Messung durchzuführen, das Ergebnis durch die Anzahl der Messungen zu teilen und dann auszugeben.

    Zu Testzwecken habe ich das Script kopiert und in cm-messung.py benannt. Also nicht wegen des Namens wundern. Das nächste ist das Prozentzeichen. Wenn ich statt "cm" "%" einsetze, meckert er rum. Daher habe ich das Wort "Prozent" eingesetzt. Das sieht so aus:

    Code
    Distance = MeasureDistance()
          print("Füllstand = %.0f %" % Distance)
          time.sleep(1)

    Ergibt folgenden Fehler:

    Code
    Traceback (most recent call last):
      File "cm-messung.py", line 95, in <module>
        main()
      File "cm-messung.py", line 58, in main
        print("Füllstand = %.0f %" % Distance)
    ValueError: incomplete format
    pi@raspberrypi ~/zisterne $

    Und dann mein größtes Problem, das Schreiben des Ergebnisses in eine Datei, um diese Daten im nächsten Schritt in eine Datenbank einzulesen. Ich habe den auf der ersten Seite von jar verlinkten Artikel als Grundlage genommen und den meines Erachtens passenden Teil in mein Script kopiert. Das klappt natürlich nicht. Der Fehler lautet:

    Code
    pi@raspberrypi ~/zisterne $ sudo ./ultrasonic.py 
      File "./ultrasonic.py", line 64
        Datum = strftime("%d.%m.%Y")
                                   ^
    IndentationError: unindent does not match any outer indentation level
    pi@raspberrypi ~/zisterne $

    Da es evtl. mit der Zeitvariable zusammenhängen könnte, habe ich noch folgendes am Anfang des Scriptes eingefügt:

    Code
    # Zeitvariable definieren
     lt = localtime()

    Das ergibt natürlich auch direkt wieder einen Fehler:

    Code
    pi@raspberrypi ~/zisterne $ sudo python cm-messung.py 
      File "cm-messung.py", line 9
        lt = localtime()
        ^
    IndentationError: unexpected indent
    pi@raspberrypi ~/zisterne $

    Das komplette Script sieht zur Zeit so aus:

    Hat jemand Ideen zur Lösung der Probleme? Das simpelste wird die Darstellung des Prozentzeichens sein. Leider habe ich keinen Plan, wie ich vorgehen muss, damit das Zeichen als solches dargestellt wird und nicht als Variable oder Ähnliches angesehen wird :(

  • Moin,

    ich kann Dir zwar mit Python nicht unbedingt helfen, aber in C ist das so, dass das %-Zeichen verdoppelt werden muss, um ausgegeben zu werden (also "%%").
    Zum Rest: warum liest Du nicht einfach die Fehlermeldung? Python ist so nett und sagt Dir ganz genau was faslch ist. Sicher ... es ist einfacher mal hier nachzuhaken, aber da hätte mein persönlicher Ehrgeiz was dagegen. Ausserdem würde ich mich nicht so recht wohlfühlen, wenn ich die Benutzer hier mit solch lapidaren Sachen beschäftigen würde. Und wenn alle Stricke reissen gibt's Handbücher und google ...

    cheers,
    -ds-

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!