]>
vault307.fbx.one Git - micorpython_ir.git/blob - ir_tx/test.py
1 # ir_tx.test Test for nonblocking NEC/SONY/RC-5/RC-6 mode 0 IR blaster.
3 # Released under the MIT License (MIT). See LICENSE.
5 # Copyright (c) 2020 Peter Hinch
7 # Implements a 2-button remote control on a Pyboard with auto repeat.
8 from sys
import platform
9 ESP32
= platform
== 'esp32'
11 from machine
import Pin
13 from pyb
import Pin
, LED
14 import uasyncio
as asyncio
15 from aswitch
import Switch
, Delay_ms
16 # Import all implemented classes
17 from ir_tx
.nec
import NEC
18 from ir_tx
.sony
import SONY_12
, SONY_15
, SONY_20
19 from ir_tx
.philips
import RC5
, RC6_M0
21 loop
= asyncio
.get_event_loop()
24 toggle
= 1 # toggle is ignored in NEC mode
25 def __init__(self
, irb
, pin
, addr
, data
, rep_code
=False):
30 self
.rep_code
= rep_code
31 self
.sw
.close_func(self
.cfunc
)
32 self
.sw
.open_func(self
.ofunc
)
33 self
.tim
= Delay_ms(self
.repeat
)
35 def cfunc(self
): # Button push: send data
36 self
.irb
.transmit(self
.addr
, self
.data
, Rbutton
.toggle
)
37 # Auto repeat. The Sony protocol specifies 45ms but this is tight.
38 # In 20 bit mode a data burst can be upto 39ms long.
41 def ofunc(self
): # Button release: cancel repeat timer
43 Rbutton
.toggle ^
= 1 # Toggle control
45 async def repeat(self
):
46 await asyncio
.sleep(0) # Let timer stop before retriggering
47 if not self
.sw(): # Button is still pressed: retrigger
50 self
.irb
.repeat() # NEC special case: send REPEAT code
52 self
.irb
.transmit(self
.addr
, self
.data
, Rbutton
.toggle
)
54 async def main(proto
):
55 # Test uses a 38KHz carrier. Some Philips systems use 36KHz.
56 # If button is held down normal behaviour is to retransmit
57 # but most NEC models send a REPEAT code
58 rep_code
= proto
== 0 # Rbutton constructor requires False for RC-X. NEC protocol only.
59 if ESP32
: # Pins for IR LED gate
60 pin
= (Pin(23, Pin
.OUT
, value
= 0), Pin(21, Pin
.OUT
, value
= 0))
63 classes
= (NEC
, SONY_12
, SONY_15
, SONY_20
, RC5
, RC6_M0
)
64 irb
= classes
[proto
](pin
, 38000) # My decoder chip is 38KHz
66 b
= [] # Rbutton instances
67 px3
= Pin(18, Pin
.IN
, Pin
.PULL_UP
) if ESP32
else Pin('X3', Pin
.IN
, Pin
.PULL_UP
)
68 px4
= Pin(19, Pin
.IN
, Pin
.PULL_UP
) if ESP32
else Pin('X4', Pin
.IN
, Pin
.PULL_UP
)
69 b
.append(Rbutton(irb
, px3
, 0x1, 0x7, rep_code
))
70 b
.append(Rbutton(irb
, px4
, 0x10, 0xb, rep_code
))
74 await asyncio
.sleep(5)
78 await asyncio
.sleep_ms(500) # Obligatory flashing LED.
81 # Greeting strings. Common:
82 s
= '''Test for IR transmitter. Run:
83 from ir_tx.test import test
84 test() for NEC protocol
85 test(1) for Sony SIRC 12 bit
86 test(2) for Sony SIRC 15 bit
87 test(3) for Sony SIRC 20 bit
88 test(4) for Philips RC-5 protocol
89 test(5) for Philips RC-6 mode 0.
95 Ground pin X3 to send addr 1 data 7
96 Ground pin X4 to send addr 0x10 data 0x0b.'''
100 IR LED gate on pins 23, 21
101 Ground pin 18 to send addr 1 data 7
102 Ground pin 19 to send addr 0x10 data 0x0b.'''
104 print(''.join((s
, sesp
)) if ESP32
else ''.join((s
, spb
)))
107 loop
.run_until_complete(main(proto
))