DS18B20 Temp. Sensor ein Relais schalten

Python auf Einplatinencomputer wie Raspberry Pi, Banana Pi / Python für Micro-Controller
Antworten
Baeschu1
User
Beiträge: 4
Registriert: Dienstag 3. Juli 2018, 10:05

DS18B20 Temp. Sensor ein Relais schalten

Ich möchte mit meinem Python Script ein Relais schalten z.b. bei 50Grad schaltet sich das Relais ab und unter 50Grad wieder ein.
Ich schaffe es einfach nicht es zu laufen zu bringen. Kann mir jemand helfen?

Dieser Script ist der Orginal und läuft.

import glob
import time
from time import sleep
import RPi.GPIO as GPIO
# An dieser Stelle kann die Pause zwischen den einzelnen Messungen eingestellt werden
sleeptime = 1
# Der One-Wire EingangsPin wird deklariert und der integrierte PullUp-Widerstand aktiviert
GPIO.setmode(GPIO.BCM)
GPIO.setup(4, GPIO.IN, pull_up_down=GPIO.PUD_UP)
# Nach Aktivierung des Pull-UP Widerstandes wird gewartet,
# bis die Kommunikation mit dem DS18B20 Sensor aufgebaut ist
print 'Warte auf Initialisierung...'
base_dir = '/sys/bus/w1/devices/'
while True:
try:
device_folder = glob.glob(base_dir + '28*')[0]
break
except IndexError:
sleep(0.5)
continue
device_file = device_folder + '/w1_slave'
# Funktion wird definiert, mit dem der aktuelle Messwert am Sensor ausgelesen werden kann
def TemperaturMessung():
f = open(device_file, 'r')
lines = f.readlines()
f.close()
return lines
# Zur Initialisierung, wird der Sensor einmal "blind" ausgelesen
TemperaturMessung()
# Die Temperaturauswertung: Beim Raspberry Pi werden erkennte one-Wire Slaves im Ordner
# /sys/bus/w1/devices/ einem eigenen Unterordner zugeordnet. In diesem Ordner befindet sich die Datei w1-slave
# in dem Die Daten, die über dem One-Wire Bus gesendet wurden gespeichert.
# In dieser Funktion werden diese Daten analysiert und die Temperatur herausgelesen und ausgegeben
def TemperaturAuswertung():
lines = TemperaturMessung()
while lines[0].strip()[-3:] != 'YES':
time.sleep(0.2)
lines = TemperaturMessung()
equals_pos = lines[1].find('t=')
if equals_pos != -1:
temp_string = lines[1][equals_pos+2:]
temp_c = float(temp_string) / 1000.0
return temp_c
# Hauptprogrammschleife
# Die gemessene Temperatur wird in die Konsole ausgegeben - zwischen den einzelnen Messungen
# ist eine Pause, deren Länge mit der Variable "sleeptime" eingestellt werden kann
try:
while True:
print '---------------------------------------'
print "Temperatur:", TemperaturAuswertung(), "°C"
time.sleep(sleeptime)
except KeyboardInterrupt:
PIO.cleanup()
Sirius3
User
Beiträge: 17710
Registriert: Sonntag 21. Oktober 2012, 17:20

Baeschu1 hat geschrieben: Dienstag 3. Juli 2018, 10:11 Dieser Script ist der Orginal und läuft.
Dann wäre es doch sinnvoller, das zu zeigen, was nicht läuft !?

Zum Skript:
Zeile 16 u. 21: Pfade setzt man mit os.path.join zusammen
Zeile 20: das continue ist überflüssig.
Zeile 35ff: statt TemperaturMessung in zwei verschiedenen Zeilen aufzurufen, besser eine while-True-Schleife mit Abbruchbedingung
Zeile 43+: wenn kein 't=' vorkommt, liefert die Funktion implizit None zurück. Das sollte nicht sein.
Zeile 53: cleanup gehört in einen finally-Block. Da fehlt ein G.

Insgesamt sollte man nicht Funktionsdefinitionen und ausführbaren Code mischen. Aller ausführbarer Code gehört auch in Funktionen und sollte nicht auf oberster Ebene stehen.
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Eins zu eins aus dem Netz kopiert (https://github.com/iGyver/sensors/blob/ ... rSensor.py) und jetzt duerfen wir dir beim loesen deiner Aufgabe helfen? Hast du dich ueberhaupt mit den Grundlagen der Programmierung beschaeftigt?
Baeschu1
User
Beiträge: 4
Registriert: Dienstag 3. Juli 2018, 10:05

Sorry, bin ein Anfänger!
Finde alles sehr spannend und lerne jeden Tag dazu.
Darum wäre ich euch sehr dankbar für eure Unterstützung.
Ich habe einfach das Problem mit dem Relais zu schalten.
:| :| :|
Baeschu1
User
Beiträge: 4
Registriert: Dienstag 3. Juli 2018, 10:05

Ich habe heute noch etwas zusammen gestellt:
Temp. Sonde Übermittelt tip top.
einfach das Relais schaltet nicht.......

import glob
import time
from time import sleep
import RPi.GPIO as GPIO

UPPER = 36
LOWER = 34

relais_an = False


# Der One-Wire EingangsPin wird deklariert und der integrierte PullUp-Widerstand aktiviert
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM)
GPIO.setup(4, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(5, GPIO.OUT)


# Nach Aktivierung des Pull-UP Widerstandes wird gewartet,
# bis die Kommunikation mit dem DS18B20 Sensor aufgebaut ist
print 'Bitte warten'
base_dir = '/sys/bus/w1/devices/'
while True:
try:
device_folder = glob.glob(base_dir + '28*')[0]
break
except IndexError:
sleep(0.5)

device_file = device_folder + '/w1_slave'
# Funktion wird definiert, mit dem der aktuelle Messwert am Sensor ausgelesen werden kann
def TemperaturMessung():
f = open(device_file, 'r')
lines = f.readlines()
f.close()
return lines

# Zur Initialisierung, wird der Sensor einmal "blind" ausgelesen
TemperaturMessung()
# Die Temperaturauswertung: Beim Raspberry Pi werden erkennte one-Wire Slaves im Ordner
# /sys/bus/w1/devices/ einem eigenen Unterordner zugeordnet. In diesem Ordner befindet sich die Datei w1-slave
# in dem Die Daten, die über dem One-Wire Bus gesendet wurden gespeichert.
# In dieser Funktion werden diese Daten analysiert und die Temperatur herausgelesen und ausgegeben
def TemperaturAuswertung():
lines = TemperaturMessung()
while lines[0].strip()[-3:] != 'YES':
time.sleep(0.2)
lines = TemperaturMessung()
equals_pos = lines[1].find('t=')
if equals_pos != -1:
temp_string = lines[1][equals_pos+2:]
temp_c = float(temp_string) / 1000.0
return temp_c



# Hauptprogrammschleife
# Die gemessene Temperatur wird in die Konsole ausgegeben - zwischen den einzelnen Messungen
# ist eine Pause, deren Länge mit der Variable "sleeptime" eingestellt werden kann
try:
while True:
print TemperaturAuswertung(), "°C"
time.sleep(0.001)


while True:
temp = TemperaturMessung()
print(temp)
if relais_an == True and temp < LOWER:
relais_an = False
GPIO.output(5, GPIO.HIGH)
print("Relais aus")
if relais_an == False and temp > UPPER:
relais_an = True
GPIO.output(5, GPIO.LOW)
print("Relais an")
time.sleep(5)

except KeyboardInterrupt:
GPIO.cleanup()
Sirius3
User
Beiträge: 17710
Registriert: Sonntag 21. Oktober 2012, 17:20

Was kommt denn als Ausgabe am Bildschirm? Dann sieht Du auch, wo im Code sich das Programm befindet.
Benutzeravatar
__blackjack__
User
Beiträge: 13003
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Baeschu1: Also bei mir startet das nicht einmal, vermutlich weil hier nicht der gesamte Quelltext gezeigt wurde.

Der ``GPIO.setwarnings(False)``-Aufruf sollte da bitte wieder raus. Warnungen unterdrückt man nicht, sondern man liest sie und behebt die Ursache. Sonst hast Du irgendwann einen Fehler und findest den nicht, weil in der Warnung ein entscheidender Hinweis steckte.

Wahrscheinlich häufigster Grund für GPIO-Warnungen ist, dass die Leute `GPIO.cleanup()` nicht in *jedem* Fall am Programmende aufrufen. Bei dem gezeigten Quelltext wird es nur aufgerufen wenn das Programm durch Strg+C abgebrochen wird, aber nicht wenn es beispielsweise innerhalb des ``try``-Blocks durch einen Programmfehler endet. Das Aufräumen gehört in einen ``finally``-Block zu einem ``try``-Block der auch die `setmode()`- und `setup()`-Aufrufe umfasst.

`relais_an` wird viel zu weit oben im Programm definiert. Definitionen von Variablen immer so nah wie möglich an den Code wo sie dann auch verwendet werden, damit man nicht suchen muss wenn man sich fragt wie eine Variable initialisiert wurde, oder wenn man einen Teil in eine eigene Funktion oder Methode herausziehen möchte.

Eingrückt wird mit vier Leerzeichen pro Ebene.

Man vergleicht Wahrheitswerte nicht mit literalen Wahrheitswerten. Da kommt ja eh nur wieder ein Wahrheitswert als Ergebnis und den hatte man ja schon von Anfang an. Wenn man auf den gegenteiligen Wahrheitswert testen möchte, dann gibt es ``not``. Also ``if condition:`` statt ``if condition == True:`` und ``if not condition:`` statt ``if condition == False:``.

In Deinem Code schreibst Du ``print`` plötzlich als wäre es eine Funktion. Ist es in Python 2 nicht (so ohne weiteres) und die Klammern sind hier irreführend. Also weg mit den Klammern, oder als ersten Import ein ``from __future__ import print_function``. Dann musst Du aber auch die anderen ``print``-Anweisungen anpassen, denn nach diesem Import ist `print()` tatsächlich eine Funktion.

Magische Zahlen sind schlecht. Für die 5 als Pin-Nummer solltest Du eine Konstante definieren an deren Namen man erkennen kann was dieser Pin bedeutet. `RELAIS_PIN` zum Beispiel.

Ansonsten hatte Sirius3 ja schon ein paar Punkte zum Original gesagt die man noch umsetzen könnte/sollte.

Zum eigentlichen Problem: Arbeite mal das Tutorial in der Python-Dokumentation durch. Es scheint noch nicht so klar zu sein wie die Ausführungsreihenfolge ist und wie Schleifen funktionieren.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Baeschu1
User
Beiträge: 4
Registriert: Dienstag 3. Juli 2018, 10:05

Hey, vielen Dank das Ihr mir so helft ! :P
Jetzt habe ich viel arbeit vor mir..
Melde mich wieder wenn ich weiter bin :P

DANKE!
Antworten