Closed pintman closed 8 years ago
Coole Idee. Ich war schon am grübeln, das ganze auf drei Bytes zu verteilen. Aber dein Vorschlag gefällt mir auch sehr gut. Werde ich mal umsetzen.
OK, ich fasse es noch einmal zusammen.
Das Bitmuster ist wie folgt aufgebaut:
1 2 3 4 5 6 7 8
h h a a a b b b
Bit 1-2: Helligkeit: 00: 25%, 01: 50%, 10: 75%, 11: 100% Bit 3-5: LED Rot (3), Gelb (4) oder Grün(5) soll geschaltet werden (1) oder nicht (0) Bit 5-8: Wert (0 oder 1) auf den dir rote (6), gelbe (7) oder grüne (8) LED geschaltet werden soll.
Die Verteilung der Helligkeitswerte gefällt mir noch nicht richtig, wegen der Asymmetrie.
Die Verteilung der Helligkeitswerte gefällt mir noch nicht richtig, wegen der Asymmetrie.
Durch das herkömmliche Ausschalten über die b-Bits hat man ja noch eine fünfte Dimmstufe.
Gegenvorschlag:
Es werden drei Bytes gesendet, eines für jede Farbe (rot, gelb und grün).
Das gesendete Byte muss jeweils einen Wert zwischen 0 und 100 aufweisen. Dieser Wert wird für die Helligkeit (0=aus, 100=volle Helligkeit) verwendet. Hat das Byte den Wert 255 (binär 11111111), wird es ignoriert und die Anzeige der LED wird nicht verändert.
Eine weitere Variante käme weiterhin mit einem Byte aus:
aabb bbbb
Mit den ersten beiden Bits (a) wird die LED angesprochen: 00=Rot, 01=Gelb, 10=Grün, 11=ignoriert oder reserviert für spätere Erweiterungen :).
In den folgenden 6 Bits (b) wird der Helligkeitswert kodiert. Mit 6 Bits ergeben sich 2^6=64 Helligkeitsstufen von 0 (000000) bis 63 (111111).
Die 3-Byte-Variante gefällt mir etwas besser. Ich würde aber vielleicht 128 Schaltstufen wählen:
abbb bbbb
Das a-Bit gibt an, ob die LED berücksichtigt wird und die b-Bits geben die Stufe an. In etwa so:
if byte > 127:
p.ChangeDutyCycle((byte-128)/127*100)
Bringt die genauere Auflösung denn einen Vorteil? Da der Parameter von ChangeDutyCycle zwischen 0 und 100 liege muss, dachte ich, dass es auch nur eine Auflösung von 100 Schritten gibt.
p.ChangeDutyCycle(dc) # where 0.0 <= dc <= 100.0
Zumindest scheint er auch Dezimalzahlen zu akzeptieren. Wie genau es tatsächlich aufgelöst wird, weiß ich nicht. Ob der Effekt sichtbar ist, müsste man mal ausprobieren.
Man hätte halt eine schöne glatte Anzahl und könnte alle Werte zwischen x000 0000 und x111 1111 nutzen und nicht nur bis x110 0100.
Dagegen spricht, dass ich ungern mit Dezimalzahlen jongliere. Ich favorisiere daher die Variante mit den 100 Werten. Du hast recht, dass einige Werte ungenutzt bleiben. Vielleicht kann man später mit ihnen noch etwas machen. :)
In Version 0.2.6 habe ich die Version mit den drei Bytes, die jeweils zwischen 0 und 100 liegen umgesetzt. Du darfst gerne testen. :)
Version 0.2.7 hat nun auch einen angepassten Testclient, der mit python3 -m eapi.net startclient
gestartet werden kann und Werte zwischen 0 und 100 an den Server schicken kann.
Vorschlag von elektroschule: