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()
|