Raspi: Python, Werte in einen anderen Script verwerten

Python auf Einplatinencomputer wie Raspberry Pi, Banana Pi / Python für Micro-Controller
Antworten
slawa
User
Beiträge: 2
Registriert: Sonntag 4. Februar 2018, 18:22

Hallo Zusammen!

Bin ein Anfänger was Python angeht, konnte mir schon einiges aus diversen Tutorial zusammenreimen, doch bei dieser Aufgabe bin ich schon seit paar Tagen dran und finde leider keine Lösung.

Hierbei handelt es sich um einen DHT22 der die Aktuelle Temperatur und Aktuelle Feuchtigkeit am SSD1306 Display anzeigt.
Ich will aus diesem laufendem Script Werte entnehmen und in einem anderen Script verwerten können.
Habe einiges versucht. Doch kein Erfolg.

1. Versuch: In einem anderen Script auf den Gleich GPIO zugegriffen (nach einigen Sekunden schmiert ein Script davon immer ab)
2. Versuch: In das selbe Script Weiteren Script einzubauen (meine Kenntnisse reichen da leider nicht aus)
3. Versuch: Ist mein eigener Script

Code: Alles auswählen

 #!/usr/bin/python
# coding=utf-8
# Python Version 2.7
# main.py
from display import dhtSensorTemperatur, dhtSensorLuftfeuchtigkeit
   print dhtSensorTemperatur
   print dhtSensorLuftfeuchtigkeit
from display import


Aus diesen Script will ich die Temperatur und die Feuchtigkeit herausnehmen OHNE das dieses Script abschmiert.
Für jeder Hilfe wäre ich Dankbar. (Ohne Fachwörter bitte :-))

Code: Alles auswählen

#!/usr/bin/python
# coding=utf-8
# Python Version 2.7
# display.py
#------------------------------------------------------------

# Einbindung der notwendigen Grundbibliotheken
import os, sys, time, threading

# Einbindung 0,96 Zoll OLED Display 128x64 Pixel
import Adafruit_SSD1306
from PIL import Image, ImageDraw, ImageFont

# Einbindung DHT22 Feuchtigkeits- und Temperatursensor
import Adafruit_DHT




# DHT22 Sensor einrichten
dhtSensorTyp = 22 # Typ 22 (weiß) - Typ 11 (blau)
dhtSensorGpio = 21 # an Pin 40 - GPIO 21 angeschlossen
dhtSensor_aktiv = True # angeschlossenen Sensor für Display aktivieren
dhtSensorTemperatur = "" # Temperaturwert
dhtSensorLuftfeuchtigkeit = "" # Luftfeuchtigkeitwert


# Global für Anzahl der Temperaturanzeigen auf Display
displaySensorBezeichnung = ""
displayTempWert = ""
a=u" " # damit Sonderzeichen korrekt dargestellt wird 

 
# Global für Aktivitätsstatus einzelner Threads/Programmteile
Display_aktiv = True
Thread_Sensoren_aktiv = True


# Funktionen
#-----------------------------

def aktuelleZeit(werta, wertb):
 zeitpunktMessung = time.localtime()
 jahr, monat, tag = zeitpunktMessung[0:3]
 stunde, minute, sekunde = zeitpunktMessung[3:6]
 systemUhrzeit = str(stunde).zfill(2) + ":" + str(minute).zfill(2) + ":" + str(sekunde).zfill(2)
 systemDatum = str(tag).zfill(2) + "." + str(monat).zfill(2) + "." + str(jahr)
 if werta == "time" and wertb == "date":
    ermittelteZeit = systemUhrzeit + " " + systemDatum
 elif werta == "date" and wertb == "time":
    ermittelteZeit = systemDatum + " " + systemUhrzeit
 elif werta == "time" and wertb == "":
    ermittelteZeit = systemUhrzeit
 elif werta == "date" and wertb == "":
    ermittelteZeit = systemDatum
 else:
    ermittelteZeit = zeitpunktMessung
 return ermittelteZeit

def sensorenAbfrage():
 # Thread zum Auslesen der Sensoren
 global dhtSensor_aktiv, dhtSensorGpio, dhtSensorTyp, dhtSensorTemperatur, dhtSensorLuftfeuchtigkeit
 print "Thread zur Sensorenabfrage gestartet."
 while dhtSensor_aktiv:
    # Abfrage Luftfeuchtigkeit und Temperatur
    luftfeuchtigkeit, temperatur = Adafruit_DHT.read_retry(dhtSensorTyp, dhtSensorGpio) 
    dhtSensorLuftfeuchtigkeit = '%6.1f' % luftfeuchtigkeit #Sensorwert auf 2 Dezimalstellen formatiert
    dhtSensorTemperatur = '%6.1f' % temperatur #Sensorwert auf 2 Dezimalstellen formatiert
    print "Werte DHT22 - Luftfeuchtigkeit = ", dhtSensorLuftfeuchtigkeit, " Temperatur = ", dhtSensorTemperatur 
    displaySensorwertAusgabe()
    time.sleep(2) # notwendige Pause von mindestens 2 Sekunden - siehe Spezifikation des verwendeten Sensors
 
def displaySensorwertAusgabe():
 global displaySensorBezeichnung, displayTempWert1, displayTempWert2, a, dhtSensorLuftfeuchtigkeit, dhtSensorTemperatur
 displaySensorBezeichnung = "DHT22 Sensor :"
 displayTempWert1 = dhtSensorLuftfeuchtigkeit # + " %" 
 displayTempWert2 = dhtSensorTemperatur  # + a + "C"


# Display einrichten

# Raspberry Pi pin configuration:
RST = 24

# Display 128x64 display with hardware I2C:
disp = Adafruit_SSD1306.SSD1306_128_64(rst=RST)

# Initialize library.
disp.begin()

# Clear display.
disp.clear()
disp.display()

# Create blank image for drawing.
# Make sure to create image with mode '1' for 1-bit color.
width = disp.width
height = disp.height
image = Image.new('1', (width, height))

# Get drawing object to draw on image.
draw = ImageDraw.Draw(image)

# Draw a black filled box to clear the image.
draw.rectangle((-10,-10,width,height), outline=0, fill=0)

# First define some constants to allow easy resizing of shapes.
padding = -45
shape_width = 0
top = padding
bottom = height-padding

# Move left to right keeping track of the current x position for drawing shapes.
x = padding

# Load default font.
#font = ImageFont.load_default() # Wenn keine eigene Schrift vorhanden ist!!!! 
font = ImageFont.truetype("font/NotoMono-Regular.ttf", 9) # Schriftart, Schriftgröße
font_b = ImageFont.truetype("font/Piboto-Light.ttf", 14)
font_c = ImageFont.truetype("font/NotoMono-Regular.ttf", 38)
font_d = ImageFont.truetype("font/NotoMono-Regular.ttf", 20)

# Write one line of text.
draw.text((x+45, top+45), 'Daten werden', font=font_b, fill=255)
draw.text((x+45, top+60), 'geladen...', font=font_b, fill=255)
draw.text((x+45, top+79), 'Bitte warten Sie', font=font_b, fill=255)
draw.text((x+120, top+100), '....', font=font, fill=255)


# Display image.
disp.image(image)
disp.display()


# Abfrage des DHT Sendor in eigenem Thread starten
sensorenAbfrageThread = threading.Thread(target=sensorenAbfrage) #Sensorenabfrage
sensorenAbfrageThread.start()
time.sleep(5) #damit alle Sensorwerte zum Start eingelesen sind



# Hauptroutine

while Display_aktiv:
 draw.rectangle((1,1,width,height), outline=0, fill=0) #Display leeren
 #displayTime = aktuelleZeit("time", "date") # bei Abfrage "date","time" ändert die Reihenfolge der Ausgabe
 #draw.text((x, top), displaySensorBezeichnung , font=font, fill=255)
 draw.text((x, top+39), displayTempWert2, font=font_c, fill=255)
 draw.text((x+145, top+43), '°C', font=font_d, fill=255)
 draw.text((x, top+72), displayTempWert1, font=font_c, fill=255)
 draw.text((x+153, top+73), '%', font=font_d, fill=255)


 #draw.line((x, top+45, x+width, top+45), fill=255)
 #draw.text((x, top+50), displayTime, font=font_c, fill=255)
 disp.image(image)
 disp.display()
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@slawa: Du willst also, dass jemand aus einem grottenschlechten Skript, das Du irgendwo im Internet gefunden hast, etwas macht, das Du brauchen kannst?

Eigentlich mußt Du nur die Dokumentation zum Modul Adafruit_DHT lesen und für Dein eigenes Programm verwenden.
Benutzeravatar
noisefloor
User
Beiträge: 3843
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

es gibt diverse Wege. Der einfachste ist, die Temperaturabfrage in eine Funktion zu packen (hast du schon), die die Werte für Temperatur und Luftfeuchtigkeit zurück liefert (Stichwort: return). Das Skript packst du in eine Datei. Die Funktion aus der Datei importierst du dann im anderen Skript und rufst von da die Funktion auf.

Das 2., lange Skript, ist wirklich schlecht... Einrückungen sind nicht 4 Leerzeichen, Variablennamen entsprechen nicht der Konvention, wie mit Zeit und Datum hantiert wird ist hochgradig unelegant, `global` zu verwenden ist in 99,9% der Fälle falsch, Strings formatiert man besser mit der `format()` Methode, die Verwendung von `threading` im Skript ist schon arg komisch... Am besten wäre hier weg werfen und neu schreiben, auch wenn's hart klingt.

> konnte mir schon einiges aus diversen Tutorial zusammenreimen,
Programmieren ist nicht raten. Welches Tuturials hast du gelesen? Das offizielle Python-Tutorial? Das ist sehr empfehlenswert.
Ohne ein grundlegendes Verständnis von der Objektorientierung von Python bzw. wie man Instanzen von Klassen anlegt und deren Methoden nutzt, kannst du das 2. Skript gar nicht verstehen. Und um zu verstehen, wie das mit dem Threading funktioniert müssten du verstehen, wie Nebenläufigkeit funktioniert und wann diese sinnvoll ist.

> Ohne Fachwörter bitte
Wie willst du den ohne ein Grundvokabular vernünftig programmieren? (BTW, die Antwort lautet: gar nicht...)
Nur weil es mit dem Pi "einfach" und preiswert ist, alles mögliche zu messen und anzuzeigen heißt es nicht, dass das "jeder" kann. Ein Grundverständnis von (Python-) Programmierung musst du halt haben.

Gruß, noisefloor
slawa
User
Beiträge: 2
Registriert: Sonntag 4. Februar 2018, 18:22

noisefloor Danke erstmal für die schnellen Antwort.
Brauchte eine main.py wo der DHT22 abgefragt wird und ich dann aus diesen Script die Werte an diverse Scripts einbinden kann.
Dachte es ist mit einem Befehl wie Import gelöst da bin ich wohl voll vor die Wand gefahren.
Muss mich wohl mit Python auseinandersetzen.

PS. meiner Meinung ist das Script sehr übersichtlich (für einen Anfänger :-) ) wie eine verständlicher Script aussehen soll :K @ sirius
Benutzeravatar
noisefloor
User
Beiträge: 3843
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,
Brauchte eine main.py wo der DHT22 abgefragt wird und ich dann aus diesen Script die Werte an diverse Scripts einbinden kann.
Wie du was benennst, ist gleich. Wo du was davon importierst hängt davon ab, wie viel du importierst und was von was abhängt. Hier sieht's aber so aus, als könntest du alles im "Hauptskript" importieren.
Dachte es ist mit einem Befehl wie Import gelöst da bin ich wohl voll vor die Wand gefahren.
Jein. Im `import` bindest du Klassen / Funktionen / Variablen aus anderen Python-Modulen ("Skripten") ein, also die sind dann im Namensraum deines Skripts bekannt. Was dir natürlich nicht "erspart", die Funktionen aufzurufen, Instanzen von Klassen anzulegen etc.
Muss mich wohl mit Python auseinandersetzen.
Sehr gute Idee :-)

Gruß, noisefloor
Antworten