I2C Relais 8-Bit Muster "erzeugen"

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

    ich möchte gerne über ein Python Script mehrere I2C Relais ansteuern. Ich habe mir teilweise Steuerkarten gekauft aber auch selber entwickelt. Funktionieren aber fast gleich und auch zusammen. Jede Platine kann 8 Relais schalten die extern noch angeschlossen werden müssen. Jede Platine hat ganz normal eine I2C-Adresse.

    Um jeweis 8 Relais schalten zu können muss ich ein 8-Bit Muster senden (0-255). Bei jedem Muster werden andere Relais ein und ausgeschaltet.

    Wenn ich 255 sende sind alle ausgeschaltet --> Kein Durchgang, bei 0 haben alle Durchgang.

    Mein Ziel ist es alle Relais einzeln aus und an schalten zu können und einen Button "ALLOFF" um alle auszuschalten. Über ein Webinterface (wobei das Webinterface nicht das Problem ist) soll das ganze gesteuert werden.

    Absich sende ich wenn ich z.B. Relais 1 anschalten will einfach die 254 und nur das erste ist an, nur weiß ich nicht wie ich des jetzt machen soll wenn Relais 1 dann anbleiben soll und ich dann noch Relais 2 ZUSÄTZLICH auf Durchgang schalten will.

    Ich habe mir die ganzen einzelnen Muster für immer nur das eine Relais rausgeschrieben. Aber ob ich damit weiter komme weiß ich net.

    Relais 1: 254
    Relais 2: 253
    Relais 3: 251
    Relais 4: 247
    Relais 5: 239
    Relais 6: 223
    Relais 7: 191
    Relais 8: 127

    Hat jemand eine Idee wie ich so mein Vorhaben mit Hilfe eines Python Scripts auf dem RPi realisieren kann?

    Beste Grüße
    Florian

  • Hallo Florian,

    Grüße von der einen Seite des Schwarzwaldes auf die andere Seite des Schwarzwaldes (wir sind in unserem Tal seit Tagen eingeschneit).

    Des Rätsels löst heißt Binärsystem. 8 Bits ergeben 1111 1111 = 255 (dezimal). 2⁸ = 256

    Jedes Bit entspricht einem Relais. Du kannst in jeder beliebigen Programmiersprache einzelne Bits setzen, löschen oder umschalten.

    Setzen: ODER-Verknüpfung mit 1
    Löschen: UND-Verknüpfung mit 0
    Umschalten: EXKLUSIV-ODER-Verknüpfung mit 1

    Um z.B. das dritte Relais einzuschalten: relais := relais ODER 2⁽³⁻¹⁾ (Man fängt bei 0 an zu zählen...)

    Deswegen würde ich an Deiner Stelle die Nummerierung anders machen:

    [font="Courier New"]
    Relais-Nr 8 7 6 5 4 3 2 1
    Relais-Nr 7 6 5 4 3 2 1 0 [font="Arial"](optimal)[/font]
    Bit-Nr. 7 6 5 4 3 2 1 0
    [/font]

    Dies vereinfacht das Umrechnen auf die entsprechende Bit-Nummer.

    Bsp.: Relais 1, 2, 7, 8 einschalten:
    [font="Courier New"]
    Relais-Nr 8 7 6 5 4 3 2 1
    Relais-Nr 7 6 5 4 3 2 1 0 [font="Arial"](optimal)[/font]
    Bit-Nr. 7 6 5 4 3 2 1 0
    Bit-Muster 1 1 0 0 0 0 1 1
    [/font]
    Das binäre Bit-Muster ergibt in dezimaler Schreibweise 1 * 2⁷ + 1 * 2⁶ + 0 * 2⁵ + 0 * 2⁴ + 0 * 2³ + 0 * 2² + 1 * 2¹ + 1 * 2⁰ = 128 + 64 + 2 + 1 = 195


    Um auf dieses Beispiel noch Relais 4 umzuschalten:
    [font="Courier New"]
    Relais-Nr 8 7 6 5 4 3 2 1
    Relais-Nr 7 6 5 4 3 2 1 0 [font="Arial"](optimal)[/font]
    Bit-Nr. 7 6 5 4 3 2 1 0
    Bit-Muster 1 1 0 1 0 0 1 1
    [/font]
    Das binäre Bit-Muster ergibt in dezimaler Schreibweise 1 * 2⁷ + 1 * 2⁶ + 0 * 2⁵ + 1 * 2⁴ + 0 * 2³ + 0 * 2² + 1 * 2¹ + 1 * 2⁰ = 128 + 64 + 16 + 2 + 1 = 211
    Auf das gleiche Ergebnis wärest Du auch gekommen, indem Du den alten Status mit 16 EXKLUSIV-ODER verknüpft hättest.
    195 EXKLUSIV-ODER 16 = 211
    Relais 4 nochmals umschalten: Analog 211 EXKLUSIV-ODER 16 = 195
    Das hat was, oder?


    Um Relais 7 auszuschalten (unabhängig vom Schaltzustand):
    [font="Courier New"]
    Relais-Nr 8 7 6 5 4 3 2 1
    Relais-Nr 7 6 5 4 3 2 1 0 [font="Arial"](optimal)[/font]
    Bit-Nr. 7 6 5 4 3 2 1 0
    Bit-Muster 0 1 0 1 0 0 1 1
    [/font]
    Das binäre Bit-Muster ergibt in dezimaler Schreibweise 0 * 2⁷ + 1 * 2⁶ + 0 * 2⁵ + 1 * 2⁴ + 0 * 2³ + 0 * 2² + 1 * 2¹ + 1 * 2⁰ = 64 + 16 + 2 + 1 = 83

    Oder auch zu erhalten durch 211 UND dez(0111111) = 211 UND 127 = 83


    Und als letztes Beispiel wollen wir Relais 3 unabhängig vom Schaltzustand eingeschaltet wissen:
    [font="Courier New"]
    Relais-Nr 8 7 6 5 4 3 2 1
    Relais-Nr 7 6 5 4 3 2 1 0 [font="Arial"](optimal)[/font]
    Bit-Nr. 7 6 5 4 3 2 1 0
    Bit-Muster 0 1 0 1 1 0 1 1
    [/font]
    Das binäre Bit-Muster ergibt in dezimaler Schreibweise 0 * 2⁷ + 1 * 2⁶ + 0 * 2⁵ + 1 * 2⁴ + 1 * 2³ + 0 * 2² + 1 * 2¹ + 1 * 2⁰ = 64 + 16 + 8 + 2 + 1 = 91

    Oder auch zu erhalten durch 91 ODER dez(00001000) = 83 ODER 8 = 91


    Der Rest ist nur Mathematik, Logik-Verknüpfung und Spaß haben, dass es funktioniert.

    Jetzt musst Du nur noch Herausfinden, wie UND, ODER, EXKLUSIV-ODER in Python gesprochen werden.


    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 (27. Februar 2016 um 18:39)

  • Beitrag von Frank86 (20. Februar 2016 um 15:37)

    Dieser Beitrag wurde gelöscht, Informationen über den Löschvorgang sind nicht verfügbar.
  • Hallo Florian,

    schreibe Dir doch mal zur Übung ein Programm mit 8 Buttons. Von links nach rechts steht drauf 7 6 5 4 3 2 1 0

    Wenn Du auf den Button mit 7 drückst, wird eine Funktion aufgerufen, die eine Variable i2c_muster nicht auf 2⁷ setzt, sondern das entsprechende Bit setzt. Wie das geht habe ich zwei Beiträge weiter oben schon recht ausführlich beschrieben.
    Mit dem Button 6 machst Du das Gleiche: Das Bit, das zu 2⁶ gehört, wird gesetzt.
    ...
    Und schließlich setzt Anklicken des Button 0 das Bit, das zu 2⁰ gehört auf 1.

    Wenn das denn funktioniert, baust Du Dir noch einen "Merker" ein. War das Bit bereits gesetzt (einmal, dreimal, fünfmal, ... eine ungeradzahlige Anzahl angeklickt worden), dann soll es beim zweiten, vierten, sechsten Anklicken (geradzahlige Anzahl) das Bit nicht gesetzt sondern gelöscht werden.

    Und somit hast Du immer exakt das richtige Bitmuster zum Ansteuern Deiner Relais über I2C.


    Aber das mit den Buttons solltest Du mal selber ausprobieren und hinbekommen.

    Und in 10 Minuten ist das dann funktionsfähig... ;)

    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.

  • Hi Andreas, das mit den Buttons war kein Problem.

    Allerdings jetzt beim einbinden und Daten senden per i2C kommt immer die Fehlermeldung

    Code
    File "i2ctest.py", Line 29
    global adress = 0x26
                         ^
    Syntax Error: invalid syntax

    Mein Code den ich bis jetzt habe:

    Gruß Florian

Jetzt mitmachen!

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