GPIO vom Pi via Python überprüfen


Status
Dieses Thema wurde gelöst! Zur Lösung gehen…

tklustig

Erfahrenes Mitglied
Hallo Leute,

seit geraumer Zeit funktioniert mein Temperatursensor auf dem Messboard meines Pis nicht mehr. Um zu überprüfen, ob der Sensor, oder die GPIOSs defekt sind, habe ich folgendes Python-Script geschrieben. Das überprüft jeden GPIO Sensor auf meinem Pi und meldet mir, dass seitens der GPIOs alles in Ordnung ist. Die Verkabelung und die GPIOs haben sich nicht verändert. Ich entferne also den DHT22-Temepratursensor vom Messboard, und, merke, dass einer der vier Leitstecker total verbogen ist. Ich hatte einen Ersatzsensor, aber auch der ließ sich nicht auf das Messboard aufstecken-die Kontaktstecker verbiegen sich! Meine Frage ist nun

  1. Woher bekomme ich einen DHT22-Sensor mit stabilen Verbindungselementen, die sich nicht verbiegen?
  2. Wie lassen sich die Ausgaben meinen Scriptes in einer Textdatei sichern??
Vorab vielen Dank
MFG
Kipp, Tomas
 

Anhänge

  • pins_testall.zip
    952 Bytes · Aufrufe: 2
Zuletzt bearbeitet:

Technipion

Erfahrenes Mitglied
Hallo tklustig,
Vorab vielen Dank
MFG
Kipp, Tomas
du bekommst jetzt von mir einen Freifahrtsschein. Denn normalerweise würde ich mir keine ZIP downloaden und entpacken (Stichwort Archivbombe). Aber ein Troll würde wohl nicht so "liebevoll" unterzeichnen...

Also hier dein aktueller Code:
Python:
#!/usr/bin/env python
#coding: utf8
import platform
print"Python Version %s:" % platform.python_version()
import time
import RPi.GPIO as GPIO
# Zählweise der Pins festlegen
GPIO.setmode(GPIO.BOARD)
# Pin x (GPIO x) als Ausgang festlegen
startport = input("Bitte maximalen Startport eingeben(3-39):")
startport = int(startport)
if startport>39 or startport<3:
    print"\x1B[31mStartpoint darf nicht kleiner als 3 und nicht größer als 39 sein sein. Applikation wird beendet\x1B[0m"
    raise SystemExit

endport=input("Bitte minimalen Endport eingeben (x>2 && <obiger \x1B[31mStartport\x1B[0m):")
endport=int(endport)
if endport <3 or endport>startport:
    print"\x1B[31mEndport darf nicht kleiner als 3 und nicht größer als der Startport %s sein. Applikation wird beendet!\x1B[0m" %startport
    raise SystemExit
x = startport

while x >= endport:
    try:
        print "Getestet wird Port %s: " % x
        GPIO.setup(x, GPIO.OUT)
# Ausgang 3 mal ein-/ausschalten
        i = 3
        while i > 0:
    # Ausgang einschalten
            GPIO.output(x, GPIO.HIGH)
    # Abfragen, ob Ausgang TRUE ist
            if GPIO.input(x) == GPIO.HIGH:
        # Wenn Ausgang TRUE ist, Ausgabe im Terminal erzeugen
                print "Ausgang HIGH"
            else:
                print "Ausagebe LOW"
    # eine Sekunden warten
            time.sleep(1)
    # Ausgang ausschalten und anzeigen
            GPIO.output(x, GPIO.LOW)
            print "Ausgang LOW"
    # eine Sekunden warten
            time.sleep(1)
    # Zähler für die Schleifen herunter zählen
            i = i - 1
    except:
        print("\x1B[31mEin Fehler ist aufgetrereten! Port %s: ist interen vom Pi belegt, und steht damit nicht zur Verfügung!!\x1B[0m") %x
    x= x - 1
# Ausgänge wieder freigeben
GPIO.cleanup()

Ich weiß leider gar nicht wo in anfangen soll. An dem Python-Code gibt es leider viel zu meckern :cautious:
Das Hauptproblem ist eben, dass du noch Python 2.x nutzt, wo doch eigentlich alles schon längst Python 3.x sein sollte. (übrigens wurde Python 2.x 2020 dann auch eeendlich offiziell eingestellt)

Falls es dich interessiert, wie du das Python-Programm verbessern (und auch Python 3.x portieren kannst), sag' einfach Bescheid, ich helfe dir da dann weiter.
Aber nun zur eigentlichen Frage:
Woher bekomme ich einen DHT22-Sensor mit stabilen Verbindungselementen, die sich nicht verbiegen?
Au Backe! Diese Pins sind eigentlich ziemlich robust und wenn sich da etwas verbiegt hast du wahrscheinlich einen ziemlichen mechanischen Defekt auf dem Board. Hier zeigt ein guter Kanal wie das ganze funktioniert:


Es ist für uns allerdings ziemlich schwer so etwas zu diagnostizieren oder zu beheben. Vielleicht kannst du ein paar Bilder von den Pins und deinem Messboard machen und posten?

Wie lassen sich die Ausgaben meinen Scriptes in einer Textdatei sichern??
Ja also da gäbe es natürlich die Möglichkeit das ganze direkt in Python zu speichern. Ganz besonders hilfreich wäre es hier, wenn du Python 3.x benutzen würdest. In Python 2.x ist print ein statement, unterstützt also keine (*args, **kwargs) parameter. Unter Python 3.x ist es ein Funktionsaufruf, dort kann file=FileObject übergeben werden:
Python:
with open('logfile.txt', 'w') as logfile:
    print('this goes into the logfile', file=logfile)

Aber: Du führst das ganze ja wahrscheinlich auf einem Linux-System aus. Hier gibt es zwei Möglichkeiten:

1) Leite die Ausgabe deines Skriptes in eine Datei um:
(your-env) $ python pins_testall.py > logfile.txt
Gerne auch stdout und stderr:
(your-env) $ python pins_testall.py &> logfile.txt

2) Logge die Ausgabe deines Skriptes in eine Datei (du kannst die Ausgabe dabei trotzdem lesen):
(your-env) $ python pins_testall.py | tee logfile.txt
Gerne auch stdout und stderr gleichzeitig:
(your-env) $ python pins_testall.py |& tee logfile.txt

Falls du den Prozess mehrfach aufrufen möchtest, solltest du die Logdatei nicht überschreiben, sondern die Ausgabe nur anhängen:
(your-env) $ python pins_testall.py >> logfile.txt
(your-env) $ python pins_testall.py | tee -a logfile.txt

Falls du noch Fragen hast einfach melden.

Gruß Technipion
 

tklustig

Erfahrenes Mitglied
Deine Weiterleitungen funktionieren nicht nicht, da ich ich innerhalb des Scriptes Usereingaben erwarte. Ein Photo des DHT22-Sensors kann ich dir leider nicht schicken, da ich aus Prinzip kein Smartphone benutzte. Es ist ein ganz gewöhnlicher DHT22-Temperatursensor mit genau 4 hauchdünnen "Steckern", die ich in das Messboard einzufügen habe. Genau die verbiegen sich aber immer wieder. Alle anderen Kabel(Widerstände,Lampen) lassen sich problemlos einstecken, nur ,der Sensor eben nicht.
P.S.: Ich hätte die Möglichkeit über mein Handy ein Photo zu knipsen und dann hochzuladen. allerdings bekomme ich die Meldung: "Nicht genug Platz". Da werde ich mir wohl eine Speicherkarte holen müsssen
P.S.: Ich habe Dir persönlich eine Nachricht mit all meinen Kontaktdaten zukommen lassen. Dir gegenüber bin ich jetzt als gläsern. Ich kann nur hoffen, dass Du dich meldest??!
LG
Kipp, Thomas
 
Zuletzt bearbeitet:

Technipion

Erfahrenes Mitglied
Wie ich dir neulich schon privat geschrieben habe, hilft dir für die Portierung das 2to3 Tool weiter. Ich habe des Code aus Post #2 in einer Datei pins_testall.py gespeichert und dann mittels
$ 2to3 -w pins_testall.py
den Python 2.x Code zu Python 3.x konvertiert. Den habe ich dann auf meinen Raspberry Pi 3 B hochgeladen und getestet. Läuft.

Was das Logging angeht: Dieser Befehl hat auf meinen Pi 3 funktioniert:
$ python3 pins_testall.py | tee -a log.txt

Falls du aber trotzdem lieber in Python direkt loggen möchtest, hast du zwei Möglichkeiten:

1) Du kannst auf das Logging-Modul zurückgreifen. Das ist in der Tat ziemlich mächtig und sollte in jedem größeren Projekt verwendet werden. Ist aber womöglich für so ein kleines Skript totaler Overkill.

2) Logge per Hand. Hier ist das Programm mit einer kleinen Ergänzung:
Python:
#!/usr/bin/env python
#coding: utf8

logfile = open('logfile.txt', 'a')

def laprint(*args, **kwargs):
    """ log and print """
    print(*args, **kwargs, file=logfile)
    print(*args, **kwargs)

import platform
laprint("Python Version %s:" % platform.python_version())
import time
import RPi.GPIO as GPIO
# Zählweise der Pins festlegen
GPIO.setmode(GPIO.BOARD)
# Pin x (GPIO x) als Ausgang festlegen
startport = eval(input("Bitte maximalen Startport eingeben(3-39):"))
startport = int(startport)
if startport>39 or startport<3:
    laprint("\x1B[31mStartpoint darf nicht kleiner als 3 und nicht größer als 39 sein sein. Applikation wird beendet\x1B[0m")
    raise SystemExit

endport=eval(input("Bitte minimalen Endport eingeben (x>2 && <obiger \x1B[31mStartport\x1B[0m):"))
endport=int(endport)
if endport <3 or endport>startport:
    laprint("\x1B[31mEndport darf nicht kleiner als 3 und nicht größer als der Startport %s sein. Applikation wird beendet!\x1B[0m" %startport)
    raise SystemExit
x = startport

while x >= endport:
    try:
        laprint("Getestet wird Port %s: " % x)
        GPIO.setup(x, GPIO.OUT)
# Ausgang 3 mal ein-/ausschalten
        i = 3
        while i > 0:
    # Ausgang einschalten
            GPIO.output(x, GPIO.HIGH)
    # Abfragen, ob Ausgang TRUE ist
            if GPIO.input(x) == GPIO.HIGH:
        # Wenn Ausgang TRUE ist, Ausgabe im Terminal erzeugen
                laprint("Ausgang HIGH")
            else:
                laprint("Ausagebe LOW")
    # eine Sekunden warten
            time.sleep(1)
    # Ausgang ausschalten und anzeigen
            GPIO.output(x, GPIO.LOW)
            laprint("Ausgang LOW")
    # eine Sekunden warten
            time.sleep(1)
    # Zähler für die Schleifen herunter zählen
            i = i - 1
    except:
        laprint(("\x1B[31mEin Fehler ist aufgetrereten! Port %s: ist interen vom Pi belegt, und steht damit nicht zur Verfügung!!\x1B[0m") %x)
    x= x - 1
# Ausgänge wieder freigeben
GPIO.cleanup()

logfile.close()

Zunächst wird ein Logfile (im Append-Modus) geöffnet und dann eine Funktion definiert, die sowohl ins Terminal als auch in die Logdatei schreibt. Am Ende wird die Datei dann geschlossen.

Falls das Skript sehr lange läuft, ist es stilistisch schöner die Logdatei währenddessen nicht unnötig offen zu halten:
Python:
#!/usr/bin/env python
#coding: utf8

def laprint(*args, **kwargs):
    """ log and print """
    with open('logfile.txt', 'a') as logfile:
        print(*args, **kwargs, file=logfile)
    print(*args, **kwargs)

import platform
laprint("Python Version %s:" % platform.python_version())
import time
import RPi.GPIO as GPIO
# Zählweise der Pins festlegen
GPIO.setmode(GPIO.BOARD)
# Pin x (GPIO x) als Ausgang festlegen
startport = eval(input("Bitte maximalen Startport eingeben(3-39):"))
startport = int(startport)
if startport>39 or startport<3:
    laprint("\x1B[31mStartpoint darf nicht kleiner als 3 und nicht größer als 39 sein sein. Applikation wird beendet\x1B[0m")
    raise SystemExit

endport=eval(input("Bitte minimalen Endport eingeben (x>2 && <obiger \x1B[31mStartport\x1B[0m):"))
endport=int(endport)
if endport <3 or endport>startport:
    laprint("\x1B[31mEndport darf nicht kleiner als 3 und nicht größer als der Startport %s sein. Applikation wird beendet!\x1B[0m" %startport)
    raise SystemExit
x = startport

while x >= endport:
    try:
        laprint("Getestet wird Port %s: " % x)
        GPIO.setup(x, GPIO.OUT)
# Ausgang 3 mal ein-/ausschalten
        i = 3
        while i > 0:
    # Ausgang einschalten
            GPIO.output(x, GPIO.HIGH)
    # Abfragen, ob Ausgang TRUE ist
            if GPIO.input(x) == GPIO.HIGH:
        # Wenn Ausgang TRUE ist, Ausgabe im Terminal erzeugen
                laprint("Ausgang HIGH")
            else:
                laprint("Ausagebe LOW")
    # eine Sekunden warten
            time.sleep(1)
    # Ausgang ausschalten und anzeigen
            GPIO.output(x, GPIO.LOW)
            laprint("Ausgang LOW")
    # eine Sekunden warten
            time.sleep(1)
    # Zähler für die Schleifen herunter zählen
            i = i - 1
    except:
        laprint(("\x1B[31mEin Fehler ist aufgetrereten! Port %s: ist interen vom Pi belegt, und steht damit nicht zur Verfügung!!\x1B[0m") %x)
    x= x - 1
# Ausgänge wieder freigeben
GPIO.cleanup()

Die Verwendung eines Kontexts (with-Keyword) kümmert sich dabei um alles.
 
Status
Dieses Thema wurde gelöst! Zur Lösung gehen…