Hi Leute,
Da ich neu im Thema Python bin, frage ich mich aktuell, wie man verschiedene Temperaturbereiche programmieren kann.
Also im Endeffekt will ich 0-100 Grad Celsius in 4-5 Bereiche zerlegen.
Soll man diese am besten/schönsten mit Range zerlegen:
If temp range (0, 20)
Dann den Output
If temp range (21, 50)
Dann den Output
If temp range (51, 60)
Und folgend
oder Gibt es hier eine andere Möglichkeit
das mit vergleichern aufzubauen!?
Allerdings kann ich mir das dann irgendwie nicht ganz vorstellen.
Ausser das wäre sowas wie:
If temp <=20
Dann den Output
If temp >20, <=50
Usw...
Temperaturbereiche
-
- User
- Beiträge: 6
- Registriert: Montag 13. Juli 2020, 19:57
Ok. Das ist schon mal gut zu hören. Mir ging es nämlich (sorry, das habe ich vergessen) auch unterschiedliche output zu schreiben. Also für bereich Eins: 3 auf high, 5 low, 7 low Bereich Zwei: 3 auf low, 5 high, 7 low.... Das führt ja schon von vorne herein zu dem Problem, dass ich bereiche benötige. Muss das deiner Syntax so folgen mit 0 <= temperatur < 20 oder wäre meine o.g. Ebenfalls möglich?
- __blackjack__
- User
- Beiträge: 13103
- Registriert: Samstag 2. Juni 2018, 10:21
- Wohnort: 127.0.0.1
- Kontaktdaten:
@UlrichBergler: In der Python-Dokumentation gibt es ein Grundlagentutorial in dem auch die Syntax und Semantik von bedingten Verzweigungen mit ``if``/``elif``/``else`` erklärt werden.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
-
- User
- Beiträge: 6
- Registriert: Montag 13. Juli 2020, 19:57
Werde ich mir ansehen. Vielen Dank schon mal für die Antworten!
-
- User
- Beiträge: 6
- Registriert: Montag 13. Juli 2020, 19:57
So, jetzt nochmal ich blutiger Anfänger!
Also soweit habe ich das jetzt mal "fertig"...
Jedoch kommt bei mir beim ausführen des Programms (wenn man das so nennen darf - und zudem abgekupfert) folgende Meldung:
this channel is already in use, continuing anyway. use gpio.setwarnings(false) to disable warnings. gpio.setup(17, gpio.out)
Hat hierfür irgendwer eine Lösung? Habe selbst schon gesucht jedoch bin ich nicht wirklich auf etwas gekommen...
Also soweit habe ich das jetzt mal "fertig"...
Jedoch kommt bei mir beim ausführen des Programms (wenn man das so nennen darf - und zudem abgekupfert) folgende Meldung:
this channel is already in use, continuing anyway. use gpio.setwarnings(false) to disable warnings. gpio.setup(17, gpio.out)
Hat hierfür irgendwer eine Lösung? Habe selbst schon gesucht jedoch bin ich nicht wirklich auf etwas gekommen...
-
- User
- Beiträge: 6
- Registriert: Montag 13. Juli 2020, 19:57
GNU nano 4.8 Temperatur.py
#!/usr/bin/env python
# Temperaturwert ist als Zeichenkette in der Datei tempData gespeichert,
# er wird in eine ganze Zahl nach math. Rundungsregel umgewandelt
# und ganzzahlig ausgegeben
import RPi.GPIO as GPIO
import time
import os
tempData = "/sys/class/thermal/thermal_zone0/temp"
# GPIO's festlegen; GPIO 17: Motor
# GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM)
GPIO.setup(17, GPIO.OUT)
GPIO.output(17, GPIO.LOW)
while True:
# os.system('clear')
f = open(tempData, "r")
temp = f.readline(3)
f.close
temp = int(temp)
temp = (temp + 5) / 10
print (temp , " Grad Celsius")
if temp <40:
GPIO.output(17, GPIO.LOW)
if temp >=50:
GPIO.output(17, GPIO.HIGH)
time.sleep (10)
GPIO.cleanup()
#!/usr/bin/env python
# Temperaturwert ist als Zeichenkette in der Datei tempData gespeichert,
# er wird in eine ganze Zahl nach math. Rundungsregel umgewandelt
# und ganzzahlig ausgegeben
import RPi.GPIO as GPIO
import time
import os
tempData = "/sys/class/thermal/thermal_zone0/temp"
# GPIO's festlegen; GPIO 17: Motor
# GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM)
GPIO.setup(17, GPIO.OUT)
GPIO.output(17, GPIO.LOW)
while True:
# os.system('clear')
f = open(tempData, "r")
temp = f.readline(3)
f.close
temp = int(temp)
temp = (temp + 5) / 10
print (temp , " Grad Celsius")
if temp <40:
GPIO.output(17, GPIO.LOW)
if temp >=50:
GPIO.output(17, GPIO.HIGH)
time.sleep (10)
GPIO.cleanup()
-
- User
- Beiträge: 6
- Registriert: Montag 13. Juli 2020, 19:57
Das Thema hatte man schonmal, i know, aber eben noch nicht die Meldung mit dem Output oder!?
Bitte Code tags benutzen, damit der Code lesbar bleibt. Und wenn die Frage ist, woher die Warnungen kommen, und wie man sie abstellt - das ist wirklich ausführlichst diskutiert. Kleiner Tipp: wenn du dein Programm abbrichst per Control-C, kommt die letzte Zeile nicht zur Ausführung.
- __blackjack__
- User
- Beiträge: 13103
- Registriert: Samstag 2. Juni 2018, 10:21
- Wohnort: 127.0.0.1
- Kontaktdaten:
@UlrichBergler: Weitere Anmerkungen zum Quelltext:
Python 2 ist tot. Da gibt es nicht einmal mehr Sicherheitsupdates für.
„Mathematische Rundungsregel“ ist nicht wirklich eindeutig. Es gibt einen ganzen Haufen verschiedener Rundungsregeln und die sind alle irgendwie ”mathematisch”. Was wäre denn eine nicht-mathematische Rundungsregel?
`os` wird importiert, aber nirgends verwendet. ``as`` bei Importen ist zum Umbenennen, `GPIO` wird aber gar nicht umbenannt.
Auf Modulebene sollte nur Code stehen der Konstanten, Funktionen, und Klassen definiert. Das Hauptprogramm steht üblicherweise in einer Funktion die `main()` heisst.
Namen werden in Python klein_mit_unterstrichen geschrieben. Ausnahmen sind Konstanten (KOMPLETT_GROSS) und Klassen (MixedCase).
Statt magischer Zahlwerte, beispielsweise für GPIO-Pins sollte man sinnvoll benannte Konstanten verwenden. Dann kann man sich a) den Kommentar sparen was die Zahl bedeutet, und b) sieht man das dann an jeder Stelle im Code und nicht nur an der einen Stelle wo die Zahl kommentiert wurde.
Man kann den initialen Wert von Ausgabepins auch beim `setup()` bereits angeben.
Dateien die man öffnet sollte man auch wieder schliessen. Einfach nur die `close`-Methode zu ermitteln ohne sie dann auch tatsächlich *aufzurufen* reicht da nicht. Besser ist sowieso die ``with``-Anweisung zu verwenden.
Namen sollten keine kryptischen Abkürzungen enthalten oder nur daraus bestehen. Wenn man `file` meint, sollte man nicht nur `f` schreiben. Und `temp` ist jetzt eine Abkürzung für `temporary` oder für `temperature`?
`readline()` mit einem Argument ist sehr ungewöhnlich und letztlich auch falsch. Das wird nicht funktionieren wenn die Temperatur nicht im erwarteten Bereich liegt. Und auch wenn das unwahrscheinlich ist, macht es keinen Sinn hier kaputten Code zu schreiben, denn der ist letztlich nicht kürzer, einfacher, oder effizienter. Nur halt falsch wenn bestimmte Annahmen nicht zutreffen.
Wenn die Temperatur unter 40 ist, kann sie nicht über oder gleich 50 sein, also braucht man die zweite Bedingung nicht prüfen wenn die erste zutraf: ``elif``.
Ungetestet:
Python 2 ist tot. Da gibt es nicht einmal mehr Sicherheitsupdates für.
„Mathematische Rundungsregel“ ist nicht wirklich eindeutig. Es gibt einen ganzen Haufen verschiedener Rundungsregeln und die sind alle irgendwie ”mathematisch”. Was wäre denn eine nicht-mathematische Rundungsregel?
`os` wird importiert, aber nirgends verwendet. ``as`` bei Importen ist zum Umbenennen, `GPIO` wird aber gar nicht umbenannt.
Auf Modulebene sollte nur Code stehen der Konstanten, Funktionen, und Klassen definiert. Das Hauptprogramm steht üblicherweise in einer Funktion die `main()` heisst.
Namen werden in Python klein_mit_unterstrichen geschrieben. Ausnahmen sind Konstanten (KOMPLETT_GROSS) und Klassen (MixedCase).
Statt magischer Zahlwerte, beispielsweise für GPIO-Pins sollte man sinnvoll benannte Konstanten verwenden. Dann kann man sich a) den Kommentar sparen was die Zahl bedeutet, und b) sieht man das dann an jeder Stelle im Code und nicht nur an der einen Stelle wo die Zahl kommentiert wurde.
Man kann den initialen Wert von Ausgabepins auch beim `setup()` bereits angeben.
Dateien die man öffnet sollte man auch wieder schliessen. Einfach nur die `close`-Methode zu ermitteln ohne sie dann auch tatsächlich *aufzurufen* reicht da nicht. Besser ist sowieso die ``with``-Anweisung zu verwenden.
Namen sollten keine kryptischen Abkürzungen enthalten oder nur daraus bestehen. Wenn man `file` meint, sollte man nicht nur `f` schreiben. Und `temp` ist jetzt eine Abkürzung für `temporary` oder für `temperature`?
`readline()` mit einem Argument ist sehr ungewöhnlich und letztlich auch falsch. Das wird nicht funktionieren wenn die Temperatur nicht im erwarteten Bereich liegt. Und auch wenn das unwahrscheinlich ist, macht es keinen Sinn hier kaputten Code zu schreiben, denn der ist letztlich nicht kürzer, einfacher, oder effizienter. Nur halt falsch wenn bestimmte Annahmen nicht zutreffen.
Wenn die Temperatur unter 40 ist, kann sie nicht über oder gleich 50 sein, also braucht man die zweite Bedingung nicht prüfen wenn die erste zutraf: ``elif``.
Ungetestet:
Code: Alles auswählen
#!/usr/bin/env python3
#
# Temperaturwert ist als ASCII-Zeichenkette in der Datei
# `TEMPERATURE_SENSOR_FILENAME` gespeichert. Er wird in eine ganze Zahl nach
# mathematischer Rundungsregel umgewandelt und ganzzahlig ausgegeben.
#
import time
from RPi import GPIO
TEMPERATURE_SENSOR_FILENAME = "/sys/class/thermal/thermal_zone0/temp"
MOTOR_PIN = 17
def main():
try:
GPIO.setmode(GPIO.BCM)
GPIO.setup(MOTOR_PIN, GPIO.OUT, initial=GPIO.LOW)
while True:
with open(TEMPERATURE_SENSOR_FILENAME, "rb") as file:
#
# Die Datei enthält die Temperatur in mC°.
#
temperature = (int(file.read()) + 500) // 1000
print(temperature, "Grad Celsius")
if temperature < 40:
GPIO.output(MOTOR_PIN, GPIO.LOW)
elif temperature >= 50:
GPIO.output(MOTOR_PIN, GPIO.HIGH)
time.sleep(10)
finally:
GPIO.cleanup()
if __name__ == "__main__":
main()
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman