Python Script funktioniert nicht mit A/D Wandler MCP3008 und GPIO

  • Hallo,

    ich wollte eine Bewässerung mit dem Raspi für unsere Tomaten nach dieser Anleitung bauen. : https://tutorials-raspberrypi.de/automatisches-…s-selber-bauen/ .Die Anleitung ist sehr umfangreich und ich brauche nur den Teil mit der der Bewässerung.

    ich habe mir als A/D Wandler einen MCP3008 besorgt und angeschlossen nur leider bekomme ich kein HIGH auf GPIO 23 wenn ich am A/D Wandler auf Channel 1 ein High anlege

    Hier ist der Code

    Wenn ich 3,3 Volt an Channel 1 anlege und das Script mit "sudo python greenhouse.py" starte läuft es wohl durch und es kommt sofort wieder der Eingabe prompt. GPIO 23 (an den ich eine LED angeschlossen habe) bleibt aber auf LOW.

    Wenn ich den GPIO 23 händisch auf HIGH setze leuchtet die LED.

    Der A/D Wandler scheint auch zu funktionieren. Ich habe ihn getestet und er wirft den Wert 1023 auf Channel 1 raus wenn 3,3 Volt angelegt werden.

    So langsam weis ich nicht mehr woran es liegen kann und mir gehen die Ideen aus was ich noch testen kann......

    Ich hoffe ihr könnt mir weiterhelfen.

    Gruß Volker

    Einmal editiert, zuletzt von Horst-Leopold (23. Mai 2019 um 14:42)

  • Python Script funktioniert nicht mit A/D Wandler MCP3008 und GPIO? Schau mal ob du hier fündig wirst!

  • Hallo,

    nackte `try... except` sind immer schlecht, damit fängst du _alle_ Fehler ab, auch Programmierfehler. Fehler fängt man entweder gezielt ab oder gar nicht. Bau' das `try...except`mal aus

    Der Code kann nicht funktionieren, deiner jedenfalls nicht. Du hast den Originalcode modifiziert (was ja ok ist) und jetzt ist er nicht mehr lauffähig. Ich würde mal sagen: dir fehlen da definitiv Python-Grundlagen, sonst hättest du die Fehler nicht eingebaut. Am besten nochmal das Tutorial auf docs.python.org durcharbeiten. Programmieren ist halt nicht Copy & Paste.

    Wenn du das `try..except` ausbaust wirst du sehen, dass Zeile 27 einen Fehler in Form eines NameError wirft. Und wenn das behoben ist, dann wirft Zeile 29 einen TypeError (Grund: Integer sind nicht iterierbar). Und wenn das behoben ist, dann wirft Zeile 37 ebenfalls einen TypeError, weil du die len-Funktion nicht auf Integer anwenden kannst.

    Kann auch sein, dass noch mehr Fehler auftauchen. Habe ich nicht weiter durchgeschaut.

    Gruß, noisefloor

  • So, ich habe jetzt den originalen Code runtergeladen nur leider passiert nach den ausführen immer noch nichts.... an Channel 1+2 liegt High an aber an GPIO 23 bleibt es weiterhin LOW

    Hier nochmal der neue Code:

    ist das in Zeile 47 in den eckigen Klammer eigentlich eine AND oder OR Verknüpfung mir den beiden Channels?

    4 Mal editiert, zuletzt von Horst-Leopold (23. Mai 2019 um 18:06)

  • Hallo,

    Zitat

    ist das in Zeile 47 in den eckigen Klammer eigentlich eine AND oder OR Verknüpfung mir den beiden Channels?

    Weder noch. Nochmal: lern' erst die Basics. Die Datenstruktur in eckigen Klammer gehört nun mal definitiv dazu. Und Programmieren ist nicht raten.

    Zitat

    Channel 1+2 liegt High an

    ??? - das sind Analogeingänge, da sollte irgendein analoger Wert anliegen.

    Vielleicht solltest du auch mal deinen Schaltungsaufbau zeigen.

    BTW: Wenn du die neuere, schönere, bessere gpiozero Bibliothek verwenden würdest, wäre das mit dem MCP3008 einfacher. Das Skript setzt außerdem auf Python 2, dass ist Ende 2019 ohne Support. Also besser direkt auf Python 3 wechseln.

    Gruß, noisefloor

  • Da liegt auch ein analoger Wert an. Um genau zu sein 3,3 Volt wie man hier sehen kann.


    Hier ist mein Schaltungsaufbau:


    Wenn ich es richtig verstanden habe muss wenn an Channel 1 oder 2 ein analoger Wert von mehr als 450 anliegt (bei einer Spannung von 3,3 Volt sind das 1023) der GPIO 23 auf High schalten oder ist da ein Denkfehler?

  • Hallo,

    Zitat

    Wenn ich es richtig verstanden habe muss wenn an Channel 1 oder 2 ein analoger Wert von mehr als 450 anliegt (bei einer Spannung von 3,3 Volt sind das 1023) der GPIO 23 auf High schalten oder ist da ein Denkfehler?

    Hast du nicht richtig verstanden. Der Code liest _jeden_ Channel 10x, bildet den Mittelwert, addiert die Werte, bildet den Mittelwert und vergleicht mit dem Threshold.

    Ist auch eher fehlendes Verständnis des Codes als ein Denkfehler.

    Gruß, noisefloor

  • Hallo,

    ich habe jetzt raus gefunden dass ab Kernel 4.9 die Frequenz vom SPI geändert wurde.

    Daher muss jetzt bei der Klassen vom MCP3008 noch zusätzlich dieses hier eingefügt werden:

    Code
            # Dies ist noetig, weil ab Kernel 4.9 die Frequenz des SPI von 100 auf $
            self.spi.max_speed_hz = 1000000

    Ich komme hier aber trotzdem nicht weiter und würde gerne ein anders Script ausprobieren. Hier bekomme ich wenigstens schon mal den richtigen Wert vom A/D Wandler ausgegeben.

    Ein Fehler gibt es aber immer noch geben.

    Das Script liest den Wert aus und errechnet daraus einen Prozentwert. Das funktioniert aber nicht. Wäre schön wenn sich jemand mit Ahnung das Script mal anschaut und mir verrät wo der Fehler ist.

    Das ist die Ausgabe vom Script:

    Code
    pi@raspberrypi:~/bewässerung $ sudo python sensorkal.py
    sensorkal.py:36: RuntimeWarning: This channel is already in use, continuing anyway.  Use GPIO.setwarnings(False) to disable warnings.
      GPIO.setup(strom_sensoren, GPIO.OUT)
    ('Sensor 1: ', 1023, ' / ', 0)
    ('Sensor 2: ', 511, ' / ', 0)
    ('Sensor 3: ', 0, ' / ', 100)
    ('Sensor 4: ', 0, ' / ', 100)
    ('Sensor 5: ', 0, ' / ', 100)
    pi@raspberrypi:~/bewässerung $

    An Sensor 1 habe ich 3,3 Volt gelegt und an Sensor 2 liegt über einen 50:50 Spannungsteiler die Hälfte an. Das Auslesen der Werte klappt also.

    Nur das mit den Prozenten das klappt nicht.

    Hier der Code:

    Gruß Volker

  • Hallo,

    das ist unnötig kompliziert. Nimm' das gpiozero Modul statt dem alten RPI.GPIO Modul und einer selbstgebastelten Klasse. Fast gpiozero Modul hat eine fertige Klasse für die MCP3xxx. Da wird die ein normierter Wert zwischen 0 und 1 als Wert geliefert. Sollte dann leicht in Prozent umrechenbar sein.

    Zu deinem Code:

    • Du rufst ihn mit Python 2 auf, die Shebang sagt Python 3 - die Shebang ist Latte, wenn du dein Skript explizit mit `python ...` aufgerufst. Willst du Python 2 oder 3?
    • String formatiert man mit der .format-Methode von String (sowohl in Python 2.7 als auch Python 3.x), nicht über zusammenstückeln mit Kommas.
    • `print` ist in Python 2 ein Statement, keine Funktion -> die Klammer sind nicht richtig.
    • Du hast 5x fast identischen Code zum berechnen des Prozentwerts -> schreib' dir eine Funktion dafür, um redundanten Code zu vermeiden.

    Gruß, noisefloor

Jetzt mitmachen!

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