Licht per klatschen ein- und ausschalten

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Hallo zusammen,

    ich bin gerade leicht am verzweifeln.
    Ich habe folgendes Problem (was Python angeht bin ich recht neu, C und C++ habe ich früher programmiert).:

    Ich will meine Funksteckdose per klatschen ein- und ausschalten. Ich hänge gerade beim Versuch die Funksteckdose wieder auszuschalten, einschalten funktioniert ohne Probleme.

    Hiermit schalte ich die Steckdose ein:


    Dann habe ich das alles überarbeitet und dachte mir mit einer if Anweisung geht das bestimmt.

    Fehlermeldung :

    Code
    File "test2.py", line 8
       if i = 1:
            ^
    SyntaxError: invalid syntax

    leider klappt es nicht und ich komme nicht weiter.
    Ich bin über jegliche Hilfe dankbar.

    Vielen Dank im vorraus.

    Einmal editiert, zuletzt von Frank414 (29. April 2017 um 19:50)

  • Hallo Frank,

    wenn der Zuweisungsoperator

    Code
    =

    lautet, dann wird der Vergleichsoperator nicht auch

    Code
    =

    lauten.

    Hast Du es mal mit

    Code
    ==

    probiert?

    Wenn das besser funktioniert, dann wäre es an der Zeit, Dich mal mit den Grundlagen dieser Programmiersprache zu befassen, z.B. hier.

    Davon abgesehen, hast Du noch einen Logikfehler im Code.

    Beim ersten Klatschen geht das Licht an. Das Programm merkt sich: Licht ist an.
    Beim nächsten Klatschen geht das Licht aus - es ist ja schon an.

    Du brauchst eigentlich nur einen Status über Exklusiv-Oder zwischen 0 und 1 wechseln zu lassen und diesen Wert übergeben: 0 für Aus, 1 für Ein.

    Dafür brauchst Du dann auch keine Fallunterscheidung, was mit diesem Wert weiter geschehen soll.


    Beste Grüße

    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

    Einmal editiert, zuletzt von Andreas (29. April 2017 um 20:51)

  • Ok, danke.

    ok, mit den == kommt jetzt kein Syntax Error mehr, sondern das hier:

    Den Logikfehler habe ich auch gerade entdeckt.

    Code
    i = 2
    
    
           if i = 2:
  • Hallo Frank,

    i soll bei Dir eine globale Variable sein. Dann musst Du sie auch so deklarieren. Wie das geht, wird Dir ein Python-Tutorial verraten. Da solltetst Du Dich generell mal aufschlauen.

    Dabei wirst Du auch erfahren, dass die Verwendung globaler Variablen in Python nicht gern gesehen wird. Bei den Python-Gurus in diesem Forum erst recht.

    Die Funktion nutzt i als lokale Variable. Bevor eine Variable verwendet werden darf, muss ihr ein Wert zugewiesen sein. Das ist hier nicht der Fall. Deswegen ist die Fehlermeldung angemessen.


    Also überlege Dir besser eine andere Vorgehensweise.


    Beste Grüße

    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

    Einmal editiert, zuletzt von Andreas (29. April 2017 um 20:50)

  • Ich weiß schon, dass es besser/einfacher geht, ich stehe aber gerade ein bisschen auf dem Schlauch.

    Mein Problem ist, dass ich beim klatschen eine 1 geliefert bekomme ich ich dann abwechselnd ein- bzw. ausschalten will. Hört sich grundsätzlich einfach an.

    Einschaltbefehl: sudo raspberry-remote/send 11111 2 1
    Ausschaltbefehl: sudo raspberry-remote/send 11111 2 0

    Mit "from gpiozero import Button" habe ich schon versucht, ist leider nichts passendes dabei.
    Bei google habe ich nach LED Schaltungen mit Taster gesucht, ist ja im Endeffekt nichts anderes.

    Ich werde dann doch mal wieder nen Stift und nen Zettel rausholen um das Programm zumindest logisch hinzubekommen.

    Danke

  • Hallo Frank,

    so würde ich das mit einem meiner aktuellen Entwicklungsprojekte (PSeudo-Code-Compiler) machen:

    Deutung:
    Einbinden der GPIO-Library (meine aktuelle Entwicklung einer in Assembler programmierten GPIO-Library funktioniert auch mit dem Pseudo-Code-Compiler).

    Definieren eines Pins PINS für GPIO-Experimente

    In der Hauptprozedur wird eine Variable [font="Courier New"]status[/font] auf 0 gesetzt.

    In einer Endlosschleife wird ein Pegelwechsel von LOW auf HIGH des definierten Pins geprüft. Wenn dieser Pegelwechsel ermittelt wurde, wird der die Variable [font="Courier New"]status[/font] auf der Bit-Position 1 (bei 1 beginnend) exklusiv-oder mit 1 verknüpft. Dadurch wird [font="Courier New"]status[/font] zu 1. Beim nächsten Ereignis zu 0 usw.
    Egal welchen Wert [font="Courier New"]status[/font] einnimmt, wird ein System-Kommando abgesetzt, das Du vorgegeben hast. Über den Wert der Variablen [font="Courier New"]status[/font] wird mal einge- und mal ausgeschaltet.

    Wenn kein GPIO-Ereignis erkannt wurde, dann passiert nichts weiter.

    Damit die CPU-Auslastung nicht zu hoch liegt, wird eine kleine Verschnaufpause von 3 ms eingelegt. Das sollte auch reichen, kein Ereignis zu verpassen.

    Viel Spaß beim Umsetzen in Python!


    Beste Grüße

    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

  • Hallo Frank.

    Anbei mein Verusch in Python:

    [code=php]
    from gpiozero import Button
    from signal import pause
    import os
    import time

    def ein():
    if i == 1:
    os.system("sudo raspberry-remote/send 11111 2 1")
    else:
    os.system("sudo raspberry-remote/send 11111 2 0")

    schalter = Button(27, bounce_time=0.2)

    if __name__ == '__main__':
    i = 1
    while True:
    schalter.when_pressed = ein()
    if i == 1:
    i = 2
    else:
    i = 1

    time.sleep(1)[/php]

    Der Code ist ungetestet, da ich zur Zeit leider keinen PI zur Hand habe.

    Gruss Dani

  • Danke für den Code,

    das Programm hängt in einer Endlosschleife und sendet immer eine 1.

    Gruß
    Frank
    Automatisch zusammengefügt:
    Nachdem ich die Klammern () hinter schalter.when_pressed = ein() entfernt habe schaltet er bei klatschen, es wird aber immer nur eine 1 gesendet, auch wenn das Licht an ist.

    Einmal editiert, zuletzt von Frank414 (29. April 2017 um 22:45)

  • Wenn ich mit STRG+C das Skript beende bekomme ich folgende Meldung

  • Guten Abend

    Wie versprochen melde ich mich.

    Anbei mein angepasster Code:

    [code=php]
    from gpiozero import Button
    from signal import pause
    import os
    import time

    def ein():
    if i == 1:
    os.system("sudo raspberry-remote/send 11111 2 1")
    else:
    os.system("sudo raspberry-remote/send 11111 2 0")
    time.sleep(1)

    schalter = Button(27, bounce_time=0.2)

    if __name__ == '__main__':
    i = 1
    while True:
    schalter.when_pressed = ein
    if i == 1:
    i = 2
    else:
    i = 1
    [/php]


    Ich habe den Code schnell auf meinen Pi getestet allerdings ohne Systemaufruf und Button_pressed

    Es ist richtig, dass das eine Endlosschleife ist.
    Nach dem drücken des Buttons "schläft" das Script eine 1 Sekunde und danach wird die Variable i geändert.

    Die Fehlermeldung beim Abbruch ist auch klar - du Beendest das Script ja zu einem Bellibigen Zeitpunkt. Die must dich nicht stören.


    Gruss Dani

    Einmal editiert, zuletzt von dll-live (30. April 2017 um 19:31)

  • Super, danke. Funktioniert soweit.

    Ein Problem habe ich jetzt noch, er sendet nicht immer abwechselnd eine 1 oder eine 0.


    Automatisch zusammengefügt:
    ok, liegt am Sensor. Ich gebe gerade mal den Wert von

    Code
    schalter = Button(27, bounce_time=0.2)

    aus.

    kommt nicht abwechselnd true/false an.

    ich spiele mal noch ein bisschen mit der bounce_time

    Einmal editiert, zuletzt von Frank414 (30. April 2017 um 21:30)

Jetzt mitmachen!

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