From: Jimmy Date: Tue, 25 Jun 2024 00:08:50 +0000 (-0500) Subject: micropython_ir projects X-Git-Url: https://vault307.fbx.one/gitweb/micorpython_ir.git/commitdiff_plain/refs/heads/master micropython_ir projects --- diff --git a/irRemote/rokuRemote.py b/irRemote/rokuRemote.py new file mode 100644 index 0000000..aa4603c --- /dev/null +++ b/irRemote/rokuRemote.py @@ -0,0 +1,86 @@ +from machine import Pin +import uasyncio as asyncio +from primitives.switch import Switch +from primitives.delay_ms import Delay_ms +from ir_tx.nec import NEC + +loop = asyncio.get_event_loop() + +# If button is held down normal behaviour is to retransmit +# but most NEC models send a REPEAT code +class Rbutton: + toggle = 1 # toggle is ignored in NEC mode + def __init__(self, irb, pin, addr, data, proto): + self.irb = irb + self.sw = Switch(pin) + self.addr = addr + self.data = data + self.proto = proto + + self.sw.close_func(self.cfunc) + self.sw.open_func(self.ofunc) + self.tim = Delay_ms(self.repeat) + + def cfunc(self): # Button push: send data + tog = 0 if self.proto < 3 else Rbutton.toggle # NEC, sony 12, 15: toggle==0 + self.irb.transmit(self.addr, self.data, tog, True) # Test validation + print(self.data) + # Auto repeat. The Sony protocol specifies 45ms but this is tight. + # In 20 bit mode a data burst can be upto 39ms long. + self.tim.trigger(108) + + def ofunc(self): # Button release: cancel repeat timer + self.tim.stop() + Rbutton.toggle ^= 1 # Toggle control + + async def repeat(self): + await asyncio.sleep(0) # Let timer stop before retriggering + if not self.sw(): # Button is still pressed: retrigger + self.tim.trigger(108) + if self.proto == 0: + self.irb.repeat() # NEC special case: send REPEAT code + print(self.data) + else: + tog = 0 if self.proto < 3 else Rbutton.toggle # NEC, sony 12, 15: toggle==0 + self.irb.transmit(self.addr, self.data, tog, True) # Test validation + print(self.data) + +async def main(proto): + pin = Pin(16, Pin.OUT, value = 0) #IRled=irb + addr=0xc7ea + #TODO: Set up buttons (see ir_tx.test) + #Power 0x17 \button=Pin(pin, Pin.IN, Pin.PULL_UP)\ (yellow)5 + #Home 0x03 \Pin(pin, Pin.IN, Pin.PULL_UP)\ + #Back 0x66 \Pin(pin, Pin.IN, Pin.PULL_UP)\ + #VolU 0x0f \Pin(pin, Pin.IN, Pin.PULL_UP)\ + #VolD 0x10 \Pin(pin, Pin.IN, Pin.PULL_UP)\ + #Up 0x19 \Pin(pin, Pin.IN, Pin.PULL_UP)\ (green)20 + #Down 0x33 \Pin(pin, Pin.IN, Pin.PULL_UP)\ + #Left 0x1e \Pin(pin, Pin.IN, Pin.PULL_UP)\ (brown)26 + #Right 0x2d \Pin(pin, Pin.IN, Pin.PULL_UP)\ + #OK 0x2a \Pin(pin, Pin.IN, Pin.PULL_UP)\ (blue)27 + + classes = (NEC,0) + irb = classes[proto](pin, 38000) # My decoder chip is 38KHz + # Uncomment the following to print transmit timing + # irb.timeit = True + + b = [] # Rbutton instances + pbutton=Pin(5,Pin.IN,Pin.PULL_UP) + ubutton=Pin(20,Pin.IN,Pin.PULL_UP) + lbutton=Pin(26,Pin.IN,Pin.PULL_UP) + ebutton=Pin(27,Pin.IN,Pin.PULL_UP) + b.append(Rbutton(irb, pbutton, addr, 0x17, proto)) + b.append(Rbutton(irb, ubutton,addr,0x19,proto)) + b.append(Rbutton(irb, lbutton,addr,0x1e,proto)) + b.append(Rbutton(irb, ebutton,addr,0x2a,proto)) + #b.append(Rbutton(irb, buttonName,addr,DATA,proto))\replace buttonName, DATA + led = Pin(25, Pin.OUT) + while True: + await asyncio.sleep_ms(500) + led(not led()) + +def test(proto=0): #(runs script allowing to try different classes) + loop.run_until_complete(main(proto)) + +test() \ No newline at end of file diff --git a/ir_tx/test.py b/ir_tx/test.py index c9e3366..db41ff3 100644 --- a/ir_tx/test.py +++ b/ir_tx/test.py @@ -130,3 +130,5 @@ else: def test(proto=0): loop.run_until_complete(main(proto)) + +test() \ No newline at end of file