Temperaturbereiche

Python auf Einplatinencomputer wie Raspberry Pi, Banana Pi / Python für Micro-Controller
Antworten
UlrichBergler
User
Beiträge: 6
Registriert: Montag 13. Juli 2020, 19:57

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...
__deets__
User
Beiträge: 14539
Registriert: Mittwoch 14. Oktober 2015, 14:29

Beides geht.

temperatur in range(0, 20)

oder

0 <= temperatur < 20
UlrichBergler
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?
__deets__
User
Beiträge: 14539
Registriert: Mittwoch 14. Oktober 2015, 14:29

Deine Syntax geht nicht, aber ich habe dir doch eine Alternative genannt, die ähnlich ist.

Und deine Anmerkung zu unterschiedlichem Output ist mir unklar.
Benutzeravatar
__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
UlrichBergler
User
Beiträge: 6
Registriert: Montag 13. Juli 2020, 19:57

Werde ich mir ansehen. Vielen Dank schon mal für die Antworten!
UlrichBergler
User
Beiträge: 6
Registriert: Montag 13. Juli 2020, 19:57

So, jetzt nochmal ich blutiger Anfänger! :D
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...
UlrichBergler
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()
UlrichBergler
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!?
__deets__
User
Beiträge: 14539
Registriert: Mittwoch 14. Oktober 2015, 14:29

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.
Benutzeravatar
__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:

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
Antworten