5521d8da5d
- Updated angle_minus value in config.json for switch calibration. - Added support for seminsu devices in load_seminsus function. - Implemented polling logic for seminsu devices in main.py. - Adjusted switch position representation from "-" and "+" to "1" and "0". - Introduced IRRxTxPollPair class for IR communication in ir_pair.py. - Created ir_test.py for testing IR functionality with configurable parameters.
72 lines
2.3 KiB
Python
72 lines
2.3 KiB
Python
from machine import Pin
|
|
from time import ticks_ms, ticks_diff
|
|
|
|
from ir_pair import IRRxTxPollPair
|
|
|
|
|
|
# --- Настройки пинов ---
|
|
# RX_PIN: выход ИК-приёмника (обычно TTL сигнал с модуля VS1838/TSOP*)
|
|
# TX_PIN: пин ИК-светодиода/ключа (на него подаётся 38кГц PWM во время окна опроса)
|
|
RX_PIN = 16
|
|
TX_PIN = 6
|
|
|
|
|
|
# --- Тайминги опроса ---
|
|
POLL_PERIOD_MS = 500 # период опроса (как часто проверяем)
|
|
TX_ON_MS = 50 # сколько держим 38кГц включённым в каждом цикле
|
|
STATUS_PERIOD_MS = 1000
|
|
|
|
|
|
# --- Условия теста ---
|
|
# N влияет сразу на:
|
|
# - сколько раз "мигнуть" ИК-передатчиком за 1 цикл опроса
|
|
# - сколько фронтов (edges) нужно увидеть, чтобы считать луч НЕ перекрытым
|
|
N = 5
|
|
|
|
|
|
LED = Pin("LED", Pin.OUT)
|
|
|
|
|
|
def main():
|
|
pair = IRRxTxPollPair(
|
|
rx_pin=RX_PIN,
|
|
tx_pin=TX_PIN,
|
|
poll_period_ms=POLL_PERIOD_MS,
|
|
tx_on_ms=TX_ON_MS,
|
|
blinks_per_poll=N,
|
|
blink_off_ms=5,
|
|
freq_hz=38_000,
|
|
duty_percent=33,
|
|
min_edges=N,
|
|
# Считаем только FALLING: обычно на каждом включении carrier RX даёт 1 спад.
|
|
# Тогда 5 миганий ~= 5 edges (а при подсчёте обоих фронтов было бы ~10).
|
|
count_rising=False,
|
|
count_falling=True,
|
|
)
|
|
|
|
last_status = ticks_ms()
|
|
|
|
print("IR poll test started")
|
|
print("RX pin:", RX_PIN, "TX pin:", TX_PIN)
|
|
print("poll_period_ms:", POLL_PERIOD_MS, "tx_on_ms:", TX_ON_MS)
|
|
print("N:", N, "(blinks_per_poll and min_edges)")
|
|
|
|
try:
|
|
while True:
|
|
pair.poll_once() # результат и счетчики сохраняются внутри pair
|
|
LED.toggle()
|
|
|
|
now = ticks_ms()
|
|
if ticks_diff(now, last_status) >= STATUS_PERIOD_MS:
|
|
seen = bool(pair.last_seen)
|
|
print(
|
|
("BEAM NOT BLOCKED" if seen else "BEAM BLOCKED")
|
|
+ " | edges=%d" % pair.last_edges
|
|
)
|
|
last_status = now
|
|
finally:
|
|
pair.deinit()
|
|
|
|
|
|
main()
|