Moin,
ich bin gerade dabei die Fernbedienung für unsere Außenbeleuchtung zu klonen und über's Smartphone steuerbar zu machen. Der "RFSniffer" war nicht erfolgreich, deshalb musste ich die Original-Signale mit URH abfangen, um die Bit-Sequenzen extrahieren zu können (bleiben immer gleich).
Hier ein Beispiel, der Übersicht und Sicherheit halber stark vereinfacht:
Bei einem Tastendruck werden vier Sequenzen, mit jeweils einer Pause von ~213ms gesendet, wobei die letzten drei exakt gleich sind. Ein Bit sollte, im Idealfall, 500μs andauern.
So in der Art konnte ich es auch schon erfolgreich umsetzen, doch das Problem liegt in der Ungenauigkeit der Zeit. 3/4 des übertragenden Signals sind richtig und stimmen mit dem Original überein, doch "auf der letzten Meile" kommt es zu Ungenauigkeiten und somit falsch ausgewerteter Bits.
Hier der aktuelle Code:
signal = "1111001011111 1111101010101 1111101010101 1111101010101"
def transmit_code(code):
GPIO.setmode(GPIO.BCM)
GPIO.setup(TRANSMIT_PIN, GPIO.OUT)
for i in code:
if i == '1':
GPIO.output(TRANSMIT_PIN, 1)
time.sleep(0.0005)
elif i == '0':
GPIO.output(TRANSMIT_PIN, 0)
time.sleep(0.0005)
elif i == ' ':
GPIO.output(TRANSMIT_PIN, 0)
time.sleep(0.213)
else:
continue
GPIO.output(TRANSMIT_PIN, 0)
GPIO.cleanup()
Alles anzeigen
Die Idee ist, dass die vier Bit-Sequenzen in einem String sind, der Zeichen für Zeichen durchlaufen wird. Einsen und Nullen setzen den entsprechenden Zustand des Pins und bei einem Leerzeichen wird gewartet.
Meine Frage ist nun, wie ich diese Ungenauigkeiten zum Ende hin vermeiden kann? Kennt jemand spezielle Python Libs mit besseren "sleep"-Funktionen oder einen effizienteren Ansatz was den Code angeht? Nebenbei versuche ich mich noch an C und WiringPi, das ich sonst auch aus Python heraus ausführen könnte.
(Ja, wenn die letzten drei Sequenzen immer gleich sind, kann man da auch eine Schleife draus machen. Ästhetische Änderungen kommen noch )
Danke