2 Taster und 4 Relais

  • Wenn ich den Pin 22 mit

    Code
    gpio -g write 22 1


    und

    Code
    gpio -g write 22 0


    schalte, geht es mit einem Relais, allerdings das gleiche geht nicht mit LEDs..

    Grün: 3,3V
    Rot: 5V
    Schwarz: GND
    Blau: Relais 1

    mit dem code..

  • Also wenn du mit einem GPIO HIGH keine LED zum leuchten bringen kannst, dann machst du irgendwas grundlegendes Falsch. Oder die LED ist kaputt, oder falsch herum angeschlossen?
    Wenn mit dem Signal da drauf aber ein Relais schalten kannst, dann klingt das ja schon so als wenn es der richtige ist.
    Kontrollier auch mal ob die Pins die du in dem Script benutzt dann auch dir richtigen sind.

  • Habe mit dem gleichen Befehl über die Konsole die LED versucht zu schalten, wie ich das Relais geschalten bekommen hab. Halte ich aber an 3,3v und an einen GND leuchtet die LED. Ich begreifs einfach nicht...

    Okay, die LED bekomm ich jetzt ans leuchten.. Hatte 3,3 und an die GPIO gehalten, musste aber an GPIO undGND halten...

    Juuuuut, das mit dem Taster funzt jetzt! habe das nach diesem Video gemacht:

    Externer Inhalt www.youtube.com
    Inhalte von externen Seiten werden ohne deine Zustimmung nicht automatisch geladen und angezeigt.
    Durch die Aktivierung der externen Inhalte erklärst du dich damit einverstanden, dass personenbezogene Daten an Drittplattformen übermittelt werden. Mehr Informationen dazu haben wir in unserer Datenschutzerklärung zur Verfügung gestellt.

    Jetzt muss ich das als nächstes hinbekommen, dass der bei jedem Tastendrucm nur zwischen HIGH und LOW wechselt..

    Einmal editiert, zuletzt von KaiStinson (11. Dezember 2014 um 00:03)

  • Habe zuerst mal alle Relais angeschlossen.. Pin 3 ist von dem TempSensor belegt. Den Schalter habe ich an Pin 22. Die Relais sind 3, 5, 11, 13, 15, 19, 21, 23.

    Der Code funktioniert bis jetzt nur, solange der Taster gedrückt gehalten wird - aber ist ja klar. An den Wechsel beim Tasten habe ich mich noch nicht gesetzt, da ich noch die Verkabelung besser gemacht hab und dann noch paar andere Sachen mit den Relais probiert hab. Dafür habe ich jetzt ne Ampelsteuerung :p

    Den Wechsel müsste ich doch eigentlich mit einer if Abfrage machen können, oder?
    Wenn das Relais auf 0 steht und der Taster gedrückt wird, dass der auf 1 schaltet - Anders herm genau anders herum halt:p

    MfG

  • Hallo,

    ich empfehle dir grundsätzlich wenn du mit den GPIOs arbeitest ein Try, Except
    Block einzubauen, damit wie im folgenden Code, die GPIOs wieder frei werden,
    wenn du dein Programm durch Strg + C beendest, außerdem empfehle ich
    dir ein sleep einzubauen, damit die while schleife nicht ganz so prozessorlastig
    ist.


    Zu dem Schalterwechsel weiß ich jetzt nicht auf Anhieb,
    wie du das am besten machst, aber wenn du willst, kann ich
    mir mal Gedanken machen.

    MfG ProfDrFisch


    Ein "Gefällt mir" oder eine Bewertung wäre nett. :danke_ATDE:

    Support per [PM]

  • Hab jetzt den "Schalter Modus" mehr oder weniger hinbekommen. Das Relais bleib angezogen und das Licht an, wenn ich den Taster betätigt habe. Aber kriege es nicht hin, dass alles wieder ausgeht..

    Ich möchte das ganze ja auch über eine Webseite steuern, wie kann ich das überhaupt machen? Geht das so mit meinem Vorhaben überhaupt, dass der dann immer wechselt? Weil wenn das nicht geht, lass ich das und bau anstatt n Taster einen Schalter in die Wand...

    Muss natürlich beim Starten direkt mit gestartet sein.. Macht das evtl mehr Sinn, ne .sh zu schreiben?

    Ich habs!!!

    Bin jetzt mächtig stolz auf mich, da ich den Rest grade selbst rausgefunden hab :DDDD
    Allerdings schaltet er auch manchmal von alleine bzw. direkt hintereinander. Kann ich das mit einem anderem Widerstand beheben? Ich bräuchte auch irgendwie einen Cooldown, dass der Schalter nicht direkt hintereinander nochmal reagiert.. Wo muss ich da den sleep hinpacken?

    Einmal editiert, zuletzt von KaiStinson (12. Dezember 2014 um 04:01)

  • Warum packst du das sleep in die IF Abfrage ? Das sleep hat den Sinn das die while Schleife nicht ungebremst die ganze Zeit durch rauscht und dir damit die komplette Prozessorleistung klaut.
    Oder blockiert GPIO.event_detected(22) den Thread bis etwas kommt? Dann wären die sleeps überflüsig.
    Und warum fragst du den Input von 23 ab, wenn doch 22 dein Eingangs-Pin ist ?
    Zur Regelung einer Schleife gehört das sleep ganz ans Ende der Scheife, und braucht auch nur ein paar ms sein, je kleiner desto weniger chance das ein Input verpasst wird (muss man sich überlegen wie klein das Sinn macht).
    Also:

    Code
    while True:
         if GPIO.event_detected(22):
             if (GPIO.input(22) == True):
                 GPIO.output(23, GPIO.LOW)
                 GPIO.output(21, GPIO.LOW)
             else:
                 GPIO.output(23, GPIO.HIGH)
                 GPIO.output(21, GPIO.HIGH)
         # am Ende ein Sleep um die Schleife zu "bremsen" 10ms reichen und ist eigentlich ein guter Wert dafür
         time.sleep(0.01)

    Wenn du einbauen willst, das es einen Cooldown gibt, dann ist das am einfachsten, wenn du dir beim Schalten den Zeitpunkt an dem geschaltet wurde merkst, und beim nächsten Schalten prüfst wie lange das letzte mal her ist. Da kannst du dann z.B. einbauen das wenn das letzte Schalten weniger als 2 Sekunden her ist, dann ignorierst du einfach das ankommende Schalten.

    z.B. mit:

    Hierbei kannst du aber das GPIO.event_detected glaube ich nicht mehr verwenden, weil das ja ein Schalten registriert, und du verwirfst damit ja dann jedes Schalten, das in einem gewissen Zeitraum passiert. Hier müsstest du dann eigentlich immer direkt den Status des Pins für den Schalter prüfen. Kannst auch eine Variable einbauen, in dem das Programm sich den Schaltstatus merkt um es ein wenig Sauberer zu machen.

    z.B.:

  • Hi,

    Zitat


    ...
    Muss natürlich beim Starten direkt mit gestartet sein.. Macht das evtl mehr Sinn, ne .sh zu schreiben?


    Wie meinst du das? Du kannst jedes ausführbare Programm/Skript automatisch starten lassen, egal was für eine Endung das hat.

    Zitat


    ...
    Bin jetzt mächtig stolz auf mich, da ich den Rest grade selbst rausgefunden hab :DDDD


    Nicht schlecht. So hätte ich das mit dem Zustandswechsel auch gemacht. :)

    Zitat


    Allerdings schaltet er auch manchmal von alleine bzw. direkt hintereinander. Kann ich das mit einem anderem Widerstand beheben? Ich bräuchte auch irgendwie einen Cooldown, dass der Schalter nicht direkt hintereinander nochmal reagiert.. Wo muss ich da den sleep hinpacken?


    Das hört sich eigentlich so an als ob der Taster "prellt", (Google Suche)
    aber:
    Ein prellender Taster kann doch eigenltich nicht der Grund sein da ja nach jedem "auslösen" extra 0.5 Sekunden gewartet wird, eben um zu verhindern dass die Interrupt-Routine, aufgrund eines "prellenden" Tasters, nicht öfters aufgerufen wird als eigentlich gewollt.

    Ich habe gerade (bei einer ganz kurzen recherche) gesehen dass man beim definieren des Interrupts auch eine entPrellzeit mit angeben kann und man sich somit nicht selber um das entprellen kümmern muss. Somit würde sich das sleep komplett erübrigen. http://kampis-elektroecke.de/?page_id=3740
    Wie das aussehen könnte:

    Code
    GPIO.add_event_detect(24, GPIO.RISING, callback = Interrupt, bouncetime = 200)


    --------------------------
    Oder könnte es irgendwie sein dass sich add_event_detect alle Interrupts/Flankenwechsel merkt und nacheinander abarbeitet und der Codeblock unter "GPIO.event.detected(22);" deshalb entsprechend oft aufgerufen wird?
    Aber das kann wohl nur ein Python/GPIO-lib Spezialist beantworten :)
    --------------------------

    RyuKajiya

    Zitat


    Oder blockiert GPIO.event_detected(22) den Thread bis etwas kommt? Dann wären die sleeps überflüsig.


    Ja der blockiert, aber damit er nicht öfters auslöst als er soll wird er eigentlich mit sleep 0.2 "entprellt".

    Zitat


    Und warum fragst du den Input von 23 ab, wenn doch 22 dein Eingangs-Pin ist ?


    Das ist eine geschickte Möglichkeit mit der man sich die Variable für den Zustand sparen kann. Man muss also nicht in einer Variable ständig mit schreiben welchen zustand der Pin hat, sondern man frägt ihn einfach. :)


    Hier mal (m)eine getestete und sicher funkionierende Variante in Bash: (Ist im Grunde das exakt gleiche wie das letze von KaiStinson gepostete Skript)

    Spoiler anzeigen


    Achtung: Es werden andere Pins verwendet und der Taster verbindet den wiringPi Pin 4 mit GND (und nicht wie im Beispiel oben mit 3V3). Damit das Skript funktioniert muss auch das gpio Tool aus dem wiringPi Paket installiert sein.

    Joh

    DON'T PANIC!

  • Danke für die ausführlichen Antworten, bin allerdings jetzt verwirrt, was ich machen muss... Habe nun das andere Problem, dass ich 2 Schalter abfragen muss, und jeweils 2 Relais schalten muss. Wie kriege ich das in 1 Skript unter? Das mit dem Autostart hab ich hinbekommen.

    Wenn ich den Taster drücke, schaltet der jetzt nichtmehr durch:

    Code
    GPIO.add_event_detect(18, GPIO.RISING, bouncetime = 200)


    Danke dafür nochmal :)

    Einmal editiert, zuletzt von KaiStinson (17. Dezember 2014 um 22:54)

  • So, habe das ganze jetzt in der neuen Wohnung. Nun reagiert das Skript sofort, wenn nur irgendwas an den Pin angeschlossen wird. Brauche also nicht mal Strom drauf sein. Einfach nur Draht dran halten. Liegt das am zu geringem Widerstand mit 4,7 kohm?

    Und es schaltet wieder von alleine..

    Einmal editiert, zuletzt von KaiStinson (18. Dezember 2014 um 11:27)

Jetzt mitmachen!

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