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!!!
Lichtsteuerung für Terrarium
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.
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.
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()
-
- User
- Beiträge: 2
- Registriert: Samstag 28. September 2019, 16:02
Super, vielen Dank!
Und wie schreibt man den Zustand in eine Datei bzw. liest diese aus?
Und wie schreibt man den Zustand in eine Datei bzw. liest diese aus?
- noisefloor
- User
- Beiträge: 3857
- Registriert: Mittwoch 17. Oktober 2007, 21:40
- Wohnort: WW
- Kontaktdaten:
Hallo,
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
Das Lesen- und Schreiben von Dateien sind absolute Python Grundlagen. Wenn du die (noch) nicht drauf hast -> Python Tutorial auf docs.python.org durcharbeiten.Und wie schreibt man den Zustand in eine Datei bzw. liest diese aus?
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