Anfäner Fragen erstes Projekt - Python, Sensoren, Programmierung, RR-DB/CSV

  • Hallo Gemeinde,


    ich bin Raspberry- und Python Neuling – eigentlich unterstütze ich nur seien Freund bei seinem ersten Projekt einer kleinen MSR Station.


    Mein letztes Programmieren mit C und Java liegt Jahre zurück und ehe ich falsche oder schlechte Ratschläge gebe oder eine Käfer-Fabrik „MyBug4you“ eröffne .. dachte ich es wäre klüger im Forum zu fragen.


    Das Projekt in Kurzform:
    Temperaturmessung in eine CSV oder eine RoundRobin-Datenbank (RR wäre cool da es da auch code gibt um das grafisch aufzubereiten) von einem/mehreren 1-Wire Sensor DS1820 oder vergleichbar. Dazu ein paar Status-Leds und Taster für Start/Stop/Notiz


    Da ich als Kind der C64 Generation über den PC vom Spaghetti Code zum Prozeduralen und zum OO gekommen bin habe ich zwar ein Grobkonzept im Kopf aber eben leider mehr aus der Hüfte geschossen und wäre dankbar wenn ich hier ein paar Hilfestellungen bekommen kann.


    Da eine Messung alle 2-5 Sekunden mehr als ausreichend ist denke ich dass ic bei vielem nicht auf Speed setzen muss aber ich würde gerne sauber und modular arbeiten und sehe mich an der einen oder anderen Stelle noch ahnungslos ...

    Ich mache hier mal ein ausführliches Posting was wir haben und gesehen aben und hoffe dass dann wenigstens nicht der Eindruck besteht dass wir eine fertige Lösung vom Forum erwarten; es geht um Angreungen und Hinweise worauf man achten sollte (neben der vermaledeiten Einrückung in Py)


    Gedanklich bin ich etwa soweit:




    Meine Fragen sind aktuell insbesondere
    (A)
    Ein Problem sehe ich dabei, dass der Buzzer und die Notiz Led nur kurz aktiv sein sollen ich aber gerne die Messung weiter laufen lassen will. Als Hardware-Hack dachte ich an einen kleine Elko der per Transistor durchgeschaltet wird. Softwareseitig würde mir nur ein Zeitstempelvergleich einfallen wenn ich nicht die Messung für 2-5 Sekunden anhalten will (was im konkreten Fall noch ok wäre aber mir unsauber erscheint).


    (B)
    Ein Problem sehe ich dabei, dass ich nicht weiss ob ich in eine CSV mittels Datei-File-Write schreiben soll oder besser eine RR-DB nehme von der ich aber nicht weiß ob ich die dann zB in LibreCalc einlesen kann um noch mit den Werten zu arbeiten


    (C)
    Ein Problem sehe ich dabei, dass ich nicht weiß ob das mit den Prozeduren oder Funktionen in Python so machbar ist oder ob ich was übersehen habe; ich lese mich gerade seit ein paar Tagen ein nachdem ich diverse Codes ähnlicher Projekte gesehen habe und nun weiß was wir ungefähr wollen/brauchen


    An Quellcodes habe ich mir u.a. folgendes angesehen:


    für Die Messung selbst dachte ich etwa an den Code aus „http://www.netzmafia.de/skripten/hardw…rojekt-Onewire/“ allerdings müsste ich entweder dann am Ende die Daten filtern und sortieren oder jeden Sensor in eine eigene DB/CSV schreiben wenn ich mal mehr als einen verwende



    für den Taster dann an den Code von „https://www.xgadget.de/anleitung/rasp…r-anschliessen/“ anlehnen:



    und für die LED dann nach dem Code von „http://technik.elbebilder.de/2014/12/28/sen…erry-pi-taster/



    .. es wäre toll ein wenig Feedback und Anergungen zu bekommen

    Danke schon vorab :)

    Gruß

    Mike


    • EDIT: korrektes quoten mit dem CodeTag
    • EDIT: procedure LedAnDauer() dazu
    • EDIT: Name drunter ;)
  • Anfäner Fragen erstes Projekt - Python, Sensoren, Programmierung, RR-DB/CSV? Schau mal ob du hier fündig wirst!

  • Hallo raspberry.myvogt.lu,

    herzlich Willkommen in unserem Forum!

    Da alles, was Du zu Deinem Projekt benötigst, hier im Forum schon zigfach durchgekaut wurde, möchte ich Dir nur ein paar Anregungen bringen.

    Auch wenn die Foundation für den Raspberry Pi die Programmiersprache Python empfiehlt, kannst Du trotzdem die Programmiersprache einsetzen, die Dir aus der Erfahrung heraus besser zusagt. Ich habe schon hunderte an Programmen (von Dreizeiler bis zu Anwendungspaketen mit mehreren zigtausend Codezeilen) für den Raspberry Pi geschrieben. Darunter war keine einzige Zeile Python. Es gaht also auch ohne die empfohlene Programmiersprache ;) .

    Lobenswert ist, dass Du schon mal reichlich Code gepostet hast und damit bewiesen hast, dass Du Dir Gedanken gemacht hast, recherchiert hast etc.

    Aus Deinen Bemerkungen entnehme ich, dass Du Gedenkst alle 2 bis 5 Sekunden Sensoren abzufragen. Hier solltest Du bedenken, dass der DS18B20 eine Auslesezeit von 750 (Datenblatt) bis 950 ms (meine Ergebnisse) benötigt. Schneller geht es nur, wenn Du die zu schaufelnden Bits verringerst- verbunden damit ist dann eine geringere Auflösung. Bei 9 Bits = 0,5 °C Auflösung sind es dann nur noch um die ca. 100 ms Auslesezeit (genauere Werte siehe im Datenblatt des DS18B20).

    Außerdem steht der DS18B20 im Verdacht, seine Temperatur zu erhöhen und damit die Messergebnisse zu verfälschen, wenn er mit zu hoher Frequenz ausgelesen wird.



    Meine Fragen sind aktuell insbesondere
    (A)
    Ein Problem sehe ich dabei, dass der Buzzer und die Notiz Led nur kurz aktiv sein sollen ich aber gerne die Messung weiter laufen lassen will. Als Hardware-Hack dachte ich an einen kleine Elko der per Transistor durchgeschaltet wird. Softwareseitig würde mir nur ein Zeitstempelvergleich einfallen wenn ich nicht die Messung für 2-5 Sekunden anhalten will (was im konkreten Fall noch ok wäre aber mir unsauber erscheint).


    Was hindert Dich daran? Du setzt einen Ausgabe-Pin für die LED auf 1 = HIGH, dann leuchtet die LED solange, bis auf den gleichen Pin eine 0 gesendet wird. Dauerhaftes Leuchten ist in keiner Weise mit einer CPU-Auslastung verbunden. Deine Messung kann unabhängig vom Leuchtstatus eine LED fortgesetzt werden.

    Meines Erachtens brauchst Du da keinerlei Zusatz-Hardware.



    (B)
    Ein Problem sehe ich dabei, dass ich nicht weiss ob ich in eine CSV mittels Datei-File-Write schreiben soll oder besser eine RR-DB nehme von der ich aber nicht weiß ob ich die dann zB in LibreCalc einlesen kann um noch mit den Werten zu arbeiten

    Das kannst Du halten, wie Du willst. Beides geht. Du kannst auch das, was Du mit den Daten anstellen möchtest, alles in Deiner Anwendung programmieren. Das ist dann ein enormer Lerneffekt, als wenn Du für jedes Features einen Datentransfer zu einer anderen Anwendung betreibst. Du kannst in jeder vernünftigen Programmiersprache Daten einlesen, Dateien schreiben, Messwerte vergleichen oder auswerten, Messwerte graphisch anzeigen, in die Graphik hineinzoomen, ...



    (C)
    Ein Problem sehe ich dabei, dass ich nicht weiß ob das mit den Prozeduren oder Funktionen in Python so machbar ist oder ob ich was übersehen habe; ich lese mich gerade seit ein paar Tagen ein nachdem ich diverse Codes ähnlicher Projekte gesehen habe und nun weiß was wir ungefähr wollen/brauchen


    Das wird in Python genauso erfolgreich werden wie es in C, C++, Icon, Lazarus/FreePascal, und vielen anderen Programmiersprachen werden könnte.


    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.

  • Wenn du Code posten willst dann nutze bitte: FAQ => Nützliche Links / Linksammlung => HowTo: CODE / PHP Code im Forum posten


    Es gibt viele Möglichkeiten die Sensoren auszulesen und grafisch darzustellen/visualisieren. Erst kürzlich wurde über die Möglichkeiten der Visualisierungen in einem anderen Thread gesprochen: Messdaten visualisieren (zoomen, Zeitraum, ...)
    Denkbar wäre beispielsweise auch eine Darstellung über Tkinter wie du hier sehen kannst: Tkinter Label per after() aktualisieren

    Wenn du nur die Messwerte visualisieren möchtest kann ich folgendes empfehlen: FAQ => Nützliche Links / Linksammlung => Python: Sensor Werte mit HighCharts visualisieren
    Aber das funktioniert natürlich auch über den herkömmlichen Weg via apache2&Co.

    Du musst die Sensoren auch nicht zwangsläufig mit Python auslesen, oder zwangsweise in eine RRD Datenbank schreiben - es gibt unzählige Möglichkeiten.

    Was du allerdings mit den Start/Stop/Notice Tastern machen möchtest hab ich im Zusammenhang einer MSR Station noch nicht verstanden :s

  • Hallo Andreas und MeigrafD,

    danke für eure Ausführungen. :helpnew:

    Mir ist schon klar dass es grds in jeder Sprache geht - da ich mich aber eh einarbeiten muss und aus allem ewig raus bin wollte ich mich an das halten wo ich die meisten Codes gefunden habe - und das ist Python ...

    Was echt toll war: der Hinweis zum Sensor der sich bei zu hoher Abfrage Taktung erwärmt - Dickes danke! :danke_ATDE:


    Noch Offen da doof gefragt: :wallbash:

    (1) Ich hatte gehofft dass mir jmd kurz exemplarisch sagt, wie ich eine procedure deklariere, ob diese nur Eingabe oder auch Rückgabewert(e) hat und ob ich hier einen Datentyp deklarieren muss (jaja ich lese nebenbei gerade ein Buch zu Py und einige zum Raspberry + diverses online aber fragen schadet nie und gute Antworten schließen Lücken die man noch selber nicht gemerkt hat)

    (2) Sind Variablen in Py Global also im gesamten Proggy oder lokal auf die jew. procedure begrenzt? :helpnew:

    (3) bisher weiß ich nur dass auch eine RR-DB als Datei angelegt wird. Ich wollte aber wissen ob diese wie eine CSV auslesbar ist oder ob ich das nur wieder mit tools oder Code umformen muss :helpnew:

    (4a) Led Leuchtsdauer / Taster mittendrin im MSR: :@
    Es soll eine Temperaturkurve zwischen zwei Zeitpunkten erfasst werden.
    Dafür die beiden Taster Start und Stop sowie dazu passend eine Signal LED
    Zusätzlich soll ein weiterer Kontakt/Taster kennzeichnen wenn (geplant) eingegriffen wurde um solche Messpunkte wiederzufinden ohne handschriftlich Zeit Datum und Zeitstempel nieder zuschreiben und dafür vorher auf stdout zu legen.

    (4b) Led Leuchtsdauer / Taster mittendrin im MSR: :@
    Problem dafür sehe ich darin dass eben die Bestätigung für einen von mehreren möglichen Eingriffen nicht durchgehend brennen soll sondern nur einige Sekunden anzeigen soll dass getastet wurde also der Zeitpunkt erfasst wurde (ich habe nur 1 Butter mit einem Tonsignal und wollte nicht auch noch den Soundport neu proggen müssen)

    (5) :denker:
    .. in dem Zusammenhang mit dem Sensor der sich erwärmt wenn er zu oft und schnell ausgelesen wird würde ich vermutlich eh eine Pausenschleife / sleeptimer von 2-5 Sekunden zwischen 2 Messungen einbauen; das würde aber auch die Reaktion auf die Taster wohl auch verzögern die müssten also 2-5 Sekunden lang gedrückt werde damit das erkannt wird?? -> oder muss ich dann doch an Interrupt Programmierung ran? :huh:

  • Bevor du weitere Fragen stellst wäre es denk ich besser du beschreibst mal ausführlicher was du eigentlich vor hast. Deine Stichpunkte in Beitrag#1 sind nicht vielsagend. Daraus geht nicht wirklich die Zusammenhänge hervor oder wie du die Bedienung sowie Visualisierung umzusetzen gedenkst. Ebenso Was überhaupt gemessen werden soll und welchen Grund es hat alle 2 Sekunden eine erneute Messung durchzuführen etc.

    Python ist nicht gleich Python. Man kann viele Wege gehen, nur ob der gewählte auch Sinnvoll ist hängt von den Details des Ziels ab.

    Guck dir auch mal deinen bearbeiten Beitrag#1 an - der ist jetzt fast unleserlicher als vorher...

  • Puh - ich dachte es wäre besser geworden ;) naja ok also; dann eben doch eine ausführliche Projektbeschreiebung auch wenn wir hier nur die fehlenden Codeschnippsel suchen und daher nicht unbedingt das kleine Projekt inklusive unfertigem "Lastenheft" präsentieren wollten solange wir noch mitten in der ersten Lernkurve stecken:

    .. ich greife nur einem Kollegen unter die Arme der seine Ausbildung im Bereich Chemie macht und dabei ein Projekt vorgeschlagen hat; eine teure Labormaschine die nix wesentlich anderes macht mit dem Raspy nachzustellen.

    Da ich früher (!) mal programmiert habe und technisch anders denke und plane als er haben wir uns entschlossen es zusammen zu durchdenken; dabei kam dann raus dass ich teils sehr konkrete Vorstellungen habe aber beim Codieren noch etwas Hilfe (hier?) brauche.

    Es soll gemessen werden wie sich die Temperatur bei der Mischung von 2 Flüssigkeiten ändert.
    Da es sich um Chemikalie handelt die gelöst gemischt werden ist es wohl mehr oder weniger exotherm und im Bereich 15-70 Grad zu erwarte (ganz grob).

    Die Mischung erfolgt Abschnittsweise/Portionsweise in einem freien Zeitrahmen.
    Immer wenn die Temp. Anstiege zu gering ausfallen wird nachgefüllt.
    Dass muss notiert werden.

    Es soll also erfasst werden:
    - Temperatur/Sensorwert und Zeitpunkt

    Die Messung soll mit dem Taster [T_Start] begonnen werden. Das soll dann auch die Led [L_Start] signalisieren dass die Messung läuft und der Buzzer [B_sound] soll mal tuten.

    Verflacht der Anstieg der Temperaturkurve (Vergleich verwerte deltaT mit akt. Wert) wird die Led [L_TempFlach] aktiviert, es tönt der Buzzer [B_sound] und es wird mit dem Taster [T_Zugabe] quittiert, es erfolgt Beigabe der nächsten Mengeneinheit Chemikalien und das soll über die Led [L_Zugabe] kurz (5 Sekunden) angezeigt werden; der Zeitpunkt der Zugabe ist gesondert zu erfassen; sollte also irgendwo notiert/gespeichert werden

    Während der Messung wird lfd der Sensor [S_Temp] ausgelesen. Es wird min, max, Mittelwert lfd mitgeschrieben, es wird lfd jeder Messwert mit Zeitpunkt gespeichert.

    Ist das gesamte Volumen gemischt und es erfolgen keine weiteren Zugaben so wird die Messung manuell mit dem Taster [T_Ende] beendet.
    Zur Bestätigung soll die Led [L_Ende] leuchten und es tönt der Buzzer [B_sound] .

    Wir aben also Taster für Start/Stop/Zugabe von Chemie deren Drücken erfasst protokolliert und signalisiert werden soll (Sound+Led, Eintrag in Datei).

    Wir haben die Signalgeber für Start/Stop/Temp etc die jeweils an/aus müssen und den Buzzer der genau so wie eine Led angesteuert werden soll.

    Das Messintervall ist natürlich teils abhängig von der Geschwindigkeit der Mischung; hier wird nicht geschüttet sondern getropft ;;). dennioch dachten wir dass alle 2-10 Sekunden eine gute Idee wäre ; in der praxis misst man manuell etwa alle 30 Sekudnen und notiert per Hand ; wir wollen die Kurve genauer und eine größere Datenmenge tut nicht weh. Vllt setzen wir das Intervall später auc als freien Parameter.


    Anmerkung so ebenbei: :angel:
    auch ohne das Projekt vorzustellen wäre es durchaus möglich mir meine Python Fragen zu beantworten da die Fragen grundsätzlicher Natur sind

    So nun habe ich hoffentlich die für viel Foren immer noch typische Phase von erklär genauer was du willst, poste das anderes, formatiere es besser hinter mir und komme langsam an den Punkt wo ich auf konkrete Fragen etwas konkretere antworten bekomme ... sonst hätte ich auch bei google bleiben können ohne hier Romane zu schreiben die nur einer zu lesen scheint :auslachen:

  • Hallo Mike,

    zu Deinen Python-Fragen halte ich mich mal ganz raus, da ich in dieser Programmiersprache nicht entwickle.

    Was mich - als Chemiker - stutzig macht:

    Du erwartest, dass Du anhand der Temperaturänderung (aktueller Messwert - letztem Messert) eine signifikante Information erhältst, ob weiter zugegeben werden soll.

    Der von Dir eingesetzte Sensor braucht vom Anstoßen der Messung bis zum Vorliegen eines Messwertes (bei den standardmäßigen 12Bit-Auflösung) rund eine Sekunde. Es würde somit zwar funktionieren, alle 2 Sekunden die Temperatur auszulesen - ob es jedoch Sinn macht, ist eine andere Frage.

    Die nächste Frage ist, wie Ihr den DS18B20 präparieren wollt, damit er in der zu mischenden Lösung und bei der Temperatur nicht angegriffen wird. Eigentlich müsstest Ihr den flüssigkeitsdicht und inert gegenüber den beiden Chemikalien "einpacken". Bei den Temperaturen, die Du erwartest und da es sich um Flüssigkeiten handelt, denke ich spontan an etwas wie Verdünnen konzentrierter Schwefelsäure. Dazu kommt, dass ein "eingepackter" Sensor wesentlich träger wird. Und so ganz schnelle Temperaturänderungen gar nicht mehr gemessen werden können.

    Ich würde da einen ganz anderen Ansatz gehen:
    1. Definieren einer maximalen Mischungstemperatur, bei deren Überschreitung nichts mehr zugegeben wird
    2. Definieren einer minimalen Mischungstemperattur, bei deren Unterschreitung eine größere Menge zugegeben wird


    Da ich sowas nicht in Python sondern in Icon programmieren würde, sähe meine Lösung so aus:

    Dieser Code erfüllt so ziemlich alle Deine Forderungen.



    Die Mischung erfolgt Abschnittsweise/Portionsweise in einem freien Zeitrahmen.
    Immer wenn die Temp. Anstiege zu gering ausfallen wird nachgefüllt.
    Dass muss notiert werden.


    Nach Deinem Vorgehen würde die Mischungstemperatur immer größer werden! Soll es das?


    Die Messung soll mit dem Taster [T_Start] begonnen werden. Das soll dann auch die Led [L_Start] signalisieren dass die Messung läuft und der Buzzer [B_sound] soll mal tuten.


    Hier würde ich ausnahmsweise einen Schalter nehmen, den kann man umlegen. Die Einstellung bleibt. Bei einem Taster musst Du ständig abfragen, ob sich da was geändert hat. Die Umlegung eines Schalters kannst Du in einer Schelife einmalig abfragen, ohne dass Informationen verlorengehen. Und dafür brauchst Du weder Interrupts noch Multithreading.


    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 (13. März 2017 um 09:23)


  • Meine Fragen sind aktuell insbesondere
    (A)
    Ein Problem sehe ich dabei, dass der Buzzer und die Notiz Led nur kurz aktiv sein sollen ich aber gerne die Messung weiter laufen lassen will. Als Hardware-Hack dachte ich an einen kleine Elko der per Transistor durchgeschaltet wird. Softwareseitig würde mir nur ein Zeitstempelvergleich einfallen wenn ich nicht die Messung für 2-5 Sekunden anhalten will (was im konkreten Fall noch ok wäre aber mir unsauber erscheint).

    Da gibt es mehrere Möglichkeiten. Zeitstempelvergleich innerhalb Deiner Meßschleife ist eine davon. Ansonsten schau Dir z.B. auch mal threading.Timer() an.


    (B)
    Ein Problem sehe ich dabei, dass ich nicht weiss ob ich in eine CSV mittels Datei-File-Write schreiben soll oder besser eine RR-DB nehme von der ich aber nicht weiß ob ich die dann zB in LibreCalc einlesen kann um noch mit den Werten zu arbeiten

    Weiß ich auch nicht. RRDs sind etwas speziell. Für Zeitreihen habe ich gute Erfahrungen damit gemacht, zum Speichern einzelner Zeitpunkte (wann wurde welcher Taster gedrückt) würde ich zu etwas anderem greifen.


    (C)
    Ein Problem sehe ich dabei, dass ich nicht weiß ob das mit den Prozeduren oder Funktionen in Python so machbar ist oder ob ich was übersehen habe; ich lese mich gerade seit ein paar Tagen ein nachdem ich diverse Codes ähnlicher Projekte gesehen habe und nun weiß was wir ungefähr wollen/brauchen

    Ich sehe in Deinem Konzept nichts, was nicht machbar wäre. Hast Du irgendwelche konkreten Bedenken?


    (1) Ich hatte gehofft dass mir jmd kurz exemplarisch sagt, wie ich eine procedure deklariere, ob diese nur Eingabe oder auch Rückgabewert(e) hat und ob ich hier einen Datentyp deklarieren muss (jaja ich lese nebenbei gerade ein Buch zu Py und einige zum Raspberry + diverses online aber fragen schadet nie und gute Antworten schließen Lücken die man noch selber nicht gemerkt hat)

    Eine procedure heißt in Python function. Sowohl Ein- als auch Rückgabewerte sind optional. Definition per

    Code
    def name(arguments):
     code
     optional return value


    (2) Sind Variablen in Py Global also im gesamten Proggy oder lokal auf die jew. procedure begrenzt? :helpnew:

    Lokal, sofern sie nicht explizit als global deklariert sind. Lesender Zugriff auf Variablen eines übergeordneten Kontexts ist möglich.


    (3) bisher weiß ich nur dass auch eine RR-DB als Datei angelegt wird. Ich wollte aber wissen ob diese wie eine CSV auslesbar ist oder ob ich das nur wieder mit tools oder Code umformen muss :helpnew:

    Letzteres. Sollte aber unkompliziert sein.

  • Lokal, sofern sie nicht explizit als global deklariert sind. Lesender Zugriff auf Variablen eines übergeordneten Kontexts ist möglich.

    Falsch! Wenn eine Variable auf Modulebene deklariert bzw. hingeklatscht wird, ist sie IMMER ``global``. Nur innerhalb einer Funktion ist eine Variable ``local``. Darum heisst es ja, dass auf Modulebene NUR Konstanten, Klassen und/oder Funktionen zu stehen haben.

  • Hallo Andreas hier Daniel ,

    Mike hat dir ja schon einen Überblick über mein Projekt verschaft.
    Worum es sich hier eigentlich handelt ist eine thermometrische Titration.
    Zu deinen Fragen: Die Reaktion ist exotherm und bewegt sich im Rahmen von 15-50°C.
    Die einzelnen Taster sollen folgendes tun:
    Taster 1: Startet die Messung und zeichnet die Temperatur in einer RR DB auf.
    Taster 2: Misst die Temperatur und versieht diese mit einem Zeitstämpel, nach der Zugabe von Salzsäure-Maßlösung ( c=1mol/L) in die Vorlage von Natronlauge (c~1mol/L)
    Anmerkung: Die Temperatur steigt zunächst nach der Zugabe an(exotherme Reaktion), da die Säure mit der Base reagiert. Nach der Zugabe hat die Lösung eine höhere Temperatur, aber sie wird nicht weiter steigen wenn die Säure verbraucht wurde. Erst nach erneuter Zugabe von Säure in die Lauge wird die Temperatur wieder steigen. An diesem Punkt, wenn die Temperatur nicht mehr weiter steigt, soll der Buzzer einen Ton geben und Taster 2 gedrückt werden.
    Taster 3: Der soll die Messung beenden und den Startwert, Maximalwert und Endwert der Temperatur Erfassen und mit Zeitstämpel Messen.
    RR DB: Soll die Temperatur in Abhängigkeit von der Zeit messen.

    Grüße und danke im Voraus Daniel :)


  • Falsch! Wenn eine Variable auf Modulebene deklariert bzw. hingeklatscht wird, ist sie IMMER ``global``. Nur innerhalb einer Funktion ist eine Variable ``local``. Darum heisst es ja, dass auf Modulebene NUR Konstanten, Klassen und/oder Funktionen zu stehen haben.

    Ich denke das ist, was ich mit dem lesenden Zugriff meinte: Wenn ich auf Modulebene eine Variable belege, habe ich innerhalb von Funktionen Zugriff auf deren Wert. Wenn ich dem gleichen Variablennamen innerhalb einer Funktion einen anderen Wert zuweise, erzeuge ich damit eine lokale Variable innerhalb der Funktion. Der Wert der Variablen auf Modulebene ändert sich dadurch nicht. Hab ich das soweit richtig verstanden?

    Einmal editiert, zuletzt von Manul (13. März 2017 um 11:48)

  • Hallo Daniel,

    ich sehe gerade, dass mein Beitrag von heute Mittag hier nicht durchgekommen ist.

    Ich glaube nicht, dass der DS18B20 für Dein Vorhaben geeignet ist.

    Eine kalorimetrische Titration erfordert, dass eine Temperatur sehr genau gemessen werden kann. Lt. Datenblatt hat der DS18B20 eine Genauigkeit von 0,5 °C - aber eine Auflösung von 12 Bit = 0,0625 °C

    Um eine kalorimetrische Titration sinnvoll verfolgen zu können, müsstest Du die Temperatur mit einer wesentlich besseren Genauigkeit von 0,01 °C oder kleiner messen können. Und Du müsstest schneller messen können als einen Wert pro Sekunde.


    Ein anderer Ansatz wäre die coulometrische Titration. Bei der Titration von Natronlauge und Salzsäure bilden die Hydroxid-Ionen und Protonen (beide mit großer Überführungszahlen, also großem Beitrag zur Leitfähigkeit) schlichtes Wasser, das bekanntlich nicht so toll leitet.

    Somit nimmt die Leitfähigkeit bei der Tritration stetig ab, bis sich die Leitfähigkeit bei der Übertritration wieder erhöht.

    Der Schnittpunkt der fallenden und der steigenden Leitfähigkeiten ergibt dann den Titrationsendpunkt, aus dem Du die Konzentration (Titer) der unbekannten Substanz ermitteln kannst.

    Die Leitfähigkeitssensoren kannst Du wesentlich schneller abfragen, so dass hier entsprechend viele Messwerte erzeugt werden können.


    Als weitere Alternative würde sich der Farbumschlag eines Indikators anbieten - in dem konkreten Beispiel bei pH = 7. Die Farbe kannst Du mit einer Kamera verfolgen und exakt den Titrationsendpunkt bestimmen.

    Für beide Alternativen ist eine Umsetzung in einer Programmiersprache recht trivial.


    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.

  • Hallo Andreas, Daniel nochmal hier,

    Erstmal danke für deine schnelle Antwort :)

    Es handelt sich bei dem Projekt eher um eine Machbarkeitsstudie. Sie soll zeigen ob es möglich ist eine Gerät für eine thermometrische Titration für um die hundert 100 Euro zu bauen. Verglichen werden dann die Werte mit einer klassischen Volumetrischen Titration.
    Wegen dem Sensor: Es handelt sich um einen gekapselten DS18B20 der sich in einem säure- und basenresistenten Plastikrohr befindet. Natürlich beeinträchtigt dies die Reaktionszeit des Sensors erheblich, aber da es weniger auf die Präzision, als vielmehr auf die Machbarkeit ankommt, nehm´ ich den Mangel an Genauigkeit gerne in Kauf.

    Theoretisch könnte ich einen Sensor des Typs K-11 verwenden(da dieser präzieser ist) und diesen an einen MCP 3088 AD-Wandler anschließen. Allerdings fehlen mir für diesen Sensor sämtliche Kennwerte.D.h. ich weiss nicht welcher Spannungs-/Widerstandswert welcher Temperatur entspricht.

    Ich hoffe, dass dir dies etwas mehr Einblick in mein Projekt verschafft.

    Gruß Daniel

  • Hallo Daniel,

    Deine Unterscheidung zwischen Machbarkeit und Präzision kann ich nicht ganz nachvollziehen. Wenn das Teil allein deswegen ungenau ist, weil der Sensor nicht nahe genug am Geschehen dran ist, dann hat dies auch verheerenden Einfluss auf die Machbarkeit: Das Teil funktioniert nicht, weil zum Titriren nicht geeignet.

    Zum K-11:
    Da gibt es ein Datenblatt - und ansonsten muss Du diesen kalibrieren. Darum kommst Du eh nicht drum herum.

    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 (15. März 2017 um 08:00)

  • .... manchmal habe ich den Eindruck, in Foren wird aneinander vorbei gedacht und geredet ;)

    Naja als IT'ler denken wir eben eher in 1 oder 0 i geht oder eben nicht.

    Wenn ich mir einige Projekte in der Industrie ansehe wir aus unmöglich ein machbar und dann ein geht nicht und dann ein wird teurer bis hin zum ab in die Tonne und nochmal oder doch ganz anders ....

    Hier dürfen wir denke ich das alles wesentlich lockerere sehen. Es ist ein winziges Budget und es ist kein hoher Anspruch sondern eben nur die Fragestellung "was ist machbar und wie". klar könnte man noch automatische Ventile verbauen (die dann Säure/base-resistent sein müssten) Klar könnte man per Pumpe (dito) Proben ziehen und per Farbtest PH etc bestimmen, klar könnte man einen PH Fühler einsetzen, klar könnte man die Masse/das Gewicht in beiden Behältern messen und abgleichen, ebenso den Pegel per Schwimmer oder Sensor überwachen etc und tausend Dinge mehr. :D

    Aber als Stufe 1 von Modell 1.0ß finde ich ein System das Daten erfassen und auswerten kann und das nur durch den zu verwendenden Sensor in der Perfektion schwankt doch ganz tragbar. IMHO

    Also:
    Es geht darum ob man grds überhaupt ohne ein Teures Messgerät eine Kurve aufzeichnen und auswerten kann
    -- ja kann man

    Es geht darum ob und wenn ja wie nahe man an die Ergebnisse teurer Geräte herankommt
    -- so nah wie der jeweilige Sensor es mitmacht; die Hardware dahinter ist "unwesentlich"; es muss kein elend teures Spezialgerät sein das die Messdaten erfasst

    Es ist grds mgl den anderen genauen Sensor der im Labor vorhanden ist anzuklemmen;
    @ Andreas: aber das Datenblatt haben wir bisher nicht gefunden, sonst hätten wir das so nicht formuliert!
    falls du das Datenblatt in der Schublade hast - immer gerne her damit; dann ist auch das kalibrieren kein Problem; mit dem DS1820 und einem hoch genauen Thermometer als Referenz sicher machbar

    Nochmal zur Unterscheidung:
    - Es geht um die technische Machbarkeit in einem kleinen Preisrahmen mit einer vertretbaren Genauigkeit.
    - auch ein negatives Ergebnis wäre ein Erfolg im Sinne von "Machbarkeit widerlegt"
    - bisher ist es machbar, einziger Schwachpunkt ist, dass der DS1820 minder genau misst aber austauschbar wäre

    Klar dass ein Bastelprojekt für 100 EUR nicht an die echten Laborgeräte für das 10 oder mehrfache ran kommen.
    Aber als "Schulprojekt in einer Ausbildung" ist das nicht zwingend erforderlich gleich eine bemannte Mondmission nachzustellen ;)

    Das bisher angedachte Ergebnis wenn man so will:
    ja es ist möglich Messwerte mit dem Rasperry zu erfassen und auszuwerten
    ja es ist kostengünstig machbar
    ja die Genauigkeit hängt vom verwendete Sensor ab
    ja der Sensor ist austauschbar, teurer=besser

    .. und auch mit der Ungenauigkeit ist dennoch klar erkennbar wenn eine kurve abflacht und deltaT lange gering bleibt - zumindest in Relation zum Messbereich

    Deine Einwände sind begründet aber nicht zwingend ein Hindernis die Sache zu verfolgen und umzusetzen.

    Was hier im Forum erhofft wird ist Hilfestellung, kritische Stimmen, Anregungen, Optimierungen und Wissenstransfer.

    Wir werden versuchen hier immer alles was wir sehen lernen und denken und erreichen einzustellen.
    Vllt wird ja mal mehr daraus, vllt wird ein echtes Profi-Bastel-Programmier Projekt daraus.

    IMHO ist ein Mini-System wir der Raspberry doch genau dazu da. Basteln, probieren lernen.
    Der Mangel an passenden Sensoren bzw Datenblättern tötet nicht das Projekt, er schränkt nur ein.

    So wir zu MSDOS Zeiten die Speichergrenze, EGA Auflösung oder lahme VGA Auflösung und Disketten Engpässe waren die einen Computer dennoch schätzenswert aber sicher nicht perfekt machten. ZX81, 8052AH basic, PC10 x86/88 bis i7 und mini-Systeme - wir haben so eine tolle digitale Welt. Lass uns Spaß haben und das beste raus holen! :)

  • So hier mal etwas Code-Krümel zum Wochenende.
    Nach Möglichkeit will ich stark granuliert arbeiten, d.h. ähnlich wie bei UML OO Vererbung später mal vom groben ins feine.

    ==> Komentare zu Denkfehlern erwünscht ;)

    Sind treu/false in Python eigentlich vordefiniert?


    # deklaration true false
    true=1
    false=0

    # debug-Levels
    # level 0 => keine ausgabe, 1=> nur LED , 2 => LED+Taster , 3=> Led, Taster, Sensor
    # in jeder i/o function debug level abfrage und status ausgabe einbauen!

    debug_level=0

    #'' Anschlussnummern noch anpassen
    BUTTON_Start = 23
    BUTTON_Zugabe = 23
    BUTTON_Stopp = 23

    LED_START = 24
    LED_Zugabe = 24
    LED_STOPP = 24

    Sensor_S1=25


    #'' für jede LED status noch anpassen
    led_on = False

    GPIO.setmode(GPIO.BCM)
    GPIO.setwarnings(False)

    # für jeden button , jede led anpassen
    GPIO.setup(BUTTON, GPIO.IN)
    GPIO.setup(LED, GPIO.OUT)


    def AbfrageTaster(pin))
    if Taster
    return true;
    else
    return false
         
         
    def SchalteLED(pin, onoff)
    if onoff=1
    #set LED(pin) = on
    GPIO.output(pin,GPIO.HIGH if onoff=true)
    else
    #set LED(pin) = off
    GPIO.output(pin,GPIO.LOW if onoff=false)
            
            
    def LeseSensor(pin)
    Sensorwert=Sensor
    return Sensorwert
        
    def LeseSensorUmrechnung(pin, faktor)
    Sensorwert=LeseSensor(pin)/faktor
    return Sensorwert

Jetzt mitmachen!

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