Lichtsteuerung für Terrarium

Python auf Einplatinencomputer wie Raspberry Pi, Banana Pi / Python für Micro-Controller
Antworten
CptApocalypse
User
Beiträge: 2
Registriert: Samstag 28. September 2019, 16:02

Hallo zusammen,

ich bin komplett neu in der Python-Welt und habe mir nun etwas als mein erstes Projekt vorgenommen.
Ich würde nämlich gerne die Beleuchtung für mein Terrarium über ein Python-Script steuern.
Das Ganze läuft auf einem Raspberry Pi 3B mit Raspbian als Betriebssystem.
Den Raspberry habe ich soweit installiert und eine Relaiskarte mit 4 Relais angeschlossen.
Die 4 GPIOs (12, 16, 20, 21) für meine 4 Lampen kann ich als Ausgang bereits manuell ein und ausschalten und habe mich auch schonmal an einem "Blinkerprogramm" probiert. Alles funktioniert soweit einwandfrei.
Die Relais schalten übrigens nur die Steuerspannung für ein größeres Relais, damit die kleine Relaiskarte des Raspberry nicht so schnell abnutzt... ;-)
Es wäre natürlich einfach die Beleuchtung jeden Tag um die gleiche Uhrzeit immer wieder ein- und auszuschalten.
Jedoch möchte ich ein Programm schreiben, die für meine Terrariumbewohner automatisiert den Winterschlaf einläutet...
Dazu soll die Beleuchtung immer wie folgt herunterfahren, wenn ich GPIO 7 als Eingang über einen Schalter einschalte:
1. Woche
GPIO 12=1 (7:00 - 19:00 Uhr)
GPIO 16=1 (7:00 - 19:00 Uhr)
GPIO 20=0 (aus)
GPIO 21=1 (6:00 - 20:00 Uhr)
2. Woche
GPIO 12=1 (7:00 - 19:00 Uhr)
GPIO 16=1 (aus)
GPIO 20=0 (aus)
GPIO 21=1 (6:00 - 20:00 Uhr)
3. Woche
GPIO 12=1 (aus)
GPIO 16=1 (aus)
GPIO 20=0 (aus)
GPIO 21=1 (6:00 - 20:00 Uhr)
4. Woche
GPIO 12=1 (aus)
GPIO 16=1 (aus)
GPIO 20=0 (aus)
GPIO 21=1 (8:00 - 18:00 Uhr)
5. Woche
GPIO 12=1 (aus)
GPIO 16=1 (aus)
GPIO 20=0 (aus)
GPIO 21=1 (aus)

Nachdem ich den Schalter für GPIO 7 wieder ausschalte, soll das Ganze die Beleuchtung entgegengesetzt wieder hochfahren. Der GPIO 7 muss also permanent auf seinen Zustand abgefragt werden.
Das komplette Script soll automatisch beim Booten des Raspberry starten.

Leider habe ich nur noch keine Lösung gefunden, was nach einem Stromausfall passieren soll/kann...
Habt ihr da eventuell Ideen???

Hier mal mein bisheriges Script mit Namen "Lichtsteuerung_Terrarium.py":

#Programm: Lichtsteuerung Terrarium
#Bemerkungen: Automatische Einleitung der jährlichen Winterruhe
#Stand: 28.09.2019
################################
#GPIO Belegung:
#HID 160W = Strahler_1 = GPIO 12
#HID 160W = Strahler_2 = GPIO 16
#HID 160W = Strahler_3 = GPIO 20
#HQL 150W = Strahler_4 = GPIO 21
################################
#Import von GPIOs
import RPi.GPIO as GPIO
#Import von Datum/Uhrzeit
import datetime as dtm
#Import von Timer
import time as tm
#Warnungen ausschalten
GPIO.setwarnings(False)
#Ansprechen der GPIOs über ihre GPIO-Nummer
GPIO.setmode(GPIO.BCM)
#Pins als Outputs definieren
GPIO.setup(12, GPIO.OUT)
GPIO.setup(16, GPIO.OUT)
GPIO.setup(20, GPIO.OUT)
GPIO.setup(21, GPIO.OUT)
#HIGH/LOW (3.3V/0V) für GPIOs definieren
GPIO.output(12, GPIO.HIGH)
GPIO.output(12, GPIO.LOW)
GPIO.output(16, GPIO.HIGH)
GPIO.output(16, GPIO.LOW)
GPIO.output(20, GPIO.HIGH)
GPIO.output(20, GPIO.LOW)
GPIO.output(21, GPIO.HIGH)
GPIO.output(21, GPIO.LOW)
################################
#Zeitsteuerung der Beleuchtung#
################################

Ich habe über die Möglichkeit von "datetime" oder "cronjobs" gelesen, weiß aber nicht, wie ich das auf meinen speziellen Fall anwenden kann/soll...(?)
Kann mir vielleicht jemand von euch weiterhelfen?
Besten Dank im Voraus!!! :-)
Sirius3
User
Beiträge: 17750
Registriert: Sonntag 21. Oktober 2012, 17:20

Die meisten Kommentare in Deinem Programm sind überflüssig. Dass was importiert wird, sieht man ja an der Zeile mit dem "import". Keine kryptischen Abkürzungen benutzen, dtm? tm? Lass das.
Das `as` ist nur dazu da, Pakete umzubenennen, was Du bei GPIO aber gar nicht machst.
Warnungen sind dazu da, dass man sie behebt, nicht dass man sie abschaltet.

Code: Alles auswählen

# Programm: Lichtsteuerung Terrarium
# Bemerkungen: Automatische Einleitung der jährlichen Winterruhe
# Stand: 28.09.2019

from RPi import GPIO
import datetime
import time

# GPIO Belegung:
STRAHLER1 = 12
STRAHLER2 = 16
STRAHLER3 = 20
STRAHLER4 = 21

def initialize():
    #Ansprechen der GPIOs über ihre GPIO-Nummer
    GPIO.setmode(GPIO.BCM)
    GPIO.setup([STRAHLER1, STRAHLER2, STRAHLER3, STRAHLER4], GPIO.OUT)

def main():
    try:
        initialize()
        # hier kommt die Zeitsteuerung
    finally:
        GPIO.cleanup()

if __name__ == '__main__':
    main()
Wenn Du nach einem Neustart nicht von vorne beginnen willst, dann mußt Du den Zustand in einer Datei speichern, die Du beim Start lesen kannst.
CptApocalypse
User
Beiträge: 2
Registriert: Samstag 28. September 2019, 16:02

Super, vielen Dank! :D
Und wie schreibt man den Zustand in eine Datei bzw. liest diese aus?
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,
Und wie schreibt man den Zustand in eine Datei bzw. liest diese aus?
Das Lesen- und Schreiben von Dateien sind absolute Python Grundlagen. Wenn du die (noch) nicht drauf hast -> Python Tutorial auf docs.python.org durcharbeiten.

Den Zustand speicherst du, in dem du dir a) eine geeignete Datenstruktur überlegst (Hint: ein Dict bietet sich hier an, man könnte aber auch eines der Key-Value-Store nehmen, die Python an Bord hat), nach dem erfolgreichen Schalten der GPIOs die Zustände in diese Datenstruktur schreibst und die dann in geeigneter Form speicherst.

Beim Neustart des Programms liest du dann nach dem Initialisieren der GPIOs 1x die Datenstruktur ein und setzt die Zustände der GPIOs entsprechend.

BTW: RPi.GPIO ist alt / veraltet. Das aktuelle Modul der Wahl ist das neuere / schönere / bessere gpiozero.

Gruß, noisefloor
Antworten