Beiträge von keepfear

    Grüße,

    hier gibt es eine Erklärung zur Berechnung des pH-Wertes.

    Von Vorteil wäre es sicher wenn du ein gewisses Verständnis von Stöchiometrie hast und weißt was Molare Masse bedeutet.

    Wenn du nach dem Lesen des Links immer noch Bock darauf hast dir das anzueignen kannst mal nach "Stöchiometrie pH-Wert berechnen" oder nach "pH-wert einstellen" suchen.

    Viel Spass :lol:

    Ich hab mir Hofeis API noch nicht angeschaut und benutze die python-telegram-bot API.

    Der Bot hört nicht nur auf deine Commands, also "/command".

    Du kannst mit:

    dir, je nachdem wie du das programmierst, im prinzip alles schicken.

    Was so nicht geht ist das Bots sich untereinander unterhalten.

    Meintest du das?

    Mahlzeit Forum,

    ich hatte vor langer Zeit mal ein Script geschrieben welches eine Alarmanlage steuert. Das Script war ziemlich funktionell und da ich mich mit OOP beschäftigen wollte hatte ich das Script umgeschrieben.

    Ich lege mir die Türen als Objekte an und wenn ich den Befehl zum einschalten des Alarms via Telegram schicke übergebe ich diese Türen der Methode def pruefe_tuer(self):.

    Damit ich nicht jedesmal 2 oder mehr Nachrichten bekomme wenn mehr als eine Tür offen ist, wollte ich die noch nicht geschlossenen Türen in eine Liste schmeißen und diese dann via Telegram schicken. An sich funktioniert das mit einer Tür, bei mehr Türen nicht so richtig. :lol:

    Da alle Türen einzeln geprüft, gezählt und in eine Liste gepackt werden, ist die Bedingung if Alarm.tuerZaehler > 0 in dem Fall wahr wenn nur eine oder mehrere Tür nicht geschlossen ist/sind und die Null mit einem anderen Wert ersetzen bringts ja auch nicht.

    Dann dachte ich mir, ich zähle wie oft das Wortschnippsel "tuer" in meiner Liste vorkommt und vergleiche das mit dem zähler, was im prinzip aufs selbe Problem hinaus führt. :X

    Lange Rede kurzer Sinn.

    Hat jemand eine Idee wie ich mir meine Bedingung so zurecht basteln kann damit mir zuerst alle meine offenen Türen in eine Liste gepackt werden und danach die Liste verschickt wird?

    Dann zeig doch Mal bitte deinen aktuellen Code. Es ist schwer zu helfen wenn keiner weiß was du da eigentlich geschrieben hast.

    Außerdem, in der tkinter Doku steht wie man eine GUI baut und das macht man nun Mal mit einer Klasse.

    Ich kann mir gut vorstellen daß du fertig werden willst und dich damit nicht beschäftigen möchtest aber das ist sonst mit nem Pfeil von hinten durch den Kopf ins Auge geschossen.

    Du wirst wahrscheinlich auch nicht viel Hilfe bekommen wenn du deinen aktuellen Code nicht zeigst.


    PS:

    Hier hatte jemand was ähnliches vor.

    Vllt hilft dir das weiter.

    Alles was ich im Netz so finde baut die GUI auf Klassen auf.

    EDIT

    Schau auch Mal hier .

    Ist aber mit Tkinter und nicht mit tkinter.

    Wenn ich die when_pressed Anweisung ausserhalb des loops stelle, wird sie ja nur einmal aufgerufen. Oder habe ich Deinen Codevorschlag falsch verstanden?

    Das when_pressed soll außerhalb des Loops stehen, weil das when_pressed immer deine Funktion errechne_abwassermenge aufruft wenn dein Wasserzaehler nen Impulse sendet. Das wäre dann dein Callback. Wenn ich das alles richtig verstanden habe darf das nicht in dem Loop stehen weil sonst der Fehler RuntimeError "can't start thread" kommt. Wenn das funktioniert musst du mal schauen ob er die richtige menge an Impulse zaehlt.

    Teste das mal bitte so.

    Also erstmal Hut ab vor deinem Projekt. Das hat sicher viel Zeit verschlungen.

    Dann wäre es schön gewesen, wenn du vorher gesagt hättest das du ne GUI benutzt.

    Auch schön wäre deinen jetzigen Code zu sehen.

    Den Ratschlag mit der Klasse solltest du ab hier beherzigen.

    Wobei, Ich werde das Gefühl nicht los das dich die Klasse nicht wirklich interessiert und du einfach nur ne Lösung willst. :lol:

    Theoretisch müsste das dann in etwas so aussehen.

    Dennis89

    Mir ging es darum wie man Signalüberschneidungen programmiertechnisch abfangen könnte. Also wenn das zweite Signal schon kommt bevor das erste verarbeitet wird.

    Jetzt hab ich es verstanden.

    Softwaretechnisch wahrscheinlich gar nicht.

    Wenn dein Programm die eingehenden Signale zu langsam verarbeitet und du schon alles super sauber programmiert hast wirst du an der Hardware schrauben müssen. Beim Wasserzähler dann eben den Durchfluss verringern.

    Eventuell das Signal auf 2 Pins verteilen?

    Dennis89

    Ich würde um Fehler zu vermeiden gerne die Flanken abfragen

    Das macht man doch mit when_pressed oder when_released bzw. wait_for_press oder wait_for_release.

    Je nachdem wie du es machen willst oder brauchst.

    ..... Ich versuche jetzt, die Edgedetection vor die oberste Hauptschleife zu setzen, damit sie nur ein einziges mal aufgerufen wird. ....

    Und das wird höchstwahrscheinlich des Rätsels Lösung sein.

    Dennis89 du kannst das auch nach empfinden wenn du zufällig nen Button, einen Magnetsensor o.ä. zu Hause rum liegen hast.

    Und mit:

    durchspielst.

    Da schmiert dir nichts ab.

    So hingegen schon:

    Code
    def say_hello():
        print("Hello!"
    
    def main():
        while True:
            button.when_pressed = say_hello

    __blackjack__ dann missbrauche ich da halt das Klassenkonstrukt. Ist mir auch egal. Ich finde es übersichtlicher. Wie gesagt das ist sicher eh Overkill.

    Für mich sieht das eher so aus als hätte er sein Programm falsch strukturiert, weil er alle 5 sek. seine "Abwasserfunktion" aus einer Hauptschleife aufruft. In dieser Abwasserfunktion ist das GPIO.add_event_detect() die dann wiederum eine andere Funktion aufruft die dann anfängt die Impulse zu zaehlen.

    Ich behaupte jetzt einfach das Brazzelhuber das GPIO.add_event_detect() falsch benutzt und dadurch das er das Event ständig aufruft ihm irgndwann das Script abschmiert.

    __blackjack__

    ``global`` vergessen bringt aber nichts wenn Du das jetzt so löst. ...

    Warum? Eine halbwegs vernünftig benannte Klasse mit halbwegs vernünftig benannten Klassenattributen find ich übersichtlicher als das olle global. Die Klasse ist sicher etwas Overkill zeigt aber das man da eben eine Klasse nutzen kann und wenn Brazzelhuber später dazu fragen haben sollte ist es doch um so besser.

    Ich frage mich bei so etwas ja manchmal ob es auch Leute gibt die bei C- oder Pascal-Anfängern sagen, lasst das mit ``struct`` oder ``record`` mal weg wenn das noch zu kompliziert ist. ...

    Ich sage auch nicht das Brazzelhuber sich nicht mit Klassen auseinandersetzen soll, nur, wenn ich den Code im 1. Post sehe, ist es doch offensichtlich das er eher wenig Erfahrung mit Python hat. Wozu da also OOP? Zumal keiner weiß wie der restliche Code von Brazzelhuber aussieht.

    Es wäre hilfreich wenn du deinen kompletten Code zeigen würdest und auch die Fehlermeldungen.

    Wie gesagt: Globalevariabeln sind BÖSE. Die wollen wir nicht. Das geht auch mit der Klasse.

    Das macht eher wenig Sinn:

    Durch die while-Schleife in deinem Hauptprogramm zählt der Counter ständig hoch und wird dir ein falsches Ergebnis bringen

    und

    wie schon gesagt, musst du das Event_detection in deiner Mainfunktion/Hauptprogramm unterbringen und damit rufst du dann deine Funktion auf die dir deine Abwassermenge berechnet.

    Hier nochmal ein Beispiel für GpioZero:

    EDIT:

    Das Problem ist offenbar, dass, wenn ich "add_event_detect" oder bei gpiozero "when_pressed" in eine Schleife einbaue, bei beiden nach ca. 30 bis 60 Minuten ein RuntimeError kommt, mit der Meldung, dass der thread nicht gestartet werden kann

    Jup, das Event darf in keiner Schleife liegen, weil das Event_detection beim Start deines Scripts einmal geladen wird (so hab ich es mal gelernt) und darauf wartet bis am Pin ein Flankenwechsel eintritt und du sagst dann ob bei steigender Flanke, bei fallender Flanke oder bei beiden Flankenwechsel etwas passieren soll.

    Mein Programm ist modular aufgebaut, wo ausgehend von der Hauptschleife (Durchlauf 1 mal pro Sekunde) neben vielen anderen Funktion und Unterfunktionen die Funktion Wertelesen()

    Wenn du eine Funktion hast die dir die Werte liest kannst du beim Messen deiner Abwassermenge ja einfach wie oben gezeigt den Wert Impuls.abwassermenge in deiner Funktion Wertelesen() weiter verarbeiten.

    Und nochmal, vergiss das es Global gibt.

    Dennis89 ich hab den Code nochmal angepasst. Danke

    Ich habe mal gelernt, das man ein Klassenobjekt einmal erzeugt und wenn man Werte speichern will, bindet man sie an 'self'.

    In dem Fall ist es, meiner Meinung nach, egal ob du nun ein Instanzattribut oder ein Klassenattribut setzt.

    Es geht ja erstmal nur um das Speichern der Werte ohne Globals.

    Da Brazzelhuber, offensichtlich, Anfänger ist macht es für mich auch keinen Sinn da OOP zu Programmieren. Das kann, wie du sicher auch selbst weißt, schnell mal überfordern. Vor allem als Anfänger. Zumindest war das bei mir so.

    Wieso die Umwandlung in 'int' und die Ausgabe wieder als String?

    Wenn das Skript beendet wird sollte die GPIO-Pins noch aufgeräumt werden

    Darauf hab ich nicht geachtet und nur Teile des Codes aus dem Anfangspost kopiert. Wir kennen auch seinen restlichen Code nicht und von daher sag ich einfach, das es erstmal egal ist.

    Ich hab auch nur wenig bis gar keine Erfahrung mit RPi.GPIO.

    Grüße,

    wie ottosieben schon schrieb solltest du das GPIO.add_event_detect(FLOW_SENSOR_GPIO, GPIO.BOTH, callback=countPulse) in deiner Hauptschleife einbauen und als Callback die Abwasserfunktion aufrufen.

    Diese Abwasserfunktion erechnet dir dann deine Menge.

    Deine Pins usw. deklarierst du, in der Regel, am Anfang des Scripts.

    Das es Global gibt vergisst du am besten gleich wieder. Damit machst du es dir nicht leichter.

    Nimm stattdessen eine Klasse.

    Besser wäre auch gpiozero zu benutzen. Das ist schöner, eleganter und sehr gut dokumentiert.

    In etwa so:

    EDIT:

    In dem Event solltest du auch das GPIO.BOTH in GPIO.RISING ändern.

    Du willst ja nur zählen wenn der Impuls kommt also die Flanke steigt und nicht auch wenn die Flanke wieder fällt.

    EDITEDIT:

    Code angepasst.