Anfänger und Programmfehler?

  • Hallo liebe Gemeinde,

    ich bin neu hier im Forum und möchte erstmal allen Hallo sagen. Ich bin noch am Anfang mit meiner Pythongeschichte, habe schon viel darüber gelesen und einige Sachen ausprobiert :)

    Erstmal allgemein zu meinem fehlerbehafteten Code. Es soll am Ende ein Aquariumcontroller werden. Ich weiß das es dafür haufen Beispiele und Beiträge gibt, nur habe ich für mein Problem leider bisher keine Lösung gefunden.
    Zur Uhrzeit x sollen die LEDstripes langsam (innerhalb von 60min) von 0 auf 100% gedimmt werden. Falls es zwischendurch oder nach der Dimmung auf 100% einen Stromausfall gibt, soll an der angehaltenen Stelle fortgefahren werden.
    Zur Uhrzeit y sollen die LEDstripes wieder von 100% auf 0% (innerhalb von 60min) gedimmt werden.

    Mehr soll der Code erstmal nicht machen,'da ich langsam an das Projekt gehe und es Stück für Stück abarbeiten möchte :D

    Im Code beachtet bitte das time.sleep(0.5) nicht. da müsste time.sleep(36) stehen für die 60min Dimmung. Ich habe es allerdings für die Testzwecke verkürzt :thumbs1:

    Hier erstmal mein kompletter Code für die PWM:


    Vielen Dank schon mal im Vorraus und seit bitte nicht zu hart zu mir :shy:

    Einmal editiert, zuletzt von Morle_ (4. Mai 2016 um 18:26)

  • Hallo Morle_,
    schöne Beschreibung, was du machen möchtest, aber was ist abgesehen von "Geht nicht" dein Problem ;)
    Geht das Licht nicht an, nicht aus, geht gar nichts?

    Gruß Christian

    PS: Die Bedingung Stromausfall würde ich erst mal weg lassen, die macht so ein Programm nur kompliziert und sollte beim deutschen Stromnetz auch nur selten vorkommen.

  • Achso, ja das hätte ich etwas besser beschreiben können :)

    Wenn die Uhrzeit z.B. 7:01 Uhr ist, dann dimmt das Programm; wie es auch machen soll, von 0% auf 100%.
    Haben wir es z.B. 8:30 Uhr macht das Programm gar nix und wenn es z.B: 19:02 Uhr ist, bringt das Programm "Dimmstufe: 0%".
    Haben wir es z.B. 23:00 Uhr dann sagt das Programm "Da ist etwas schief gelaufen".
    kannst ja auch mal selbst testen, damit du weißt was ich meine :D

    Ich habe mir die Schleifen im Python schon zig mal durchgelesen, ich finde aber irgendwie den Fehler nicht.
    Vielleicht ist ja meine Schleife bzw. Herangehensweise nur zu kompliziert oder es kann mir jmd. den Code so schreiben das es funktioniert und mir erklären warum es so sein muss und nicht anders :thumbs1:

    Einmal editiert, zuletzt von Morle_ (4. Mai 2016 um 21:01)

  • Hallo
    Ein Wort vorerst: Ich kann Programmieren, aber ich kann (noch) nicht Python

    Ich glaube ich habe mal einen Fehler gefunden:
    Count = 100
    Da Python auf Groß/Kleinschreibung achtet, muss das sicherlich
    count = 100
    heißen.
    Des weiteren wird pwmzeit nur einmal gesetzt und dann nicht mehr verändert. Das müsste meines Verständnisses nach nach jedem Sleep neu gesetzt werden.

    Was mich außerdem stutzig macht, ist der Vergleich von Zeiten, nach meinem (nicht Python kennenden) Verständnis nutzt du hier einen Zeichenkettenvergleich und keinen Vergleich von Zeiten. Links wie diese geben mir da recht, dass es anders funktioniert: https://stackoverflow.com/questions/1510…datetime-python

    Gruß
    Chris

  • Oh also das mit dem "Count" ist mir selber noch nicht aufgefallen. Python hat es mir auch nicht als Fehler ausgegeben. :daumendreh2:

    Das mit dem pwmzeit leuchtet mir irgendwie noch nicht so ganz ein. Ich nutze doch die Systemzeit und zweige für die pwmzeit doch lediglich die Stunden und Minuten ab. Sollte da pwmzeit nicht automatisch erneuert werden?

    Naja wie würdest du denn Zeiten vergleichen bzw wie würdest du diesen Programmabschnitt scripten? Ich hab es jetzt so ähnlich wie in Java probiert. Java liegt allerdings auch schon etwas zurück, da ich schon länger mein Abitur in der Tasche habe :D

  • Die Zeit muss wie schon gesagt in der Whileloop eingelesen werden. Und count und Count sind unterschiedliche Variablen. Der Zeitvergleich als String funktioniert.

    Du kannst alles relativ leicht testen wenn Du die Abfrage mit pwmzeit= ... durch ein Einlesen von der Commandline ersetzt (raw_input) und die 100 durch eine Variable zum Testen auf 3 setzt (Willst ja nicht alle 100 Schritte durchtesten :lol: ). Dann kannst Du recht elegant die verschiedenen Zeiten dem Programm vorgaukeln und einen Tagesablauf simulierern und alles testen ;) Du musst aber aufpassen dass Du dann die Zeit immer im Format hh:mm eingibst, denn sonst funktionieren Deine Zeitvergleiche nicht mehr.

  • Moin moin liebe Gemeinde,

    wenn ich

    Code
    pwmzeit=time.strftime("%H:%M")

    mit in die while Schleife nehme, passiert gar nichts mehr.
    Ich habe langsam die Vermutung, dass die kompletten Vergleiche falsch sind bzw der Zähler "count" falsch gestzt wird.

    raw_input() habe ich versucht und habe eine interessante Entdeckung gemacht. Wenn ich 07:00 Uhr eingebe, wird "count" schritweise bis auf 100% gesetzt. Gebe ich 08:00 Uhr ein, passiert das gleiche. Gebe ich 19:00 Uhr ein ebenfalls. Bei 20:00Uhr genauso. Da habe ich die pwmzeit außerhalb der while Schleife gelassen. Nehme ich es in die while Schleife mit rein, muss ich die Uhrzeit nach jedem erhöhten count die Zeit neu eingeben, allerdings mit gleicher Wirkung auf den Dimmwert.

    Einmal editiert, zuletzt von Morle_ (5. Mai 2016 um 08:27)

  • Ich habe Dir mal einen kleinen Zeitgenerator geschrieben :)

    [code=php]def timeGenerator(startHour=0, startMinute=0, startSecond=0, startMilliSecond=0, milliIncrement=1):
    hour = startHour
    minute = startMinute
    second = startSecond
    milliSecond = startMilliSecond
        
    while True:
    yield "%02d:%02d" % (hour, minute)
    milliSecond += milliIncrement
    if milliSecond >= 1000:
    second += milliSecond / 1000
    milliSecond %= 1000
    if second >= 60:
    minute += second / 60
    second %= 60
    if minute >= 60:
    hour += minute / 60
    minute %= 60
    if hour >= 24:
    hour = hour % 24
    print "Es ist nun exakt %02d:%02d:%02d-%03d" % (hour, minute, second, milliSecond)
            
    # Beginn Programm automatische PWM

    timer = timeGenerator(6, 59, 50, 0, 500)[/php]


    Wenn Du dann die Zeilen wie folgt änderst
    [code=php] # pwmzeit=time.strftime("%H:%M")
    # pwmzeit=raw_input("Zeit?")
    pwmzeit = timer.next()
    [/php]

    und das Programm startest wirst Du seht schnell sehen was nicht so ganz funktioniert: Dein Licht geht innerhalb von 50 Sekunden an und nicht in 1 Stunde ;)

    Ansonsten funktioniert aber die Logik des Ab- und Aufdimmens in Deinem Code perfekt wenn die kleinen schon genannten Dinge korrigiert werden.

  • 0
    Komisch... Bei mir funktioniert der Code bzw. die Logik überhaupt nicht. Ich habe es jetzt genauso wie du gemacht und bei mir klappt lediglich das Hochdimmen. Ich habe den Count auf 3 gesetzt und die Fehler behoben. Von 07:00 Uhr bis 07:03 Uhr dimmt er hoch. Das soll er ja jetzt auch so machen. ist aber 19:00 Uhr an der Reihe dimmt er nicht runter sondern bringt wieder die Anfrage "Zeit?" in der Shell. Gebe ich dann 19:01 Uhr ein, sagt er wieder "Zeit?". Keine Angst ich gebe natürlich nur die Zahlen der Uhrzeit ein und schreibe nicht noch "Uhr" dahinter :lol:
    Wenn ich bei "Zeit?" keine Uhrzeit eingebe und nur "Enter" drücke, dann gibt mir das Programm "Dimmstufe: 0%" aus.
    Und bei dir hat wirklich alles so funktioniert wie es sein soll??? :denker:
    PS: Ich weiß das die Dimmung zu schnell geht. Ich wollte es euch nur ersparen wenn ihr den Code testet, dass ihr nicht 1 Stunde warten müsst. Aus diesem Grund der time.sleep(0.5) :thumbs1:
    Automatisch zusammengefügt:

    Sooo ich nochmal. Sorry für den Post drüber. Das Programm funktioniert in der Tat problemlos. Ich habe gerade herausgefunden warum es nur bei mir nicht funktioniert hat.

    Code
    if pwmzeit >= zeit1 and pwmzeit <= zeit2:
         if count < 100:
          count = count + 1               
          print "Dimmstufe:", count ,"%"

    pwmzeit<=zeit2 war bei mir weg. Das muss ich wohl beim testen und herumprobieren gelöscht haben. Jetzt wo es wieder dabei steht funktionert es makellos :)

    Vielen Dank für eure schnelle und aufschlussreiche Hilfe. Im Laufe des Projektes werde ich auf jedenfall nochmal auf euch zurückkommen :danke_ATDE: :danke_ATDE: :danke_ATDE:

    Noch eine Frage zum Abschluss: Gibt es hier einen Bedanken Button bzw wo finde ich den :)

    Einmal editiert, zuletzt von Morle_ (6. Mai 2016 um 10:49)

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!